/* Хаб — стиль «лёгкий, воздушный» (дизайн-система «Хаб»). Один шрифт, роли вместо цветов. */
:root {
  /* Роли дизайн-системы «Хаб» (артефакт Pavel-а, 28.09). Имена — роли, не цвета. */
  color-scheme: light;
  --bg: #ffffff; --sidebar: #f5f5f7; --surface-2: #f2f2f5; --surface-raised: #ffffff;
  --selection: #eef3fd; --line: #e5e5ea; --mark: #8a8a90;
  --ink: #1d1d1f; --ink-2: #6e6e73;
  --accent: #2563d9; --on-accent: #ffffff;
  --today: #e3b505;           /* ТОЛЬКО заливка звезды: как текст 1.9:1 — запрещено */
  --today-ink: #8a6500; --today-soft: #fdf3d7;
  --danger: #d92d3a; --danger-soft: #fde8e8; --danger-soft-ink: #b3261e;
  --done: #1a7f45;
  /* не из дизайн-системы: подложка статуса «активен» во вкладке «Пульт» */
  --done-soft: #dcf1e4; --done-soft-ink: #155f35;
  --focus: #2563d9;
  --shadow-card: 0 1px 2px rgba(0,0,0,.04), 0 6px 20px rgba(0,0,0,.07);
  --shadow-pop: 0 12px 40px rgba(0,0,0,.14);
  --radius-xs: 5px; --radius-sm: 8px; --radius-md: 12px; --radius-lg: 20px; --radius-full: 999px;
  --row-min: 44px; --checkbox: 20px; --sidebar-w: 248px; --list-max: 720px;
  --tabbar-h: 64px;           /* высота нижней панели: от неё считается отступ списка */
  --sans: -apple-system, "SF Pro Text", "PT Sans", system-ui, "Segoe UI", sans-serif;
}
/* Р-15.17: тёмная тема. Весь дизайн жил на переменных :root — поэтому тема это
   ровно один набор значений. Три состояния: авто (по системе), светлая, тёмная;
   выбор пишется в data-theme на <html> (см. base.html — применяется ДО отрисовки,
   иначе на старте мигал бы белый экран).
   Золото и красный на тёмном фоне подняты по светлоте: исходные #E3B505/#d1435b
   на #12181f дают контраст ниже 4.5:1 и читаются как «слепые». */
:root[data-theme="dark"], :root.theme-dark {
  color-scheme: dark;
  --bg: #1c1c1e; --sidebar: #252528; --surface-2: #2c2c2e; --surface-raised: #2c2c2e;
  --selection: #1f2d47; --line: #38383a; --mark: #7c7c82;
  --ink: #f2f2f7; --ink-2: #a1a1a8;
  --accent: #5b93ff; --on-accent: #0b1220;
  --today: #f2c744; --today-ink: #f2c744; --today-soft: #3a3220;
  --danger: #ff6b6b; --danger-soft: #3b1d20; --danger-soft-ink: #ff8a8a;
  --done: #4cd07d; --done-soft: #1c3328; --done-soft-ink: #6fd79b;
  --focus: #5b93ff;
  --shadow-card: 0 1px 2px rgba(0,0,0,.4), 0 6px 20px rgba(0,0,0,.35);
  --shadow-pop: 0 12px 40px rgba(0,0,0,.5);
}
/* П-в036-4 (найдено сессией на приёмке v036): в АВТО-режиме (тёмная система, без
   явного выбора) палитра разъехалась с явной тёмной — здесь оставался старый
   `--head: #cfe0f5` и не было `--head-text`. У человека с тёмной системой это давало
   белый текст на светло-голубых плашках и почти невидимые заголовки. Два блока
   обязаны совпадать значение в значение; за этим следит сторож в тестах. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    color-scheme: dark;
  --bg: #1c1c1e; --sidebar: #252528; --surface-2: #2c2c2e; --surface-raised: #2c2c2e;
    --selection: #1f2d47; --line: #38383a; --mark: #7c7c82;
    --ink: #f2f2f7; --ink-2: #a1a1a8;
    --accent: #5b93ff; --on-accent: #0b1220;
    --today: #f2c744; --today-ink: #f2c744; --today-soft: #3a3220;
    --danger: #ff6b6b; --danger-soft: #3b1d20; --danger-soft-ink: #ff8a8a;
    --done: #4cd07d; --done-soft: #1c3328; --done-soft-ink: #6fd79b;
    --focus: #5b93ff;
    --shadow-card: 0 1px 2px rgba(0,0,0,.4), 0 6px 20px rgba(0,0,0,.35);
    --shadow-pop: 0 12px 40px rgba(0,0,0,.5);
  }
}
* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; background: var(--bg); color: var(--ink);
  font: 16px/1.4 var(--sans); -webkit-font-smoothing: antialiased; -webkit-tap-highlight-color: transparent; }
a { color: var(--accent); text-decoration: none; }
/* Р-15.17: поля ввода не наследуют тему сами — браузер рисует их белыми, и на тёмном
   фоне они становятся теми самыми «слепыми» пятнами. Задаём роли явно. */
input, select, textarea, button { font-family: inherit; }
/* П-в036-1, корень (найден 21.08 вечером). iOS Safari АВТО-ЗУМИТ страницу при фокусе
   в поле с font-size < 16px. После авто-зума лейаут-вьюпорт шире визуального, а
   `position: fixed` считается от ЛЕЙАУТА — таб-бар уезжает и оказывается посреди
   экрана, список видно и над ним, и под ним. Ровно симптом со скрина: он снят на
   «Сегодня», где первое же поле — быстрый ввод, и был 15px.
   Лечим размером, а не `maximum-scale=1`: запрет зума отнял бы у человека
   возможность увеличить текст. 16px — минимум, при котором iOS не зумит.
   Заодно у полей не задан font-size вовсе — Safari берёт свои ~13px, и зумило бы
   каждое из них: календарные поля, поиск в листе, интервал повтора. */
input, select, textarea { background: var(--surface-2); color: var(--ink);
  border: 1px solid transparent; border-radius: var(--radius-sm); padding: 10px 12px;
  font-size: 16px; }
input:focus, select:focus, textarea:focus { outline: 2px solid var(--focus); outline-offset: 0; background: var(--bg); }
::placeholder { color: var(--ink-2); opacity: 1; }
input[type="checkbox"], input[type="radio"] { accent-color: var(--accent); padding: 0; }
main { padding: 16px 16px calc(var(--tabbar-h) + env(safe-area-inset-bottom));
  max-width: var(--list-max); margin: 0 auto; }
.muted { color: var(--ink-2); } .center { text-align: center; padding: 24px 0; }

.queue-badge { color: var(--ink-2); } .off-dot { color: var(--danger); }

/* П-в036-1: на iPhone бар уезжал в середину экрана. `position: fixed; bottom: 0`
   держится за ЛЕЙАУТ-вьюпорт, а Safari при схлопывании/разворачивании своей панели
   меняет ВИЗУАЛЬНЫЙ: пока layout не пересчитан, «низ» оказывается выше видимого края,
   и список виден и над баром, и под ним. Поправку считает JS (anchorViewport) и кладёт
   в --vv-bottom; на десктопе и в PWA она ровно 0, то есть ничего не меняет.
   Разметка бара с v033 не менялась — регрессии волн 2–3 здесь нет, это iOS. */
.tabbar { position: fixed; bottom: 0; left: 0; right: 0; z-index: 20; display: flex;
  background: var(--sidebar); border-top: 1px solid var(--line);
  min-height: var(--tabbar-h); padding-bottom: env(safe-area-inset-bottom);
  transform: translateY(var(--vv-bottom, 0px)); }
.tabbar a { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 3px; padding: 8px 0 6px; font-size: 12px; line-height: 14px; font-weight: 600; color: var(--ink-2); }
.tabbar a span { line-height: 0; }
.tabbar a.on { color: var(--accent); }
.tabbar a.on span { line-height: 0; }

h2 { font-size: 17px; line-height: 22px; color: var(--ink); font-weight: 700;
  margin: 24px 0 0; padding: 0 8px 8px; border-bottom: 1px solid var(--line); }
h2:first-child { margin-top: 8px; }
.section-head { display: flex; justify-content: space-between; align-items: baseline; }

.card { background: var(--surface-raised); border: 1px solid var(--line); border-radius: var(--radius-md);
  padding: 12px 16px; margin-bottom: 8px; }
.card.accent { background: var(--surface-2); border-color: transparent; }

.prio-hero { margin: 0 0 8px; }
.prio-hero .lbl { font-size: 17px; line-height: 22px; font-weight: 700; color: var(--ink);
  margin: 24px 0 0; padding: 0 8px 8px; border-bottom: 1px solid var(--line); }
