:root{--ink:#243B47;--concrete:#EDF3F6;--paper:#FFFFFF;--steel:#5E7A88;--line:#D4E4ED;--tape:#89CDE8;--red:#A8321C;--accent:#306883;--accent-deep:#1E4557;--wash:#EAF5FB;}
*{box-sizing:border-box;}
html,body{margin:0;}
body{font-family:-apple-system,'Segoe UI',Roboto,system-ui,sans-serif;color:var(--ink);background:var(--concrete);min-height:100vh;-webkit-font-smoothing:antialiased;}
h1,h2,h3{font-weight:600;letter-spacing:.04em;text-transform:uppercase;margin:0;color:var(--accent-deep);}
.mono{font-variant-numeric:tabular-nums;font-feature-settings:"tnum";}
button{font-family:inherit;cursor:pointer;}
button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:2px solid var(--ink);outline-offset:1px;box-shadow:0 0 0 4px var(--tape);}
input,select,textarea{font-family:inherit;color:var(--ink);background:var(--paper);border:1px solid var(--line);border-radius:9px;padding:6px 8px;font-size:13px;}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--ink);}
::placeholder{color:#93A8B2;}
.card{background:var(--paper);border:1px solid var(--line);border-radius:14px;}
.btn{border:1px solid var(--ink);background:var(--paper);color:var(--ink);border-radius:10px;padding:7px 12px;font-size:12px;font-weight:600;letter-spacing:.02em;transition:background .12s,color .12s;}
.btn:hover{background:var(--ink);color:var(--paper);}
.btn:disabled{opacity:.4;cursor:not-allowed;}
.btn-tape{background:var(--tape);border-color:var(--ink);}
.btn-tape:hover{background:var(--ink);color:var(--tape);}
.btn-ghost{border-color:transparent;background:transparent;color:var(--steel);padding:4px 6px;}
.btn-ghost:hover{background:transparent;color:var(--red);}
.tab{border:none;background:transparent;padding:8px 14px;margin-right:2px;font-size:13.5px;font-weight:500;color:var(--steel);border-radius:10px;letter-spacing:.01em;}
.tab:hover{background:#F7FBFD;color:var(--accent);}
.tab[data-on="1"]{background:var(--wash);color:var(--accent-deep);font-weight:600;}
.tape-strip{height:3px;background:var(--tape);opacity:.45;border-radius:2px;}
.row{display:grid;grid-template-columns:minmax(220px,1fr) 92px 84px 96px 104px 116px 30px;gap:10px;align-items:center;}
.erow{display:grid;grid-template-columns:minmax(210px,1fr) 84px 90px 62px 100px 100px 26px;gap:9px;align-items:center;}
.hd{font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--steel);}
.chain{font-size:11px;color:var(--steel);margin-top:3px;}
.chain b{color:var(--ink);font-weight:600;}
.num{text-align:right;}
.scroll{overflow-x:auto;}
.scroll > *{min-width:820px;}
.combo{position:relative;}
.dd{position:absolute;left:0;top:100%;z-index:40;width:340px;max-height:260px;overflow:auto;background:#fff;border:1px solid var(--ink);border-radius:9px;box-shadow:0 8px 24px rgba(0,0,0,.14);display:none;}
.dd button{display:flex;width:100%;gap:8px;align-items:center;text-align:left;border:none;background:#fff;border-bottom:1px solid #EAF1F5;padding:8px 10px;font-size:13px;}
.dd button:hover,.dd button[data-hi="1"]{background:var(--wash);}
.fold{display:flex;align-items:center;gap:8px;padding:9px 12px;background:#F7FBFD;border:1px solid var(--line);border-radius:9px;margin:8px 0 4px;}
@media (max-width:900px){.cols{grid-template-columns:1fr !important;}.side{position:static !important;}}
#printClone{display:none;}
@media print{
  body{background:#fff;}
  body.printing #root{display:none !important;}
  body.printing #printClone{display:block;}
  /* прямой Cmd+P без кнопки: печатаем только документ, если он открыт */
  body:not(.printing) *{visibility:hidden;}
  body:not(.printing) #kpDoc, body:not(.printing) #kpDoc *{visibility:visible;}
  body:not(.printing) #kpDoc{position:absolute;left:0;top:0;width:100%;padding:0 !important;}
  #kpDocPrint{padding:0 !important;background:#fff;}
  #printClone table{page-break-inside:auto;}
  #printClone tr{page-break-inside:avoid;}
  #printClone thead{display:table-header-group;}
  @page{margin:12mm 12mm 18mm;}
}

/* ---- экран входа ---- */
#authWrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px;}
.authCard{background:var(--paper);border:1px solid var(--line);border-radius:9px;width:380px;max-width:100%;padding:28px;}
.logo{display:flex;align-items:center;gap:10px;margin-bottom:18px;}
.logo .sq{width:24px;height:24px;background:var(--tape);border:2px solid var(--ink);}
.err{background:#FBEDE9;color:var(--red);border:1px solid #EBD3CC;border-radius:9px;padding:8px 10px;font-size:13px;margin-bottom:12px;display:none;}
.field{margin-bottom:12px;}
.field label{display:block;margin-bottom:4px;}
.tabsw{display:flex;gap:6px;margin-bottom:18px;}
.tabsw button{flex:1;border:1px solid var(--line);background:var(--paper);color:var(--steel);padding:9px;border-radius:9px;font-weight:600;font-size:13px;}
.tabsw button[data-on="1"]{background:var(--ink);color:var(--paper);border-color:var(--ink);}
.link{border:none;background:transparent;color:var(--steel);text-decoration:underline;font-size:13px;padding:4px;}
.link:hover{color:var(--ink);}
/* название проекта в графике — ссылка в проект */
.glink{color:#2F80CB;}
.glink:hover{color:var(--ink);text-decoration:underline;}
/* подписи полей всегда в одну строку: длинный текст обрезается с «…»
   и не ломает выравнивание соседних блоков (полный текст — в title) */
label>.hd{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;}
#authWrap input{width:100%;padding:9px 10px;font-size:14px;}
#authWrap .btn{width:100%;background:var(--ink);color:var(--paper);padding:11px 14px;}
#authWrap .btn:hover{background:var(--tape);color:var(--ink);}

/* нижний колонтитул печати */
.print-footer{display:none;}
@media print{
  .print-footer{display:flex;position:fixed;bottom:0;left:0;right:0;justify-content:space-between;align-items:center;gap:10px;font-size:8.5px;color:#6A7480;border-top:1px solid #D2D4CE;padding:3px 0 0;background:#fff;}
  #kpDocPrint{padding-bottom:14mm !important;}
}

/* ═══ адаптив: планшеты ═══ */
@media (max-width: 900px){
  header > div, main{ padding-left:12px !important; padding-right:12px !important; }
  header h1{ font-size:16px !important; }
  main{ padding-top:14px !important; }
  .card{ padding:12px !important; overflow:visible; }
  table{ font-size:12px; display:block; overflow-x:auto; max-width:100%; }
  nav .tab{ white-space:nowrap; }
}
/* ═══ адаптив: телефоны ═══ */
@media (max-width: 640px){
  html, body{ overflow-x:hidden; max-width:100vw; }
  header h1{ font-size:14px !important; }
  header > div > div:first-child{ flex-wrap:wrap; }
  main{ padding-bottom:130px !important; max-width:100vw; }
  input, select, textarea{ font-size:16px; } /* iOS: без автозума */
  .btn{ padding:8px 10px; }
  .kb-col{ flex:0 0 78vw !important; max-width:300px; }
  h2{ font-size:16px !important; }
  /* ── Длинные ряды: горизонтальная прокрутка вместо переноса ──────────────
     Встроенные стили в разметке сильнее файла, поэтому !important.
     Полоса прокрутки скрыта, жест работает. Только раскладка — цвета,
     шрифты и оформление не трогаем. */
  .ptabs, nav.tabbar{
    overflow-x:auto !important; overflow-y:hidden;
    flex-wrap:nowrap !important;
    scrollbar-width:none; -webkit-overflow-scrolling:touch;
  }
  .ptabs::-webkit-scrollbar, nav.tabbar::-webkit-scrollbar{ display:none; }
  .ptabs button, nav.tabbar button{ white-space:nowrap !important; flex:0 0 auto !important; }
  /* канбан: колонки листаются вбок, соседняя видна краем */
  .kb-wrap{ overflow-x:auto !important; -webkit-overflow-scrolling:touch; scrollbar-width:none; }
  .kb-wrap::-webkit-scrollbar{ display:none; }
  /* ── Строки списка проектов: не сжимать название в вертикальную «лапшу» ──
     Причина: правая часть (полоска стадии + сумма) держит фиксированную
     ширину и выдавливает название до одной буквы. На узком экране убираем
     полоску стадии и позволяем правой части сжиматься. */
  /* ── Шапка: кнопки (помощь, аватар, выход) — в один ряд с логотипом ──────
     Меню разделов уезжает на свою строку и листается вбок. Так кнопки не
     «висят» отдельной строкой посреди экрана. */
  .hdrow{ flex-wrap:wrap !important; gap:8px !important; align-items:center; }
  .hdrow > .hdlogo{ order:1; flex:0 0 auto; height:34px !important; }
  .hdrow > nav{ order:3; flex:1 1 100% !important; margin-top:2px; }
  .hdrow > .hd, .hdrow > button, .hdrow > span, .hdrow > a{ order:2; }
  .hdrow > span[style*="margin-left:auto"]{ order:2; flex:1 1 0 !important; }

  /* ── Меню «Настройки» на телефоне ────────────────────────────────────────
     Меню лежит внутри прокручиваемой полосы навигации и уезжало вместе с ней
     за край экрана. Открепляем его от полосы: показываем по центру снизу,
     как обычную панель — так оно всегда видно целиком. */
  .setmenu{
    position:fixed !important;
    top:auto !important; bottom:0 !important;
    left:0 !important; right:0 !important;
    width:100% !important; min-width:0 !important;
    border-radius:16px 16px 0 0 !important;
    max-height:78vh; overflow-y:auto !important; -webkit-overflow-scrolling:touch; overscroll-behavior:contain;
    box-shadow:0 -6px 24px rgba(0,0,0,.18) !important;
    z-index:80 !important;
    padding:8px 0 20px !important;
  }
  .setmenu button{ padding:13px 20px !important; font-size:15px !important; }

  /* ── Колокольчик: наверх, к логотипу; всплывашка — панелью снизу ─────────
     Он лежал в прокручиваемой полосе разделов и уезжал вправо вместе с ней,
     а его окно обрезалось краем экрана. */
  .hdrow > .bellwrap{ order:2; margin-left:0 !important; }
  .bellpop{
    position:fixed !important;
    top:auto !important; bottom:0 !important;
    left:0 !important; right:0 !important;
    width:100% !important; max-width:100% !important; min-width:0 !important;
    border-radius:16px 16px 0 0 !important;
    max-height:72vh; overflow-y:auto;
    box-shadow:0 -6px 24px rgba(0,0,0,.18) !important;
    z-index:80 !important;
    padding:12px 16px 22px !important;
  }

  .mrow-stage{ display:none !important; }

  /* ── 19.08: колокольчик и «?» — в один ряд ──────────────────────────────
     bellwrap попадал под правило «span с margin-left:auto растягивается» и
     кнопки складывались столбиком посреди шапки. */
  .hdrow > .bellwrap{
    display:inline-flex !important; align-items:center; gap:2px;
    flex:0 0 auto !important; white-space:nowrap;
  }

  /* ── 19.08: профиль — всё в одну вертикальную прокрутку ─────────────────
     Окно поднимаем шторкой снизу на всю ширину, ряды переносим, таблица
     уведомлений ужимается до трёх колонок без бокового скролла. */
  #profOverlay{ padding:0 !important; align-items:flex-end !important; }
  #profOverlay > .card{
    max-width:100vw !important; width:100% !important;
    max-height:92vh !important; border-radius:14px 14px 0 0;
  }
  #profOverlay .card div[style*="display:flex"]{ flex-wrap:wrap; }
  #profOverlay table{ font-size:11.5px !important; table-layout:fixed; width:100% !important; }
  #profOverlay th, #profOverlay td{ padding:4px 3px !important; overflow-wrap:break-word; }
  #profOverlay th:first-child, #profOverlay td:first-child{ width:56%; }
  #profOverlay input, #profOverlay select{ max-width:100%; }

  /* ── 19.08: эскиз — сноски выезжают шторкой снизу ───────────────────────
     Панель занимала треть экрана и душила холст. На телефоне холст получает
     всё, панель прячется вниз; язычок «① Сноски (N)» открывает/прячет.
     Первая поставленная сноска открывает шторку сама (JS). */
  #skLeg{
    position:fixed !important; left:0 !important; right:0 !important;
    bottom:0 !important; top:auto !important;
    width:100% !important; max-height:62vh;
    border-left:none !important; border-top:1px solid var(--line,#E2E2DC);
    border-radius:14px 14px 0 0; box-shadow:0 -10px 30px rgba(0,0,0,.28);
    z-index:96; transform:translateY(105%); transition:transform .22s ease;
  }
  #skLeg.mobOpen{ transform:none; }
  #skLegTab{
    position:fixed; left:50%; transform:translateX(-50%); bottom:10px; z-index:95;
    border:1px solid var(--line,#E2E2DC); background:#fff; border-radius:18px;
    padding:9px 16px; font-size:13px; font-weight:600; font-family:inherit;
    box-shadow:0 4px 14px rgba(0,0,0,.18); align-items:center; gap:6px; cursor:pointer;
  }
              /* полоска стадии — не помещается */
  /* ── Список смет: строка перестраивается в две строки ────────────────────
     На узком экране галка «в КП», прогресс, сумма, «Журнал» и меню вместе
     съедали всю ширину — названию оставалась одна буква в строку. Решение:
     название занимает всю первую строку, остальное уходит на вторую. */
  .mrow-est{ flex-wrap:wrap !important; padding-bottom:8px !important; }
  .mrow-est > button[data-act="openEst"]{
    flex:1 1 100% !important; min-width:0 !important; order:1;
    padding-left:14px !important;
  }
  .est-kp{ order:2; padding:0 8px 0 14px !important; flex-direction:row !important; gap:6px !important; }
  .est-prog{ display:none !important; }                    /* процент есть в подписи */
  .est-sum{ order:3; width:auto !important; min-width:70px; flex:1 1 auto !important; text-align:left !important; }
  .est-jrn{ order:4; }
  .mrow-est > span:last-child{ order:5; }                  /* меню ⋮ */
  .mrow-right{ gap:8px !important; flex:0 0 auto !important; }
  .mrow-sum{ width:auto !important; min-width:78px; }
  /* ── Пользователи: имя и почта во всю ширину, кнопки — второй строкой ──── */
  .urow{ flex-wrap:wrap !important; gap:8px !important; }
  .urow-info{ flex:1 1 100% !important; min-width:0 !important; }
  .urow-info > div{ overflow-wrap:anywhere; }
  .hrow{ flex-wrap:wrap !important; }
  .hrow > *{ min-width:0; }
  /* нижняя сводка сметы: компактно, всё видно */
  .bbar{ padding:8px 10px !important; gap:10px 14px !important; font-size:12px; }
  .bbar .hd{ font-size:9px !important; }
  /* двухколоночные раскладки (обсуждение, финансы, эскиз, формы) — в столбик */
  [style*="grid-template-columns:1fr 1fr;"],
  [style*="grid-template-columns:minmax(0,1fr) 320px"],
  [style*="grid-template-columns:300px 1fr"]{ display:block !important; }
  [style*="grid-template-columns:1fr 1fr;"] > *,
  [style*="grid-template-columns:minmax(0,1fr) 320px"] > *,
  [style*="grid-template-columns:300px 1fr"] > *{ margin-bottom:12px; min-width:0; }
  /* выпадающие подсказки прайса/наборов — в пределах экрана */
  .combo{ position:relative; }
  .dd{ max-width:calc(100vw - 32px); }
  /* журнал выполнения: строки не сжимаются, листаются пальцем */
  .shipTbl{ overflow-x:auto; }
  .shipTbl > div{ min-width:660px; }
}

/* ═══ гость-заказчик: всё только для чтения, кроме чата ═══ */
.guest input, .guest select, .guest textarea{ pointer-events:none; background:#F6F6F3 !important; }
.guest [data-e="chatText"], .guest [data-e="chatFile"]{ pointer-events:auto; background:#fff !important; }
/* «Мой профиль» — личные данные гостя, полностью живые */
.guest #profOverlay input, .guest #profOverlay select, .guest #profOverlay textarea{ pointer-events:auto; background:#fff !important; }
.guest #profOverlay input[type="checkbox"]{ background:none !important; }
.guest [data-act="prMenu"], .guest [data-act="stageSet"], .guest [data-act="projDates"]{ display:none !important; }

/* ═══ мобильная первая помощь (экраны до 700px) ═══ */
@media (max-width:700px){
  /* попапы — по ширине экрана, со своей прокруткой */
  div[style*="z-index:60"]>div, div[style*="z-index:65"]>div{
    width:100% !important; max-width:94vw !important;
    max-height:88vh; overflow:auto;
  }
  /* ── Поля дат на iOS ──────────────────────────────────────────────────────
     Пустое поле даты в Safari выглядит как узкий серый прямоугольник без
     единой подписи — непонятно, что это дата и куда нажимать. Задаём поле
     нормальной высоты и показываем «дд.мм.гггг» серым, пока оно пустое. */
  input[type="date"], input[type="datetime-local"], input[type="time"]{
    width:100% !important; min-width:0 !important; max-width:100%;
    min-height:38px; padding:8px 10px !important;
    -webkit-appearance:none; appearance:none;
    background:var(--paper);
  }
  /* Safari показывает заполнитель только для пустого поля */
  input[type="date"]:not(:valid)::-webkit-datetime-edit,
  input[type="date"][value=""]::-webkit-datetime-edit{ color:#93A8B2; }
  input[type="date"]::-webkit-calendar-picker-indicator{
    opacity:.55; margin-left:auto; padding:2px;
  }
  /* пары «с — по» не сжимаются в нечитаемые огрызки */
  span:has(> input[type="date"] + span + input[type="date"]){ flex-wrap:wrap; }
  input[type="date"]{ flex:1 1 130px !important; }
  /* колонки складываем в одну, ряды — с переносом (кроме таблиц) */
  #root div[style*="grid-template-columns"]{ grid-template-columns:1fr !important; }
  #root div[style*="display:flex"]{ flex-wrap:wrap; }
  /* таблицы (сметы и пр.) — горизонтальная прокрутка внутри карточки */
  .card{ overflow-x:auto; }
  .card table{ min-width:560px; }
  /* названия не рвём по буквам */
  #root button, #root a, #root .hd{ word-break:normal; overflow-wrap:anywhere; }
  /* нижняя итоговая панель — компактнее и с переносом */
  #root>div[style*="position:fixed"][style*="bottom"]{ font-size:11px; }
}

/* мобильное меню «⋮» — по центру экрана, поверх всего (не режется прокруткой) */
@media (max-width:700px) and (pointer:coarse){
  .dd{
    position:fixed !important; left:50% !important; right:auto !important;
    top:50% !important;
    /* bottom обязателен: у некоторых меню (например «На согласование») он задан
       в разметке как bottom:calc(100% + 4px) и утаскивал окно за нижний край */
    bottom:auto !important;
    transform:translate(-50%,-50%);
    z-index:80 !important; min-width:230px !important; max-width:92vw;
    max-height:70vh; overflow:auto; box-shadow:0 10px 40px rgba(31,35,40,.35);
  }
  .dd button{ padding:13px 16px !important; font-size:15px !important; }
  [data-pricecell], [data-qtycell]{ text-decoration:underline dotted; }
}

/* полоса прокрутки занимает место всегда — шапка не прыгает при смене вкладок разной высоты */
html{overflow-y:scroll;}

/* 19.08: смета в режиме «только просмотр» (право «Проект: сметы» = просмотр) —
   органы правки не показываем; сервер эти действия и так не принимает */
.est-ro [data-act="lineUp"], .est-ro [data-act="lineDown"],
.est-ro [data-act="setAreaEdit"], .est-ro [data-act="ctx"]{ display:none !important; }
.est-ro input[readonly]{ background:transparent; }

/* 20.08: тариф выключил модуль «Бригады» — колонка уходит из смет целиком:
   сетка строк сужается до шести колонок, бригадные ячейки не показываются */
.no-crews .row{grid-template-columns:minmax(220px,1fr) 92px 84px 96px 104px 30px;}
.no-crews .erow{grid-template-columns:minmax(210px,1fr) 84px 90px 62px 100px 26px;}
.no-crews [data-crew], .no-crews .col-crew{display:none !important;}
/* 05.09: расценка бригады прямо в позиции. Ячейка кликается двойным щелчком,
   crewp-own помечает позиции с собственной расценкой (не из справочника). */
.crewp-cell{font-size:13px;color:var(--steel);}
.crewp-cell[data-crewpcell]{cursor:pointer;}
.crewp-own{color:var(--ink);border-bottom:1px dashed var(--steel);}
.crewp-inp{width:84px;text-align:right;}

/* ── 21.08: мобильный Safari автоматически «лупит» поля со шрифтом <16px.
   Даём инпутам 16px на узких экранах — автозум исчезает, ручной остаётся. ── */
@media (max-width: 700px){
  input, select, textarea { font-size: 16px !important; }
}

/* ── Замеры: модификаторы кнопок (оформление живёт здесь, не в app.js) ── */
.btn.on{background:var(--ink);color:var(--paper);}
.btn.sq{width:32px;padding:7px 0;}
.btn.nw{white-space:nowrap;}
.meas-strip{display:flex;gap:8px;flex-wrap:nowrap;overflow-x:auto;padding:2px 2px 8px;margin-bottom:8px;-webkit-overflow-scrolling:touch;scrollbar-width:thin;}
.meas-strip .btn{flex:none;white-space:nowrap;}


/* ── Редактор эскизов: мобильные панели ── */
.skleg-fold{max-height:44px !important;overflow:hidden !important;}
.skleg-fold>*:not(:first-child){display:none !important;}
@media (max-width:640px){
  .sk-bar{flex-wrap:nowrap !important;overflow-x:auto;padding:6px 8px !important;-webkit-overflow-scrolling:touch;scrollbar-width:none;}
  .sk-bar::-webkit-scrollbar{display:none;}
  .sk-bar .btn{flex:none;white-space:nowrap;padding:6px 9px;font-size:11px;}
  .sk-bar>span{flex:none;}
}

/* ── График: пунктирные контуры («по договору») ── */
/* 05.09: подписи рядом с полосами графика. Раньше жили инлайном; вычисляемые
   left (позиция) и color (контраст к цвету полосы) остаются в разметке,
   всё постоянное — здесь. */
/* 06.09: .card намеренно без отступов — их добавляет каждый раздел сам.
   В Журнале и Стройконтроле про это забыли, и текст лип к краю.
   Общий класс, чтобы больше не забывали. */
.pane-pad{padding:18px;}
/* 07.09: вынесено из разметки — правило «стили классами» касается и строк,
   которые переписываем целиком, а не только совсем нового кода. */
.sk-sz{font-size:12.5px;padding:5px 10px;}
.sk-sz-on{background:#23262B;color:#fff;border-color:#23262B;}
.gbar-crew{font-size:9px;color:#B3552D;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:90px;}
.gt-hint{margin:4px 0 8px;text-transform:none;letter-spacing:0;line-height:1.6;}
.gt-right{margin-left:auto;display:flex;align-items:center;gap:4px;text-transform:none;letter-spacing:0;}
.gt-check{display:flex;align-items:center;gap:6px;cursor:pointer;margin-left:14px;text-transform:none;letter-spacing:0;}
.gt-nav{border:1px solid var(--line);background:transparent;color:var(--ink);border-radius:8px;padding:3px 9px;font-size:12px;cursor:pointer;}
.gt-nav-off{color:#C9CFD4;}
.gt-today{font-size:11.5px;}
.gt-pill{border:1px solid var(--line);background:transparent;color:var(--steel);border-radius:8px;padding:2px 8px;font-size:11px;cursor:pointer;}
.gt-pill-on{border-color:var(--ink);background:var(--ink);color:#fff;}
/* 07.09: таблица галок уведомлений в «Мой профиль» — отступы были инлайном
   в каждой ячейке, повторялись десяток раз */
.nf-th{padding:4px 6px;}
.nf-td{padding:5px 6px;}
.nf-c{text-align:center;}
.nf-l{text-align:left;}
.nf-no{text-transform:none;letter-spacing:0;margin-top:2px;font-size:10px;}
/* 08.09: справка по клику — «?» рядом с заголовком. Открывается кликом,
   а не наведением: на телефоне наведения нет и подсказка была бы недоступна.
   Без этих стилей текст подсказки вываливается прямо в плитку. */
.q{position:relative;display:inline-block;margin-left:6px;vertical-align:middle;}
.q>button{width:16px;height:16px;border-radius:50%;border:1px solid var(--line);
  background:var(--paper);color:var(--steel);font-size:10.5px;line-height:1;padding:0;
  font-family:inherit;cursor:pointer;}
.q>button:hover{border-color:var(--accent);color:var(--accent);}
.q.on>button{background:var(--accent);color:#fff;border-color:var(--accent);}
.q-pop{display:none;position:absolute;z-index:40;top:22px;left:-8px;width:280px;
  background:var(--paper);border:1px solid var(--line);border-radius:10px;
  box-shadow:0 6px 20px rgba(36,59,71,.16);padding:11px 13px;
  font-size:11.5px;line-height:1.55;color:var(--ink);text-transform:none;
  letter-spacing:0;font-weight:400;text-align:left;white-space:normal;}
.q.on .q-pop{display:block;}
.q-pop b{display:block;margin-bottom:4px;font-size:12px;}
/* у правого края экрана окно уезжает за границу — прижимаем к правому краю */
.tiles .tile:nth-child(4n) .q-pop,.tiles .tile:last-child .q-pop{left:auto;right:-8px;}

/* 08.09: раздел «Отчёты» */
.rep-head{margin-bottom:14px;}
.ttl-row{display:flex;align-items:center;gap:12px;margin-bottom:4px;flex-wrap:wrap;}
.rep-title{font-size:17px;font-weight:600;margin:0;}
.upd-when{white-space:nowrap;}
.rep-sub{font-size:12px;color:var(--steel);margin-bottom:12px;}
.rep-filters{display:flex;gap:14px;flex-wrap:wrap;align-items:flex-end;}
.rep-f{display:flex;flex-direction:column;gap:4px;}
.rep-f input,.rep-f select{font-size:12.5px;padding:5px 7px;}
.rep-mt{margin-top:16px;}
.per{display:flex;border:1px solid var(--line);border-radius:9px;overflow:hidden;}
.per button{border:0;background:transparent;color:var(--steel);font-size:12.5px;padding:6px 12px;border-right:1px solid var(--line);}
.per button:last-child{border-right:0;}
.per button.on{background:var(--accent);color:#fff;}
.tiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(184px,1fr));gap:10px;margin-top:14px;}
/* 08.09: плитка ниже прежнего и «?» прибит к правому верхнему углу — в потоке
   заголовка он рвал длинные названия на строки и плитки прыгали по высоте */
.tile{position:relative;border:1px solid var(--line);border-radius:12px;padding:10px 12px 11px;}
.tile>.q{position:absolute;top:8px;right:9px;margin:0;}
.tile-h{padding-right:20px;line-height:1.3;}
.tile-v{font-size:22px;font-weight:600;line-height:1.15;margin:4px 0 1px;}
.tile-v.v-up{color:#2E7D5B;}
.tile-v.v-down{color:var(--red);}
.tile-sm{font-size:13px;color:var(--steel);font-weight:400;}
.tile-d{font-size:10.5px;color:var(--steel);line-height:1.35;}
.tile-money .tile-v{color:var(--accent-deep);}
/* окно справки у плитки всегда прижимаем к правому краю: она сама у края */
.tile .q-pop{left:auto;right:-6px;}
.sec-d{font-size:11.5px;color:var(--steel);margin:-6px 0 10px;}
/* 08.09: переходы из отчёта в список проектов. Отчёт отвечает «сколько»,
   а дальше нужно «какие именно» — без перехода это ищут руками. */
.lnk-v{cursor:pointer;border-bottom:1.5px dotted var(--line);}
.lnk-v:hover{border-bottom-color:var(--accent);color:var(--accent);}
.stage-go{cursor:pointer;border-radius:7px;padding:1px 4px;margin-left:-4px;}
.stage-go:hover{background:var(--wash);}
/* 08.09: причина неуспешного закрытия и её комментарий */
.done-why{margin-top:12px;padding-top:12px;border-top:1px solid var(--line);display:grid;gap:7px;}
.done-why-t{text-transform:none;letter-spacing:0;font-size:12px;}
.done-r{display:flex;align-items:center;gap:7px;font-size:13px;cursor:pointer;}
.done-note{width:100%;font-family:inherit;font-size:12.5px;padding:7px;border:1px solid var(--line);border-radius:8px;resize:vertical;}
.rsn-note{text-transform:none;letter-spacing:0;margin-top:2px;font-size:10.5px;}
.jrn-tbl tr.row-go{cursor:pointer;}
.jrn-tbl tr.row-go:hover td{background:var(--wash);}
/* пояснение под блоком: что считается и чего в цифре нет */
.note{margin-top:12px;font-size:11.5px;color:var(--steel);line-height:1.5;}
.cols{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:16px;}
@media(max-width:900px){.cols{grid-template-columns:1fr;}}
.sec-t{font-size:13px;font-weight:600;margin-bottom:10px;}
.stage{display:flex;align-items:center;gap:10px;margin-bottom:8px;}
.stage-n{width:130px;font-size:12.5px;flex:none;}
.stage-bar{flex:1;height:20px;background:var(--wash);border-radius:6px;overflow:hidden;}
.stage-bar span{display:block;height:100%;background:var(--accent);opacity:.85;}
.stage-bar .bar-arch{background:var(--steel);opacity:.45;}
.stage-c{width:78px;text-align:right;font-size:12.5px;flex:none;}
.fun{display:flex;gap:8px;align-items:flex-end;}
.fun-step{flex:1;text-align:center;}
.fun-bar{background:var(--accent);border-radius:7px 7px 0 0;display:flex;align-items:flex-end;
  justify-content:center;color:#fff;font-size:15px;font-weight:600;padding-bottom:6px;}
.fun-ok{background:#2E7D5B;}
.fun-n{font-size:11px;color:var(--steel);margin-top:6px;}
.fun-p{font-size:11.5px;color:var(--accent-deep);font-weight:600;}
.fun-arrow{align-self:center;color:var(--steel);padding-bottom:24px;}
/* 08.09: заголовки числовых колонок прижимались влево правилом .jrn-tbl th —
   его вес выше одиночного класса .num, и шапка разъезжалась со значениями */
/* 09.09: итоговая строка таблиц отчёта — отделена линией и жирным */
.jrn-tbl tr.tot-row td{font-weight:600;border-top:2px solid var(--line);background:#FBFCFD;}
.jrn-tbl th.num{text-align:right;}
.jrn-tbl td.num,.jrn-tbl th.num{white-space:nowrap;}
.sv .grp td{background:var(--wash);font-weight:600;cursor:pointer;}
/* 08.09: треугольник сворачивания. Поворот у строчного элемента без опоры
   съезжал вниз и выглядел точкой — задаём размер, центрирование и опору. */
.sv .grp .tw{display:inline-block;width:14px;height:14px;line-height:14px;text-align:center;
  font-size:11px;color:var(--steel);vertical-align:middle;margin-right:2px;
  transform-origin:50% 50%;transition:transform .12s;}
.sv .grp.off .tw{transform:rotate(-90deg);}
.sv .gc{margin-left:8px;font-weight:400;}
.sv tr.hid{display:none;}
.out-row{display:flex;gap:10px;align-items:center;margin-top:16px;}
.btn-out{border:1px solid var(--ink);background:var(--paper);color:var(--ink);border-radius:9px;
  padding:6px 14px;font-size:12.5px;font-family:inherit;}
.btn-upd{border-color:var(--line);color:var(--steel);padding:4px 11px;font-size:12px;}
/* 07.09: раздел «Тариф» и полоска о лимитах на исходе */
/* 07.09: таблица занимает всю ширину карточки. Ограничение в 720px оставляло
   справа пустую половину; вместо него держим форму фиксированной шириной
   числовых колонок и шкалы, а название ресурса забирает остаток. */
.trf-tbl td{vertical-align:middle;}
.trf-n{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums;}
/* у .jrn-tbl th уже стоит text-align:left, и его вес выше одиночного класса —
   заголовки числовых колонок прижимались влево, а значения вправо */
.trf-tbl th.trf-n{text-align:right;}
.trf-tbl th.trf-n,.trf-tbl td.trf-n{width:110px;}
.trf-warn td{background:#FDF6E7;}
.trf-tag{display:inline-block;margin-left:6px;padding:0 6px;border-radius:7px;background:#E3C08A;color:#5A4526;font-size:10px;text-transform:uppercase;letter-spacing:.4px;}
.trf-bar{width:180px;}
.trf-bar span{display:block;height:6px;border-radius:4px;background:var(--ink);opacity:.25;}
.trf-warn .trf-bar span{background:#C8792B;opacity:.6;}
.trf-soon{margin-top:16px;}
.trf-soon ul{margin:6px 0 0;padding-left:18px;font-size:12.5px;line-height:1.7;}
.trf-hint{margin-top:16px;font-size:12px;color:var(--steel);}
.trf-box{margin-top:18px;padding:14px;border:1px solid var(--line);border-radius:10px;}
.trf-box-t{font-size:13px;font-weight:600;margin-bottom:4px;}
.trf-box-t2{margin-top:14px;}
.trf-box-d{font-size:12px;color:var(--steel);margin-bottom:10px;line-height:1.5;}
.trf-ta{width:100%;font-family:inherit;font-size:12.5px;padding:8px;border:1px solid var(--line);border-radius:8px;margin-bottom:8px;resize:vertical;}
.trf-reqs{margin:6px 0 0;padding-left:18px;font-size:12px;line-height:1.7;color:var(--steel);}
.trf-wants{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:12px;}
.trf-want{display:flex;flex-direction:column;gap:3px;}
.trf-want-in{display:flex;align-items:center;gap:5px;}
.trf-want-in input{width:78px;font-family:inherit;font-size:12.5px;padding:6px 8px;border:1px solid var(--line);border-radius:8px;}
.trf-want-c{display:block;}
.trf-reply{text-transform:none;letter-spacing:0;margin:2px 0 0 0;white-space:pre-wrap;color:var(--ink);}
.trf-band{margin:0 0 12px;padding:9px 14px;border:1px solid #E3C08A;background:#FDF6E7;border-radius:10px;font-size:12.5px;cursor:pointer;}
.trf-band:hover{background:#FBEFD8;}
/* 06.09: название проекта в попапе сроков — ссылка в объект */
.gterm-link{margin-bottom:14px;cursor:pointer;color:var(--ink);text-decoration:underline;text-underline-offset:2px;}
.gterm-link:hover{opacity:.7;}
.gterm-arrow{opacity:.5;}
@media(max-width:640px){ .pane-pad{padding:12px;} }
/* 06.09: Журнал кабинета. Таблица с прокруткой по горизонтали — на телефоне
   пять колонок не помещаются, но резать данные нельзя: журнал для разбора. */
.jrn-head{margin-bottom:14px;}
.jrn-title{font-size:17px;font-weight:600;margin:0 0 4px;}
.jrn-sub{font-size:12px;color:var(--steel);margin-bottom:12px;}
.jrn-filters{display:flex;gap:12px;flex-wrap:wrap;align-items:flex-end;}
.jrn-f{display:flex;flex-direction:column;gap:3px;}
.jrn-f input,.jrn-f select{font-size:12.5px;padding:4px 6px;}
.jrn-wrap{overflow-x:auto;margin:0 -4px;}
.jrn-tbl{width:100%;border-collapse:collapse;font-size:12.5px;}
.jrn-tbl th{text-align:left;font-size:10px;text-transform:uppercase;letter-spacing:.5px;color:var(--steel);padding:6px 8px;border-bottom:1px solid var(--line);white-space:nowrap;}
.jrn-tbl td{padding:7px 8px;border-bottom:1px solid #F0F0ED;vertical-align:top;}
.jrn-tbl tr:hover td{background:#FBFBF8;}
.jrn-when{white-space:nowrap;color:var(--steel);}
.jrn-ev{display:inline-block;padding:1px 7px;border-radius:7px;background:var(--tape);font-size:11px;white-space:nowrap;}
.jrn-who{white-space:nowrap;}
.jrn-ip{white-space:nowrap;font-variant-numeric:tabular-nums;}
.jrn-agent{font-size:10px;color:var(--steel);margin-top:2px;}
.jrn-data{color:var(--steel);font-size:11.5px;word-break:break-word;max-width:420px;}
/* 09.09: проект в журнале — ссылкой и первым: по нему опознают запись */
.jrn-proj{color:var(--accent);text-decoration:underline;text-underline-offset:2px;font-weight:600;cursor:pointer;}
.jrn-proj:hover{opacity:.75;}
.jrn-pager{display:flex;align-items:center;justify-content:center;gap:14px;margin-top:14px;}
.jrn-empty{padding:20px;text-align:center;color:var(--steel);font-size:13px;}
/* 06.09: выбор глубины показа завершённых и плашка «показано не всё» */
.gmon-sel{margin-left:8px;font-size:11px;text-transform:none;letter-spacing:0;padding:1px 4px;}
.gcut-note{margin:8px 0;padding:8px 12px;border:1px solid #E3C08A;background:#FDF6E7;border-radius:8px;font-size:12px;color:var(--ink);}
.gbarlab{position:absolute;top:50%;transform:translateY(-50%);font-size:11px;white-space:nowrap;}
.gbarlab-td{margin-left:8px;color:var(--steel);}
.gbarlab-m{margin-left:6px;font-weight:600;color:var(--ink);}
.gbarlab-w{margin-left:10px;font-weight:600;pointer-events:none;}
.gbarlab-halo{margin-left:8px;font-weight:600;color:var(--ink);pointer-events:none;text-shadow:0 0 3px #fff,0 0 3px #fff;}
.gdash{background:transparent !important;border-style:dashed !important;border-width:1px !important;box-sizing:border-box;}
.gsolid{background:transparent !important;border-style:solid !important;border-width:1px !important;box-sizing:border-box;}
.dd-add{background:#EFF6EC !important;font-weight:600;}

/* ── Профиль на телефоне (25.08): ничего не шире экрана ── */
.prof-notif{width:100%;border-collapse:collapse;font-size:12.5px;table-layout:fixed;}
.prof-notif th,.prof-notif td{overflow-wrap:anywhere;word-break:break-word;}
.prof-notif th:first-child,.prof-notif td:first-child{width:auto;}
.prof-notif th:not(:first-child),.prof-notif td:not(:first-child){width:64px;text-align:center;}
@media (max-width:640px){
  #profOverlay .card{max-width:100% !important;padding:16px !important;}
  #profOverlay .card>div[style*="grid-template-columns:1fr 1fr"]{grid-template-columns:1fr !important;}
  #profOverlay input,#profOverlay select,#profOverlay textarea{max-width:100%;box-sizing:border-box;}
  .prof-notif{font-size:12px;}
  .prof-notif th:not(:first-child),.prof-notif td:not(:first-child){width:52px;}
}

/* 25.08: окно профиля на iPhone — ничего не распирает экран.
   Таблица уведомлений при нехватке места прокручивается вбок сама. */
#profOverlay{padding:12px !important;}
#profOverlay>.card{min-width:0 !important;max-width:min(420px,100%) !important;box-sizing:border-box;}
#profOverlay *{min-width:0;}
.prof-notif-wrap{max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;}
.prof-notif{min-width:280px;}
.prof-notif td:first-child,.prof-notif th:first-child{white-space:normal;}

/* ── КП: комментарий к документу (25.08) ── */
.kp-note{display:block;margin-top:10px;}
.kp-note textarea{width:100%;font-size:12.5px;font-family:inherit;box-sizing:border-box;}
.kp-note-doc{font-size:12px;line-height:1.55;margin:16px 0 0;color:#333;}
.kp-chk{display:flex;align-items:center;gap:8px;margin:10px 0 6px;font-size:12.5px;font-weight:600;color:var(--ink);cursor:pointer;}
.kp-chk input{width:16px;height:16px;flex:none;}

/* 25.08: названия смет и разделов показываем как введены (h2/h3 иначе делают КАПС) */
.name-raw{text-transform:none !important;letter-spacing:.01em;}

/* ── Канбан: меню «⋮» в карточке (25.08) ── */
.kb-top{display:flex;align-items:flex-start;gap:6px;}
.kb-name{flex:1;min-width:0;font-weight:700;font-size:13px;overflow-wrap:anywhere;}
.kb-menu{flex:none;margin:-3px -4px 0 0;}
.kb-menu .btn{padding:2px 6px;font-size:12px;line-height:1;}

/* ── Редактор: кнопка полной палитры (25.08) ── */
.sk-pick{position:relative;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;border:1.5px solid var(--line);background:var(--paper);cursor:pointer;flex:none;}
.sk-pick input{position:absolute;inset:0;opacity:0;width:100%;height:100%;cursor:pointer;padding:0;border:none;}
.sk-pick span{font-size:13px;line-height:1;pointer-events:none;}

/* ── Редактор: ожидание сохранения (26.08) ── */
.sk-wait{position:absolute;inset:0;z-index:120;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.55);}
.sk-wait-box{background:var(--ink);color:#fff;padding:12px 20px;border-radius:12px;font-size:14px;font-weight:600;box-shadow:0 10px 30px rgba(0,0,0,.25);}

/* ── Цены поставщика и журнал (26.08) ── */
.sup-card{padding:16px;margin-bottom:14px;}
.sup-card--warn{border:1.5px solid #E8B9A8;}
.sup-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:14px;flex-wrap:wrap;gap:10px;}
.sup-title{font-weight:700;margin-bottom:4px;}
.sup-note{margin-bottom:10px;text-transform:none;letter-spacing:0;line-height:1.5;}
.sup-row{display:flex;gap:10px;align-items:center;padding:6px 0;border-bottom:1px solid #F0F0ED;flex-wrap:wrap;font-size:13px;}
.sup-row__name{flex:1;min-width:200px;overflow-wrap:anywhere;}
.sup-row__val{flex:none;}
.sup-row__pct{flex:none;min-width:56px;font-size:12.5px;}
.sup-row__pct--big{color:#B23B3B;}
.sup-list{max-height:260px;overflow:auto;margin-bottom:10px;}
.sup-actions{margin-top:12px;display:flex;gap:8px;flex-wrap:wrap;align-items:center;}
.sup-sel{flex:none;min-width:220px;font-size:12.5px;}
.sup-cand{display:flex;gap:8px;align-items:center;margin-top:4px;}
.sup-log-item{padding:14px;margin-bottom:10px;}
.sup-h2{font-size:18px;}
.sup-when{font-size:14px;}
.sup-meta{display:flex;gap:10px;flex-wrap:wrap;align-items:baseline;}
.sup-scroll{margin-top:8px;max-height:220px;overflow:auto;}
.sup-pct{flex:none;font-size:12px;}
.sup-name{flex:1;min-width:0;font-size:13px;overflow-wrap:anywhere;}
.sup-cand-wrap{padding:8px 0;border-bottom:1px solid #F0F0ED;}
.sup-cand-name{font-size:13px;font-weight:600;overflow-wrap:anywhere;}
.sup-pad{padding:16px;}
.sup-pad-lg{padding:20px;}
.sup-mb{margin-bottom:8px;}
.sup-mt{margin-top:4px;}
.sup-btns{display:flex;gap:8px;}
.sup-self{align-self:center;}
.sup-log-line{display:flex;gap:10px;align-items:baseline;padding:4px 0;border-bottom:1px solid #F0F0ED;font-size:12.5px;}

/* ── Хлебные крошки и кнопка «Назад» (26.08) ── */
.crumbs{display:flex;align-items:center;gap:8px;margin-bottom:16px;flex-wrap:wrap;}
.crumb-back{padding:3px 10px;font-size:14px;line-height:1.1;flex:none;}

/* ── Модальные окна: единое оформление (26.08) ── */
.ovl{position:fixed;inset:0;background:rgba(35,38,43,.45);z-index:60;display:flex;align-items:center;justify-content:center;padding:20px;}
.ovl__box{background:var(--paper);border-radius:16px;padding:20px;width:100%;max-width:520px;max-height:86vh;overflow:auto;box-shadow:0 24px 60px rgba(0,0,0,.3);box-sizing:border-box;}
.sec-val{color:var(--ink);font-size:13px;}

/* ── Окно «Заменить позицию» (27.08): на телефоне — вертикально, по ширине экрана ── */
.pick-ovl{align-items:flex-start;padding:40px 20px;}
.pick-box{width:520px;max-width:100%;max-height:80vh;display:flex;flex-direction:column;padding:0;min-width:0;}
.pick-head{padding:14px 18px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;align-items:center;gap:10px;}
.pick-title{font-size:15px;}
.pick-search{padding:12px 18px;border-bottom:1px solid var(--line);}
.pick-search input{width:100%;box-sizing:border-box;}
.pick-rows{overflow:auto;-webkit-overflow-scrolling:touch;}
.pick-empty{text-align:center;padding:20px;}
#pickEmpty{display:none;}
.pick-row{display:flex;gap:8px;align-items:flex-start;width:100%;text-align:left;border:none;border-bottom:1px solid #F0F0ED;background:#fff;padding:9px 12px;font-size:13px;min-width:0;}
.pick-row[hidden]{display:none;}
.pick-row__name{flex:1;min-width:0;overflow-wrap:anywhere;white-space:normal;line-height:1.3;}
.pick-row__price{flex:none;white-space:nowrap;}
@media (max-width:640px){
  .pick-ovl{padding:12px;align-items:stretch;}
  .pick-box{width:100%;max-width:100%;max-height:88vh;}
  .pick-row{flex-wrap:wrap;}
  .pick-row__price{width:100%;padding-left:2px;}
}

/* ── Окно выбора действия над позицией (27.08) ── */
.dd-ico{flex:none;}
.dd-txt{flex:1;min-width:0;overflow-wrap:anywhere;}
.ask-box{max-width:460px;}
.ask-title{font-size:15px;margin-bottom:6px;overflow-wrap:anywhere;}
.ask-btns{display:flex;flex-direction:column;gap:8px;margin-top:12px;}
.ask-note{margin-top:10px;text-transform:none;letter-spacing:0;line-height:1.45;}
.ask-foot{margin-top:14px;text-align:right;}

/* ── Финансы проекта: колонки строго пополам (26.08) ── */
.fin-cols{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px;}
.fin-cols>*{min-width:0;}
.fin-cols .card{min-width:0;}
.fin-row-name{min-width:0;overflow-wrap:anywhere;word-break:break-word;}
@media (max-width:900px){ .fin-cols{grid-template-columns:1fr;} }

/* ==== пресеты прайса «Наполнить прайс» (28.08) ==== */
.preset-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px;padding:14px 16px}
.preset-card{border:1.5px solid var(--line);border-radius:12px;padding:14px;cursor:pointer;background:var(--paper);transition:border-color .15s,box-shadow .15s}
.preset-card:hover{border-color:var(--accent);box-shadow:0 2px 10px rgba(0,0,0,.06)}
.preset-card__name{font-weight:600;font-size:14.5px;margin-bottom:6px}
.preset-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:14px 16px;border-bottom:1px solid var(--line)}
.preset-fold{display:flex;align-items:center;gap:8px;font-weight:600;font-size:14px;padding:12px 16px 4px;cursor:pointer;user-select:none}
.preset-fold input{width:16px;height:16px}
.preset-tbl{width:100%;border-collapse:collapse;font-size:13px}
.preset-tbl th,.preset-tbl td{padding:6px 10px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}
.preset-tbl th{font-weight:600;white-space:nowrap}
.preset-tbl td.pr-num{text-align:right;white-space:nowrap}
.preset-tbl tr.pr-skip td{opacity:.45}
.preset-exists{display:inline-block;font-size:11px;padding:1px 7px;border-radius:8px;background:var(--line);margin-left:6px;white-space:nowrap;vertical-align:middle}
.preset-apply{position:sticky;bottom:0;background:var(--paper);padding:12px 16px;border-top:1px solid var(--line);display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.preset-undo{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 14px;border:1.5px solid #6ea564;background:rgba(110,165,100,.12);border-radius:12px;margin-bottom:14px;font-size:13.5px}
.preset-empty-cta{margin-top:12px}
@media (max-width:640px){
  .preset-grid{grid-template-columns:1fr}
  .preset-tbl th:nth-child(4),.preset-tbl td:nth-child(4){display:none}
}
.preset-h2{font-size:18px}
.preset-pad{padding:16px}
.preset-hint{padding:12px 16px 0}
/* меню «Опции» в прайсе (28.08, выкладка 3) */
.price-opts{position:relative}
.price-opts-bg{position:fixed;inset:0;z-index:5}
.price-opts-dd{display:block;left:auto;right:0;min-width:214px;z-index:30}
/* мастер импорта прайса (28.08, выкладка 4) */
.imp-hidden{display:none}
.imp-controls{display:flex;gap:14px;align-items:center;flex-wrap:wrap;padding:12px 16px 2px}
.imp-row{display:inline-flex;gap:7px;align-items:center;font-size:13.5px}
.imp-row select{padding:5px 8px;border:1px solid var(--line);border-radius:8px;background:var(--paper)}
.imp-chk input{width:15px;height:15px}
.imp-scroll{overflow:auto;max-height:420px;margin-top:8px}
.imp-tbl select{width:100%;min-width:96px;padding:4px 6px;border:1px solid var(--line);border-radius:7px;background:var(--paper);font-size:12.5px}
.imp-hdr-row td{font-weight:600;background:var(--sky, #EFF7FC)}
tr.imp-upd td{background:rgba(245,180,60,.14)}
.imp-upd-badge{background:rgba(245,180,60,.35)}
/* онбординг: карточка шагов и плашка «следующий шаг» (28.08, выкладка 8) */
.steps-card{border:1px solid var(--line);background:#F7FBFD;border-radius:12px;padding:14px 16px;margin-bottom:16px}
.steps-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
.steps-head b{font-size:14px}
.steps-x{border:none;background:none;cursor:pointer;font-size:16px;color:var(--steel,#6A7480);padding:0 4px}
.steps-bar{height:5px;background:#E2EDF3;border-radius:3px;margin-bottom:10px}
.steps-bar-fill{height:5px;border-radius:3px;background:#2E7D46;width:0;transition:width .3s}
.st-w1{width:17%}.st-w2{width:33%}.st-w3{width:50%}.st-w4{width:67%}.st-w5{width:83%}
.steps-row{display:flex;gap:8px;align-items:center;padding:4px 0;font-size:13.5px}
.steps-row.steps-todo{cursor:pointer}
.steps-row.steps-todo:hover{color:var(--accent)}
.steps-row.steps-done{color:var(--steel,#6A7480)}
.steps-dot{flex:none;width:18px;height:18px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:11px;border:1.5px solid #B9CFDC;color:#2E7D46}
.steps-done .steps-dot{background:#2E7D46;border-color:#2E7D46;color:#fff}
.steps-go{margin-left:auto;color:var(--accent);opacity:0;transition:opacity .15s}
.steps-todo:hover .steps-go{opacity:1}
.step-note{display:flex;gap:12px;align-items:center;flex-wrap:wrap;border:1.5px solid #6EA564;background:rgba(110,165,100,.13);border-radius:12px;padding:10px 14px;margin-bottom:14px;font-size:13.5px}
.step-note .steps-x{margin-left:auto}
/* обучающий тур (28.08, выкладка 9) */
.tour-hole{position:fixed;z-index:60;border-radius:10px;box-shadow:0 0 0 9999px rgba(22,32,42,.55);pointer-events:none;transition:left .2s,top .2s,width .2s,height .2s}
.tour-bar{position:fixed;left:0;right:0;bottom:0;z-index:61;background:var(--paper);border-top:2px solid var(--accent);padding:12px 16px;display:flex;gap:12px;align-items:center;flex-wrap:wrap;font-size:14px;box-shadow:0 -4px 18px rgba(0,0,0,.12)}
.tour-step{flex:none;font-weight:600;color:var(--accent);white-space:nowrap}
.tour-text{flex:1;min-width:200px}
.tour-text i{color:var(--steel,#6A7480)}
.help-tour-btn{font-family:inherit;font-size:12.5px;border:1px solid var(--line);background:var(--wash);border-radius:8px;padding:5px 10px;cursor:pointer}
/* мягкая подсветка тура: рамка-свечение без затемнения экрана (выкладка 18) */
.tour-hole--soft{box-shadow:0 0 0 3px var(--accent),0 0 12px 5px rgba(47,91,124,.35);border-radius:12px}
/* приветствие нового кабинета (выкладка 23) */
.welcome-ov{position:fixed;inset:0;z-index:70;background:rgba(22,32,42,.55);display:flex;align-items:center;justify-content:center;padding:18px}
.welcome-card{background:var(--paper);border-radius:16px;max-width:520px;width:100%;padding:26px 24px;box-shadow:0 10px 40px rgba(0,0,0,.25);text-align:center}
.welcome-card h2{font-size:19px;margin-bottom:10px}
.welcome-card p{font-size:14px;color:var(--steel,#6A7480);margin-bottom:16px;line-height:1.45}
.welcome-emoji{font-size:40px;margin-bottom:6px}
.welcome-btns{display:flex;gap:10px;justify-content:center;flex-wrap:wrap;margin-top:6px}
.welcome-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin-bottom:14px}
.welcome-dir{font-family:inherit;font-size:13px;padding:10px 8px;border:1.5px solid var(--line);border-radius:10px;background:var(--paper);cursor:pointer;transition:border-color .15s}
.welcome-dir:hover{border-color:var(--accent)}
@media (max-width:480px){ .welcome-grid{grid-template-columns:1fr} }

/* ── Стройконтроль: список объектов (выкладка №1, 30.08) ── */
.sk-head{margin-bottom:14px}
.sk-h2{font-size:18px}
.sk-hd{margin-top:4px;text-transform:none;letter-spacing:0}
.skq{width:100%;box-sizing:border-box;font-family:inherit;font-size:13.5px;padding:11px 14px;border:1px solid var(--line);border-radius:10px;background:var(--paper,#fff);margin-bottom:14px;outline:none}
.sk-card{padding:4px 18px}
.sk-row{display:flex;align-items:center;gap:12px;padding:12px 2px;border-bottom:1px solid #F5F5F2;cursor:pointer}
.sk-row:last-child{border-bottom:0}
.sk-row:hover{background:#F7F7F4}
.sk-num{flex:none;font-size:11.5px;color:var(--steel);border:1px solid var(--line);border-radius:8px;padding:2px 8px;white-space:nowrap}
.sk-min{flex:1;min-width:0}
.sk-nm{font-size:14px;font-weight:600;overflow-wrap:break-word}
.sk-sub{font-size:12px;color:var(--steel);margin-top:2px}
.sk-chev{flex:none;font-size:18px;color:var(--steel)}
.sk-empty{text-align:center;padding:36px 16px;border:1.5px dashed var(--line);border-radius:12px;color:var(--steel);font-size:13px}

/* ── Стройконтроль: журнал работ в проекте (выкладка №3, 30.08) ── */
.skw-wait{padding:24px;text-align:center;color:var(--steel);font-size:13px}
.skw-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:6px}
.skw-pers{display:flex;gap:2px}
.skw-nav{display:flex;align-items:center;gap:4px}
.skw-lbl{font-size:13px;font-weight:600;min-width:120px;text-align:center}
.skw-add{margin-left:auto}
.skw-hd{text-transform:none;letter-spacing:0;line-height:1.5;margin-bottom:12px}
.skw-card{padding:6px 16px;margin-bottom:12px}
.skw-kop{padding:12px 16px;margin-bottom:12px;border-left:4px solid var(--tape)}
.skw-gr{margin:8px 0 4px}
.skw-row{display:flex;align-items:center;gap:12px;padding:10px 0;border-bottom:1px solid #F5F5F2;flex-wrap:wrap}
.skw-row:last-child{border-bottom:0}
.skw-min{flex:1;min-width:180px}
.skw-nm{font-size:13.5px;font-weight:600}
.skw-sub{font-size:11.5px;color:var(--steel);margin-top:2px}
.skw-x{display:inline-block;font-size:10px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;color:#8A5A00;background:#FFF3CC;border-radius:6px;padding:1px 6px;vertical-align:1px}
.skw-qty{flex:none;width:90px;text-align:right;font-size:12.5px}
.skw-sum{flex:none;width:100px;text-align:right;font-size:13px;font-weight:600}
.skw-st{flex:none;width:120px;font-size:11.5px;font-weight:600}
.skw-st-p{color:#8A5A00}
.skw-st-a{color:#1E7A3D}
.skw-st-r{color:var(--red,#A8321C)}
.skw-btns{flex:none;display:flex;gap:6px}
.skw-ok{padding:5px 10px}
.skw-form{padding:14px 16px;margin-bottom:12px;display:grid;gap:10px}
.skw-fx{display:flex;align-items:center;gap:8px;font-size:13px;cursor:pointer}
.skw-fx input{width:auto}
.skw-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.skw-grid input,.skw-grid select{width:100%}
.skw-lb{margin-bottom:3px}
.skw-frow{display:flex;gap:8px}
@media (max-width:640px){ .skw-grid{grid-template-columns:1fr} .skw-qty,.skw-sum,.skw-st{width:auto} }

/* ── Вкладки проекта: ВСЕГДА одна строка с горизонтальной прокруткой
   (жалоба 31.08: на широком экране кнопки переносились и наезжали).
   Правило было только в мобильной ветке — поднимаем на все размеры.
   Встроенные стили сильнее файла, поэтому !important. ── */
.ptabs{overflow-x:auto !important;overflow-y:hidden;flex-wrap:nowrap !important;scrollbar-width:none;-webkit-overflow-scrolling:touch}
.ptabs::-webkit-scrollbar{display:none}
.ptabs button{white-space:nowrap !important;flex:0 0 auto !important}

/* ── Стройконтроль: экран «Люди» (выкладка №4, 31.08) ── */
.skp-top{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:10px}
.skp-cnt{font-size:13.5px;font-weight:700}
.skp-cnt b{color:#1E7A3D}
.skp-me{margin-left:auto;display:flex;gap:8px}
.skp-card{padding:6px 16px;margin-bottom:12px}
.skp-row{display:flex;align-items:center;gap:12px;padding:10px 0;border-bottom:1px solid #F5F5F2;flex-wrap:wrap}
.skp-row:last-child{border-bottom:0}
.skp-min{flex:1;min-width:160px}
.skp-nm{font-size:13.5px;font-weight:600}
.skp-sub{font-size:11.5px;color:var(--steel);margin-top:2px}
.skp-st{flex:none;width:150px;font-size:12px;font-weight:600}
.skp-here{color:#1E7A3D}
.skp-left{color:var(--steel)}
.skp-abs{color:var(--red,#A8321C)}
.skp-none{color:#B9B9B2;font-weight:400}
.skp-btns{flex:none;display:flex;gap:6px}
.skp-btns .btn{padding:5px 9px;font-size:12px}
@media (max-width:640px){ .skp-st{width:auto} .skp-me{margin-left:0} }

/* ── Хотфикс 31.08: панель настроек документов не наезжает на лист ── */
.cols>*{min-width:0}
#kpDoc{overflow-x:auto}
.doc-side{position:static}
/* прилипание как было раньше: без ограничения высоты и без внутренней
   прокрутки — кнопки и текст переносятся, ничего не обрезается */
@media (min-width:901px){ .doc-side{position:sticky;top:20px} }

/* ── Стройконтроль: гео-вердикты и QR (выкладка №6, 31.08) ── */
.skp-b{display:inline-block;font-size:10px;font-weight:700;letter-spacing:.02em;border-radius:6px;padding:1px 6px;background:#EFEFEA;color:var(--steel);vertical-align:1px}
.skp-b-ok{background:#E4F2E7;color:#1E7A3D}
.skp-b-far{background:#FBEAE4;color:#A8321C}
.skp-qr{padding:14px 16px;margin-bottom:12px}
.skp-qr-box{display:flex;justify-content:center;padding:10px 0}
.skp-qr-box svg{width:220px;height:220px}

/* ── Стройконтроль: копилка и перенос доп-работ (выкладка №7, 31.08) ── */
.skx-row{display:flex;align-items:center;gap:10px;padding:8px 0;border-bottom:1px solid #F5F5F2;cursor:pointer}
.skx-row input{width:auto;flex:none}
.skx-row:last-of-type{border-bottom:0}
.skx-nm{flex:1;font-size:13px}
.skx-done{cursor:default;color:var(--steel)}
.skx-bar{display:flex;gap:8px;align-items:center;margin-top:10px}
.skx-bar select{flex:1;min-width:0}

/* ── Стройконтроль: План/Факт (выкладка №8, 31.08) ── */
.skl-alert{padding:12px 16px;margin-bottom:12px;border-left:4px solid var(--red,#A8321C);font-size:13px}
.skl-card{padding:12px 16px;margin-bottom:12px}
.skl-head{display:flex;align-items:center;gap:12px}
.skl-est{font-weight:700;font-size:14px;flex:none}
.skl-pc{flex:none;font-size:12.5px;font-weight:600;width:44px;text-align:right}
.skl-bar{flex:1;height:8px;background:#EFEFEA;border-radius:5px;overflow:hidden;min-width:60px}
.skl-fill{display:block;height:100%;background:#8FA8C8;border-radius:5px}
.skl-fill.skl-ok{background:#4E9A63}
.skl-fill.skl-red{background:var(--red,#A8321C)}
.skl-row{display:flex;align-items:center;gap:10px;padding:8px 0;border-bottom:1px solid #F5F5F2;flex-wrap:wrap}
.skl-row:last-child{border-bottom:0}
.skl-row .skl-bar{max-width:160px}
.skl-nm{flex:1;min-width:150px;font-size:13px}
.skl-qty{flex:none;font-size:12px;color:var(--steel);min-width:110px;text-align:right}
@media (max-width:640px){ .skl-qty{min-width:0} .skl-row .skl-bar{max-width:none;min-width:120px} }

/* ── Стройконтроль: Сводка дня (выкладка №9, 31.08) ── */
.sk-seg{display:flex;gap:2px;border-bottom:2px solid var(--ink);margin-bottom:14px}
.skd-card{padding:10px 16px;margin-bottom:12px}
.skd-head{display:flex;align-items:center;gap:10px;padding:4px 0 8px;cursor:pointer;flex-wrap:wrap}
.skd-nm{font-weight:700;font-size:14px;flex:1;min-width:140px}
.skd-cnt{font-size:12.5px;color:var(--steel)}
.skd-cnt b{color:#1E7A3D}
.skd-ev{display:flex;align-items:baseline;gap:8px;padding:7px 0;border-top:1px solid #F5F5F2;font-size:12.5px}
.skd-ico{flex:none;width:18px;text-align:center}
.skd-txt{flex:1;min-width:0}
.skd-tm{flex:none;font-size:11px;color:var(--steel)}
.skd-ev-delay .skd-txt{color:var(--red,#A8321C)}
.skd-ev-absence .skd-txt{color:#8A5A00}
.skd-quiet{padding:8px 0 4px;font-size:12px;color:#B9B9B2;border-top:1px solid #F5F5F2}
.skg-card{display:flex;align-items:center;gap:8px;padding:10px 14px;margin-bottom:10px;font-size:13px}
.skg-i{font-size:15px}
.skg-sep{color:var(--steel)}

/* ── Полировка 31.08 (в2, по эталону боя): ОДНА линия под вкладками.
   Чёрная линия рисуется фоном контейнера по его низу (фон не режется
   прокруткой), родная синяя черта активной кнопки ложится ПОВЕРХ её
   отрезка. Выступ-хак с margin глушим — он и прятался за линию. ── */
.ptabs{border-bottom:none !important;background:linear-gradient(var(--ink),var(--ink)) left bottom/100% 2px no-repeat}
.ptabs button{margin-bottom:0 !important}

/* ══ Стройконтроль: вёрстка по прототипу (выкладка №11, 31.08) ══
   Классы перенесены из прототип-строи_контроль.html — он написан в токенах
   сервиса, поэтому цвета и радиусы совпадают с боевыми сами собой. */
.pgTag{font-size:10px;letter-spacing:.08em;text-transform:uppercase;font-weight:600;border-radius:7px;padding:3px 8px;background:var(--wash);color:var(--accent-deep);white-space:nowrap;flex:none}
.pgTag.ok{background:#E7F3EA;color:#1E7A3D}.pgTag.warn{background:#FBF3E2;color:#8A6414}.pgTag.bad{background:#FBEDE9;color:var(--red)}
.prow{display:flex;align-items:center;gap:12px;padding:10px 2px;border-bottom:1px solid var(--line)}
.prow:last-child{border-bottom:0}
.prow .nm{font-weight:600;font-size:13.5px}
.sp{flex:1}
.avat{width:34px;height:34px;border-radius:50%;background:var(--wash);color:var(--accent-deep);font-weight:700;display:flex;align-items:center;justify-content:center;flex:none;font-size:12.5px;border:1px solid var(--line)}
.dot{width:9px;height:9px;border-radius:50%;display:inline-block;margin-right:5px;vertical-align:0}
.dot.ok{background:#1E7A3D}.dot.off{background:#C3D2DA}.dot.out{background:#C98A1B}.dot.abs{background:var(--red,#A8321C)}
.pbar{height:9px;background:var(--wash);border-radius:6px;overflow:hidden}
.pbar i{display:block;height:100%;background:var(--accent,#306883)}
.gline{display:flex;align-items:center;gap:10px;margin:5px 0}
.gname{width:230px;flex:none;font-size:12.5px}
.gtrack{flex:1;position:relative;height:22px;background:var(--wash);border-radius:6px;overflow:hidden}
.gplan{position:absolute;top:3px;height:6px;background:#B9CFDA;border-radius:4px}
.gfact{position:absolute;bottom:3px;height:9px;background:#1E7A3D;border-radius:4px}
.gfact.late{background:var(--red,#A8321C)}
.gdate{width:150px;flex:none;font-size:11.5px;color:var(--steel);text-align:right}
.legend{font-size:11px;color:var(--steel);display:flex;gap:14px;margin-top:8px}
.legend i{display:inline-block;width:16px;height:7px;border-radius:3px;vertical-align:1px;margin-right:4px}
.tile{border:1px solid var(--line);border-radius:12px;padding:12px 14px;background:var(--paper,#fff)}
.tile .big,.big{font-size:22px;font-weight:700;color:var(--accent-deep);font-variant-numeric:tabular-nums}
.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}
table.pt{width:100%;border-collapse:collapse;font-size:13px}
table.pt th{font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--steel);text-align:left;padding:8px;border-bottom:1px solid var(--line)}
table.pt td{padding:9px 8px;border-bottom:1px solid var(--line);vertical-align:middle}
.rr{text-align:right !important}
.pill{display:inline-block;border:1px solid var(--line);border-radius:999px;padding:4px 12px;font-size:12.5px;cursor:pointer;user-select:none;background:var(--paper,#fff)}
.pill[data-on="1"]{background:var(--ink);border-color:var(--ink);color:var(--paper,#fff);font-weight:600}
.cmt{background:var(--wash);border-radius:9px;padding:9px 12px;font-size:12.5px;margin-top:8px}
.fold{display:flex;align-items:center;gap:8px;padding:9px 12px;background:#F7FBFD;border:1px solid var(--line);border-radius:9px;margin:8px 0 4px}
.tape-strip{height:3px;background:var(--tape);opacity:.45;border-radius:2px}
.tbl-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
.tbl-scroll table{min-width:640px}
.sk-wide{width:100%;box-sizing:border-box;font-family:inherit;font-size:13.5px;padding:12px 16px;border:1px solid var(--line);border-radius:12px;background:var(--paper,#fff);margin-bottom:14px;outline:none}
.sk-per{font-family:inherit;font-size:12px;padding:6px 10px;border:1px solid var(--line);border-radius:999px;background:var(--paper,#fff);cursor:pointer}
@media(max-width:820px){.grid3{grid-template-columns:1fr}.gname{width:140px}.gdate{width:100px}}
@media(max-width:760px){.prow{flex-wrap:wrap;row-gap:6px}.prow .sp{flex-basis:100%;order:5}.prow .pgTag{order:6}.gdate{display:none}}

/* ── Стройконтроль: бригады в табеле (выкладка №12, 31.08) ── */
.skp-pills{display:flex;gap:8px;flex-wrap:wrap;margin:2px 0 10px}

/* ── Стройконтроль: шапка объекта, меню человека, сворачивание (№13) ── */
.skp-obj{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;margin-bottom:12px}
.skp-h2{font-size:18px;margin:2px 0;text-transform:uppercase;letter-spacing:.01em}
.skp-now{text-align:right}
.skp-cv{font-size:11px;color:var(--steel);margin-left:8px}
.skp-mwrap{position:relative;display:inline-block}
.skp-dots{font-size:14px;padding:2px 9px;border-radius:8px;margin-left:6px}
.skp-menu{position:absolute;right:0;top:calc(100% + 6px);z-index:40;min-width:210px;background:var(--paper,#fff);border:1px solid var(--line);border-radius:12px;box-shadow:0 10px 30px rgba(20,30,40,.14);padding:8px;display:flex;flex-direction:column;gap:2px;text-align:left}
.skp-mt{font-weight:700;font-size:12.5px;padding:4px 10px 6px}
.skp-mi{display:flex;align-items:center;gap:9px;width:100%;background:none;border:0;font:inherit;font-size:13px;padding:8px 10px;border-radius:8px;cursor:pointer;text-align:left;color:var(--ink)}
.skp-mi:hover{background:var(--wash)}
.skp-mi[data-on="1"]{color:var(--steel);cursor:default}
@media(max-width:760px){.skp-menu{right:auto;left:0}}

/* ── Стройконтроль: форма записи и копилка по прототипу (№17) ── */
.skw-form2{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:12px;padding:12px;background:var(--wash);border-radius:12px}
.skw-sel{font-family:inherit;font-size:13px;padding:8px 12px;border:1px solid var(--line);border-radius:10px;background:var(--paper,#fff);flex:0 1 520px;max-width:520px;min-width:200px}
.skw-in{font-family:inherit;font-size:13px;padding:8px 12px;border:1px solid var(--line);border-radius:10px;background:var(--paper,#fff);width:200px}
.skw-in-s{width:130px}
.skw-in-n{width:110px}
.skw-kop{border-left:4px solid #F0C896}
@media(max-width:760px){.skw-form2>*{flex:1 1 100%;max-width:none;width:auto}}
