﻿header { padding-inline: max(16px, calc((100% - 1180px) / 2)); }
header { justify-content: flex-start; gap: 8px; }
header > div { flex: 0 0 auto; }
header #settingsBtn { margin-left: auto; }
.menuBtn { font-size: 25px; }
.sessionBar {
  position: sticky;
  top: 0;
  z-index: 5;
  display: flex;
  align-items: end;
  min-height: 43px;
  padding: 7px max(16px, calc((100% - 1180px) / 2)) 0;
  overflow-x: auto;
  background: #e7e2d8;
  border-bottom: 1px solid var(--line);
}
#emptyTabs { padding: 0 8px 10px; color: var(--muted); font-size: 12px; }
#sessionTabs { display: flex; align-items: end; gap: 4px; min-width: 0; }
.sessionTab {
  display: flex;
  align-items: center;
  gap: 14px;
  min-width: 130px;
  max-width: 220px;
  padding: 9px 9px 9px 13px;
  border: 1px solid var(--line);
  border-bottom: 0;
  border-radius: 10px 10px 0 0;
  background: #d8d3c9;
  color: var(--ink);
  text-align: left;
}
.sessionTab span { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 700; }
.sessionTab i { font-style: normal; font-size: 18px; color: var(--muted); }
.sessionTab.active { background: var(--bg); color: var(--green); position: relative; top: 1px; }
.sessionTab.unread::before {
  content: '';
  width: 9px;
  height: 9px;
  flex: 0 0 9px;
  border-radius: 50%;
  background: var(--orange);
  box-shadow: 0 0 0 4px #e36f3622;
  animation: unreadPulse 1.6s infinite;
}
@keyframes unreadPulse { 50% { box-shadow: 0 0 0 8px #e36f3600; } }
main { max-width: 1180px; }
#chatView { padding-bottom: 110px; }
.timeline { padding-bottom: 36px; }
.timeline { width: 100%; min-width: 0; }
.event {
  width: auto;
  max-width: min(96%, 1040px);
  min-width: 0;
}
.event:not(.me):not(.system) { width: 100%; }
.eventText {
  display: block;
  width: 100%;
  min-width: 0;
  white-space: pre-wrap;
  overflow-wrap: break-word;
  word-break: normal;
}
.messageImage {
  display: block;
  width: auto;
  max-width: min(360px, 100%);
  max-height: 260px;
  margin-top: 8px;
  border-radius: 10px;
  border: 1px solid var(--line);
  object-fit: contain;
  cursor: zoom-in;
  background: #fff;
}
.attachments { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; }
.attachment { position: relative; }
.attachment img {
  display: block;
  width: 96px;
  height: 72px;
  object-fit: cover;
  border-radius: 9px;
  border: 1px solid var(--line);
}
.attachment button {
  position: absolute;
  top: -7px;
  right: -7px;
  width: 24px;
  height: 24px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: var(--red);
  color: white;
}
.workIndicator { display: flex; align-items: center; gap: 5px; padding: 8px 4px; margin-left: auto; }
.workIndicator span {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--green);
  animation: workingDot 1.15s infinite ease-in-out;
}
.workIndicator span:nth-child(2) { animation-delay: .14s; }
.workIndicator span:nth-child(3) { animation-delay: .28s; }
@keyframes workingDot {
  0%, 70%, 100% { transform: translateY(0); opacity: .35; }
  35% { transform: translateY(-6px); opacity: 1; }
}
.approvalHead { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.approvalReason { margin: 12px 0 8px; font-size: 16px; font-weight: 650; }
.approvalEffect { margin: 0 0 10px; color: var(--muted); font-size: 13px; }
.riskBadge { flex: 0 0 auto; padding: 4px 8px; border-radius: 999px; font-size: 11px; font-weight: 800; }
.riskLow { color: #075d45; background: #d7f2e7; }
.riskMedium { color: #7b4300; background: #ffe6b8; }
.riskHigh { color: #8b2018; background: #ffd6d1; }
.approval details { margin: 10px 0 14px; }
.approval summary { cursor: pointer; color: var(--muted); font-size: 13px; }
.approval small { display: block; overflow-wrap: anywhere; }
.composeActions #stopBtn { margin-left: 2px; min-width: 72px; }
.composeActions #sendBtn { margin-left: auto; }
.bottomMenu { flex: 0 0 42px; width: 42px; height: 38px; border: 1px solid var(--line); border-radius: 11px; background: var(--dark); color: white; font-size: 22px; line-height: 1; }
.titleActions { display: flex; align-items: center; gap: 7px; }
.projectRow, .sessionRow { position: relative; display: grid; grid-template-columns: 1fr 44px; gap: 7px; min-width: 0; }
.projectRow:not(.hasSessions) { display: block; }
.projectRow .project, .sessionRow .thread { min-width: 0; }
.projectKill, .sessionKill { border: 0; border-radius: 13px; background: #f5d7d3; color: var(--red); font-size: 27px; font-weight: 700; }
.projectKill:hover, .sessionKill:hover { background: var(--red); color: white; }
.sessionRow .thread { height: 100%; }
.sessionGroup { margin: 14px 2px 0; color: var(--dark); font-size: 16px; }
.progressPanel { margin-bottom: 8px; padding: 10px 12px; border: 1px solid #b7d8cb; border-radius: 12px; background: #edf8f3; }
.progressPanel.waiting { border-color: #dfb86b; background: #fff7df; }
.progressPanel.waiting .miniSpinner { animation: none; border-color: #dfb86b; background: #dfb86b; }
.progressPanel.error { border-color: #e2aaa5; background: #fff0ee; }
.progressPanel.error .miniSpinner { animation: none; border-color: var(--red); }
.progressNow { display: flex; align-items: center; gap: 9px; color: var(--dark); font-weight: 700; }
.miniSpinner { width: 16px; height: 16px; border: 2px solid #a7cfc0; border-top-color: var(--green); border-radius: 50%; animation: progressSpin .8s linear infinite; }
@keyframes progressSpin { to { transform: rotate(360deg); } }
#progressPlan { display: grid; gap: 5px; margin: 9px 0 0; padding: 0; list-style: none; font-size: 13px; }
#progressPlan li { display: grid; grid-template-columns: 18px 1fr; gap: 5px; color: var(--muted); }
#progressPlan li.inProgress { color: var(--green); }
#progressPlan li.completed { color: #71807a; }
#progressPlan li.completed b { text-decoration: line-through; font-weight: 500; }
#progressPlan .planIcon { display: inline-block; width: 18px; text-align: center; }
#progressPlan li.inProgress .planIcon { animation: planPulse 1.1s ease-in-out infinite; }
@keyframes planPulse { 0%,100% { transform: scale(.9); opacity: .65; } 50% { transform: scale(1.12); opacity: 1; } }
#composer { width: min(1180px, 100%); }
.scrollBottom {
  position: fixed;
  z-index: 7;
  right: max(16px, calc((100vw - 1160px) / 2));
  bottom: calc(176px + env(safe-area-inset-bottom));
  width: 46px;
  height: 46px;
  border: 1px solid #b7d8cb;
  border-radius: 50%;
  background: var(--card);
  color: var(--green);
  box-shadow: 0 7px 24px #17221e38;
  font-size: 27px;
  font-weight: 800;
}
#message {
  display: block;
  inline-size: 100%;
  min-inline-size: 0;
  min-height: 112px;
  max-height: 42vh;
  line-height: 1.5;
}
.composeActions { flex-wrap: wrap; }
#voiceState { flex: 1 1 280px; min-width: 0; }
@media (max-width: 600px) {
  main, #composer { padding-inline: 10px; }
  #message { min-height: 92px; }
  #voiceState { flex-basis: calc(100% - 54px); }
  .composeActions .primary { width: 100%; margin-left: 0; }
  .composeActions #stopBtn { width: auto; margin-left: 2px; }
  .composeActions .workIndicator { margin-left: auto; }
  .messageImage { max-width: 100%; max-height: 220px; }
  #chatView { padding-bottom: 150px; }
  .title { align-items: flex-start; }
  .titleActions { flex-direction: column-reverse; align-items: stretch; }
  .titleActions button { white-space: nowrap; }
  .scrollBottom { right: 14px; bottom: calc(230px + env(safe-area-inset-bottom)); }
}

/* «Спросить мозг» — панель на главном экране (02.09.2026) */
.brainBox { margin: 0 0 14px; display: flex; flex-direction: column; gap: 8px; }
.brainHead{display:flex;align-items:baseline;justify-content:space-between;gap:10px}
.brainHead b{display:block;font-size:14px;color:inherit}
.brainHead small{color:var(--muted);text-align:right}
.brainRow { display: grid; grid-template-columns:minmax(0,1fr) auto auto auto;gap:8px;align-items:end }
#brainQ { flex: 1; min-width: 0; resize: vertical; padding: 8px 10px;
          border-radius: 8px; border: 1px solid rgba(128,128,128,.35);
          font: inherit; background: transparent; color: inherit; }
#brainAsk { white-space: nowrap; align-self: flex-end; }
#brainQuick{align-self:flex-start}
/* Микрофон у мозга (04.09.2026, T0006): тот же вид и та же пульсация, что у поля
   сообщения, чтобы владелец не учился второй раз. .mic и .mic.listening — в styles.css. */
#brainMic { align-self: flex-end; flex: 0 0 38px; }
#brainAttach { align-self: flex-end; }
#brainVoiceState { display: block; min-height: 1em; }

/* Кнопка «Подключиться» в строке доски (04.09.2026, q1350): владелец хочет всегда видеть
   доску и уходить из неё в нужную вкладку. Не primary — она не главное действие строки. */
.boardGo{margin-top:6px;align-self:flex-start;border:1px solid rgba(128,128,128,.35);
  border-radius:8px;background:transparent;color:inherit;padding:5px 10px;font-size:12px}
.boardGo:hover{background:rgba(128,128,128,.12)}
.boardActions{display:flex;gap:6px;margin-top:2px;width:100%}
.boardAction{flex:1;min-height:32px;padding:5px 8px;border-radius:8px;border:1px solid rgba(255,255,255,.16);
  background:rgba(255,255,255,.07);color:inherit;font-size:11.5px;cursor:pointer}
.boardAction.primary{background:#2f805a;border-color:#5fbf8a;color:#fff}
.boardAction:hover{filter:brightness(1.12)}
.boardChoices{flex-wrap:wrap;align-items:center;padding:3px 0}
.boardChoices .boardChoiceTitle{flex:1 0 100%;font-size:11.5px;color:var(--muted);padding:0 2px 2px}
.boardChoices .boardAction{flex:1 1 auto;min-width:82px}
.boardChoices .boardAction.ghost{background:transparent;color:inherit;border-color:rgba(128,128,128,.35)}
.boardActionMessage{grid-column:1/-1}
.boardClose.pending{color:#e9c66d}
.brainAnswer { white-space: pre-wrap; overflow-wrap: anywhere; padding: 10px 12px;
               border-radius: 8px; border: 1px solid rgba(128,128,128,.25);
               display:flex;flex-direction:column;gap:7px }
.brainTarget{color:#8fd3b0}
.brainOpen{align-self:flex-start}

/* Отправленное, но ещё не подтверждённое сервером (сообщение во вкладку Claude уходит
   в её ящик и в историю не попадает). Показываем как своё, но помечаем, что это эхо. */
.event.me.pending{opacity:.92;border-left:3px solid rgba(120,160,255,.65)}
.event.me.pending::after{content:'отправлено';display:block;margin-top:4px;font-size:11px;opacity:.6}


/* Доска задач и значки внимания на вкладках (04.09.2026) */
.boardBox{margin:10px 0 14px;padding:12px 14px;border:1px solid rgba(255,255,255,.10);
  border-radius:12px;background:rgba(255,255,255,.03)}
/* ⛔ 05.09.2026: при широком экране space-between уносил кнопку ↻ к правому краю —
   владелец обвёл её красным: висит над колонкой «Завершено» и выглядит чужой. */
.boardHead{display:flex;align-items:center;justify-content:flex-start;gap:10px;margin-bottom:8px}
.boardHead b{font-size:14px;letter-spacing:.02em}
.boardNotice{margin:0 0 8px;padding:7px 9px;border-radius:8px;font-size:12px;
  border:1px solid rgba(95,191,138,.32);background:rgba(62,167,106,.10)}
.boardNotice.pending{border-color:rgba(216,161,58,.4);background:rgba(216,161,58,.10)}
.boardNotice.error{border-color:rgba(200,106,94,.55);background:rgba(200,106,94,.14);color:#f0aaa1}
.icon.isRefreshing{animation:iternaSpin .7s linear infinite;opacity:.65}.icon:disabled{cursor:wait}
@keyframes iternaSpin{to{transform:rotate(360deg)}}
.kanbanActions{display:flex;gap:5px;margin:-2px 0 7px}.kanbanActions button{flex:1;min-width:0;padding:6px 4px;font-size:11px}
.historyList{display:flex;flex-direction:column;gap:14px}.historyGroup h3{margin:8px 0;font-size:13px}.historyItem{padding:11px;border:1px solid rgba(255,255,255,.12);border-radius:10px;background:rgba(255,255,255,.04)}.historyHead{display:flex;gap:8px;align-items:flex-start;justify-content:space-between}.historyHead b{overflow-wrap:anywhere}.historyItem>small{display:block;margin-top:5px;opacity:.7}.historyResult{font-size:11px;padding:3px 7px;border-radius:9px;white-space:nowrap}.historyResult.success{color:#9fe0ba;background:rgba(62,167,106,.2)}.historyResult.failure{color:#f0aaa1;background:rgba(200,106,94,.2)}.historyResult.unknown{color:#e9d29b;background:rgba(216,161,58,.2)}.historySteps{margin:8px 0 0;padding-left:18px;font-size:12px}.historySteps li{margin:2px 0}.historyItem p{margin:8px 0 0;font-size:12px;white-space:pre-wrap;overflow-wrap:anywhere;opacity:.8}
.historyGroup summary{cursor:pointer;font-weight:600;padding:8px 0}
.historyItem{margin-top:8px;border-color:var(--line);background:var(--card)}
.historyResult.success{color:#126b54;background:#d9eee5}.historyResult.failure{color:#96332b;background:#f8ded9}.historyResult.unknown{color:#785719;background:#f4e6bf}
.boardList{display:flex;flex-direction:column;gap:9px}
.boardItem{display:grid;grid-template-columns:1fr auto;gap:4px 10px;padding:9px 11px;
  border-radius:9px;background:rgba(255,255,255,.04);border-left:3px solid transparent}
.boardItem .boardTop{grid-column:1/-1;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
.boardItem b{font-weight:600;font-size:13.5px;line-height:1.35}
.boardItem small{font-size:11.5px;opacity:.75}
.boardItem small.muted{grid-column:1/-1}
.boardItem.in_progress{border-left-color:#3ea76a}
.boardItem.review{border-left-color:#d8a13a}
.boardItem.blocked{border-left-color:#c86a5e}
.boardItem.todo{border-left-color:rgba(255,255,255,.18)}
.boardItem.stale{background:rgba(200,106,94,.12)}
.boardStatus{font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;padding:2px 7px;
  border-radius:20px;background:rgba(255,255,255,.10);white-space:nowrap}
.boardStatus.in_progress{background:rgba(62,167,106,.22)}
.boardStatus.review{background:rgba(216,161,58,.22)}
.boardStatus.blocked{background:rgba(200,106,94,.22)}
.boardBar{height:5px;border-radius:3px;background:rgba(255,255,255,.10);overflow:hidden;align-self:center}
.boardBar i{display:block;height:100%;background:#3ea76a;border-radius:3px}
.boardWarn{grid-column:1/-1;color:#e79287}
/* T0015: состояние закрытия вкладки исполнителя — владелец читает это глазами */
.boardClose{color:#8fd3b0;font-size:10.5px;line-height:1.3;overflow-wrap:anywhere}
.boardClose.alarm{color:#e79287;font-weight:700}

/* T0012: настоящая четырёхколоночная Kanban-доска. */
.boardBox{overflow:hidden}
.boardKanban{display:grid;grid-template-columns:repeat(4,minmax(220px,1fr));gap:10px;
  overflow-x:auto;padding:2px 2px 10px;scroll-snap-type:x proximity;align-items:start}
.kanbanTabs{display:none}
.kanbanColumn{scroll-snap-align:start;min-height:160px;padding:8px;border-radius:10px;
  background:rgba(255,255,255,.025);border:1px solid rgba(255,255,255,.08)}
.kanbanColumn>h3{display:flex;justify-content:space-between;align-items:center;margin:0 2px 8px;
  font-size:12px;text-transform:uppercase;letter-spacing:.045em}
.kanbanHeadingText{display:flex;flex-direction:column;gap:3px}
.kanbanHint{font-size:10px;font-weight:400;line-height:1.25;text-transform:none;letter-spacing:0;
  color:var(--muted);opacity:.9}
.kanbanColumn>h3 span{min-width:22px;text-align:center;padding:2px 6px;border-radius:12px;
  background:rgba(255,255,255,.09);font-size:11px}
/* ⛔ 04.09.2026: у столбца ДОЛЖНА быть своя прокрутка. Замер: 10 задач «На проверке»
   растянули столбец на 3333 px, страница росла вместе с ним, и цель переноса
   оказывалась за экраном. Ограничиваем высоту и прокручиваем внутри столбца. */
.kanbanCards{display:flex;flex-direction:column;gap:8px;min-height:108px;
  max-height:min(58vh,520px);overflow-y:auto;overscroll-behavior:contain;
  scrollbar-width:thin;padding-right:2px}
.kanbanCards::-webkit-scrollbar{width:6px}
.kanbanCards::-webkit-scrollbar-thumb{background:rgba(255,255,255,.18);border-radius:3px}
/* быстрое «переместить в…» на карточке — перенос без перетаскивания */
.boardMove{display:flex;margin-top:2px}
.boardMoveSel{width:100%;min-height:32px;padding:5px 6px;border-radius:8px;font-size:11.5px;
  color:inherit;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.14);
  cursor:pointer;touch-action:auto}
.boardMoveSel:focus{outline:2px solid rgba(95,191,138,.7);outline-offset:1px}
.boardMoveSel option{color:#101c19;background:#e9f3ee}
/* ⛔ 04.09.2026: липкая подпись проекта ПЕРЕХВАТЫВАЛА захват карточки. Замер: нажатие
   в 12 px от верха карточки давало target = H4.kanbanProject (position:sticky, z-index:1
   лежит поверх верхней кромки карточки), обработчик карточки не запускался вовсе —
   ни призрака, ни подсветки, ни переноса. Подпись — чистый текст, события ей не нужны. */
.kanbanProject{pointer-events:none;position:sticky;top:0;z-index:1;margin:2px 1px -2px;padding:4px 5px;
  border-radius:6px;background:#173e35;color:#8fd3b0;font-size:10px;
  text-transform:uppercase;letter-spacing:.055em;overflow-wrap:anywhere}
.kanbanColumn.dropTarget{border-color:#5fbf8a;background:rgba(62,167,106,.10)}
.kanbanEmpty{display:grid;place-items:center;min-height:88px;text-align:center;opacity:.42;
  border:1px dashed rgba(255,255,255,.16);border-radius:8px;padding:8px}
.kanbanColumn .boardItem{display:flex;flex-direction:column;gap:6px;padding:10px;
  border:1px solid rgba(255,255,255,.08);border-left-width:3px;cursor:grab;touch-action:none}
.kanbanColumn .boardItem:active{cursor:grabbing}
.kanbanColumn .boardItem.dragging,.kanbanColumn .boardItem.moving{opacity:.45}
body.boardDragging{user-select:none;touch-action:none}
.boardDragGhost{position:fixed;left:0;top:0;z-index:9999;width:min(260px,70vw);max-height:300px;
  overflow:hidden;pointer-events:none;display:flex;flex-direction:column;gap:6px;padding:10px;
  border:1px solid rgba(95,191,138,.75);border-left:3px solid #5fbf8a;border-radius:10px;
  background:#173e35;box-shadow:0 14px 32px rgba(0,0,0,.38);opacity:.96}
.kanbanColumn .boardTop{display:flex;align-items:center;gap:6px}
.boardProject{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  color:#8fd3b0;font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.045em}
.boardId{margin-left:auto;font-size:10px;opacity:.5}
.boardExecutor{color:#5fbf8a;font-size:11px;font-weight:700}
.boardUnread{color:#f2c15c;font-weight:700;font-size:11px!important;opacity:1!important}
.boardTitle{font-size:13px;line-height:1.35}
.kanbanColumn .boardBar{width:100%}
.boardProgress{align-self:flex-end;margin-top:-4px}
.boardSteps{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}
.boardSteps li{font-size:11px;line-height:1.3;opacity:.78}
.boardSteps li.done{text-decoration:line-through;opacity:.45}
.kanbanColumn .boardGo{width:100%;margin-top:2px}
.taskDetails{background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.1);border-radius:14px;padding:14px;margin:10px 0}
.taskDetails h1{margin:7px 0;font-size:24px;line-height:1.2;overflow-wrap:anywhere}
.taskMeta{color:#8fd3b0;font-size:12px;font-weight:700}
.taskInfo,.taskNote{margin:5px 0;color:#b8c9c1;font-size:13px;overflow-wrap:anywhere}
.taskSteps{list-style:none;margin:10px 0 0;padding:0;display:grid;gap:4px;font-size:13px}
.taskSteps li.done{text-decoration:line-through;opacity:.55}
.taskChat{min-height:180px;padding-top:4px}
.taskChatFrom{display:block;color:#78958a;margin-bottom:5px}
.taskFile{display:block;color:#5fbf8a;margin-top:6px;overflow-wrap:anywhere}
#taskComposer{position:sticky;bottom:0;padding:10px 0 calc(10px + env(safe-area-inset-bottom));background:#173e35ee;backdrop-filter:blur(12px);border-top:1px solid rgba(255,255,255,.12)}
#taskComposer .composeActions{flex-wrap:wrap}
@media(max-width:600px){.taskDetails h1{font-size:21px}#taskComposer .composeActions span{flex:1;min-width:120px}.taskChat{min-height:140px}}
@media(min-width:1100px){.boardKanban{grid-template-columns:repeat(4,minmax(0,1fr))}}
@media(max-width:600px){
  .brainBox{padding-top:9px}
  .brainHead{align-items:flex-start;flex-direction:column;gap:2px}
  .brainHead small{text-align:left}
  .brainRow{grid-template-columns:40px 40px minmax(0,1fr)}
  #brainQ{grid-column:1/-1}
  #brainMic{grid-column:1}
  #brainAttach{grid-column:2;width:100%}
  #brainAsk{grid-column:3;width:100%}
  #brainQuick{width:100%}
  .boardBox{margin-left:-6px;margin-right:-6px;padding:9px 8px}
  .boardKanban{display:block;overflow:visible;padding:0 0 2px;touch-action:pan-y}
  .kanbanTabs{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:4px;margin:0 0 8px;padding:2px 0;position:sticky;top:0;z-index:3;background:var(--card)}
  .kanbanTab{min-width:0;min-height:48px;padding:5px 3px;border:1px solid rgba(128,128,128,.25);border-radius:8px;background:rgba(128,128,128,.08);color:inherit;font-size:10px;line-height:1.15;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px}
  .kanbanTab span{overflow-wrap:anywhere}
  .kanbanTab b{min-width:20px;padding:1px 5px;border-radius:10px;background:rgba(128,128,128,.16);font-size:11px}
  .kanbanTab.active{border-color:#5fbf8a;background:rgba(62,167,106,.18);color:var(--green);font-weight:700}
  .kanbanTab.active b{background:#3ea76a;color:white}
  /* ⛔ Карточка не должна быть ВЫШЕ окна прокрутки столбца: замер 04.09 —
     карточка 248 px в окне 246 px, и прокрутка «до конца» уводила заголовок
     за верхнюю кромку столбца (палец попадал в H3, а не в карточку). */
  .kanbanColumn{display:none;min-width:0;min-height:130px;max-height:none;padding:8px;overflow:hidden}
  .kanbanColumn.mobileActive{display:block}
  .kanbanColumn>h3{font-size:10px;letter-spacing:.015em}
  /* ⛔ 05.09.2026, владелец с телефона: «полоска прокрутки очень узенькая, пальцем в неё
     неудобно попадать». Правильный ответ на телефоне — не расширять полоску, а убрать
     ВНУТРЕННЮЮ прокрутку столбца совсем: столбец растёт по содержимому, а страница
     листается пальцем в любом месте, как в любом современном списке. Полоска остаётся
     только там, где без неё нельзя (чат), и там она сделана широкой — ниже. */
  .kanbanCards{min-height:80px;max-height:none;overflow:visible;gap:6px}
  .kanbanColumn .boardItem{padding:8px;gap:5px}
  .boardProject{max-width:105px;font-size:9.5px}
  .boardTitle{font-size:12px;overflow-wrap:anywhere}
  .boardSteps{display:none}
  .kanbanColumn .boardGo{font-size:10px;padding:5px}
  .boardMove{margin-top:5px}
  .boardMoveSel{min-height:40px;padding:7px 8px;border:2px solid #5fbf8a;background:rgba(62,167,106,.16);font-size:12px;font-weight:700}
  .boardActions{gap:4px}.boardAction{font-size:10px;padding:5px 4px}
}

/* T0036 — чат Штаба присутствует поверх каждого экрана пульта. */
#hqWidget{position:fixed;right:18px;bottom:18px;z-index:20;font-size:14px}
#hqBubble{width:58px;height:58px;border:0;border-radius:50%;background:var(--green);color:#fff;box-shadow:0 8px 25px #17221e44;font-weight:800;font-size:20px;cursor:pointer;position:relative}
#hqBubble i{position:absolute;right:-2px;top:-3px;min-width:21px;height:21px;padding:1px 5px;border-radius:12px;background:var(--orange);font:700 11px/19px system-ui;font-style:normal}
#hqPanel{position:absolute;right:0;bottom:72px;width:min(390px,calc(100vw - 28px));height:min(590px,calc(100vh - 105px));display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--line);border-radius:18px;background:var(--bg);box-shadow:0 18px 55px #17221e38}
#hqPanel>header{height:58px;min-height:58px;padding:9px 12px;background:var(--dark);display:flex;align-items:center;gap:9px;color:#fff}
#hqPanel>header>div{display:flex;flex-direction:column;flex:1;min-width:0}.hqVoice{font-size:12px;white-space:nowrap}.hqVoice input{accent-color:var(--orange)}
#hqClose{border:0;background:transparent;color:#fff;font-size:25px;padding:3px 7px;cursor:pointer}
#hqPanel .timeline{flex:1;min-height:0;overflow-y:auto;padding:12px}#hqPanel .event{max-width:94%}
#hqComposer{padding:9px 10px calc(9px + env(safe-area-inset-bottom));background:#f4f1e9f2;border-top:1px solid var(--line)}
#hqComposer .composeActions{gap:7px;flex-wrap:wrap}#hqComposer .composeActions span{font-size:11px;color:var(--muted);flex:1;min-width:100px}
#hqAttachments{padding:0 10px}.hqVoice small{color:#b7d6cb}
@media(max-width:600px){#hqWidget{right:10px;bottom:10px}#hqPanel{bottom:68px;width:min(390px,calc(100vw - 20px));height:min(540px,calc(100vh - 88px));border-radius:15px}#hqBubble{width:54px;height:54px}}

.sessionTab u.attn{font-style:normal;text-decoration:none;margin-left:6px;font-size:11px;line-height:1}
.sessionTab u.attn{color:#e0b23a}
.sessionTab u.attn.work{color:#5fbf8a}
.sessionTab.waiting{box-shadow:inset 0 -2px 0 #e0b23a}
@media (prefers-reduced-motion:no-preference){
  .sessionTab.working u.attn.work{animation:attnSpin 1.8s linear infinite}
  @keyframes attnSpin{to{transform:rotate(360deg)}}
}
.sessionTab u.attn.work{display:inline-block}
button.ghost{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.12);
  color:inherit;border-radius:8px;padding:4px 10px;font-size:12px;white-space:nowrap}
button.ghost:disabled{opacity:.6}
.sessionBar{display:flex;align-items:center;gap:8px}
.sessionBar #sessionTabs{flex:1;min-width:0}

/* ⛔ 04.09.2026: кнопка «Закрыть неактивные» НАЕЗЖАЛА на названия вкладок — видно на снимке
   экрана «Активные» (текст кнопки поверх вкладки «new»). Причина: прокрутка стояла на
   .sessionBar целиком, поэтому кнопка уезжала вместе с полосой и накладывалась на вкладки.
   Прокручиваем только сам список вкладок, кнопку не сжимаем и не двигаем. */
.sessionBar{overflow:hidden}
.sessionTabsViewport{position:relative;flex:1 1 auto;min-width:0;overflow-x:auto;scrollbar-width:thin;scroll-behavior:smooth;touch-action:pan-y}
.sessionTabsViewport::before,.sessionTabsViewport::after{content:"";position:absolute;top:0;bottom:0;width:22px;z-index:2;pointer-events:none;opacity:0;transition:opacity .18s}
.sessionTabsViewport::before{left:0;background:linear-gradient(90deg,#e7e2d8,transparent)}
.sessionTabsViewport::after{right:0;background:linear-gradient(270deg,#e7e2d8,transparent)}
.sessionTabsViewport.has-left::before,.sessionTabsViewport.has-right::after{opacity:1}
.sessionBar #sessionTabs{display:flex;flex:0 0 max-content;min-width:100%;overflow:visible}
.sessionBar .sessionTab{flex:0 0 auto;max-width:42vw}
.sessionBar .sessionTab span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tabNav{flex:0 0 28px;width:28px;height:32px;padding:0;border:1px solid var(--line);border-radius:7px;background:#d8d3c9;color:var(--ink);font-size:24px;line-height:25px;cursor:pointer}
.tabNav:disabled{opacity:.35;cursor:default}
.tabNav[hidden]{display:none}
#closeInactive{flex:0 0 auto;white-space:nowrap;position:relative;z-index:1}

@media (max-width:600px){
  .sessionBar{gap:5px;padding-inline:10px}
  .sessionTab{min-width:96px;gap:6px;padding:8px 6px 8px 8px}
  .sessionBar .sessionTab{max-width:38vw}
  #closeInactive{padding-inline:6px;font-size:11px}
}

/* Крестик «Потушить» доминировал: 27px на всю высоту строки. Делаем спокойнее. */
.projectKill, .sessionKill{font-size:20px}

/* Длинная неразрывная строка (URL в первом промпте ветки) вылезала ЗА карточку —
   видно на снимке «Активные» 04.09.2026, группа new. Обрезка по 110 символов её
   не спасает: она короче предела и просто не переносится. */
.thread b, .thread small, .sessionRow .thread span{overflow-wrap:anywhere;min-width:0}
.thread em{flex:0 0 auto}


/* Широкие полосы прокрутки там, где внутренняя прокрутка ОСТАЁТСЯ (чат, длинные списки):
   6 px пальцем не поймать, 14 px — норма для касания; бегунок не короче 44 px. */
#hqPanel .timeline,#timeline,.taskChat,.threads{scrollbar-width:auto;scrollbar-color:rgba(128,128,128,.45) transparent}
#hqPanel .timeline::-webkit-scrollbar,#timeline::-webkit-scrollbar,.taskChat::-webkit-scrollbar,.threads::-webkit-scrollbar{width:14px}
#hqPanel .timeline::-webkit-scrollbar-thumb,#timeline::-webkit-scrollbar-thumb,.taskChat::-webkit-scrollbar-thumb,.threads::-webkit-scrollbar-thumb{
  background:rgba(128,128,128,.45);border-radius:8px;min-height:44px;border:3px solid transparent;background-clip:padding-box}
#hqPanel .timeline::-webkit-scrollbar-thumb:active,#timeline::-webkit-scrollbar-thumb:active{background:rgba(62,167,106,.75);background-clip:padding-box}

/* На телефоне карточка не перехватывает жест: вертикальная прокрутка списка важнее
   перетаскивания (владелец 05.09). Перенос делается кнопкой «переместить в…». */
@media(max-width:600px){.kanbanColumn .boardItem{cursor:default;touch-action:pan-y}
  .kanbanColumn .boardMove,.kanbanColumn select{min-height:44px;font-size:13px}}

/* T0047: constrain message contents; scroll wide tables and code within the bubble. */
.timeline>.event{min-width:0}
.messageMarkdown{min-width:0;max-width:100%;white-space:normal;overflow-wrap:anywhere}
.messageMarkdown p{margin:0 0 .65em}
.messageMarkdown>:last-child,.messageMarkdown li>:last-child{margin-bottom:0}
.messageMarkdown h1,.messageMarkdown h2,.messageMarkdown h3,.messageMarkdown h4,.messageMarkdown h5,.messageMarkdown h6{font-size:1.1em;line-height:1.35;margin:.8em 0 .4em}
.messageMarkdown>:first-child{margin-top:0}
.messageMarkdown ul,.messageMarkdown ol{margin:.4em 0 .65em;padding-left:1.6em}
.messageMarkdown li{margin:.2em 0}
.messageMarkdown li>p{margin-bottom:.25em}
.messageMarkdown code{font-family:Consolas,monospace;font-size:.9em;background:#17221e0c;border-radius:4px;padding:.1em .25em}
.messageMarkdown pre{max-width:100%;overflow-x:auto;white-space:pre;overflow-wrap:normal;background:#17221e;color:#def2ea;border-radius:8px;padding:10px;margin:.6em 0}
.messageMarkdown pre code{background:none;padding:0;color:inherit}
.messageTable{max-width:100%;overflow-x:auto;overscroll-behavior-x:contain;margin:.6em 0;border:1px solid var(--line);border-radius:7px}
.messageTable:focus-visible{outline:2px solid var(--green);outline-offset:2px}
.messageTable table{border-collapse:collapse;width:max-content;min-width:100%;font-size:.92em}
.messageTable th,.messageTable td{padding:7px 10px;border:1px solid var(--line);white-space:nowrap;overflow-wrap:normal}
.messageTable th{background:var(--mint);font-weight:700}

/* Требуют решения: имя проекта крупной плашкой (просьба владельца 07.09.2026 —
   «написано очень мелко, я не сразу понимаю, о каком проекте речь»). */
/* ⛔ замер в браузере владельца: у .decisionMeta вычисленный display остаётся block
   (что-то перебивает flex), поэтому зазор задаём НА ДЕТЯХ — так он не зависит от родителя. */
.decisionMeta{display:block;margin-bottom:10px}
.decisionProject{display:inline-block;vertical-align:middle;margin-right:12px;
  font:700 15px/1.1 system-ui,Segoe UI,sans-serif;letter-spacing:.04em;
  text-transform:uppercase;color:#fff;background:var(--green);padding:5px 12px;border-radius:999px;
  box-shadow:0 2px 6px #126b5433;max-width:100%;overflow-wrap:anywhere}
.decisionAgeText{display:inline-block;vertical-align:middle;font-size:13px;color:var(--muted)}
@media(max-width:520px){.decisionProject{font-size:14px;padding:4px 10px}}
/* время сообщения в ленте (просьба владельца 07.09.2026) */
.eventTime{display:block;font-size:11px;color:var(--muted);margin-bottom:3px;font-variant-numeric:tabular-nums}
.event.me .eventTime{text-align:right}

/* T0052 шаг 5: «вкладка ждёт тебя / можно закрыть». Отдельная секция, узлы Штаба не задеты. */
.tabsWidget{margin-top:12px}
.tabsWidget[hidden]{display:none!important}
.tabsWidgetHead{display:flex;align-items:center;justify-content:space-between;gap:8px}
.tabsWidgetNotice{display:block;margin-top:6px;color:var(--muted)}
.tabsWidgetNotice:empty{display:none}
.tabsWidgetNotice.warn{color:var(--orange)}
.tabsWidgetList{display:grid;gap:10px;margin-top:10px}
.tabsWidgetCard{min-width:0;padding:12px;border:1px solid var(--line);border-radius:12px}
.tabsWidgetCard.closable{border-color:var(--orange)}
.tabsWidgetTop{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
.tabsWidgetState{font-size:14px;font-weight:700;padding:4px 10px;border-radius:999px;background:var(--line);color:inherit;white-space:nowrap}
.tabsWidgetCard.closable .tabsWidgetState{background:var(--orange);color:#10231d}
.tabsWidgetCard.waiting .tabsWidgetState{background:#f2d67a;color:#10231d}
.tabsWidgetProject{font-size:14px;font-weight:700;overflow-wrap:anywhere}
.tabsWidgetAge{font-size:12px;color:var(--muted);font-variant-numeric:tabular-nums}
.tabsWidgetTask{display:block;margin-top:6px;font-size:13px;overflow-wrap:anywhere}
.tabsWidgetHint{display:block;margin-top:4px;font-size:12px;color:var(--muted);overflow-wrap:anywhere}
.tabsWidgetCmd{display:block;margin-top:6px;font-size:11px;color:var(--muted);overflow-wrap:anywhere;white-space:pre-wrap}
/* «ответ готов» — задача доски «На проверке» (просьба владельца 07.09.2026) */
.tabsReadyCard{display:block;width:100%;text-align:left;border-color:var(--green,#2e7d5b);background:inherit;color:inherit;cursor:pointer}
.tabsReadyCard.seen{opacity:.55;border-color:var(--line)}
.tabsWidgetState.ready{background:var(--green,#2e7d5b);color:#eafff5}
.tabsReadyCard .decisionProject{margin-left:2px}
/* переход из виджета к карточке вопроса (просьба владельца 07.09.2026) */
.tabsWidgetGo{cursor:pointer}
.tabsWidgetGo:hover,.tabsWidgetGo:focus-visible{border-color:var(--orange);outline:none}
.decisionJump{animation:decisionJumpGlow 2.4s ease-out 1}
@keyframes decisionJumpGlow{0%{box-shadow:0 0 0 3px var(--orange)}100%{box-shadow:0 0 0 0 transparent}}
@media(prefers-reduced-motion:reduce){.decisionJump{animation:none;border-color:var(--orange)}}

/* T0067: три вида вместо прокрутки (решение владельца 07.09.2026 18:15).
   ⛔ Первая редакция была светлой «плиткой» — владелец: «что за некрасивую шляпу сделал?
   Сделай в таком же стиле, скруглённом, зелёненькие, жирненькие, с красивыми пиктограммами»,
   со скриншотом кнопки «Активные». Поэтому вид взят у штатной `.primary`: заливка var(--green),
   белый жирный текст, скругление 16px, мягкая тень. Свои цвета не выдумываем — берём палитру. */
.viewBar{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin:6px 0 18px}
.viewBtn{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  padding:16px 10px;min-height:104px;border:0;border-radius:16px;cursor:pointer;
  background:var(--green);color:#fff;font-weight:700;
  box-shadow:0 6px 18px #12352a26;transition:transform .12s ease,box-shadow .12s ease}
.viewBtn:hover{transform:translateY(-1px);box-shadow:0 10px 24px #12352a33}
.viewBtn:active{transform:translateY(0)}
.viewBtn .viewIcon{font-size:26px;line-height:1}
.viewBtn .viewName{font-size:15px;font-weight:800;text-align:center;overflow-wrap:anywhere;letter-spacing:.01em}
.viewBtn .viewCount{display:inline-grid;place-items:center;min-width:30px;height:26px;padding:0 8px;
  border-radius:13px;background:#ffffff2e;color:#fff;font-size:16px;font-weight:800;
  font-variant-numeric:tabular-nums}
.viewBtn .viewCount.zero{background:#ffffff1c;color:#ffffffb0;font-weight:700}
/* Текущий вид — светлая заливка mint с зелёным текстом: видно сразу, где ты стоишь. */
.viewBtn.active{background:var(--mint);color:var(--dark);box-shadow:inset 0 0 0 2px var(--green)}
.viewBtn.active .viewCount{background:var(--green);color:#fff}
/* Есть что смотреть — счётчик оранжевый (тот же акцент, что у «Требуют решения»). */
.viewBtn.attention .viewCount{background:var(--orange);color:#fff}
.viewBtn.active.attention .viewCount{background:var(--orange);color:#fff}
.viewPane[hidden]{display:none!important}
@media(max-width:520px){
  .viewBar{gap:8px}
  .viewBtn{min-height:92px;padding:12px 6px;border-radius:14px}
  .viewBtn .viewIcon{font-size:22px}
  .viewBtn .viewName{font-size:13px}
}
/* Значки видов — свои SVG в currentColor, поэтому меняют цвет вместе с кнопкой */
.viewBtn .viewIcon{width:22px;height:22px;flex:none}
.viewBtn .viewName .narrow{display:none}
@media(max-width:520px){
  .viewBtn .viewName .wide{display:none}
  .viewBtn .viewName .narrow{display:inline}
}
/* «Ответ готов»: сначала то, что нужно ОТ ВЛАДЕЛЬЦА, потом инженерный заголовок мелким */
.tabsReadyForOwner{margin:8px 0 2px;font-size:15px;font-weight:600;line-height:1.35;overflow-wrap:anywhere}
.tabsReadyForOwner.missing{color:var(--orange);font-weight:600}
.tabsReadyCard .tabsWidgetTask{color:var(--muted);font-size:12px}

.translationBanner{display:block;padding:8px 10px;border-radius:8px;background:#294c68;color:#fff;overflow-wrap:anywhere}
.translationSummary{font-weight:600;line-height:1.5}
.translationOriginal{margin-top:12px;font-size:.9em}
.translationOriginal>summary{cursor:pointer;opacity:.8}
/* Кнопки решения прямо на карточке «Ответ готов» (просьба владельца 07.09 18:57) */
.tabsReadyActions{display:flex;gap:8px;margin-top:10px}
.tabsReadyActions button{min-height:40px;border-radius:10px}
.tabsReadyActions .ghost{background:transparent;color:inherit;border:1px solid var(--line)}
/* Карточка задачи: сначала «что от тебя нужно», потом решение, техника — под «подробности» */
.taskForOwner{margin:8px 0 4px;font-size:19px;font-weight:700;line-height:1.35;overflow-wrap:anywhere}
.taskForOwner.internal{font-size:16px;font-weight:600;color:var(--muted)}
.taskTitleSmall{margin:2px 0 12px;font-size:13px;color:var(--muted);overflow-wrap:anywhere}
.taskDecisions{display:flex;flex-wrap:wrap;gap:8px;margin:4px 0 14px}
.taskDecisions button{min-height:44px;border-radius:12px;padding:0 16px;font-weight:700}
.taskDecisions .ghost{background:transparent;color:inherit;border:1px solid var(--line)}
.taskInner{margin:6px 0 10px;font-size:13px;color:var(--muted)}
.taskInner summary{cursor:pointer}

.messageDelivery{display:block;clear:both;margin-top:6px;font-size:12px;line-height:1.4;color:var(--muted,#667085)}
.messageDelivery[data-state="working"],.messageDelivery[data-state="answered"]{color:#247a58}

/* ⭐ 04.10.2026, владелец: «активная вкладка вверху не очень выделена, часто путаю, с какой
   работаю — подсвечивай ярким оранжевым». Заливка оранжевым + белый текст + толстая полоса снизу;
   !important — чтобы не перебивали состояния waiting/working/unread. */
.sessionTab.active{background:var(--orange)!important;color:#fff!important;box-shadow:inset 0 -4px 0 #a8441a,0 2px 8px #e36f3666!important;border-color:var(--orange)!important}
.sessionTab.active span,.sessionTab.active i,.sessionTab.active u.attn{color:#fff!important}
/* 04.10.2026: кнопка «＋ Новая задача» — включённая видна сразу (оранжевая), как активная вкладка */
.newTaskBtn{white-space:nowrap}
.newTaskBtn.on{background:var(--orange)!important;color:#fff!important;border-color:var(--orange)!important}

/* ⭐ 04.10.2026: чек-лист задачи со временем шагов и заминкой (диалог проекта, карточка, доска) */
.stepStrip{margin:0 0 8px}
.stepBox{border:1px solid var(--line);border-left:4px solid #5fbf8a;border-radius:10px;background:var(--card);overflow:hidden}
.stepBox.yellow{border-left-color:#e0b23a;background:#fff8e6}
.stepBox.red{border-left-color:var(--red);background:#fdeceb}
.stepLine{display:flex;align-items:center;gap:8px;width:100%;border:0;background:transparent;color:inherit;padding:7px 10px;text-align:left;cursor:pointer;font-size:13px}
.stepLine span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.stepBox.red .stepLine span{color:var(--red);font-weight:700}
.stepBar{flex:0 0 64px;height:6px;border-radius:3px;background:var(--line);overflow:hidden}
.stepBar u{display:block;height:100%;background:#5fbf8a;text-decoration:none}
.stepBox.yellow .stepBar u{background:#e0b23a}.stepBox.red .stepBar u{background:var(--red)}
.stepLine small{color:var(--muted);font-size:11px}
.stepList{display:none;margin:0;padding:2px 10px 8px 12px;list-style:none;font-size:13px}
.stepBox.open .stepList{display:block}
.stepList li{display:flex;justify-content:space-between;gap:10px;padding:2px 0}
.stepList li small{color:var(--muted);white-space:nowrap}
.stepList li.done span{color:var(--muted)}
.stepList li.now span{font-weight:700}
.stepList li.stepTotal{color:var(--muted);font-size:12px;border-top:1px dashed var(--line);margin-top:4px;padding-top:4px}
.stepBox.mini{margin-top:6px}.stepBox.mini .stepLine{padding:4px 8px;font-size:12px}

/* ⭐ 04.10.2026: индикатор качества связи в шапке (как в Zoom) */
header{gap:8px}.netBadge{display:flex;align-items:flex-end;gap:2px;margin-left:auto;border:0;background:#ffffff1a;color:#fff;border-radius:999px;padding:5px 9px;font-size:12px;cursor:pointer;line-height:1}
.netBadge i{display:block;width:4px;border-radius:1px;background:#ffffff40}.netBadge i:nth-child(1){height:6px}.netBadge i:nth-child(2){height:10px}.netBadge i:nth-child(3){height:14px}
.netBadge span{margin-left:5px;white-space:nowrap}
.netBadge.lvl3 i{background:#55d49f}
.netBadge.lvl2 i:nth-child(-n+2){background:#e0b23a}
.netBadge.lvl1 i:nth-child(1){background:var(--orange)}.netBadge.lvl1{background:#e36f3640}
.netBadge.lvl0{background:#b43b32}.netBadge.lvl0 i{background:#ffffff55}
.netDialog p{color:inherit;font-size:14px;line-height:1.5}
/* 04.10.2026: статус ставит владелец — автоматика предлагает (кнопки Да/Нет), «что нужно от тебя», счётчики доски */
.boardSummary{display:flex;flex-wrap:wrap;gap:6px 14px;align-items:center;padding:6px 2px 8px;font-size:14px;color:var(--muted)}
.boardSummary b{color:var(--orange);font-size:16px}
.boardSummary button{margin-left:auto}
.boardProposal{grid-column:1/-1;display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:6px 0;padding:6px 8px;border:1px dashed var(--orange);border-radius:10px;font-size:13px;line-height:1.35}
.boardProposal span{flex:1 1 180px;overflow-wrap:anywhere}
.boardNeedsBadge{grid-column:1/-1;display:block;margin-top:4px;color:var(--orange);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.boardNeeds{font-size:16px;font-weight:600}
.boardNeeds b{display:block;color:var(--orange);font-size:14px;margin-bottom:2px}
.boardNeeds ul{margin:2px 0 6px 18px;padding:0}
.boardNeeds li{margin:3px 0;overflow-wrap:anywhere}

/* ⛔ 04.10.2026, владелец: «на телефоне ширина приложения перестала вмещаться в экран».
   Замер: шапка экрана проектов (.title) не сжимается уже ~343 px — слово «запускаем?» 34px Georgia
   (~205 px, перенести нельзя) + колонка кнопок «Все проекты (44)» (nowrap, 114 px). На 412 px запас
   всего ~70 px; при увеличенном шрифте Android/Chrome (масштаб текста) страница становится шире
   экрана, и вместе с ней уезжает пузырь Штаба. Заголовок теперь сжимается и уменьшает шрифт. */
.title>div:first-child{min-width:0}
.title h1{overflow-wrap:break-word}
@media (max-width:480px){.title h1{font-size:clamp(24px,8vw,34px)}}

/* ⛔ 04.10.2026 21:1x, владелец второй раз: «опять влево-вправо выезжает, пофиксить так, чтобы не слетало».
   Прошлая правка лечила ОДНУ найденную причину (шапка), а вылезти может любой новый элемент —
   длинный путь или строка кода в сообщении, таблица, картинка. Поэтому два пояса:
   1) страница целиком не прокручивается по горизонтали никогда (clip, а где нет — hidden);
   2) содержимое сообщений переносится и сжимается само. Что всё-таки шире экрана — ловит датчик
      в app.js (layoutOverflowProbe) и присылает в журнал клиента, чтобы чинить по факту. */
html,body{max-width:100%;overflow-x:hidden}
@supports (overflow-x:clip){html,body{overflow-x:clip}}
.eventText,.replyQuote{overflow-wrap:anywhere;word-break:break-word;min-width:0}
.eventText pre,.eventText table{display:block;max-width:100%;overflow-x:auto}
.eventText code{overflow-wrap:anywhere}
.eventText img,.messageImage,.timeline img{max-width:100%;height:auto}
.event{max-width:100%;min-width:0}

/* 04.10.2026 21:47 — датчик layout.overflow с телефона владельца (392 px, dpr 2.75) назвал виновника
   ФАКТОМ: шапка. При обрыве связи #serverStatus («Не удалось передать уточнение…») и значок
   «нет интернета» не переносились: блок шапки 510 px при экране 392. */
header{max-width:100%;overflow:hidden}
header>div:first-child{min-width:0;flex:1 1 auto;overflow:hidden}
#serverStatus{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
.netBadge{flex:0 0 auto}
@media (max-width:480px){.netBadge span{display:none}}

/* 05.10.2026: чек-лист — нажатие по всему полю, длинный список прокручивается внутри и не
   закрывает экран; свой бегунок прокрутки чата справа (страница прокручивается целиком). */
.stepBox{cursor:pointer}
.stepBox.open .stepList{max-height:33vh;overflow-y:auto;overscroll-behavior:contain}
#chatScrollThumb{position:fixed;right:2px;width:14px;border-radius:8px;background:rgba(128,128,128,.45);
  z-index:20;touch-action:none}
#chatScrollThumb.drag{background:rgba(62,167,106,.8)}

/* 06.10.2026 — нижняя панель «как в Телеграме» (владелец: «закрывает пол экрана, кнопка огромная»).
   Одна строка: ☰ 📎 [поле, растёт по тексту] ● ➤. Статус и «＋ задача» — тонкой строкой над ней. */
#composer .composeActions{display:flex;flex-wrap:nowrap;align-items:flex-end;gap:6px;margin-top:4px}
#composer #message{flex:1 1 auto;min-width:0;min-height:40px;height:40px;max-height:35vh;padding:9px 12px;border-radius:20px;line-height:1.35;overflow-y:auto}
#composer .bottomMenu{flex:0 0 38px;width:38px;height:38px;border-radius:50%;font-size:18px}
#composer .iconBtn{flex:0 0 34px;width:34px;height:38px;border:0;background:transparent;font-size:20px;padding:0;color:var(--muted)}
#composer .mic{flex:0 0 38px;width:38px;height:38px}
#composer .sendIcon{flex:0 0 40px;width:40px;height:40px;border:0;border-radius:50%;background:var(--green);color:#fff;font-size:18px;line-height:1;padding:0 0 0 3px;margin:0}
#composer .composeStatus{display:flex;align-items:center;gap:8px;min-height:0;font-size:12px;color:var(--muted)}
#composer .composeStatus:empty{display:none}
#composer #voiceState{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#composer .composeStatus .workIndicator{padding:2px 2px;margin:0}
#composer .composeStatus .newTaskBtn{padding:2px 9px;font-size:12px;border-radius:999px;margin-left:auto}
#composer .composeStatus #stopBtn{padding:3px 10px;font-size:12px;min-width:0}
/* панель хода: одна строка, план — по тапу, ошибка закрывается */
#progressPanel{padding:6px 10px;margin-bottom:6px}
#progressPanel .progressNow{font-size:13px;line-height:1.3;cursor:pointer}
#progressPanel .progressNow > span{flex:1;min-width:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
#progressPanel #progressPlan{display:none}
#progressPanel.expanded #progressPlan{display:grid;max-height:30vh;overflow:auto}
#progressPanel.expanded .progressNow > span{-webkit-line-clamp:unset}
#progressPanel.hasPlan .progressNow > span::after{content:' ▾';color:var(--muted)}
.progressClose{flex:0 0 26px;width:26px;height:26px;border:0;border-radius:50%;background:transparent;color:var(--muted);font-size:20px;line-height:1;padding:0}
.progressPanel.error .progressClose{color:var(--red)}
@media (max-width:600px){
  #composer{padding:6px 8px calc(6px + env(safe-area-inset-bottom))}
  #composer #message{min-height:40px}
  #composer .composeActions .primary{width:auto}
  #chatView{padding-bottom:96px}
  .scrollBottom{bottom:calc(120px + env(safe-area-inset-bottom))}
}
/* 06.10.2026: пузырь неудачной отправки — явно «не отправлено» (владелец принял его за отправленный) */
.event.me.notSent{opacity:.6;border-style:dashed;border-color:#e2aaa5}
.notSentTag{display:block;margin-top:4px;color:var(--red);font-size:12px}
/* 06.10.2026: шапка обсуждения липнет ПОД полосой вкладок, а не под неё */
#chatView .chatTop{top:var(--sessionBarH,44px);z-index:4}
/* 06.10.2026: шапка обсуждения сворачивается до одной строки (тап по названию — развернуть) */
#chatView .chatTop{padding:0 0 4px}
#chatView .chatTop:not(.open) #chatTitle{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:15px}
#chatView .chatTop:not(.open) #chatTitle::after{content:' ▾';color:var(--muted);font-weight:400}
#chatView .chatTop.open #chatTitle::after{content:' ▴';color:var(--muted);font-weight:400}
#chatView .chatTop:not(.open) #chatState{display:none}
#chatView .chatTop:not(.open) #finishTab{display:none!important}
/* 07.10.2026, владелец: «Стоп» — вверху, после разворота шапки, пользуюсь редко */
#chatView .chatTop:not(.open) #stopBtn{display:none!important}
#chatView .chatTop > div{min-width:0}
/* 06.10.2026: пузырь «ждут твоего ответа» */
#askBubble{position:fixed;z-index:30;right:14px;bottom:calc(185px + env(safe-area-inset-bottom));width:52px;height:52px;border:0;border-radius:50%;background:var(--orange);color:#fff;font-size:24px;font-weight:800;box-shadow:0 8px 24px #17221e55}
#askBubble i{position:absolute;top:-4px;right:-4px;min-width:22px;height:22px;padding:0 6px;border-radius:11px;background:var(--red);color:#fff;font:700 13px/22px system-ui;font-style:normal;border:2px solid #fff}

/* 06.10.2026: значок связи в строке статуса над полем ввода — виден всегда (владелец не видел его в шапке) */
#composer .composeStatus .netBadge{margin-left:0;padding:2px 7px;background:#8881;color:var(--muted)}
#composer .composeStatus .netBadge i{background:#8886}
#composer .composeStatus .netBadge span{display:inline;margin-left:4px;font-size:11px}
#composer .composeStatus .netBadge.lvl3 i{background:#2fae75}
#composer .composeStatus .netBadge.lvl2 i:nth-child(-n+2){background:#d29b14}
#composer .composeStatus .netBadge.lvl1{background:#e36f3633}
#composer .composeStatus .netBadge.lvl1 i:nth-child(1){background:var(--orange)}
#composer .composeStatus .netBadge.lvl0{background:#b43b32;color:#fff}
#composer .composeStatus .netBadge.lvl0 i{background:#ffffff88}

/* ⭐ 06.10.2026: режим «Чаты» как в Телеграме (body.chatsMode). Прежний вид не тронут. */
.uiModeBtn{border:0;background:#ffffff1a;color:#fff;border-radius:999px;padding:4px 9px;font-size:16px;line-height:1;cursor:pointer;flex:0 0 auto}
body.chatsMode .sessionBar{display:none}
#chatsView{padding:0}
.chatsHead{display:flex;align-items:center;gap:8px;padding:2px 2px 8px}
.chatsHead b{font-size:22px;margin-right:auto}
.chatsSearch{width:100%;border:1px solid var(--line);border-radius:999px;padding:8px 14px;font:inherit;background:var(--card);margin-bottom:8px}
.chatsFolders{display:flex;flex-wrap:wrap;gap:6px;padding-bottom:8px}/* 15.10.2026: кнопки папок не уходят за край */
.chatsFolder{flex:0 0 auto;border:1px solid var(--line);background:var(--card);color:var(--ink);border-radius:999px;padding:5px 12px;font-size:14px;cursor:pointer}
.chatsFolder.active{background:var(--green);border-color:var(--green);color:#fff}
.chatsFolder u{text-decoration:none;margin-left:6px;background:var(--orange);color:#fff;border-radius:999px;padding:0 6px;font-size:12px}
.chatsList{display:flex;flex-direction:column}
.chatRow{display:flex;gap:12px;align-items:center;width:100%;text-align:left;border:0;background:transparent;padding:9px 6px;border-radius:12px;cursor:pointer;color:var(--ink);font:inherit}
.chatRow:hover{background:#0000000a}.chatRow.active{background:var(--mint)}
.chatAva{flex:0 0 48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:700;font-size:20px}
.chatBody{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;border-bottom:1px solid var(--line);padding-bottom:9px}
.chatTop1,.chatTop2{display:flex;align-items:center;gap:8px;min-width:0}
.chatTop1 b{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:15px}
.chatTop1 time{flex:0 0 auto;font-size:12px;color:var(--muted)}
.chatRow.unread .chatTop1 time{color:var(--green);font-weight:600}
.chatPreview{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;color:var(--muted)}
.chatPreview.working{color:var(--green);font-style:italic}
.chatCount,.chatWait{flex:0 0 auto;text-decoration:none;min-width:22px;height:22px;padding:0 7px;border-radius:999px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;color:#fff;background:var(--green)}
.chatWait{background:var(--orange)}
.chatsEmpty{color:var(--muted);text-align:center;padding:30px 0}
/* компьютер: две колонки — список слева всегда, переписка справа */
@media (min-width:900px){
  body.chatsMode #chatsView{display:block!important;position:fixed;left:0;top:0;bottom:0;width:var(--chats-w,360px);overflow-y:auto;padding:12px 10px;background:var(--bg);border-right:1px solid var(--line);z-index:5}
  body.chatsMode main{margin-left:var(--chats-w,360px);max-width:min(var(--chat-max,760px),calc(100% - var(--chats-w,360px)))}
  body.chatsMode #composer{left:calc(var(--chats-w,360px) + (100% - var(--chats-w,360px))/2);width:min(var(--chat-max,760px),calc(100% - var(--chats-w,360px)))}
  /* 15.10.2026, владелец: «чтобы панели двигались, размер я мог менять» — ручка на границе */
  body.chatsMode #chatsSplit{display:block;position:fixed;top:0;bottom:0;left:calc(var(--chats-w,360px) - 3px);width:7px;cursor:col-resize;z-index:6}
  body.chatsMode #chatsSplit:hover,body.chatsMode #chatsSplit.drag{background:var(--line)}
  body.chatsMode #chatView [data-back]{visibility:hidden}
}
@media (min-width:900px){body.chatsMode main:has(> #chatsView:not([hidden]))::after{content:'Выберите чат слева';display:block;text-align:center;color:var(--muted);padding-top:30vh}}
.installBtn{font-size:13px;padding:5px 10px;background:var(--orange)}.installBtn[hidden]{display:none}
.chatRow.off{opacity:.62}
.chatKind{flex:0 0 auto;text-decoration:none;font-size:11px;color:var(--muted);border:1px solid var(--line);border-radius:6px;padding:0 5px}
/* 06.10.2026: полоски соседних вкладок проекта под своей */
.stepBox.neighbor{margin-top:4px;opacity:.92}
.neighborHead{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--muted);padding:2px 2px 0}
.neighborHead span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.neighborHead button{border:0;background:transparent;color:var(--green);font-size:12px;cursor:pointer;padding:0 4px}

/* 08.10.2026: владелец — маленький цветной кружок слева от индикатора скорости. */
#limitsBadge,#limitsBadgeChat{flex:0 0 28px;width:28px;height:28px;margin:0;padding:7px;border:0;
  border-radius:50%;background:#ffffff12;color:#55d49f;font-size:0;cursor:pointer}
#limitsBadge::before,#limitsBadgeChat::before{content:'';display:block;width:14px;height:14px;border-radius:50%;background:currentColor}
#limitsBadge[hidden],#limitsBadgeChat[hidden]{display:none}
#limitsBadge.limitsUnknown,#limitsBadgeChat.limitsUnknown{color:#a5b1ad}
#limitsBadge.limitsWarn,#limitsBadgeChat.limitsWarn{color:#ffae52}
#limitsBadge.limitsCritical,#limitsBadgeChat.limitsCritical{color:#ff7168}
.limitsDialog{width:min(420px,calc(100vw - 28px));max-height:80vh;overflow-y:auto}
.limitsDialog section{padding:10px 0;border-top:1px solid var(--line)}
.limitsDialog p{margin:6px 0;overflow-wrap:anywhere}
.limitsDialog .limitsUpdated{font-size:12px;color:var(--muted)}

/* 08.10.2026: long cached histories lay out only messages near the viewport. */
#timeline > .event { content-visibility: auto; contain-intrinsic-size: auto 180px; }
#timeline > .event:nth-last-child(-n+8) { content-visibility: visible; contain-intrinsic-size: none; }

/* 08.10.2026: задачи раскрываются внутри чата; Канбан остаётся источником данных. */
/* 18.10.2026: на месте скрытого канбана — «Реестр» (решение владельца), правило снято */
.viewBar{grid-template-columns:repeat(2,minmax(0,1fr))}
.readyTools{display:flex;gap:8px;justify-content:flex-end;margin-bottom:12px}
.dialogTasks,.dialogTask,.dialogNeighbors{min-width:0}
.dialogTasks{border:1px solid var(--line);border-left:4px solid #5fbf8a;border-radius:10px;background:var(--card);overflow:hidden}
.dialogTasks.yellow,.dialogTask.yellow{border-left-color:#e0b23a}
.dialogTasks.red,.dialogTask.red{border-left-color:var(--red)}
.dialogTasksSummary{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:4px 7px;padding:7px 8px;cursor:pointer;font-size:12px;list-style:none}
.dialogTasksSummary::-webkit-details-marker,.dialogTaskSummary::-webkit-details-marker{display:none}
.dialogTasksSummary>b::before{content:'▸ ';font-size:12px}
.dialogTasks[open]>.dialogTasksSummary>b::before{content:'▾ '}
.dialogTasksSummary>span{font-size:11px;text-align:right;white-space:nowrap}
.dialogTasksSummary>small{font-size:10px;color:var(--muted)}
.dialogTasksSummary>.stepBar{grid-column:1/-1;width:100%;height:3px}
.dialogTasks.yellow>.dialogTasksSummary{background:#fff8e6}.dialogTasks.red>.dialogTasksSummary{background:#fdeceb}
.dialogTasks.yellow>.dialogTasksSummary .stepBar u,.dialogTask.yellow .stepBar u{background:#e0b23a}
.dialogTasks.red>.dialogTasksSummary .stepBar u,.dialogTask.red .stepBar u{background:var(--red)}
.dialogTaskList{max-height:45vh;overflow-y:auto;overscroll-behavior-y:contain;scrollbar-width:thin}
.dialogTask{border-top:1px solid var(--line);border-left:3px solid transparent;padding:0 7px;background:var(--card)}
.dialogTaskSummary{padding:8px 0;cursor:pointer;list-style:none}
.dialogTaskSummary>b{display:block;font-size:12px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dialogTaskSummary>b::before{content:'▸ ';color:var(--muted)}
.dialogTask[open]>.dialogTaskSummary>b::before{content:'▾ '}
.dialogTaskMeta{display:flex;align-items:center;gap:7px;margin-top:3px;font-size:11px;color:var(--muted)}
.dialogTaskMeta>span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dialogTaskMeta small{white-space:nowrap;font-size:10px}
.dialogTaskMeta .stepBar{flex-basis:46px;height:4px}
.dialogTask.complete>.dialogTaskSummary>b{color:var(--green)}
.dialogTaskChecklist.stepBox{border:0;background:transparent;border-radius:0}
.dialogTaskChecklist>.stepLine{display:none}
.dialogTaskChecklist.open>.stepList{max-height:none;overflow:visible;padding:0 0 7px}
.dialogTaskChecklist .stepList li{flex-wrap:wrap;gap:1px 8px}
.dialogTaskChecklist .stepList li>span{min-width:0;overflow-wrap:anywhere}
.dialogTaskChecklist .stepList li>small{margin-left:auto}
.taskReplyAction{font-size:11px;margin:2px 0 8px;min-height:28px}
.taskReplyGesture{touch-action:pan-y;user-select:none;-webkit-user-select:none}
.dialogNeighbors{border-top:1px solid var(--line);padding:5px 7px;font-size:12px;background:var(--card)}
.dialogNeighbors>summary{cursor:pointer;padding:5px 0;color:var(--muted)}
.dialogNeighbor{padding:5px 0}
.dialogNeighbor .neighborHead{padding:3px 0 6px}
.dialogNeighbor>.dialogTask{padding-left:3px}
.dialogNeighborsItem{display:block!important;padding:0!important}
.dialogSingleTask>.stepList{max-height:45vh!important;overscroll-behavior-y:contain}

/* 13.10.2026: голубой пузырь «ждут ответа в чатах» — над оранжевым «?», стопкой */
#chatBubble{position:fixed;z-index:30;right:14px;bottom:calc(247px + env(safe-area-inset-bottom));width:52px;height:52px;border:0;border-radius:50%;background:#2f8fe0;color:#fff;font-size:22px;font-weight:800;box-shadow:0 8px 24px #17221e55}
#chatBubble.alone{bottom:calc(185px + env(safe-area-inset-bottom))}
#chatBubble i{position:absolute;top:-4px;right:-4px;min-width:22px;height:22px;padding:0 6px;border-radius:11px;background:#1565c0;color:#fff;font:700 13px/22px system-ui;font-style:normal;border:2px solid #fff}
.decisionCard.decisionChat{border-left:5px solid #2f8fe0;background:color-mix(in srgb,#2f8fe0 7%,var(--card, #fff))}
.decisionCard.decisionChat .decisionProject{background:#2f8fe0;color:#fff}

/* 13.10.2026: кнопки «Отчёт по задаче» и «Завершить задачу» + окно подтверждения */
.taskActions{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.taskFinishBackdrop{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:9999;display:flex;align-items:center;justify-content:center;padding:16px}
.taskFinishDialog{background:#fff;color:var(--ink,#111);border-radius:12px;max-width:420px;width:100%;padding:16px;box-shadow:0 8px 30px rgba(0,0,0,.3)}
.taskFinishDialog p{margin:6px 0 12px;opacity:.8;font-size:14px}
.taskFinishButtons{display:flex;flex-direction:column;gap:8px}
.taskFinishButtons button{min-height:40px}
.taskFinishReport{white-space:pre-wrap;max-height:30vh;overflow:auto;font-size:13px;background:var(--card,#fffdf8);border:1px solid var(--line,#ded8cc);border-radius:8px;padding:8px;margin:0 0 10px}
.taskFinishReason{width:100%;margin:0 0 10px;font-size:14px}
/* 13.10.2026, владелец: «не видно, что кнопка нажалась» — отклик на нажатие и состояние «сделано» */
.taskReplyAction{transition:transform .08s,background-color .2s,color .2s}
.taskReplyAction:active{transform:scale(.94);background:var(--mint,#d9eee5)}
.taskReplyAction.taskActionDone,.taskReplyAction:disabled{background:var(--mint,#d9eee5);color:var(--green,#126b54);border-color:var(--green,#126b54);opacity:1}
.taskFinishButtons button:active{transform:scale(.97)}

/* Реакции на ответ: компактная строка внутри пузыря, доступная и без наведения. */
#timeline .eventReactions{display:flex;gap:4px;margin-top:7px;clear:both}
#timeline .eventReaction{display:inline-flex;align-items:center;justify-content:center;min-width:36px;min-height:32px;padding:3px 8px;border:1px solid transparent;border-radius:14px;background:transparent;color:inherit;font-size:17px;line-height:1;cursor:pointer;opacity:.65;touch-action:manipulation}
#timeline .eventReaction:hover,#timeline .eventReaction:focus-visible{opacity:1;background:rgba(127,127,127,.12)}
#timeline .eventReaction[aria-pressed="true"]{opacity:1;background:rgba(88,166,255,.18);border-color:currentColor}
#timeline .eventReaction:disabled{cursor:wait;opacity:.4}

/* 14.10.2026: значок лимитов мигает при остатке Claude 5ч <10 % или недели <5 % */
@keyframes limitsBlink{0%,100%{opacity:1;box-shadow:0 0 0 0 rgba(220,40,40,0)}50%{opacity:.35;box-shadow:0 0 0 4px rgba(220,40,40,.55)}}
#limitsBadge.limitsBlink,#limitsBadgeChat.limitsBlink{animation:limitsBlink 1s ease-in-out infinite;background:#c62828!important;color:#fff!important}
/* 14.10.2026: модель вкладки — серой строкой над значком лимитов */
#composer .modelLine{font-size:11px;color:var(--muted);opacity:.8;padding:0 2px 2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#composer .modelLine.modelWarn{color:#b7791f;opacity:1}
/* 14.10.2026: значок закрепа в списке чатов, как в Телеграме */
.chatPin{flex:0 0 auto;text-decoration:none;font-size:13px;opacity:.55;margin-left:4px}
/* 14.10.2026: сводки сторожей — свёрнутой группой */
.decisionsWatch{margin:10px 0;opacity:.85}
.decisionsWatch>summary{cursor:pointer;color:var(--muted);font-size:13px;padding:6px 2px}
/* 14.10.2026: выбор модели во вкладке ChatGPT */
#composer .chatgptModel{flex:0 0 auto;font-size:12px;padding:2px 6px;border-radius:8px;border:1px solid var(--line,#ccc);background:transparent;color:inherit}

#chatsSplit{display:none}
.chatsFolder.watch{border-style:dashed;color:var(--muted)}

/* 15.10.2026, владелец: «шапка в таком виде не нужна — индикаторы дублируются, кнопки — в меню ☰» */
body>header{display:none!important}
.iternaMenu{position:fixed;z-index:50;background:var(--card);border:1px solid var(--line);border-radius:14px;box-shadow:0 12px 40px #0003;padding:6px;min-width:230px}
.iternaMenu button{display:flex;width:100%;align-items:center;gap:10px;border:0;background:transparent;color:var(--ink);text-align:left;padding:9px 12px;border-radius:9px;font-size:15px;cursor:pointer}
.iternaMenu button:hover{background:var(--mint)}
.iternaMenu small{color:var(--muted);margin-left:auto;font-size:12px}
/* 18.10.2026: третий пузырь «выполнено» — зелёный кружок с галочкой */
#doneBubble{position:fixed;z-index:30;right:14px;bottom:calc(185px + env(safe-area-inset-bottom));width:52px;height:52px;border:0;border-radius:50%;background:#2e9e5b;color:#fff;font-size:26px;font-weight:800;box-shadow:0 8px 24px #17221e55;cursor:pointer}
#doneBubble i{position:absolute;top:-4px;right:-4px;min-width:22px;height:22px;padding:0 6px;border-radius:11px;background:#1b6b3a;color:#fff;font:700 13px/22px system-ui;font-style:normal;border:2px solid #fff}
.doneDialog{border:0;border-radius:14px;padding:0;max-width:min(560px,94vw);width:100%;max-height:82vh;overflow:auto;box-shadow:0 12px 40px #17221e66}
.doneDialog::backdrop{background:#17221e88}
.doneHead{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid var(--line,#ddd);position:sticky;top:0;background:var(--card,#fff)}
#doneList{padding:6px 16px 16px}
.doneItem{padding:12px 0;border-bottom:1px solid var(--line,#ddd);overflow-wrap:anywhere;color:var(--ink,#0b120f)}
.doneItem>b{font-size:17px;font-weight:800}
.doneFact{margin:6px 0;color:var(--ink,#0b120f);font-size:16px;font-weight:600;line-height:1.45}
.doneBtns{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px}
.doneEmpty{color:var(--muted,#666);padding:14px 0}
/* 18.10.2026: кнопка и панель «Реестр» */
.registryFilters{display:flex;flex-direction:column;gap:8px;margin:8px 0 12px}
.registryChips{display:flex;flex-wrap:wrap;gap:6px}
.registryChips .chip{border:1px solid var(--line,#ccc);background:var(--card,#fff);color:inherit;border-radius:999px;padding:6px 11px;font-size:13px;cursor:pointer}
.registryChips .chip.active{background:var(--green,#2e9e5b);border-color:var(--green,#2e9e5b);color:#fff}
.registryProject{max-width:100%;padding:7px 9px;border-radius:8px;border:1px solid var(--line,#ccc);background:var(--card,#fff);color:inherit;font-size:14px}
.registryGroup{border-top:1px solid var(--line,#ddd);padding:6px 0}
.registryGroup>summary{font-weight:700;cursor:pointer;padding:6px 0}
.registryItem{padding:7px 0 7px 8px;border-left:3px solid transparent;overflow-wrap:anywhere}
.registryItem.overdue{border-left-color:var(--red,#d9534f)}
.registryItem small{color:var(--muted,#666);font-size:12px}
.chatsRegistryBtn{margin-left:auto}
#registryBox .boardHead{gap:8px}
.registryItem.paused{opacity:.78;border-left-color:#c9a227}
.registryItem .doneBtns{margin-top:6px}
.registryPanel{margin-top:6px;padding:8px 10px;border-radius:8px;background:var(--mint,#eef6f1)}
.registryPanel .doneBtns{margin:0 0 6px}
.registryReply{width:100%;box-sizing:border-box;margin:4px 0 6px;padding:8px;border-radius:8px;border:1px solid var(--line,#ccc);background:var(--card,#fff);color:inherit;font:inherit}
.registryLog{margin:3px 0;font-size:12px;color:var(--muted,#666);overflow-wrap:anywhere}
/* 18.10.2026, владелец: «кнопка голоса везде одинаковая — зелёный кружок, внутри зелёный микрофон на белом фоне; при записи
   краснеет и моргает; пока идёт расшифровка — меняется (крутится кольцо)». Один вид для ВСЕХ мест, где есть ввод голоса:
   поле сообщения, Штаб, мозг, задача, карточки решений, ответ по задаче в реестре — все они берут класс .mic. */
.mic{position:relative;width:38px;height:38px;flex:0 0 38px;border-radius:50%;border:2px solid var(--green,#126b54);padding:0;cursor:pointer;
  background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23126b54' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='3' width='6' height='11' rx='3'/%3E%3Cpath d='M5 11a7 7 0 0 0 14 0M12 18v3'/%3E%3C/svg%3E") center/20px no-repeat;
  color:transparent;font-size:0;line-height:0;animation:none}
.mic.listening{border-color:#d32f2f;animation:micBlink 1s infinite;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23d32f2f' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='3' width='6' height='11' rx='3'/%3E%3Cpath d='M5 11a7 7 0 0 0 14 0M12 18v3'/%3E%3C/svg%3E")}
.mic.transcribing{background-image:none;border-color:var(--muted,#6b7772)}
.mic.transcribing::after{content:'';position:absolute;inset:7px;border:3px solid var(--green,#126b54);border-top-color:transparent;border-radius:50%;animation:iternaSpin .9s linear infinite}
.mic:disabled{opacity:1;cursor:progress}
@keyframes micBlink{0%,100%{box-shadow:0 0 0 0 rgba(211,47,47,.55);opacity:1}50%{box-shadow:0 0 0 6px rgba(211,47,47,0);opacity:.55}}
/* 18.10.2026, владелец: кнопка «＋ задача» убрана (не нужна); значок уведомлений — крупный динамик как в Телеграме:
   зелёный динамик с волнами — оповещения ВКЛЮЧЕНЫ, динамик с перечёркиванием — выключены. Тот же зелёный круг, что у микрофона. */
#pushBtn{position:relative;flex:0 0 38px;width:38px;height:38px;border-radius:50%;border:2px solid var(--green,#126b54);padding:0;cursor:pointer;
  background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23126b54' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M11 5 6 9H3v6h3l5 4z'/%3E%3Cpath d='M15.5 8.5a5 5 0 0 1 0 7M18.5 5.5a9 9 0 0 1 0 13'/%3E%3C/svg%3E") center/22px no-repeat;
  color:transparent;font-size:0;line-height:0;margin-left:2px}
#pushBtn[aria-pressed="false"]{border-color:var(--muted,#6b7772);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236b7772' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M11 5 6 9H3v6h3l5 4z'/%3E%3Cpath d='M16 9.5a3.5 3.5 0 0 1 .5 4'/%3E%3Cpath d='M3 3l18 18' stroke='%23d32f2f'/%3E%3C/svg%3E")}
#pushBtn:disabled{opacity:.6;cursor:progress}
/* 18.10.2026, владелец: скрепка (прикрепить вложение) — в том же стиле, что микрофон и динамик: круг в зелёной рамке, зелёная
   скрепка на белом. Четыре места: поле сообщения, задача, Штаб, «мозг». */
#composer button#chatAttachBtn,button#taskAttach,button#hqAttach,button#brainAttach{position:relative;flex:0 0 38px;width:38px;height:38px;min-width:38px;
  border-radius:50%;border:2px solid var(--green,#126b54);padding:0;cursor:pointer;margin:0;
  background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23126b54' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48'/%3E%3C/svg%3E") center/20px no-repeat;
  color:transparent;font-size:0;line-height:0}
#composer button#chatAttachBtn:disabled,button#taskAttach:disabled,button#hqAttach:disabled,button#brainAttach:disabled{opacity:.6}

/* 19.10.2026 R0059: крупная читалка отчёта реестра */
.regReader{position:fixed;inset:0;z-index:9999;background:rgba(18,60,49,.55);display:flex;justify-content:center;overflow-y:auto}
.regReaderBox{width:min(820px,100%);margin:0 auto;background:var(--bg,#f4f1e9);min-height:100%;padding:16px 18px 40px;font-family:Georgia,'Times New Roman',serif;font-size:20px;line-height:1.6;color:var(--ink,#17221e)}
.regReaderHead{display:flex;justify-content:space-between;align-items:center;gap:12px;position:sticky;top:0;background:var(--bg,#f4f1e9);padding:6px 0 10px;border-bottom:1px solid var(--line,#ded8cc)}
.regReaderHead h2{margin:0;font-size:26px}
.regBlock{background:var(--card,#fffdf8);border:1px solid var(--line,#ded8cc);border-radius:16px;padding:14px 18px;margin:14px 0}
.regBlock h3{margin:0 0 6px;font-size:16px;text-transform:uppercase;letter-spacing:.05em;color:var(--green,#126b54);font-family:system-ui,sans-serif}
.regBlock p{margin:6px 0;overflow-wrap:anywhere;color:var(--ink,#0b120f);font-weight:600}
.regLogLine{font-size:19px;color:var(--ink,#0b120f);font-weight:600}
.regCritic{border-color:var(--green,#126b54);border-width:2px}
.regVerdict{display:inline-block;font:700 18px system-ui,sans-serif;padding:6px 16px;border-radius:11px;color:#fff;margin-bottom:8px}
.regVerdict.ok{background:var(--green,#126b54)}.regVerdict.warn{background:var(--orange,#e36f36)}
.regCritLine{font-size:20px;color:var(--ink,#0b120f);font-weight:600}.regCritMeta{font-size:16px;color:var(--ink,#0b120f);font-weight:600}
.regNote{width:100%;font-size:17px}
.regReaderFoot{display:flex;gap:12px;flex-wrap:wrap;margin-top:18px}
.regErr{color:var(--red,#b43b32)}

/* T1184: карточка с текстом вопроса по клику «?» — поверх списка, читается на телефоне без листания */
.waitCard{position:fixed;left:12px;right:12px;bottom:calc(12px + env(safe-area-inset-bottom));z-index:60;max-width:560px;margin:0 auto;padding:14px 16px;border:2px solid var(--orange,#e36f36);border-radius:16px;background:var(--card,#fffdf8);color:var(--ink,#17221e);box-shadow:0 15px 40px #35231535;max-height:min(60vh,420px);max-height:min(60dvh,420px);overflow-y:auto;overscroll-behavior:contain}
.waitCardHead{display:flex;align-items:center;justify-content:space-between;gap:10px;position:sticky;top:-14px;z-index:1;margin:-14px -16px 6px;padding:14px 16px 6px;background:var(--card,#fffdf8)}
.waitCardProject{font-size:15px}
.waitCardText{white-space:pre-wrap;overflow-wrap:anywhere;font-size:15px}
.waitCardOptions{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.waitCardOption{padding:4px 9px;border:1px solid var(--line,#ded8cc);border-radius:999px;font-size:13px}
.waitCardNote{margin-top:6px;font-size:12px;color:var(--muted,#6b7772)}
.waitCardNote:empty,.waitCardOptions:empty{display:none}
.waitCardActions,.waitCardOpen{margin-top:10px}

/* 23.10.2026 (q5558): рамочка с моделью у вкладки — для зрительной проверки, на какой модели работает. */
.modelBadge { font-style: normal; font-size: 10px; font-weight: 700; line-height: 1; padding: 2px 5px; margin-left: 4px;
  border: 1px solid var(--green, #2e9d5c); border-radius: 5px; color: var(--green, #2e9d5c); white-space: nowrap; flex: 0 0 auto; }

/* 23.10.2026 (q5558): несколько рамок моделей в одной строке чата — по одной на вкладку проекта. */
.modelBadges { display: inline-flex; gap: 3px; flex: 0 0 auto; margin-left: 4px; }
.modelBadges .modelBadge { margin-left: 0; }

/* v328: название проекта в строке чата не вытесняется рамками моделей */
.chatTop1 b { min-width: 6ch; flex: 1 1 auto; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.chatTop1 .modelBadges { flex: 0 0 auto; }

/* 23.10.2026 (R0322): индикатор расхода токенов у вкладки */
.usageChip { display: inline-flex; align-items: center; gap: 4px; flex: 0 0 auto; margin-left: 0; margin-right: 6px; order: -1; white-space: nowrap; font-size: 10px; color: #4a6b5d; }
.usageChip i { display: inline-block; width: 34px; height: 4px; border-radius: 2px; background: #d9e4dd; position: relative; overflow: hidden; }
.usageChip i::after { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: var(--k, 0%); background: #3b9a6e; }
.usageChip.warn i::after { background: #d99a2b; }
.usageChip.over i::after { background: #c0392b; }
.usageChip.over b { color: #c0392b; }

/* R0367 (24.10.2026): вложения в ответах по решениям и задачам реестра */
.attachKitChips { display: flex; gap: 8px; flex-wrap: wrap; margin: 6px 0; }
.attachKitChips:empty { display: none; }
.attachKitChips .attachment { min-width: 74px; height: 58px; }
.attachKitNote { display: block; color: var(--muted, #6b7280); min-height: 0; }
.attachKitNote:empty { display: none; }
.attachKitBtn { min-width: 40px; }
.doneResult{border-left:4px solid #2e9e5b}
.doneReason{display:block;width:100%;box-sizing:border-box;margin:8px 0;padding:8px;border:1px solid #9bb5a6;border-radius:8px;font:inherit}