.prio-hero ol { margin: 8px 0 4px; padding: 0 8px 0 30px; color: var(--ink); }
.prio-hero li { margin: 4px 0; font-size: 16px; }

.row { display: flex; align-items: flex-start; gap: 12px; min-height: var(--row-min);
  padding: 12px 8px; border-bottom: 1px solid var(--line); }
.row:last-child { border-bottom: 0; }
/* та же грабля, что с .ds в v031: display:flex перебивает атрибут hidden, и строка,
   спрятанная под раскрытую карточку (Р-15.18), оставалась видимой вместе с ней. */
.row[hidden] { display: none; }
.row .t { flex: 1; min-width: 0; }
.row .t .ti { overflow: hidden; text-overflow: ellipsis; }
.row .t .sub { color: var(--ink-2); font-size: 14px; line-height: 18px; margin-top: 2px; }
.time { font-variant-numeric: tabular-nums; font-weight: 600; color: var(--ink); white-space: nowrap;
  line-height: 22px; }
.pill { font-size: 14px; padding: 2px 8px; border-radius: var(--radius-full); background: var(--surface-2); color: var(--ink-2); }
.pill.p1 { background: var(--danger-soft); color: var(--danger-soft-ink); font-weight: 700; }
.pill.p2 { background: var(--today-soft); color: var(--today-ink); }
.dot { width: 9px; height: 9px; border-radius: 50%; flex: none; }
.dot.green { background: var(--done); } .dot.red { background: var(--danger); }
.dot.amber { background: var(--today-ink); } .dot.grey { background: var(--mark); }

.chk { width: var(--checkbox); height: var(--checkbox); border: 1.5px solid var(--mark);
  border-radius: var(--radius-xs); flex: none; background: var(--bg); display: grid; place-items: center;
  color: transparent; padding: 0; margin-top: 1px; cursor: pointer; }
.chk:active { border-color: var(--accent); }
.done .ti { color: var(--ink-2); }
/* Р-15.2: у выполненной задачи кружок закрашен галкой — иначе не видно, что
   повторный тап её ВЕРНЁТ, и жест остаётся необнаружимым. */
.task-row.done .chk-round { background: var(--accent); border-color: var(--accent); }
.task-row.done .chk-round::after { content: ''; width: 5px; height: 10px; border: solid var(--on-accent);
  border-width: 0 2px 2px 0; transform: translateY(-1px) rotate(45deg); }

.btn-gold { background: var(--accent); color: var(--on-accent); border: 0; border-radius: var(--radius-sm);
  padding: 10px 14px; font-weight: 600; font-size: 16px; cursor: pointer; }
.btn-gold.wide { width: 100%; padding: 13px; margin-top: 6px; }
.btn { background: var(--surface-2); color: var(--ink); border: 0; border-radius: var(--radius-sm);
  padding: 8px 14px; font-size: 16px; cursor: pointer; }
.btn.ack { background: var(--done); color: var(--on-accent); font-weight: 700; }
.btn.ghost { background: transparent; border: 0; color: var(--accent); }

.badge-unack { background: var(--danger-soft); color: var(--danger-soft-ink); border-radius: var(--radius-sm); padding: 8px 12px;
  margin-bottom: 8px; font-size: 14px; display: flex; justify-content: space-between; align-items: center; gap: 8px; }

        /* меньше 16px = авто-зум iOS (П-в036-1) */
.qa-preview { background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--radius-sm);
  padding: 10px 12px; margin-bottom: 8px; font-size: 14px; }
.qa-preview b { color: var(--ink); }

.front-hdr { display: flex; align-items: center; gap: 8px; }
.front-hdr .nx { color: var(--ink-2); font-size: 14px; }

/* Р-15.3: карточка задачи ОБЯЗАНА быть выше листа дня (.ds = 50). При z-index 40
   она рисовалась под полупрозрачным оверлеем листа, который съедал клики —
   третий случай семьи «слои» после мёртвого слоя v031 и ручки Н0 v032. */
.sheet { position: fixed; inset: 0; z-index: 70; background: rgba(0,0,0,.28);
  display: flex; align-items: flex-end; }
.sheet .panel { background: var(--surface-raised); width: 100%; max-width: var(--list-max); margin: 0 auto;
  border-radius: var(--radius-lg) var(--radius-lg) 0 0; box-shadow: var(--shadow-pop);
  padding: 20px 16px calc(20px + env(safe-area-inset-bottom)); }
.sheet h3 { color: var(--ink); font-size: 17px; line-height: 22px; font-weight: 700; margin: 0 0 12px; }
.field { margin: 10px 0; } .field label { display: block; color: var(--ink-2); font-size: 14px; margin-bottom: 4px; }
.field input, .field select { width: 100%; border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 10px; font-size: 16px; }
.grid4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; }
.grid4 button { border: 1px solid var(--line); background: var(--surface-raised); border-radius: var(--radius-sm); padding: 10px 0; font-weight: 700; }
.grid4 button.on { background: var(--accent); color: var(--on-accent); border-color: var(--accent); }
.sheet-actions { display: flex; gap: 8px; margin-top: 14px; }
.sheet-actions .btn, .sheet-actions .btn-gold { flex: 1; text-align: center; }

.jform { margin: 6px 0 12px; }
.jform textarea { width: 100%; border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 11px 12px;
  font: inherit; resize: vertical; }
.jform-row { display: flex; gap: 8px; margin-top: 6px; }
.jform-row select { border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 10px; font-size: 16px; }
.jform-row .btn-gold { flex: 1; }
.jentry { padding: 12px 8px; border-bottom: 1px solid var(--line); }
.jentry .jd { color: var(--ink-2); font-weight: 600; font-size: 14px; }
.jentry .jt { margin-top: 2px; }

.toast { position: fixed; left: 50%; bottom: calc(var(--tabbar-h) + 24px);
  transform: translate(-50%, var(--vv-bottom, 0px));
  background: var(--ink); color: var(--bg); padding: 10px 16px; border-radius: var(--radius-sm);
  box-shadow: var(--shadow-pop); z-index: 80; font-size: 14px; }

.login-body { display: flex; align-items: center; justify-content: center;
  min-height: 100vh; min-height: -webkit-fill-available; min-height: 100dvh;
  background: var(--bg); }
.login-card { background: var(--surface-raised); border-radius: var(--radius-md); padding: 32px 24px;
  width: 320px; text-align: center; box-shadow: var(--shadow-pop); }
.login-brand { font-size: 28px; line-height: 34px; font-weight: 700; color: var(--ink); }
.login-sub { color: var(--ink-2); font-size: 14px; margin-bottom: 20px; }
.login-card input { width: 100%; padding: 12px; font-size: 16px; }
.login-err { color: var(--danger); font-size: 14px; margin-top: 8px; min-height: 18px; }

/* чипы под лентой «Сегодня» + лист триажа инбокса */
.chips { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
.chip { font-size: 14px; padding: 6px 12px; border-radius: var(--radius-full); border: 1px solid var(--line);
  background: var(--surface-2); color: var(--ink); }
button.chip { cursor: pointer; }
.inbox-chip { border-color: var(--accent); background: var(--today-soft); color: var(--today-ink); font-weight: 600; }
.inbox-list { max-height: 60vh; overflow-y: auto; margin: 4px 0 8px; }
.inbox-item { border-bottom: 1px solid var(--line); padding: 10px 0; }
.inbox-text { margin-bottom: 8px; }
.inbox-acts { display: flex; gap: 8px; flex-wrap: wrap; }
.inbox-acts .btn { flex: 1; min-width: 90px; text-align: center; }

/* бриф дня (свёрнутый блок вверху «Сегодня») */
.brief-box { background: var(--surface-2); border-radius: var(--radius-md); padding: 12px 16px; margin: 8px 0 16px; }
.brief-fresh { font-size: 14px; }
.brief-title { color: var(--ink); font-weight: 700; margin: 2px 0 6px; }
.brief-headline { margin: 0; padding-left: 20px; }
.brief-headline li { margin: 3px 0; }
.brief-toggle { margin-top: 8px; background: none; border: 0; color: var(--accent); font: inherit;
  font-size: 14px; font-weight: 600; padding: 4px 0; cursor: pointer; }
.brief-sections { margin-top: 6px; }
.brief-sec { margin: 8px 0; }
.brief-sec-title { font-weight: 700; color: var(--ink); font-size: 14px; }

/* вкладка «ИИ» */
.ai-fresh { font-size: 14px; margin-bottom: 8px; }
.ai-header { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; margin-bottom: 8px; }
.ai-digest { color: var(--ink); font-weight: 600; font-size: 14px; text-decoration: underline; white-space: nowrap; }
.ai-stale-banner { background: var(--danger-soft); color: var(--danger-soft-ink); border-radius: var(--radius-sm); padding: 8px 12px;
  font-weight: 600; font-size: 14px; margin-bottom: 8px; }
/* очередь Pavel-а */
.ai-queue { border: 0; background: var(--surface-2); }
.ai-queue .lbl { font-weight: 700; color: var(--ink); margin-bottom: 6px; }
.queue-item { border-top: 1px solid var(--line); padding: 8px 0; cursor: pointer; }
.queue-item:first-of-type { border-top: 0; }
.queue-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.queue-proj { font-weight: 700; color: var(--ink); font-size: 14px; }
.queue-type { background: var(--surface-2); }
.queue-dl { color: var(--danger); font-size: 14px; }
.queue-title { margin: 2px 0; }
.queue-price { font-size: 14px; }
.queue-more { font-size: 14px; margin-top: 8px; }
/* «сделано за неделю» + бейдж молчания + подсветка */
.ai-done { margin: 8px 0; } .ai-done .lbl { font-weight: 700; color: var(--done); font-size: 14px; }
.ai-done ul { margin: 4px 0 0; padding-left: 18px; } .ai-done li { margin: 3px 0; font-size: 14px; }
.ai-badge-silent { display: inline-block; background: var(--today-soft); color: var(--today-ink); border-radius: var(--radius-sm);
  padding: 2px 8px; font-size: 14px; margin: 4px 0; }
.ai-card.ai-flash { box-shadow: 0 0 0 3px var(--accent); transition: box-shadow .3s; }
.ai-card .ai-name { font-size: 16px; margin: 0; }
.ai-st.active { background: var(--done-soft); color: var(--done-soft-ink); }
.ai-st.blocked { background: var(--danger-soft); color: var(--danger-soft-ink); }
.ai-st.paused, .ai-st.closed { background: var(--surface-2); color: var(--ink-2); }
.ai-focus { margin: 6px 0; }
.ai-plan { display: flex; align-items: center; gap: 8px; margin: 4px 0; }
.ai-plan-link { color: var(--ink); text-decoration: underline; }
.ai-next { color: var(--ink-2); font-size: 14px; margin: 6px 0; }
.ai-waiting { margin: 8px 0 4px; padding: 8px 12px; }
.ai-waiting .lbl, .ai-q .lbl { font-weight: 700; color: var(--ink); font-size: 14px; }
.ai-waiting ul, .ai-q ul { margin: 4px 0 0; padding-left: 18px; }
.ai-q { margin-top: 6px; } .ai-link { display: inline-block; margin: 6px 8px 0 0; font-size: 14px; }
.ai-notes { margin-top: 10px; font-size: 14px; }
.md-body { max-height: 62vh; overflow-y: auto; margin: 4px 0 8px; }
.md-body h3, .md-body h4, .md-body h5, .md-body h6 { color: var(--ink); margin: 12px 0 4px; }
.md-body p { margin: 6px 0; } .md-body ul { padding-left: 20px; margin: 6px 0; }
.md-body pre { background: var(--surface-2); padding: 8px; border-radius: var(--radius-sm); overflow-x: auto; font-size: 14px; }
.md-body code { background: var(--surface-2); padding: 1px 4px; border-radius: var(--radius-xs); font-size: 14px; }

/* ===== Задачник 2.0 (план 07 §5 — скелет Things в теме «центра отчётов») ===== */
/* безрамочный список задач (приёмка л: единственная рамка на экране — золотое «Главное») */
.list { margin: 2px 0 4px; }
h2.sec-head { font-size: 17px; line-height: 22px; color: var(--ink); font-weight: 700;
  margin: 24px 0 0; padding: 0 8px 8px; border-bottom: 1px solid var(--line); }
/* кружки-чекбоксы (обводка цвета флага у p1-p3) */
.chk-round { width: var(--checkbox); height: var(--checkbox); border-radius: var(--radius-xs);
  border: 1.5px solid var(--mark); background: var(--bg); flex: none; }
/* Р25: красные элементы строки — только p1-флаг и дедлайн-бейдж; у p1-кружка обводка
   НЕ красная (иначе краснота шире правила), приоритет p1 читается по красному флагу */
.chk-round.p2 { border-color: var(--today-ink); }
.chk-round.p3 { border-color: var(--mark); }
.task-row .ti { display: flex; align-items: center; gap: 6px; }
.flag { font-size: 14px; line-height: 1; }
.flag.p1 { color: var(--danger); } .flag.p2 { color: var(--today-ink); } .flag.p3 { color: var(--ink); }
.wontdo .ti { text-decoration: line-through; color: var(--ink-2); }
/* When ≠ Deadline: дедлайн — единственный красный элемент строки */
.dl { font-size: 14px; line-height: 18px; white-space: nowrap; color: var(--danger); font-weight: 600; }
.dl-hot { color: var(--danger); }
.dl-over { background: var(--danger-soft); color: var(--danger-soft-ink); border-radius: var(--radius-full);
  padding: 1px 8px; }
/* ряд-меню + тап-зоны */
.row-menu { background: none; border: 0; color: var(--ink-2); font-size: 20px; padding: 0 4px;
  flex: none; cursor: pointer; min-width: 32px; }
.row-menu-list { display: flex; flex-direction: column; gap: 8px; margin: 6px 0; }
.row-menu-list .btn { text-align: left; padding: 12px 14px; }
/* анимация завершения */
.task-row.completing .chk-round { background: var(--accent); border-color: var(--accent); }
.task-row.collapsing { opacity: 0; transform: translateX(8px); max-height: 0; padding: 0;
  overflow: hidden; transition: all .5s ease; }
.toast-undo { background: none; border: 0; color: var(--bg); font: inherit; font-weight: 700;
  text-decoration: underline; cursor: pointer; padding: 0 2px; }
/* плавающая «+» */
/* z-index ниже шторки (.sheet = 70): «+» перекрывала кнопки открытой карточки задачи */
.fab { position: fixed; right: 16px; bottom: calc(var(--tabbar-h) + 20px + env(safe-area-inset-bottom));
  z-index: 30; width: 56px; height: 56px; transform: translateY(var(--vv-bottom, 0px));
  border-radius: var(--radius-full); border: 0; background: var(--accent); color: var(--on-accent);
  box-shadow: var(--shadow-pop); display: grid; place-items: center; cursor: pointer; padding: 0; }
.add-input { width: 100%; padding: 10px 12px; font-size: 16px; margin-bottom: 4px; }
/* баннер триажа */
.triage-banner, .triage-entry { display: block; width: 100%; text-align: left; border: 0;
  background: var(--surface-2); color: var(--ink); border-radius: var(--radius-sm); padding: 12px 14px;
  font-weight: 600; font-size: 16px; margin: 6px 0 10px; cursor: pointer; }
.triage-entry { border-width: 1px; background: var(--surface-2); }
/* карточка триажа */
.triage-panel { text-align: center; }
.triage-progress { font-size: 14px; }
.triage-title { font-size: 22px; color: var(--ink); margin: 6px 0 10px; }
.triage-meta { display: flex; flex-wrap: wrap; gap: 6px; justify-content: center; margin-bottom: 8px; }
.triage-reason { font-size: 14px; padding: 2px 8px; border-radius: var(--radius-full); background: var(--danger-soft); color: var(--danger-soft-ink); }
.triage-raw { font-size: 14px; margin: 6px 0 12px; }
.triage-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin: 10px 0; }
.triage-btn { padding: 16px 0; border: 1px solid var(--line); border-radius: var(--radius-md); background: var(--surface-raised);
  font-size: 15px; font-weight: 600; cursor: pointer; min-height: 44px; }
.triage-btn.ok { border-color: var(--done); color: var(--done); }
.triage-btn.warn { border-color: var(--danger); color: var(--danger); }
.triage-more { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 4px; }
.triage-skip { display: block; width: 100%; background: none; border: 0; margin-top: 12px; cursor: pointer; font-size: 14px; }
.triage-summary { font-size: 16px; margin: 10px 0; }
/* Скоро */
.soon-day-head { display: flex; align-items: baseline; justify-content: space-between;
  margin: 20px 0 4px; }
.soon-day-t { font-size: 18px; color: var(--ink); font-weight: 700; }
.soon-plus { background: none; border: 0; color: var(--accent); font-size: 24px; cursor: pointer; padding: 0 6px; }
.soon-empty { padding: 4px 0 4px 2px; }
.soon-ico { flex: none; width: 22px; text-align: center; }
/* Р27: прыжок к дате, раскрытие недель, ленивая подгрузка */
.soon-jump { display: flex; align-items: center; gap: 8px; margin: 2px 0 8px; font-size: 14px; }
.soon-jump-inp { border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 5px 8px; font-size: 14px; }
.soon-week { cursor: pointer; }
.soon-chev { color: var(--ink-2); flex: none; padding-left: 6px; }
.soon-week-days { padding-left: 6px; border-left: 2px solid var(--line); margin: 2px 0 6px; }
.soon-more-days { }
.btn.wide { width: 100%; margin-top: 8px; }
/* нагрузка дня (F7) — золотая полоска, без красноты */
.load-box { margin: 4px 0 6px; }
.load-txt { font-size: 14px; margin-bottom: 3px; }
.load-bar { height: 6px; background: var(--surface-2); border-radius: var(--radius-full); overflow: hidden; }
.load-fill { height: 100%; background: var(--accent); border-radius: var(--radius-full); }
/* риски сроков (F6) */
.risk-box { background: var(--danger-soft); border-radius: var(--radius-md); padding: 12px 16px; margin: 8px 0; }
.risk-box .lbl { font-weight: 700; color: var(--danger-soft-ink); margin-bottom: 4px; }
.risk-row { margin: 6px 0; display: flex; flex-wrap: wrap; align-items: baseline; gap: 6px; }
.risk-badge { font-size: 14px; padding: 2px 8px; border-radius: var(--radius-full); background: var(--today-soft); color: var(--today-ink); font-weight: 700; }
.risk-badge.crit { background: var(--danger); color: var(--on-accent); }
/* цвет ЯВНО: именно здесь ошибка пряталась от глаза — правило несло только
   font-weight, чернила приходили наследованием и на розовой подложке белели */
.risk-t { font-weight: 600; color: var(--ink); }
.risk-note { flex-basis: 100%; font-size: 14px; }
/* пикер оценки времени (F7) */
.grid6 { display: grid; grid-template-columns: repeat(6, 1fr); gap: 6px; }
.grid6 button { border: 1px solid var(--line); background: var(--surface-raised); border-radius: var(--radius-sm); padding: 10px 0; font-weight: 700; }
.grid6 button.on { background: var(--accent); color: var(--on-accent); border-color: var(--accent); }

/* План 10: карточка задачи (У8), «Сегодня» (У2), БСД (У6) */
.card-title { width: 100%; border: 0; border-bottom: 1px solid var(--line); padding: 4px 0 8px;
  font: 700 17px/22px var(--sans); color: var(--ink); background: transparent; }
.card-title:focus { outline: none; border-bottom-color: var(--accent); }
.card-sub { font-size: 14px; margin: 6px 0 10px; }
.task-card .lbl { color: var(--ink-2); font-size: 14px; margin-bottom: 4px; }
.card-chips { margin-bottom: 10px; }
.chip { border: 1px solid var(--line); background: var(--surface-raised); border-radius: var(--radius-full); padding: 8px 12px;
  font-size: 14px; color: var(--ink); }
.chip.on { background: var(--accent); color: var(--on-accent); border-color: var(--accent); font-weight: 600; }
.card-toggle { width: 100%; border: 1px solid var(--line); background: var(--bg); color: var(--ink); border-radius: var(--radius-sm);
  padding: 11px 0; font-weight: 700; font-size: 15px; margin-bottom: 10px; }
.card-toggle.on { background: var(--today-soft); border-color: var(--accent); color: var(--today-ink); }
.card-acts { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 6px; }
.card-acts .btn { flex: 1 1 auto; }
.card-acts .btn.ok { background: var(--done); color: var(--on-accent); font-weight: 700; }
.card-more { width: 100%; background: transparent; border: 0; color: var(--ink-2);
  padding: 10px 0; font-size: 14px; }
.card-details { border-top: 1px solid var(--line); padding-top: 6px; }

/* ---------- карточка Things-style (план 15 Р-15.1) ---------- */
.card-top { display: flex; align-items: center; gap: 10px; margin-bottom: 2px; }
.card-top .card-title { flex: 1; border-bottom: 0; padding: 2px 0; }
.card-chk { flex: none; }
.card-chk.done { background: var(--done); border-color: var(--done); }
.card-chk.done::after { content: '✓'; color: var(--on-accent); font-size: 14px; line-height: 20px; }
.card-x { flex: none; background: none; border: 0; color: var(--ink-2); font-size: 18px;
  padding: 4px 6px; cursor: pointer; }
/* заметки: markdown-минимум, чек-боксы отмечаются тапом */
.notes { margin: 8px 0 10px; font-size: 14px; line-height: 1.45; }
.notes-ph { padding: 8px 0; cursor: text; }
.notes-line { padding: 1px 0; cursor: text; white-space: pre-wrap; word-break: break-word; }
.notes-line.empty { height: 6px; }
.notes-chk { display: flex; gap: 8px; align-items: flex-start; padding: 3px 0; cursor: pointer; }
.notes-chk .notes-box { flex: none; font-size: 15px; line-height: 1.35; }
.notes-chk.done .notes-txt { color: var(--ink-2); text-decoration: line-through; }
.notes-edit { width: 100%; border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 8px;
  font: inherit; resize: vertical; }
/* строки даты и дедлайна — текст, а не набор контролов */
.card-line { display: flex; align-items: center; gap: 8px; width: 100%; text-align: left;
  background: var(--bg); border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 10px 12px;
  margin-bottom: 6px; font-size: 14px; color: var(--ink); cursor: pointer; }
.card-line.off .card-line-txt { color: var(--ink-2); }
.card-line.hot { border-color: var(--danger); color: var(--danger); }
.card-line-ico { flex: none; }
.card-select { width: 100%; margin-bottom: 6px; }
/* важность — сегмент из двух половин: видно, что выбрано (замечание 8 Pavel-а) */
.imp-seg { margin: 4px 0 10px; }
.imp-seg .seg-btn.on { background: var(--today-soft); border-color: var(--accent); color: var(--today-ink); }
.card-menu { margin-top: 4px; }

/* Р-15.18: та же карточка, раскрытая на месте строки. Рамка и фон отделяют её от
   списка — иначе поля карточки читаются как продолжение соседних строк. */
.row-card { border: 0; border-radius: var(--radius-md); padding: 16px; margin: 8px 0;
  background: var(--surface-raised); box-shadow: var(--shadow-card); }
.task-card-inline .card-title { font-size: 16px; }
.task-card-inline .notes { margin: 6px 0 8px; }
.row.expanded { display: none; }
/* пока карточка раскрыта, плавающая «+» уезжает: инлайн-карточка не под шторкой,
   и кнопка перекрывала бы сегмент важности прямо под пальцем */
body.inline-open .fab { display: none; }

/* ---------- попап даты (Р-15.5), только десктоп ---------- */
.dpop-back { position: fixed; inset: 0; z-index: 85; background: rgba(20,30,45,.35);
  display: flex; align-items: center; justify-content: center; }
.dpop { background: var(--bg); border-radius: var(--radius-md); padding: 14px; width: min(360px, 94vw);
  box-shadow: var(--shadow-pop); }
.dpop-head { display: flex; align-items: center; justify-content: space-between; }
.dpop-title { font-weight: 700; }
.dpop-presets { display: flex; gap: 6px; flex-wrap: wrap; margin: 10px 0; }
.dpop-presets .btn { flex: 1 1 auto; }
.dpop-nav { display: flex; align-items: center; justify-content: space-between; margin-top: 4px; }
.dpop-month { font-weight: 600; }
.dpop-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; margin-top: 6px; }
.dpop-wd { text-align: center; font-size: 14px; color: var(--ink-2); padding: 2px 0; }
.dpop-cell { height: 38px; border: 0; background: transparent; border-radius: var(--radius-sm);
  font-size: 15px; cursor: pointer; }
.dpop-cell:hover { background: var(--bg); }
.dpop-cell.today { box-shadow: inset 0 0 0 1px var(--line); font-weight: 700; }
.dpop-cell.on { background: var(--accent); color: var(--on-accent); font-weight: 700; }
.dpop-cell.empty { pointer-events: none; }
.dpop-time { display: flex; align-items: center; gap: 8px; margin-top: 10px; }
.dpop-time label { color: var(--ink-2); font-size: 14px; }
.dpop-time input { flex: 1; }

/* ---------- мини-редактор строки в неделе/ленте (Р-15.4) ---------- */
.mini-wrap { border-bottom: 1px solid var(--line); }
.mini-wrap:last-child { border-bottom: 0; }
.mini-wrap .row { border-bottom: 0; }
.mini-wrap.on { background: var(--surface-2); border-radius: var(--radius-sm); }
.mini-edit { padding: 2px 0 10px 34px; }
.mini-title { width: 100%; border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 7px 9px;
  font: inherit; margin-bottom: 6px; }
.mini-chips { margin-bottom: 6px; }
.mini-open { width: 100%; }
.card-details .grid2 button, .card-details .grid4 button, .card-details .grid6 button { font-size: 14px; }

.overdue-list .row { border-bottom-color: var(--line); }
.inbox-block { margin: 14px 0 6px; }
.inbox-head { width: 100%; text-align: left; background: var(--surface-2); border: 1px solid var(--line);
  border-radius: var(--radius-sm); padding: 11px 12px; font-size: 14px; font-weight: 600; color: var(--ink); }
.inbox-note { font-size: 14px; padding: 6px 2px; }

.bsd-head { font-size: 14px; color: var(--ink-2); margin: 4px 2px 10px; }
.bsd-group { width: 100%; text-align: left; background: transparent; border: 0; padding: 10px 2px; font-size: 14px; font-weight: 700; color: var(--ink); }
.bsd-row { flex-wrap: wrap; }
.bsd-row.ripe { background: var(--today-soft); }
.bsd-acts { display: flex; gap: 6px; flex-wrap: wrap; flex-basis: 100%; margin-top: 6px; }
.bsd-acts .btn { flex: 1 1 auto; font-size: 14px; padding: 7px 8px; }
.arch-note { font-style: italic; }
.arch-note-btn { flex: none; }

/* Планы — прогресс фронтов (план 10 У3) + ритуал БСД (У6.3) */
.plan-card { border: 1px solid var(--line); }
.plan-bar { height: 6px; background: var(--surface-2); border-radius: var(--radius-xs); overflow: hidden; margin: 8px 0 4px; }
.plan-fill { height: 100%; background: var(--accent); }
.plan-count { font-size: 14px; margin-bottom: 6px; }
.plan-ev { display: flex; gap: 8px; align-items: baseline; font-size: 14px; padding: 3px 0; }
.plan-ev-ico { color: var(--done); flex: none; }
.plan-ev-t { min-width: 0; }
.plan-blocker { color: var(--danger); font-size: 14px; margin-top: 4px; }
.bsd-banner { background: var(--surface-2); }
.bsd-dismiss { background: var(--danger-soft); color: var(--danger-soft-ink); border-radius: var(--radius-sm); padding: 8px 10px;
  font-size: 14px; margin: 8px 0; }

/* Пульт (план 09 У12) и Транзит (У8) */
.tab-ico { position: relative; display: inline-block; }
.tabbar .tab-badge { position: absolute; top: -4px; right: -10px; min-width: 16px; height: 16px;
  padding: 0 4px; border-radius: var(--radius-sm); background: var(--danger); color: var(--on-accent);
  font-size: 11px; line-height: 16px; font-weight: 700; text-align: center; }
.pult-item { border: 1px solid var(--line); }
.pult-item.answered { opacity: .6; border-left-color: var(--line); }
.pult-ref { background: var(--surface-2); color: var(--ink); }
.pult-age { font-size: 14px; color: var(--ink-2); }
.pult-age.hot { color: var(--danger); font-weight: 700; }
.pult-form { margin-top: 8px; }
.pult-acts { display: flex; gap: 6px; flex-wrap: wrap; }
.pult-acts .btn, .pult-acts .btn-gold { flex: 1 1 auto; }
.pult-done { font-size: 14px; color: var(--done); margin: 6px 0; }
.queue-proj { cursor: pointer; }
.transit-box { border: 1px solid var(--line); }
.transit-row { display: flex; gap: 8px; align-items: baseline; padding: 6px 0;
  border-top: 1px solid var(--line); }
.transit-row:first-of-type { border-top: 0; }
.transit-row .ti { font-size: 14px; word-break: break-all; }
.transit-age { flex: none; width: 54px; font-size: 14px; color: var(--ink-2); }
.transit-row.warn .transit-age { color: var(--today-ink); font-weight: 700; }
.transit-row.alert .transit-age { color: var(--danger); font-weight: 700; }
.transit-row.alert .ti { font-weight: 600; }
.transit-await { margin: 4px 0 2px; font-size: 14px; font-weight: 700; color: var(--today-ink); }
.transit-grp { margin: 10px 0 2px; font-size: 14px; color: var(--ink-2); }
.transit-note { font-size: 14px; margin-top: 6px; }

/* кликабельные дедлайны и риски (план 09 У13) + «Жду от других» (У4) */
.risk-row.tappable, .dl-row, .waiting-row { cursor: pointer; }
.risk-row.tappable:active, .dl-row:active, .waiting-row:active { opacity: .6; }
.dl-when { font-weight: 700; margin: 2px 0 6px; }

/* итог задачи (план 09 У1): пикер «внешняя», поле итога, показ записанного */
.grid2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: 6px; }
.grid2 button { border: 1px solid var(--line); background: var(--surface-raised); border-radius: var(--radius-sm); padding: 10px 0; font-weight: 700; }
.grid2 button.on { background: var(--accent); color: var(--on-accent); border-color: var(--accent); }
.result-input { width: 100%; border: 1px solid var(--line); border-radius: var(--radius-sm);
  padding: 10px; font: inherit; margin: 8px 0 4px; resize: vertical; }
.result-note { background: var(--surface-2); border-radius: var(--radius-sm); padding: 8px 10px;
  font-size: 14px; white-space: pre-wrap; }

/* Архив внутри вкладки «Задачи»: сегмент-переключатель, фильтры, строки */
.seg { display: flex; gap: 0; margin: 6px 0 10px; border: 1px solid var(--line);
  border-radius: var(--radius-sm); overflow: hidden; }
.seg-btn { flex: 1; background: var(--surface-raised); border: 0; padding: 9px 0; font-size: 14px;
  color: var(--ink-2); cursor: pointer; }
.seg-btn.on { background: var(--accent); color: var(--on-accent); font-weight: 700; }
.arch-filters { margin: 0 0 6px; }
.chip.on { border-color: var(--accent); background: var(--accent); color: var(--on-accent); font-weight: 600; }
.arch-glyph { flex: none; width: 22px; text-align: center; color: var(--ink-2); }
.arch-glyph.done { color: var(--done); }
.arch-glyph.wont_do { color: var(--danger); }
.arch-row .ti { color: var(--ink-2); }
.arch-back { flex: none; padding: 6px 10px; }

.sheet[hidden] { display: none; }


/* строка напоминания в карточке задачи (план 11 Н1) */
.remind-row { width: 100%; text-align: left; background: var(--surface-2); border: 1px solid var(--line);
  border-radius: var(--radius-sm); padding: 10px 12px; font-size: 14px; color: var(--ink);
  font-weight: 600; margin-bottom: 10px; }
.remind-row.off { color: var(--ink-2); font-weight: 400; }
.remind-info { font-size: 14px; margin-top: 8px; }
.remind-quiet { background: var(--today-soft); color: var(--today-ink); border-radius: var(--radius-sm); padding: 8px 10px;
  font-size: 14px; margin-top: 8px; }

/* ---------- Календарь (план 13) ---------- */
.cal-head { display: flex; align-items: center; gap: 8px; margin: 4px 0 8px; }
.cal-title { flex: 1; font-weight: 700; font-size: 18px;
  color: var(--ink); }
.cal-nav { width: 34px; height: 34px; border: 1px solid var(--line); background: var(--surface-raised);
  border-radius: var(--radius-sm); font-size: 18px; color: var(--ink); }
.cal-today { padding: 7px 10px; font-size: 14px; }
.cal-seg { margin-bottom: 8px; }
.cal-wd { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; margin-bottom: 2px; }
.cal-wd-c { text-align: center; font-size: 14px; color: var(--ink-2); padding: 2px 0; }
.cal-wd-c.we { color: var(--danger); }
.cal-grid { display: grid; grid-template-columns: repeat(7, 1fr);
  grid-auto-rows: 1fr; gap: 2px; touch-action: pan-y; }
.cal-cell { position: relative; aspect-ratio: 1 / 1; border: 1px solid transparent;
  border-radius: var(--radius-sm); background: var(--surface-2); display: flex; flex-direction: column;
  align-items: center; justify-content: flex-start; gap: 2px; padding: 4px 0 0;
  font: inherit; overflow: hidden; }
.cal-cell.other { opacity: .38; }
.cal-cell.we .cal-num { color: var(--danger); }
.cal-num { font-size: 14px; font-variant-numeric: tabular-nums; color: var(--ink);
  width: 24px; height: 24px; line-height: 24px; text-align: center; border-radius: 50%; }
.cal-cell.today .cal-num { background: var(--accent); color: var(--on-accent); font-weight: 700; }
.cal-cell.sel { border-color: var(--accent); box-shadow: inset 0 0 0 1px var(--accent); }
/* Ф5: уголок на дне с непогашенной просрочкой — листая назад, видно где осталось */
.cal-cell.late::after { content: ''; position: absolute; top: 0; right: 0;
  border: 6px solid transparent; border-top-color: var(--danger); border-right-color: var(--danger);
  border-top-right-radius: 9px; }
/* Ф1: тепловая карта — та же клетка, другая отрисовка, второго запроса не нужно */
.cal-cell.heat { background: rgba(26,58,92,calc(var(--w) * .55)); }
.cal-cell.heat .cal-num { color: var(--ink); }
.cal-cell.heat.we .cal-num { color: var(--danger); }   /* заливка не должна съедать выходные */
.cal-dots { display: flex; gap: 2px; align-items: center; }
.cal-dot { flex: none; width: 5px; height: 5px; padding: 0; border: 0;
  border-radius: 50%; background: var(--accent); }
.cal-dot.k-sig { background: var(--done); } .cal-dot.k-dl { background: var(--danger); }
.cal-dot.k-pay { background: var(--today-ink); } .cal-dot.k-done { background: var(--mark); }
.cal-more { font-size: 14px; color: var(--ink-2); }
.cal-cellmode { width: 100%; background: transparent; border: 0; padding: 8px 0;
  font-size: 14px; }
.cal-day-head { margin-top: 6px; }
.cal-overdue { width: 100%; text-align: left; background: var(--danger-soft); color: var(--danger-soft-ink);
  border: 0; border-radius: var(--radius-sm); padding: 10px 12px; font-size: 14px; font-weight: 600; }
.cal-allday-lbl { font-size: 14px;
  margin: 10px 2px 2px; }
.cal-empty { border: 1px dashed var(--line); border-radius: var(--radius-md); margin-top: 6px; }
.cal-range { font-size: 14px; }
.cal-remind, .cal-note { font-size: 14px; }
.cal-note { font-style: italic; }
.cal-time-field input { width: 100%; }
.cal-clash { background: var(--today-soft); color: var(--today-ink); border-radius: var(--radius-sm); padding: 8px 10px;
  font-size: 14px; margin-top: 8px; }

/* ---------- Лист дня с часовой линейкой (план 13 §10) ---------- */
.ds { position: fixed; inset: 0; z-index: 50; background: rgba(20,30,45,0);
  display: flex; align-items: flex-end; transition: background .22s ease; }
.ds.on { background: rgba(20,30,45,.4); }
/* display:flex перебивает атрибут hidden — без этой строки закрытый лист
   остаётся прозрачным слоем на весь экран и съедает тапы по сетке */
.ds[hidden] { display: none; }
.ds-panel { background: var(--bg); width: 100%; max-width: 680px; margin: 0 auto;
  border-radius: var(--radius-lg) var(--radius-lg) 0 0; height: 88vh; display: flex; flex-direction: column;
  transform: translateY(100%); transition: transform .25s cubic-bezier(.2,.8,.2,1); }
.ds.on .ds-panel { transform: translateY(0); }
body.ds-open { overflow: hidden; }          /* тело под листом не скроллится */
.ds-grip { width: 38px; height: 4px; border-radius: var(--radius-xs); background: var(--line);
  margin: 8px auto 4px; flex: none; }
.ds-head { display: flex; align-items: center; gap: 6px; padding: 4px 12px 8px;
  border-bottom: 1px solid var(--line); flex: none; }
.ds-title { flex: 1; font-weight: 700; font-size: 17px;
  color: var(--ink); }
.ds-plus { color: var(--accent); font-weight: 700; }
.ds-fixed { flex: none; padding: 8px 12px; border-bottom: 1px solid var(--line);
  max-height: 34vh; overflow-y: auto; }     /* закреплена: не уезжает с линейкой */
/* min-height:0 обязателен: flex-элемент по умолчанию не сжимается ниже своего
   содержимого, и часовая линейка вылезала за нижний край листа (П-в034-1). */
.ds-scroll { flex: 1; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; }
/* Низкое окно (ноутбук, ужатое окно): двух конкурирующих скроллов не хватает на
   экран — список дня зажимался в 34vh и обрезался «под календарём». На такой высоте
   лист становится ОДНИМ скроллом: сначала весь список дня, ниже линейка (П-в034-1). */
@media (max-height: 620px) {
  .ds-panel { height: 96vh; overflow-y: auto; -webkit-overflow-scrolling: touch; }
  .ds-head { position: sticky; top: 0; background: var(--bg); z-index: 2; }
  .ds-fixed { max-height: none; overflow: visible; flex: none; }
  .ds-scroll { overflow: visible; flex: none; }
}
.ds-grid { position: relative; margin: 0 12px 40px 52px; }
.ds-hour { position: absolute; left: -52px; right: 0; border-top: 1px solid var(--line); }
.ds-hour.night { background: repeating-linear-gradient(180deg, var(--surface-2) 0 2px, transparent 2px 6px); }
.ds-hour-lbl { position: absolute; left: 0; top: -7px; width: 44px; text-align: right;
  font-size: 14px; color: var(--ink-2); font-variant-numeric: tabular-nums; }
.ds-block { position: absolute; left: 0; right: 0; background: var(--surface-2);
  border-radius: var(--radius-sm); padding: 3px 8px; overflow: hidden; font-size: 14px; }
.ds-block.imp { background: var(--today-soft); }
.ds-block.done { opacity: .55; }
.ds-block.done .ds-b-title { text-decoration: line-through; }
.ds-b-time { font-size: 14px; color: var(--ink-2); font-variant-numeric: tabular-nums; }
.ds-b-title { font-weight: 600; line-height: 1.2; }
/* П-в034-2: календарь показывает заголовок и ОДНУ строку заметки/итога. После
   миграции notes в отражения полез служебный контекст PA на пол-экрана («текст
   большой строкой сверху», 18.08). Полный текст — только в карточке. */
.cal-clamp { display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical;
  overflow: hidden; text-overflow: ellipsis; word-break: break-word; }
.ds-b-sub { font-size: 14px; color: var(--ink-2); }
.ds-b-sub.note { font-style: italic; }
.ds-grip-b { position: absolute; left: 0; right: 0; bottom: 0; height: 12px;
  cursor: ns-resize; touch-action: none; }
.ds-grip-b::after { content: ''; position: absolute; left: 50%; bottom: 3px; width: 26px;
  height: 3px; margin-left: -13px; border-radius: var(--radius-xs); background: var(--line); }
.ds-sig { position: absolute; left: 0; right: 0; font-size: 14px; color: var(--done);
  border-top: 1px dashed var(--done); padding-left: 2px; }
.ds-now { position: absolute; left: -6px; right: 0; height: 2px; background: var(--danger); }
.ds-now::before { content: ''; position: absolute; left: -4px; top: -3px; width: 8px;
  height: 8px; border-radius: 50%; background: var(--danger); }
.ds-ghost { position: absolute; left: 0; right: 0; background: rgba(227,181,5,.28);
  border: 1px dashed var(--accent); border-radius: var(--radius-sm); font-size: 14px; color: var(--today-ink);
  padding: 2px 6px; }
.ds-input { position: absolute; left: 0; right: 0; background: var(--surface-raised); border: 1px solid var(--accent);
  border-radius: var(--radius-sm); padding: 6px; box-shadow: var(--shadow-card); z-index: 3; }
.ds-in-row { display: flex; gap: 6px; }
.ds-in { flex: 1; border: 0; font: inherit; font-size: 15px; padding: 4px 2px; outline: none; }
.ds-in-ok { padding: 6px 12px; }
.ds-in-remind { background: transparent; border: 0; color: var(--ink); font-size: 14px;
  padding: 4px 2px; text-align: left; }
.ds-skeleton { padding: 12px; }
.ds-sk-row { height: 44px; border-radius: var(--radius-sm); background: var(--surface-2); margin-bottom: 8px;
  animation: sk 1.2s ease-in-out infinite; }
@keyframes sk { 0%,100% { opacity: .55; } 50% { opacity: .9; } }

/* короткий блок: время и название одной строкой, без переносов */
.ds-block.mini { display: flex; align-items: center; gap: 6px; padding: 2px 6px; overflow: hidden; }
.ds-block.mini .ds-b-time { flex: 0 0 auto; margin: 0; }
.ds-block.mini .ds-b-title { flex: 1 1 auto; white-space: nowrap; overflow: hidden;
  text-overflow: ellipsis; font-size: 14px; line-height: 1.1; }

/* ---------- Неделя (план 14 Н1): полоса дат + дни списками ---------- */
.wk-strip { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px;
  padding: 6px 8px 10px; position: sticky; top: 0; z-index: 5;
  background: var(--bg); border-bottom: 1px solid var(--line); }
.wk-cell { background: var(--surface-2); border: 0; border-radius: var(--radius-sm); padding: 6px 2px 5px;
  display: flex; flex-direction: column; align-items: center; gap: 2px; cursor: pointer; }
.wk-wd { font-size: 14px; color: var(--ink-2); text-transform: lowercase; }
.wk-num { font-weight: 700; font-size: 15px; font-variant-numeric: tabular-nums; }
.wk-cell.today .wk-num { background: var(--accent); color: var(--on-accent); border-radius: 50%;
  width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; }
.wk-cell.drop { outline: 2px solid var(--accent); outline-offset: -2px; }
.wk-day { padding: 2px 0 6px; }
.wk-day-head { display: block; width: 100%; text-align: left; background: none; border: 0; font-weight: 700; font-size: 15px; color: var(--ink);
  padding: 10px 12px 4px; cursor: pointer; }
.wk-day-head.today { color: var(--today-ink); }
.wk-free { padding: 2px 12px 8px; font-size: 14px; }

/* Н3.1: «не разобрана» — одна точка, без текста */
.inbox-dot { display: inline-block; width: 6px; height: 6px; border-radius: 50%;
  background: var(--accent); margin-right: 5px; vertical-align: middle; }

/* Н2: строка «в руке» и цель броска */
.drag-src { opacity: .35; }
.drag-ghost { position: fixed; z-index: 90; pointer-events: none; max-width: 62vw;
  background: var(--surface-raised); color: var(--ink); font-size: 14px; padding: 5px 9px;
  border-radius: var(--radius-sm); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  box-shadow: var(--shadow-pop); }
.cal-cell.drop, .ds-grid.drop { outline: 2px solid var(--accent); outline-offset: -2px; }
.toast-undo { background: none; border: 0; color: var(--bg); font: inherit; font-weight: 700;
  text-decoration: underline; cursor: pointer; padding: 0 2px; }
.toast-btn { background: none; border: 0; color: var(--bg); font-weight: 700; text-decoration: underline;
  font-size: 14px; padding: 0 2px; cursor: pointer; }

/* Полоса дат внутри листа: цель броска, пока идёт перенос (Н2 п.2) */
.ds-dropstrip { position: absolute; left: 0; right: 0; top: 0; z-index: 3;
  display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; padding: 6px 8px;
  background: var(--surface-2); border-bottom: 1px solid var(--line);
  box-shadow: var(--shadow-card); }


/* ================= Волна 2 плана 15: десктоп-верстак ================= */

/* Р-15.9: сайдбар. Появляется от 900px, нижний таб-бар при этом не нужен. */
.sidebar { position: fixed; left: 0; top: 0; bottom: 0; width: var(--sidebar-w);
  padding: 16px 12px; background: var(--sidebar); overflow-y: auto; z-index: 15; }
.sidebar[hidden] { display: none; }
.side-nav { display: flex; flex-direction: column; gap: 2px; }
.side-nav a { display: flex; align-items: center; gap: 10px; min-height: 36px; padding: 0 10px;
  border-radius: var(--radius-sm); color: var(--ink); text-decoration: none; font-size: 16px; }
.side-nav a:hover { background: var(--surface-2); }
.side-nav a.on { background: var(--selection); color: var(--ink); }
.side-nav a.side-sub { font-size: 16px; color: var(--ink); }
.side-count { margin-left: auto; color: var(--ink-2); font-size: 14px; font-weight: 400; }
.side-search { width: 100%; margin: 12px 0 4px; padding: 8px 10px; text-align: left;
  border: 0; border-radius: var(--radius-sm); background: var(--surface-2); color: var(--ink-2);
  cursor: pointer; font-size: 16px; display: flex; align-items: center; gap: 10px; }
.side-kbd { margin-left: auto; color: var(--ink-2); font-size: 14px; }
.side-lbl { margin: 16px 0 4px; padding: 0 10px; font-size: 14px; font-weight: 600; color: var(--ink-2); }
.side-fronts { display: flex; flex-direction: column; gap: 2px; }
.side-front { display: flex; align-items: center; gap: 10px; text-align: left; background: none; border: 0;
  border-radius: var(--radius-sm); min-height: 36px; padding: 0 10px; font-size: 16px; color: var(--ink);
  cursor: pointer; }
.side-front i { margin-left: auto; color: var(--ink-2); font-style: normal; font-size: 14px; }
.side-front:hover { background: var(--surface-2); }
.side-front.on { background: var(--selection); }
.side-help { margin-top: 16px; width: 100%; background: none; border: 0; color: var(--ink-2);
  font-size: 14px; cursor: pointer; text-align: left; padding: 6px 10px; }
@media (min-width: 900px) {
  body.wide .tabbar { display: none; }
  body.wide #main { margin-left: var(--sidebar-w); padding: 48px 32px 32px; }
  body.wide .fab { display: none; }        /* на широком экране вход — строка «Новая задача» и клавиша N */
}
.front-chip { margin: 4px 0 8px; }

/* Р-15.10: поиск */
.search-back { position: fixed; inset: 0; z-index: 88; background: rgba(20,30,45,.35);
  display: flex; align-items: flex-start; justify-content: center; padding-top: 8vh; }
.search-panel { background: var(--bg); border-radius: var(--radius-md); width: min(620px, 94vw); padding: 12px;
  box-shadow: var(--shadow-pop); max-height: 76vh; display: flex; flex-direction: column; }
.search-input { width: 100%; font-size: 17px; padding: 10px 12px; border: 1px solid var(--line);
  border-radius: var(--radius-sm); }
.search-hint { font-size: 14px; margin: 6px 2px; }
.search-res { overflow-y: auto; }
.search-grp { font-size: 14px; color: var(--ink-2);
  margin: 10px 2px 4px; }
.search-row { display: block; width: 100%; text-align: left; background: none; border: 0;
  border-bottom: 1px solid var(--line); padding: 8px 4px; cursor: pointer; }
.search-row:hover { background: var(--surface-2); }
.search-row .ti { font-size: 14px; }
.search-row .sub { color: var(--ink-2); font-size: 14px; }

/* Р-15.11: мультивыбор */
.row.sel { background: var(--selection); border-radius: var(--radius-sm); }
body.sel-mode .row { cursor: copy; }
.sel-bar { position: fixed; left: 50%; transform: translate(-50%, var(--vv-bottom, 0px));
  bottom: calc(var(--tabbar-h) + 14px); z-index: 82;
  display: flex; gap: 6px; align-items: center; flex-wrap: wrap; justify-content: center;
  background: var(--surface-raised); color: var(--ink); padding: 8px 10px; border-radius: var(--radius-md);
  box-shadow: var(--shadow-pop); max-width: 94vw; }
body.wide .sel-bar { bottom: 24px; }
.sel-bar .btn { padding: 6px 10px; font-size: 14px; }
.sel-count { font-weight: 700; margin-right: 4px; font-size: 14px; }
.list-tools { display: flex; gap: 6px; margin: 6px 0 2px; }
.list-tools .btn { padding: 6px 10px; font-size: 14px; }
.list-tools .btn.on { background: var(--accent); color: var(--on-accent); }

/* Р-15.12: каретка списка и подсказка по клавишам */
.row.cursor { box-shadow: inset 2px 0 0 var(--accent); }
.key-help { display: flex; flex-direction: column; gap: 4px; margin: 6px 0; }
.key-row { display: flex; gap: 10px; font-size: 14px; }
.key-k { flex: none; width: 130px; font-family: ui-monospace, Menlo, monospace; color: var(--ink); }
.key-v { color: var(--ink-2); }

/* Р-15.13: один блок «🛠 Разбор» вместо россыпи служебных плашек */
.service-box { margin: 14px 0 6px; border-top: 1px solid var(--line); padding-top: 8px; }
.service-head { width: 100%; text-align: left; background: none; border: 0; color: var(--ink-2);
  font-size: 14px; font-weight: 600; padding: 6px 8px; cursor: pointer; }
.service-body { padding-top: 4px; }


/* ================= Волна 3 плана 15 ================= */

/* П-в035-1: на узком экране заголовок карточки жался между галкой и крестиком и
   обрезался в поле ввода. Шапка переносится, поле занимает всю ширину строки. */
@media (max-width: 520px) {
  .card-top { flex-wrap: wrap; row-gap: 4px; }
  .card-top .card-title { order: 3; flex: 1 0 100%; font-size: 17px; }
  .card-chk { order: 1; }
  .card-x { order: 2; margin-left: auto; }
  .card-line { padding: 12px; }
  .card-line-txt { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .row-card { padding: 10px 8px; }
}

/* Р-15.14: повтор */
.rep-mark { color: var(--ink); margin-right: 4px; font-size: 14px; }
.rep-line .card-line-ico { color: var(--ink); }
.rep-seg, .rep-mode { margin: 8px 0; }
.rep-days { margin: 6px 0; }
.rep-interval { display: flex; align-items: center; gap: 8px; margin: 8px 0; }
.rep-interval input { width: 70px; }
.rep-preview { margin: 6px 0 2px; font-size: 14px; }

/* Р-15.15 + П-в036-2: свайпы. Под уезжающей строкой открывается подложка с иконкой
   и подписью — как в Things: видно, ЧТО произойдёт, если отпустить. До порога она
   приглушена, на пороге вспыхивает (класс .armed) и отдаёт вибрацией. */
.task-row { touch-action: pan-y; }
.list, .mini-wrap { position: relative; }        /* подложке нужен позиционированный родитель */
.row.swiping { position: relative; z-index: 1; background: var(--bg); }
.sw-back { position: absolute; left: 0; right: 0; display: flex; align-items: center;
  justify-content: space-between; border-radius: var(--radius-sm); padding: 0 14px; z-index: 0;
  color: var(--on-accent); font-size: 14px; font-weight: 600; opacity: .45; transition: opacity .12s ease; }
.sw-back.armed { opacity: 1; }
.sw-back.to-do { background: var(--done); }
.sw-back.to-move { background: var(--accent); }
.sw-back .sw-side { display: none; align-items: center; gap: 6px; }
.sw-back.to-do .sw-do { display: inline-flex; }      /* вправо — «✓ Выполнить» слева */
.sw-back.to-move .sw-move { display: inline-flex; margin-left: auto; }   /* влево — справа */

/* Р-15.16: мобильный капчер — ввод сразу под шапкой, бриф компактно */
@media (max-width: 520px) {
  .brief-box.compact .brief-headline li + li { display: none; }
  .brief-box.compact .brief-fresh { display: none; }
}


/* ================= План 17: доска разбора (только широкий экран) =================
   Никаких литеральных цветов — только роли палитры (§5 плана: иначе повторим
   П-в042-1, и сторож из v043 это поймает). */
.board-head { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap;
  margin: 4px 0 10px; }
.board-title { font-weight: 700; font-size: 18px;
  color: var(--ink); }
.board-counter { font-size: 14px; font-weight: 600; color: var(--today-ink);
  background: var(--today-soft); border-radius: var(--radius-full); padding: 3px 10px; }
.board-hint { font-size: 14px; }
.board-cols { display: grid; grid-template-columns: minmax(280px, 1.6fr) repeat(6, minmax(150px, 1fr));
  gap: 8px; align-items: start; }
.board-col { background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--radius-md);
  padding: 8px; min-height: 180px; }
.board-col.src { background: var(--surface-raised); }
.board-col.over { outline: 2px solid var(--accent); outline-offset: -2px; background: var(--surface-2); }
.board-col-head { display: flex; align-items: baseline; justify-content: space-between;
  gap: 6px; margin-bottom: 6px; }
.board-col-t { font-weight: 700; font-size: 14px; color: var(--ink); }
.board-col-n { font-size: 14px; }
.board-col-body { display: flex; flex-direction: column; gap: 6px;
  max-height: calc(100vh - 230px); overflow-y: auto; }
.board-col.src .board-col-body { max-height: calc(100vh - 200px); }
.board-sub { font-size: 14px; margin: 6px 0 2px; }
.board-drop { border: 1px dashed var(--line); border-radius: var(--radius-sm); padding: 14px 8px;
  text-align: center; font-size: 14px; }
.board-card { background: var(--surface-raised); border: 1px solid var(--line);
  border-left: 3px solid var(--line); border-radius: var(--radius-sm); padding: 8px 10px;
  cursor: grab; box-shadow: var(--shadow-card); }
.board-card:hover { border-color: var(--accent); }
.board-card.sel { border-left-color: var(--accent); background: var(--today-soft); }
.board-card.sel .board-card-t { color: var(--today-ink); }
.board-card.dragging { opacity: .5; cursor: grabbing; }
.board-card.leaving { opacity: .35; }
.board-card-t { font-size: 14px; font-weight: 600; color: var(--ink); line-height: 1.25; }
.board-card-sub { font-size: 14px; margin-top: 2px; }
.board-reason { display: inline-block; margin: 4px 4px 0 0; font-size: 14px; font-weight: 700;
  padding: 1px 7px; border-radius: var(--radius-full); background: var(--danger-soft); color: var(--danger-soft-ink); }
.board-narrow { text-align: center; }
.board-narrow-t { font-weight: 700; font-size: 17px;
  color: var(--ink); margin-bottom: 6px; }
@media (max-width: 999px) { .board-cols { display: none; } }


/* ================= Стиль «лёгкий, воздушный» (дизайн-система «Хаб», 30.09) =================
   Разметка и значения — из образцов артефакта (ScreenToday / ScreenPhone / bundle.css).
   Шапки нет: экран начинается с заголовка прямо в контенте. */

/* значки: одноцветные линии 20px, штрих 1.5, цвет mark; звезда «Сегодня» — заливка today */
.ico { width: 20px; height: 20px; flex: none; stroke: var(--mark); fill: none; stroke-width: 1.5;
  stroke-linecap: round; stroke-linejoin: round; }
.ico.today { fill: var(--today); stroke: var(--today); }
.tabbar .ico { width: 24px; height: 24px; }
.tabbar a.on .ico:not(.today) { stroke: var(--accent); }
.side-nav a.on .ico:not(.today) { stroke: var(--ink); }
.side-dot { width: 8px; height: 8px; border-radius: 50%; border: 1.5px solid var(--mark);
  flex: none; margin: 0 6px; }

/* заголовок экрана: 28/34, значок слева, дата или счётчик справа */
.scr-title { display: flex; align-items: center; gap: 10px; margin: 8px 0 8px;
  font-size: 28px; line-height: 34px; font-weight: 700; letter-spacing: -.01em; color: var(--ink); }
.scr-title .ico { width: 26px; height: 26px; }
.scr-side { margin-left: auto; font-size: 17px; line-height: 22px; font-weight: 400; color: var(--ink-2); }
.scr-side a { display: grid; place-items: center; width: 36px; height: 36px; border-radius: var(--radius-sm); }
.scr-side a:hover { background: var(--surface-2); }
body.wide .scr-title { margin-top: 0; }

/* секция «Просрочено» — единственная красная */
h2.sec-head.danger { color: var(--danger); }
.sec-count { font-size: 14px; font-weight: 400; color: var(--ink-2); margin-left: 8px; }

/* строка «+ Новая задача» — вход на широком экране; по клику превращается в поле на месте */
.add-row { display: flex; align-items: center; gap: 12px; min-height: var(--row-min); padding: 0 8px;
  color: var(--ink-2); font-size: 16px; cursor: text; border-radius: var(--radius-sm);
  background: none; border: 0; width: 100%; text-align: left; margin-top: 16px; }
.add-row:hover { background: var(--surface-2); }
.add-row .plus { width: var(--checkbox); height: var(--checkbox); display: grid; place-items: center;
  color: var(--accent); font-size: 20px; line-height: 1; }
.add-inline { display: block; width: 100%; margin-top: 16px; }
.add-inline[hidden], .add-row[hidden] { display: none; }
.qa-preview { background: var(--surface-2); border: 0; border-radius: var(--radius-sm);
  padding: 10px 12px; margin: 8px 0; font-size: 14px; }
.qa-preview b { color: var(--ink); }
/* на телефоне вход один — круглая «+»; строка ввода там не показывается */
body:not(.wide) .add-row, body:not(.wide) .add-inline { display: none; }

/* метки в мета-строке */
.tag { display: inline-flex; align-items: center; gap: 4px; font-size: 14px; line-height: 18px;
  font-weight: 600; padding: 1px 8px; border-radius: var(--radius-full);
  background: var(--surface-2); color: var(--ink-2); }
.tag.main { background: var(--today-soft); color: var(--today-ink); }

/* наведение и фокус — как в образцах */
.task-row:hover, .waiting-row:hover, .dl-row:hover { background: var(--surface-2); }
.chk:focus-visible, .btn:focus-visible, .btn-gold:focus-visible, .add-row:focus-visible,
.side-nav a:focus-visible, .tabbar a:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }

/* статус сети: раньше жил в шапке; теперь маленькая плашка в углу, видна только по делу */
.net-status { position: fixed; top: calc(8px + env(safe-area-inset-top)); right: 12px; z-index: 25;
  display: flex; gap: 8px; font-size: 14px; }
.net-status > [hidden] { display: none; }
.net-status > span { background: var(--surface-raised); box-shadow: var(--shadow-card);
  border-radius: var(--radius-full); padding: 2px 10px; }

/* шестерёнка настроек переехала в сайдбар и в «Пульт» */
.side-set { margin-top: 12px; }
.empty-line { padding: 12px 8px; color: var(--ink-2); }
/* хвост под круглой «+»: последняя строка списка не прячется под кнопкой */
body:not(.wide) main::after { content: ''; display: block; height: 80px; }
.side-count.today { color: var(--today-ink); font-weight: 600; }   /* число дел на сегодня */
.sidebar { scrollbar-width: thin; }

/* Значки внутри строк (стиль 30.09, вторая волна): флажок срока — единственный красный */
.ico.danger { stroke: var(--danger); }
.card-line-ico .ico, .soon-ico .ico { width: 18px; height: 18px; vertical-align: -3px; }
.ti .ico, .ds-sig .ico { width: 14px; height: 14px; vertical-align: -2px; }
.ds-sig .ico { stroke: var(--done); }
