/* CRM-оболочка: композиция страниц Salesforce Lightning, кожа — дизайн Гиперплан v1 (tokens.css). */
*{box-sizing:border-box;}
html,body.sf{margin:0;background:var(--ground);color:var(--ink);font-family:var(--font);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased;}
a{color:var(--glacier);text-decoration:none;}
a:hover{text-decoration:underline;}
button{font:inherit;cursor:pointer;color:inherit;}
input,select{font:inherit;color:inherit;}
:focus-visible{outline:2px solid var(--rope);outline-offset:2px;border-radius:var(--r-sm);}
/* Поле без своих правил — как в формах продукта (.sf-form, .ad-form): рамка, скругление, фон, 32 px. До 27.10.2026 такое поле
   рисовал браузер — серая «вдавленная» рамка, прямые углы, 22–26 px (замечание владельца по «Диспетчерской»; обход стенда нашёл
   то же на 24 экранах: справочники, навыки, фильтры каталога, «Обсуждение»). Вес — элемента (0,0,1), отбор типов — в :where():
   любое правило раздела с классом весомее, поэтому поле, оформленное разделом, не меняется. Поле внутри составного (поиск,
   метки) рамку не носит — у него свой padding:0. */
select,textarea,input:where(:not([type=checkbox],[type=radio],[type=range],[type=color],[type=file],[type=hidden],[type=submit],[type=button],[type=reset],[type=image])){
  border:1px solid var(--line-control);border-radius:var(--r-sm);background-color:var(--surface);font-size:13px;}
select,input:where(:not([type=checkbox],[type=radio],[type=range],[type=color],[type=file],[type=hidden],[type=submit],[type=button],[type=reset],[type=image])){height:32px;padding:0 9px;}
textarea{padding:7px 9px;font-family:inherit;line-height:1.45;color:inherit;}
:where(select,textarea,input):focus{border-color:var(--rope);}
/* флажок и переключатель — цветом продукта, как в формах администрирования; размер задаёт правило цели нажатия ниже */
input:where([type=checkbox],[type=radio]){accent-color:var(--rope);}
/* подпись с флажком `label.check` без своих правил (выездные работы: навыки, требования выезда, окно): флажок — по центру первой
   строки подписи; браузер ставил его на базовую линию, и подпись уезжала вниз на 3–4 px (замечание владельца 27.10.2026).
   Приём для всех подписей с флажком: подпись прижата к верху, флажок сдвинут на половину разницы высоты строки (1lh) и своей
   высоты — так он по центру первой строки при любом размере (16, 20, 24 px) и любой длине подписи. Нулевой вес — правила форм
   (.ad-form .check) весомее. */
:where(label[class="check"]){display:inline-flex;align-items:flex-start;gap:6px;vertical-align:middle;}
:where(label[class="check"]) > input:where([type=checkbox],[type=radio]){margin:0;transform:translateY(calc((1lh - 100%) / 2));}
/* в ячейке таблицы подпись короткая, в одну строку: пара «флажок — подпись» по центру строки таблицы, вровень с полем рядом */
:where(td > label[class="check"]){align-items:center;}
:where(td > label[class="check"]) > input:where([type=checkbox],[type=radio]){transform:none;}

/* ---------- глобальная шапка ---------- */
.sf-global{height:52px;background:var(--surface);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:16px;padding:0 20px;position:relative;z-index:10;}
.sf-logo{display:flex;align-items:center;justify-content:center;gap:10px;min-width:24px;color:var(--ink);}
.sf-logo:hover{text-decoration:none;}
.sf-logo .brand-mark{display:block;height:24px;width:auto;}
.sf-search{flex:1;max-width:520px;margin:0 auto;display:flex;align-items:center;gap:8px;height:34px;padding:0 10px;border:1px solid var(--line-control);border-radius:var(--r-sm);background:var(--raised);color:var(--ink-3);}
.sf-search:focus-within{border-color:var(--rope);outline:2px solid var(--rope);outline-offset:2px;}
.sf-search input{border:0;outline:0;flex:1;font-size:13px;background:transparent;color:var(--ink);padding:0;}
.sf-search input::placeholder{color:var(--ink-3);}
.sf-utils{display:flex;align-items:center;gap:6px;margin-left:auto;}
.sf-ico{width:32px;height:32px;border-radius:var(--r-sm);display:inline-flex;align-items:center;justify-content:center;color:var(--ink-2);position:relative;border:1px solid transparent;background:transparent;}
.sf-ico:hover{border-color:var(--line);text-decoration:none;color:var(--ink);}
.sf-ico--dot::after{content:"";position:absolute;top:6px;right:7px;width:6px;height:6px;border-radius:50%;background:var(--rope);}
.sf-avatar{width:32px;height:32px;border-radius:var(--r-sm);background:var(--ink);color:var(--ground);font-family:var(--mono);font-size:var(--fs-min);font-weight:500;display:inline-flex;align-items:center;justify-content:center;margin-left:4px;}

/* ---------- панель приложения: графит, акцент верёвкой ---------- */
.sf-appnav{height:42px;background:var(--ink);display:flex;align-items:center;gap:4px;padding:0 12px;color:var(--ground);}
[data-theme="dark"] .sf-appnav{background:var(--sunk);color:var(--ink);border-bottom:1px solid var(--line);}
.sf-waffle{width:34px;height:34px;border:0;border-radius:var(--r-sm);background:transparent;color:inherit;opacity:.8;display:inline-flex;align-items:center;justify-content:center;}
.sf-waffle:hover{opacity:1;background:rgba(255,255,255,.08);}
.sf-appname{font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.12em;text-transform:uppercase;padding:0 14px 0 6px;opacity:.75;border-right:1px solid rgba(255,255,255,.2);margin-right:6px;white-space:nowrap;}
.sf-tabs{list-style:none;margin:0;padding:0;display:flex;height:100%;overflow-x:auto;scrollbar-width:none;}
.sf-tabs a{display:flex;align-items:center;height:42px;padding:0 14px;color:inherit;font-size:13px;font-weight:500;border-bottom:2px solid transparent;white-space:nowrap;opacity:.8;}
.sf-tabs a:hover{opacity:1;text-decoration:none;}
.sf-tabs a.is-active{border-bottom-color:var(--rope);opacity:1;font-weight:600;}
.sf-tabs a[aria-disabled="true"]{opacity:.45;}

/* ---------- макет страницы ---------- */
.sf-main{padding:16px 20px 48px;max-width:1600px;margin:0 auto;}
.sf-page-head{display:flex;align-items:center;gap:12px;padding:14px 18px;background:var(--raised);border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow);margin-bottom:14px;}
.sf-obj{width:34px;height:34px;border-radius:var(--r-sm);display:inline-flex;align-items:center;justify-content:center;flex:none;border:1px solid var(--line);background:var(--surface);color:var(--ink-2);}
.sf-obj svg{width:18px;height:18px;stroke:currentColor !important;}
.sf-obj--opp{color:var(--rope-on-soft);border-color:var(--rope-line);background:var(--rope-soft);}
.sf-obj--acc{color:var(--glacier);background:var(--glacier-soft);}
.sf-obj--product{color:var(--glacier);background:var(--glacier-soft);}
.sf-obj--task{color:var(--ok);background:var(--ok-soft);}
.sf-obj--report{color:var(--ink-2);}
.sf-obj--home{color:var(--rope-on-soft);border-color:var(--rope-line);background:var(--rope-soft);}
.sf-obj--contract{color:var(--amber);background:var(--amber-soft);}
.sf-obj--user{color:var(--ink-2);background:var(--sunk);}
.sf-page-head .sf-kicker{font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3);}
.sf-page-head h1{margin:0;font-size:17px;font-weight:600;line-height:1.25;}
/* Строка действий записи. Раскладка жила в атрибуте style на восемнадцати
   страницах, и правило просвета для сенсорного экрана до неё не доставало:
   встроенный стиль весомее любого селектора (повторный аудит, В-03). */
.sf-actions{margin-left:auto;display:flex;gap:6px;flex-wrap:wrap;align-items:center;}
.sf-page-head .sf-actions{margin-left:auto;display:flex;gap:6px;flex-wrap:wrap;}
.sf-grid{display:grid;gap:14px;}
.sf-grid--kpi{grid-template-columns:repeat(4,1fr);}
.sf-grid--2{grid-template-columns:2fr 1fr;}
.sf-grid--3{grid-template-columns:1fr 1fr;}
@media (max-width:1023px){.sf-grid--kpi{grid-template-columns:1fr 1fr;}.sf-grid--2,.sf-grid--3{grid-template-columns:1fr;}}
@media (max-width:599px){.sf-grid--kpi{grid-template-columns:1fr;}.sf-main{padding:10px 10px 32px;}.sf-appname{display:none;}}
.sf-stack{display:flex;flex-direction:column;gap:14px;}

/* ---------- карточки ---------- */
.sf-card{background:var(--raised);border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow);}
.sf-card-head{display:flex;align-items:center;gap:10px;padding:11px 16px;border-bottom:1px solid var(--divider);}
.sf-card-head .sf-obj{width:26px;height:26px;} .sf-card-head .sf-obj svg{width:14px;height:14px;}
.sf-card-head h1,.sf-card-head h2{margin:0;font-size:14px;font-weight:600;flex:1;}
.sf-card-head h1 small,.sf-card-head h2 small{font-family:var(--mono);font-weight:400;color:var(--ink-3);font-size:var(--fs-min);margin-left:4px;}
.sf-card-head .sf-more{margin-left:auto;display:flex;gap:6px;align-items:center;}
.sf-card-body{padding:14px 16px;}
.sf-card-body--flush{padding:0;}

/* ---------- кнопки ---------- */
.sf-btn{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 14px;border:1px solid var(--line-control);border-radius:var(--r-sm);background:var(--raised);color:var(--ink);font-size:13px;font-weight:500;white-space:nowrap;transition:border-color .12s,color .12s,background .12s;}
.sf-btn:hover{border-color:var(--rope);color:var(--rope);text-decoration:none;}
.sf-btn--brand{background:var(--rope);border-color:var(--rope);color:var(--rope-contrast);font-weight:600;}
.sf-btn--brand:hover{filter:brightness(.94);color:var(--rope-contrast);}
/* Главное действие раздела: заметнее обычной кнопки, но без заливки — заливка
   на экране одна и принадлежит главному действию страницы. До 20.09.2026 на
   карточке продажи заливкой были четыре кнопки сразу, и какая из них двигает
   продажу, приходилось угадывать (пятый проход, «Целостность дизайн-системы»). */
.sf-btn--key{border-color:var(--rope);color:var(--rope-on-soft);font-weight:600;}
.sf-btn--key:hover{background:var(--rope-soft);color:var(--rope-on-soft);}
.sf-btn--key[disabled]{border-color:var(--line-control);color:var(--ink-3);font-weight:400;}
.sf-btn--sm{height:28px;padding:0 10px;font-size:12px;}
/* опасное действие видно и в покое (28.09.2026): красный текст; при наведении — рамка и фон */
.sf-btn--danger{color:var(--warn);}
.sf-btn--danger:hover{border-color:var(--warn);color:var(--warn);background:var(--warn-soft);}
.sf-btn:disabled,.sf-btn[aria-disabled="true"]{opacity:.5;cursor:not-allowed;}
.sf-btn-group{display:inline-flex;}
.sf-btn-group .sf-btn{border-radius:0;margin-left:-1px;}
.sf-btn-group .sf-btn:first-child{border-radius:var(--r-sm) 0 0 var(--r-sm);margin-left:0;}
.sf-btn-group .sf-btn:last-child{border-radius:0 var(--r-sm) var(--r-sm) 0;}

/* ---------- KPI ---------- */
.sf-kpi{padding:14px 16px;}
/* Т-09: плитка KPI и строка воронки стали ссылками в список с тем же отбором.
   Ссылка не должна выглядеть ссылкой — она и есть вся плитка; подчёркивание
   и цвет ссылки здесь только мешали бы читать число. */
a.sf-kpi,a.sf-kpi:hover{color:inherit;text-decoration:none;display:block;}
a.sf-kpi:hover{border-color:var(--line-control);}
.sf-funnel a.row{color:inherit;text-decoration:none;min-height:24px;}
.sf-funnel a.row:hover .n{color:var(--rope-on-soft);}
.sf-kpi .k{font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3);}
/* И-11.2: у <small> размер по умолчанию — «smaller», то есть 0,83 от родителя:
   12 px превращались в 10 px, и метки масштаба «МОИ / КОМАНДА» оказывались мельче
   порога (четвёртый проход аудита, Н4-04). Размер наследуется явно. */
.sf-kpi .k small,.sf-card-head small small,.sf-legend small{font-size:inherit;}
.sf-kpi .v{font-family:var(--mono);font-size:22px;font-weight:500;font-variant-numeric:tabular-nums;margin-top:6px;}
.sf-kpi .d{font-size:12px;color:var(--ink-3);margin-top:2px;}
.sf-kpi .d.up{color:var(--ok);} .sf-kpi .d.down{color:var(--warn);}

/* ---------- прогресс и воронка ---------- */
.sf-progress{height:8px;border-radius:2px;background:var(--sunk);overflow:hidden;}
.sf-progress > span{display:block;height:100%;background:var(--rope);}
.sf-legend{display:flex;justify-content:space-between;font-size:12px;color:var(--ink-3);margin-top:6px;}
/* Остаток до цели и срок: строки под полосой, каждая со своей.
   Раздельными строками, а не в подбор, — числа читаются по одному. */
.sf-goal-rest{display:flex;flex-direction:column;gap:4px;margin-top:10px;
  padding-top:10px;border-top:1px solid var(--divider);font-size:12.5px;color:var(--ink-2);}
.sf-goal-rest b{color:var(--ink);font-weight:600;}
.sf-funnel{display:flex;flex-direction:column;gap:8px;}
.sf-funnel .row{display:grid;grid-template-columns:150px 1fr 120px;gap:10px;align-items:center;font-size:13px;}
.sf-funnel .bar{height:16px;border-radius:2px;background:var(--sunk);overflow:hidden;}
.sf-funnel .bar > span{display:block;height:100%;background:var(--glacier);}
.sf-funnel .row:nth-child(4) .bar > span{background:var(--rope);} .sf-funnel .row:nth-child(5) .bar > span{background:var(--ok);}
.sf-funnel .n{text-align:right;font-family:var(--mono);font-size:var(--fs-min);color:var(--ink-2);font-variant-numeric:tabular-nums;}
/* Графики рабочего стола SOM (ТЗ SOM 1.12). Полосы — «подпись · полоса · число» одним цветом, без раскраски по месту
   строки, как у воронки; строка — ссылка на срез реестра. Столбцы — месяцы: «в срок» снизу, «позже срока» сверху,
   высота — доля от самого полного месяца, серая дорожка — шкала. */
.sf-bars{display:flex;flex-direction:column;gap:8px;}
.sf-bars .row{display:grid;grid-template-columns:130px 1fr 48px;gap:10px;align-items:center;font-size:13px;color:inherit;text-decoration:none;min-height:24px;}
.sf-bars a.row:hover .n{color:var(--rope-on-soft);}
.sf-bars .bar{height:16px;border-radius:2px;background:var(--sunk);overflow:hidden;}
.sf-bars .bar > span{display:block;height:100%;background:var(--glacier);}
.sf-bars .row.is-warn .bar > span{background:var(--warn);}
.sf-bars .n{text-align:right;font-family:var(--mono);font-size:var(--fs-min);color:var(--ink-2);font-variant-numeric:tabular-nums;}
.sf-cols{list-style:none;margin:0;padding:0;display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);gap:10px;align-items:end;}
.sf-cols li{display:flex;flex-direction:column;align-items:center;gap:4px;min-width:0;}
.sf-cols .n{font-family:var(--mono);font-size:var(--fs-min);color:var(--ink-2);font-variant-numeric:tabular-nums;}
.sf-cols .bar{width:100%;max-width:44px;height:120px;display:flex;flex-direction:column;justify-content:flex-end;background:var(--sunk);border-radius:2px;overflow:hidden;}
.sf-cols .bar > span{display:block;width:100%;}
.sf-cols .bar > .late,.sf-swatch.late{background:var(--warn);}
.sf-cols .bar > .ok,.sf-swatch.ok{background:var(--ok);}
.sf-cols .m{font-size:12px;color:var(--ink-3);}
.sf-cols li.is-now .m{color:var(--ink);font-weight:600;}
.sf-swatch{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:6px;vertical-align:-1px;}

/* ---------- таблицы ---------- */
.sf-table{width:100%;border-collapse:collapse;font-size:13px;}
.sf-table th{font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);font-weight:500;text-align:left;padding:9px 14px;border-bottom:1px solid var(--line);white-space:nowrap;background:var(--surface);}
.sf-table td{padding:10px 14px;border-bottom:1px solid var(--divider);vertical-align:middle;}
.sf-table tr:last-child td{border-bottom:0;}
.sf-table tbody tr:hover{background:var(--surface);}
.sf-table .num{text-align:right;font-family:var(--mono);font-size:12.5px;font-variant-numeric:tabular-nums;white-space:nowrap;}
.sf-table .muted{color:var(--ink-3);}
.sf-table-wrap{overflow-x:auto;}
.sf-rownum{color:var(--ink-3);font-family:var(--mono);font-size:var(--fs-min);width:36px;}
/* v95: номер и ИНН не переносятся на две строки */
.sf-table td.no-wrap,.sf-table th.no-wrap{white-space:nowrap;}
.sf-table td.col-number{white-space:nowrap;min-width:84px;}
.sf-money{font-family:var(--mono);font-variant-numeric:tabular-nums;white-space:nowrap;}

/* ---------- бейджи этапов ---------- */
.sf-badge{display:inline-flex;align-items:center;height:20px;padding:0 8px;border-radius:var(--r-sm);font-size:var(--fs-min);font-weight:600;white-space:nowrap;background:var(--sunk);color:var(--ink-2);}
.sf-badge--new{background:var(--sunk);color:var(--ink-2);}
.sf-badge--solution{background:var(--sunk);color:var(--ink-2);}
.sf-badge--hold{background:var(--amber-soft);color:var(--amber);}
/* квалификация лида, пока отмечены не все четыре признака BANT; четыре — «Выиграна» (зелёный) */
.sf-badge--qualification{background:var(--amber-soft);color:var(--amber);}
.sf-badge--proposal{background:var(--glacier-soft);color:var(--glacier);}
.sf-badge--negotiation{background:var(--amber-soft);color:var(--amber);}
.sf-badge--contract{background:var(--rope-soft);color:var(--rope-on-soft);}
.sf-badge--won{background:var(--ok-soft);color:var(--ok);}

/* ---------- списки: задачи и лента ---------- */
.sf-list{list-style:none;margin:0;padding:0;}
.sf-list li{display:flex;gap:10px;padding:10px 16px;border-bottom:1px solid var(--divider);align-items:flex-start;font-size:13px;}
.sf-list li:last-child{border-bottom:0;}
.sf-list .when{font-family:var(--mono);font-size:var(--fs-min);color:var(--ink-3);white-space:nowrap;min-width:96px;padding-top:2px;}
/* В-04: без min-width:0 гибкий столбец не сжимается ниже min-content, и форма
   проработки ТВ внутри строки списка уезжала с 157-го пикселя на 551-й
   при экране 412 (повторный аудит, Н-02). Прокрутки у блока нет — поля
   просто недоступны. */
.sf-list .txt{flex:1;min-width:0;}
.sf-list .txt b{font-weight:600;}
.sf-check{width:15px;height:15px;margin-top:3px;accent-color:var(--rope);flex:none;}
.sf-feed-ava{width:26px;height:26px;border-radius:var(--r-sm);background:var(--glacier-soft);color:var(--glacier);font-family:var(--mono);font-size:var(--fs-min);display:inline-flex;align-items:center;justify-content:center;flex:none;}

/* ---------- запись: панель ключевых полей ---------- */
.sf-highlights{display:flex;flex-direction:column;gap:14px;padding:14px 18px;}
.sf-highlights .top{display:flex;align-items:center;gap:12px;}
.sf-fields{display:flex;gap:28px;flex-wrap:wrap;}
.sf-field{display:flex;flex-direction:column;gap:2px;min-width:120px;}
.sf-field .k{font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3);}
.sf-field .v{font-size:13px;font-weight:600;}

/* ---------- Path (этапы) ---------- */
.sf-path{display:flex;padding:12px 16px;gap:2px;align-items:center;}
.sf-path ol{list-style:none;margin:0;padding:0;display:flex;flex:1;gap:2px;}
.sf-path li{flex:1;}
/* Длинная подпись этапа — на две строки внутри ступени, а не многоточием: у заказа восемь этапов, и «Отправлен
   на тарификацию» резалась (замечание владельца 29.09.2026). Полный текст — и в title ступени. */
/* Полоса этапов — картина пути, а не набор кнопок: щелчок по ней никогда ничего
   не переключал, перевод делает кнопка «Следующий этап» (И-6.2). */
.sf-path-step{display:flex;align-items:center;justify-content:center;gap:6px;width:100%;height:32px;background:var(--sunk);color:var(--ink-2);font-size:12px;font-weight:500;clip-path:polygon(0 0,calc(100% - 12px) 0,100% 50%,calc(100% - 12px) 100%,0 100%,12px 50%);padding:0 14px 0 18px;overflow:hidden;text-align:center;line-height:1.15;}
.sf-path li:first-child .sf-path-step{clip-path:polygon(0 0,calc(100% - 12px) 0,100% 50%,calc(100% - 12px) 100%,0 100%);}
.sf-path li:last-child .sf-path-step{clip-path:polygon(0 0,100% 0,100% 100%,0 100%,12px 50%);}
.sf-path li.is-complete .sf-path-step{background:var(--glacier);color:var(--rope-contrast);}
.sf-path li.is-current .sf-path-step{background:var(--rope);color:var(--rope-contrast);font-weight:600;}
.sf-path .sf-btn{margin-left:12px;flex:none;}
@media (max-width:1023px){.sf-path{flex-direction:column;align-items:stretch;}.sf-path ol{flex-wrap:wrap;}.sf-path li{flex:1 1 45%;}.sf-path .sf-btn{margin:8px 0 0;}}

/* ---------- вкладки записи ---------- */
.sf-rtabs{display:flex;gap:2px;border-bottom:1px solid var(--line);padding:0 16px;}
.sf-rtabs button{border:0;background:none;height:40px;padding:0 12px;font-size:13px;font-weight:600;color:var(--ink-3);border-bottom:2px solid transparent;margin-bottom:-1px;}
.sf-rtabs button[aria-selected="true"]{color:var(--ink);border-bottom-color:var(--rope);}
.sf-dl{display:grid;grid-template-columns:1fr 1fr;gap:0 24px;margin:0;}
/* Только прямые потомки: правило ловило и вложенные div — пояснение под значением
   получало собственную линию и превращалось в пустую полосу поперёк карточки
   (замечание владельца 22.09.2026: «что это за полоса?»). */
.sf-dl > div{display:flex;flex-direction:column;padding:8px 0;border-bottom:1px solid var(--divider);}
.sf-dl dt{font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);}
.sf-dl dd{margin:0;font-size:13px;font-weight:600;}
/* длинный текст (причина, описание) — во всю ширину и обычным начертанием: читается как текст, а не как значение */
.sf-dl > div.is-wide{grid-column:1 / -1;}
.sf-dl dd.is-text{font-weight:400;line-height:1.5;white-space:pre-line;}
/* метки на карточке: чипы только для чтения и правка на месте (запрос, договор) */
.tg-inline{display:flex;flex-wrap:wrap;align-items:center;gap:8px;font-weight:400;}
.tags-chip--ro{padding-right:8px;}
.tg-edit > summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;gap:4px;}
.tg-edit > summary::-webkit-details-marker{display:none;}
.tg-edit[open]{flex-basis:100%;}
.tg-edit[open] > summary{display:none;}
.tg-edit-form{max-width:560px;}
.ag-tags{display:flex;align-items:flex-start;gap:10px;margin:8px 16px 0;font-size:12.5px;}
.ag-tags-k{font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);padding-top:5px;}
@media (max-width:599px){.sf-dl{grid-template-columns:1fr;}}

/* ---------- формы ---------- */
/* Колонки — minmax(0, 1fr), а не 1fr: у 1fr нижняя граница — ширина содержимого, и выпадающий список
   с длинным вариантом («Пупкин Кирилл · Генеральный директор») распирал сетку за край карточки
   (раздел «Контакты» контрагента, замечено 15.09.2026). Поля сжимаются вместе с колонкой. */
.sf-form{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 24px;}
@media (max-width:1023px){.sf-form{grid-template-columns:minmax(0,1fr);}}
.sf-form .full{grid-column:1 / -1;}
.sf-form label{display:flex;flex-direction:column;gap:4px;font-size:var(--fs-min);color:var(--ink-2);min-width:0;}
/* звёздочка обязательного поля 12 px: у --rope 4,33 : 1 при норме 4,5 (Д-12 прогона 24.09.2026) */
.sf-form label .req{color:var(--rope-on-soft);font-style:normal;font-family:var(--mono);font-size:var(--fs-min);}
/* v118: пролонгация — такое же поле, как соседние: подпись сверху, флажок в строке
   значения. Прежде флажок стоял подписью сбоку, и блок выглядел вставленным
   из другой формы (замечание владельца 22.09.2026). */
/* v118: правка условий — поля сгруппированы по сторонам, как и в просмотре.
   В общей сетке из двух колонок колонка значила сторону в одной строке и не значила
   в следующей (замечание владельца 22.09.2026). */
.sf-form .ag-party-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:16px;align-items:start;}
.sf-form .ag-party{display:flex;flex-direction:column;gap:12px;margin:0;padding:12px 14px 14px;
  border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);min-width:0;}
.sf-form .ag-party > legend{padding:0 6px;margin-left:-6px;font-family:var(--mono);font-size:var(--fs-min);
  letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);}
/* уточнение — строкой целиком, четыре коротких поля — ровным рядом под ним:
   при auto-fit «Аб. ящик» падал на следующую строку в одиночку */
.sf-form .ag-party .addr-extra{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;}
.sf-form .ag-party .addr-extra > label:first-child{grid-column:1 / -1;}

/* v118: стороны договора построчным сравнением — ИНН против ИНН, подписант против
   подписанта. Прежде каждая сторона была колонкой со своей сеткой, и длинный адрес
   у одной сдвигал всё ниже (замечание владельца 22.09.2026). */
.ag-sides{display:grid;grid-template-columns:max-content minmax(0,1fr) minmax(0,1fr);}
/* Ячейки строки тянутся на одну высоту: при align-items:start линия под короткой
   ячейкой шла выше линии под длинной, и «уровни не выдерживались» (22.09.2026). */
.ag-sides > *{padding:9px 16px;border-bottom:1px solid var(--divider);min-width:0;overflow-wrap:anywhere;}
.ag-sides > * > *{border:0;}
.ag-sides > :nth-last-child(-n+3){border-bottom:0;}
.ag-sides-corner{border-bottom:1px solid var(--line);}
.ag-sides-head{border-bottom:1px solid var(--line);}
.ag-sides-role{font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3);}
.ag-sides-name{font-weight:600;font-size:14px;margin-top:2px;}
.ag-sides-label{font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3);white-space:nowrap;}
.ag-sides-cell{font-size:13px;}
.ag-sides-cell.mono{font-family:var(--mono);font-size:12.5px;}
/* узкий экран: сравнение не помещается — стороны идут друг за другом,
   и каждое значение подписано своей стороной */
@media (max-width:1023px){
  .ag-sides{grid-template-columns:1fr;}
  .ag-sides-corner{display:none;}
  .ag-sides-cell::before{content:attr(data-party) ": ";font-family:var(--mono);font-size:var(--fs-min);text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3);}
  .ag-sides-label{padding-bottom:0;border-bottom:0;}
  .ag-sides > .ag-sides-cell{padding-top:2px;}
}

/* v118: шапка договора — шкала этапов с датами, четыре главных факта, происхождение
   мелкой строкой (замечание владельца 22.09.2026: «системнее, логичнее, удобнее»).
   Так устроен и верх записи у Salesforce: полоса этапов и 4–6 полей, по которым
   решают, а подробности — ниже, разделами. */
.ag-path{padding-bottom:0;}
.ag-path li{display:flex;flex-direction:column;gap:4px;}
/* плотная шкала — больше шести этапов (заказ с отключением — восемь): без значка у подписи, 11 px, перенос
   с дефисом; этап различим цветом, текущий — ещё и полужирным (замечание владельца 29.09.2026) */
/* на узком экране подпись — в три строки: ступени растут по высоте, все одинаково (li тянутся по самой высокой) */
.ag-path--dense .sf-path-step{font-size:11px;padding:3px 10px 3px 16px;hyphens:auto;overflow-wrap:anywhere;height:auto;min-height:32px;flex:1 0 auto;}
.ag-path--dense li:first-child .sf-path-step{padding-left:10px;}
.ag-path--dense .sf-path-step svg{display:none;}
.ag-path-when{padding-left:22px;font-family:var(--mono);font-size:var(--fs-min);color:var(--ink-2);font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.ag-path li:first-child .ag-path-when{padding-left:14px;}
.ag-path-when.is-plan{color:var(--ink-3);}
/* этап пройден без захода в него (аудит UX 27.09.2026, C-2) */
.ag-path-when.is-skipped{color:var(--ink-3);font-style:italic;}
.ag-facts{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));margin:6px 16px 0;padding:14px 0;border-top:1px solid var(--divider);border-bottom:1px solid var(--divider);}
.ag-fact{display:flex;flex-direction:column;gap:3px;padding:0 18px;min-width:0;}
.ag-fact:first-child{padding-left:0;}
.ag-fact + .ag-fact{border-left:1px solid var(--divider);}
.ag-fact dt{font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);}
.ag-fact dd{margin:0;font-size:14px;font-weight:600;color:var(--ink);overflow-wrap:anywhere;}
.ag-fact dd.is-empty{font-weight:500;color:var(--ink-3);}
.ag-fact-num{font-variant-numeric:tabular-nums;}
.ag-fact-unit{font-weight:500;color:var(--ink-2);font-size:12.5px;}
.ag-fact dd.ag-fact-note{font-size:12px;font-weight:400;color:var(--ink-2);}
.ag-fact dd.ag-fact-note.is-warn{color:var(--warn);}
.ag-origin{display:flex;flex-wrap:wrap;gap:4px 0;margin:10px 16px 0;font-size:12px;color:var(--ink-3);}
.ag-origin > span:not(:last-child)::after{content:"·";margin:0 8px;color:var(--line-control);}
/* плашки состояния — значок и мягкая заливка вместо цветной полосы слева */
.ag-callout{display:flex;gap:10px;align-items:flex-start;margin:12px 16px 0;padding:10px 12px;border-radius:var(--r-sm);font-size:13px;line-height:1.45;}
.ag-callout > svg{flex:none;margin-top:2px;}
.ag-callout--gap{background:var(--amber-soft);color:var(--ink);}
.ag-callout--gap > svg{color:var(--amber);}
.ag-callout--ok{background:var(--ok-soft);color:var(--ink);}
.ag-callout--ok > svg{color:var(--ok);}
.ag-callout--lost{background:var(--warn-soft);color:var(--ink);}
.ag-callout--lost > svg{color:var(--warn);}
@media (max-width:1023px){
  .ag-facts{grid-template-columns:repeat(2,minmax(0,1fr));row-gap:14px;}
  .ag-fact:nth-child(3){padding-left:0;border-left:0;}
}
@media (max-width:599px){
  .ag-facts{grid-template-columns:1fr;}
  .ag-fact{padding:0;border-left:0 !important;}
  .ag-path-when{display:none;}
  /* строка происхождения — столбиком: точки-разделители повисали на концах строк */
  .ag-origin{flex-direction:column;gap:2px;}
  .ag-origin > span:not(:last-child)::after{content:none;}
}
/* v118: готовность договора к подписанию — список того, чего не хватает */
.ag-ready-list{margin:6px 0 6px 18px;padding:0;}
.ag-ready-list li{margin:2px 0;}
/* пункт чек-листа — цель нажатия не ниже 24 px: строки по 17 px стояли вплотную (проверка 25.09.2026) */
.ag-ready-list a{display:inline-block;min-height:24px;line-height:24px;}
.sf-form .ag-renew{display:contents;}
.sf-form .ag-check{display:flex;align-items:center;gap:8px;min-height:34px;font-size:13px;color:var(--ink);}
.sf-form .ag-check input{height:auto;flex:none;width:16px;}
.sf-form label[hidden],.sf-form [data-terms][hidden]{display:none;}
.sf-form input,.sf-form select{min-width:0;max-width:100%;height:34px;padding:0 9px;border:1px solid var(--line-control);border-radius:var(--r-sm);background:var(--surface);font-size:13px;color:var(--ink);}
.sf-form input:hover,.sf-form select:hover{border-color:var(--ink-3);}
.sf-form input:focus,.sf-form select:focus{border-color:var(--rope);}
/* поле файла (26.09.2026: «Заявление клиента» — кнопка браузера торчала в углу поля высотой 34 px): поле по высоте
   содержимого, кнопка выбора — как кнопка системы, по центру строки */
.sf-form input[type=file]{height:auto;min-height:40px;padding:5px 9px;line-height:28px;cursor:pointer;}
input[type=file]::file-selector-button{margin-right:10px;padding:4px 12px;border:1px solid var(--line-control);border-radius:var(--r-sm);
  background:var(--raised);color:var(--ink);font:inherit;font-size:12.5px;font-weight:600;line-height:18px;cursor:pointer;vertical-align:middle;}
input[type=file]::file-selector-button:hover{border-color:var(--ink-3);}
.sf-form .err{color:var(--warn);font-size:12px;}
.sf-form-actions{display:flex;justify-content:flex-end;gap:8px;padding:12px 16px;border-top:1px solid var(--divider);}
.sf-section{font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3);padding:8px 0 2px;border-bottom:1px solid var(--divider);margin-bottom:4px;grid-column:1 / -1;}

/* ---------- тост ---------- */
.sf-toast{position:fixed;top:64px;left:50%;transform:translateX(-50%);z-index:40;display:flex;align-items:center;gap:10px;padding:10px 16px;border-radius:var(--r);background:var(--ink);color:var(--ground);font-size:13px;font-weight:500;box-shadow:0 8px 24px rgba(24,29,36,.25);animation:sf-toast 6s forwards;}
.sf-toast svg{color:var(--rope);}
@keyframes sf-toast{0%{opacity:0;transform:translate(-50%,-8px);}6%{opacity:1;transform:translate(-50%,0);}85%{opacity:1;}100%{opacity:0;visibility:hidden;}}
/* сообщения сессии столбиком: позиционирует контейнер, сами сообщения — в потоке */
.sf-toasts{position:fixed;top:64px;left:50%;transform:translateX(-50%);z-index:40;display:flex;flex-direction:column;align-items:center;gap:8px;width:max-content;max-width:calc(100vw - 32px);pointer-events:none;}
.sf-toasts .sf-toast{position:static;transform:none;animation-name:sf-toast-stacked;pointer-events:auto;}
.sf-toast--warning{background:var(--amber-soft);color:var(--ink);box-shadow:0 8px 24px rgba(24,29,36,.18),inset 3px 0 0 var(--amber);}
.sf-toasts .sf-toast--warning{animation-duration:14s;}
.sf-toast--warning svg{color:var(--amber);}
@keyframes sf-toast-stacked{0%{opacity:0;transform:translateY(-8px);}6%{opacity:1;transform:none;}85%{opacity:1;}100%{opacity:0;visibility:hidden;}}

/* ---------- прочее ---------- */
.sf-empty{padding:28px 16px;text-align:center;color:var(--ink-3);font-size:13px;}
.sf-empty b{display:block;color:var(--ink);font-size:14px;margin-bottom:4px;}
.sf-breadcrumb{font-family:var(--mono);font-size:var(--fs-min);color:var(--ink-3);display:flex;gap:8px;align-items:center;margin-bottom:10px;}
.sf-breadcrumb a{color:var(--ink-2);}
.sf-greeting{display:flex;align-items:center;gap:12px;margin:2px 0 14px;}
.sf-greeting h1{margin:0;font-size:20px;font-weight:600;}
.sf-greeting .date{color:var(--ink-3);font-size:12px;font-family:var(--mono);}
.sf-greeting .sf-btn{margin-left:auto;}
/* М-01: на 390 px приветствие не переносилось. Заголовок сжимался в три строки,
   контейнер «Мои / Команда» — до двух пикселей под overflow:hidden, а «+ Новая
   продажа» заканчивалась на 441 px при ширине экрана 390. Руководитель отдела
   с телефона не мог переключиться между своими и командными цифрами. */
@media (max-width:599px){
  .sf-greeting{flex-wrap:wrap;gap:8px 10px;}
  .sf-greeting > div{flex:1 1 100%;min-width:0;order:0;}
  .sf-greeting .sf-obj{order:-1;}
  .sf-greeting h1{font-size:18px;}
  .sf-scope{order:1;flex:1 1 100%;margin-left:0 !important;}
  .sf-scope a{flex:1;text-align:center;min-height:40px;display:flex;align-items:center;justify-content:center;}
  .sf-greeting .sf-btn{order:2;flex:1 1 calc(50% - 5px);margin-left:0 !important;justify-content:center;min-height:44px;}
}
/* М-07: шапка карточки на 390 px становилась двумя узкими колонками — название
   лида уходило в четыре строки, а главная кнопка обрезалась краем экрана. */
@media (max-width:599px){
  .sf-highlights .top{flex-wrap:wrap;}
  /* Название записи встаёт рядом со значком, а не под ним. Целая строка
     на всю ширину уводила текст под 44-пиксельный значок, и название
     контрагента оказывалось на 300-м пикселе при экране высотой 740 —
     за пределом «первого экрана» (собственный проход 21.09.2026). Значок
     декоративный: то же самое говорят полоса разделов и крошка выше.
     На свою строку переносятся только действия. */
  .sf-highlights .top > div:not(.sf-actions){flex:1 1 0;min-width:0;}
  .sf-highlights .top .sf-actions{margin-left:0 !important;flex:1 1 100%;}
  .sf-highlights .top .sf-actions > *{flex:1 1 auto;justify-content:center;}
  .sf-highlights .top .sf-actions .sf-btn--icon{flex:0 0 44px;}
}

/* v97: сортировка вложенных таблиц щелчком по заголовку */
.sf-table th .ts-btn{border:0;background:transparent;padding:0;font:inherit;letter-spacing:inherit;text-transform:inherit;color:inherit;cursor:pointer;display:inline-flex;align-items:center;gap:4px;}
.sf-table th .ts-btn:hover{color:var(--ink);}
.sf-table th .ts-btn .arr{opacity:0;transition:opacity .12s;}
.sf-table th[aria-sort] .ts-btn{color:var(--ink);}
.sf-table th[aria-sort] .ts-btn .arr{opacity:1;}
.sf-table th[aria-sort="descending"] .ts-btn .arr{transform:rotate(180deg);}
.sf-card-foot{display:flex;flex-wrap:wrap;gap:6px 18px;padding:10px 16px;border-top:1px solid var(--divider);font-size:12.5px;color:var(--ink-2);}
.sf-card-foot b{color:var(--ink);font-weight:600;}
.sf-table .none{color:var(--ink-3);font-style:italic;}

/* ==== crm-v7.css ==== */
/* v7: процесс продажи — лиды, активности с результатом ТВ, КП с версиями, договор, заказы */
.sf-obj--lead{color:var(--amber);background:var(--amber-soft);}
.sf-badge--lead-new{background:var(--amber-soft);color:var(--amber);}
.sf-badge--lead-working{background:var(--glacier-soft);color:var(--glacier);}
.sf-badge--lead-qualified{background:var(--ok-soft);color:var(--ok);}
.sf-badge--lead-disqualified{background:var(--sunk);color:var(--ink-3);}
.sf-badge--lost{background:var(--warn-soft);color:var(--warn);}
.sf-badge--solution{background:var(--glacier-soft);color:var(--glacier);}
.sf-badge--kind{background:var(--sunk);color:var(--ink-2);min-width:92px;justify-content:center;flex:none;}
.sf-badge--tech{background:var(--glacier-soft);color:var(--glacier);}
.sf-badge--q-draft{background:var(--sunk);color:var(--ink-2);} .sf-badge--q-sent{background:var(--glacier-soft);color:var(--glacier);}
.sf-badge--q-accepted{background:var(--ok-soft);color:var(--ok);} .sf-badge--q-rejected,.sf-badge--q-expired{background:var(--sunk);color:var(--ink-3);}
/* Пять статусов договора — пять разных заливок. «Завершён» правила не имел вовсе
   и падал на серую основу, неотличимую от «Нового»: в списке договоров контрагента
   начало и конец жизни читались одинаково (замечание владельца 22.09.2026).
   «Завершён» — спокойный синий: закончился штатно, это архив. «Отменён» — красный:
   договор не состоялся, и это исключение, а не тихий конец. */
/* состояние и тарификация услуги — карточка услуги (25.09.2026) */
.sf-badge--svc-active{background:var(--ok-soft);color:var(--ok);} .sf-badge--svc-suspended{background:var(--amber-soft);color:var(--amber);} .sf-badge--svc-terminated{background:var(--sunk);color:var(--ink-2);}
.sf-badge--svc-billed{background:var(--glacier-soft);color:var(--glacier);} .sf-badge--svc-unbilled{background:var(--warn-soft);color:var(--warn);}
.sf-badge--ag-draft{background:var(--sunk);color:var(--ink-2);} .sf-badge--ag-signing{background:var(--amber-soft);color:var(--amber);} .sf-badge--ag-active{background:var(--ok-soft);color:var(--ok);}
.sf-badge--ag-closed{background:var(--glacier-soft);color:var(--glacier);}
.sf-badge--ag-cancelled{background:var(--warn-soft);color:var(--warn);}
/* v118: номер правится на месте — карандаш у номера, по клику номер становится
   полем с кнопкой сохранения, как в PM (решение владельца 23.09.2026) */
.ag-title{display:flex;flex-wrap:wrap;align-items:center;gap:0 6px;}
.ag-renum{display:inline-flex;align-items:center;}
.ag-renum > summary{list-style:none;cursor:pointer;}
.ag-renum > summary::-webkit-details-marker{display:none;}
.ag-renum-btn{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:var(--r-sm);color:var(--ink-3);}
.ag-renum-btn:hover{background:var(--sunk);color:var(--ink);}
.ag-renum-btn:focus-visible,.ag-renum-icon:focus-visible{outline:2px solid var(--rope);outline-offset:1px;}
/* в режиме правки номер и карандаш уступают место полю */
.ag-title:has(.ag-renum[open]) > .ag-title-num,.ag-renum[open] > summary{display:none;}
.ag-renum-form{display:inline-flex;flex-direction:column;gap:6px;font-size:13px;font-weight:400;}
.ag-renum-field{display:inline-flex;align-items:center;height:32px;border:1px solid var(--rope);border-radius:var(--r-sm);background:var(--surface);}
.ag-renum-field input{height:30px;width:clamp(180px,22ch,320px);padding:0 8px;border:0;background:transparent;color:var(--ink);
  font-family:var(--mono);font-size:15px;font-weight:600;outline:none;}
.ag-renum-icon{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border:0;background:transparent;color:var(--ink-2);cursor:pointer;border-radius:var(--r-sm);}
.ag-renum-icon:hover{background:var(--sunk);color:var(--ink);}
.ag-renum-icon[type=submit]{color:var(--rope);}
.ag-renum-reason{height:30px;padding:0 8px;border:1px solid var(--line-control);border-radius:var(--r-sm);background:var(--surface);color:var(--ink);font-size:12.5px;}

/* v118: действия шапки договора. Четыре равновесные кнопки с полем даты между ними
   ломались на две строки, и главное действие уезжало под второстепенное (замечание
   владельца 22.09.2026). В строке — значок статуса, «Ещё» и одно главное действие;
   ряд не переносится, поле даты и кнопка подписания держатся вместе. */
.ag-actions{display:flex;align-items:center;gap:8px;flex-wrap:nowrap;}
.ag-actions form{margin:0;}
.ag-readonly{font-size:13px;color:var(--ink-2);max-width:40ch;text-align:right;}
.ag-sign{display:flex;align-items:center;gap:6px;white-space:nowrap;}
.ag-sign input[type=date]{width:auto;height:32px;padding:0 8px;border:1px solid var(--line-control);border-radius:var(--r-sm);background:var(--surface);color:var(--ink);font-size:13px;}
.ag-more{position:relative;flex:none;}
.ag-more>summary{list-style:none;cursor:pointer;}
.ag-more>summary::-webkit-details-marker{display:none;}
.ag-more-menu{position:absolute;right:0;top:calc(100% + 4px);z-index:6;min-width:240px;display:flex;flex-direction:column;gap:6px;
  padding:8px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--raised);box-shadow:var(--shadow);}
.ag-more-menu .sf-btn{width:100%;justify-content:center;}
.ag-more-cancel{display:flex;flex-direction:column;gap:6px;padding-top:6px;border-top:1px solid var(--divider);}
.ag-more-cancel label{display:flex;flex-direction:column;gap:3px;font-size:12px;color:var(--ink-2);}
.ag-more-cancel input{height:32px;padding:0 8px;border:1px solid var(--line-control);border-radius:var(--r-sm);background:var(--surface);color:var(--ink);font-size:13px;}
.ag-more-cancel input[type=file]{height:auto;min-height:40px;padding:5px 8px;line-height:28px;cursor:pointer;}
/* узкий экран: действия переносятся строкой под заголовок, а не жмутся в угол */
/* узкий экран: действия одной строкой от левого края; значок статуса прячется —
   статус виден на полосе этапов прямо под ним, а строку он занимал целиком */
@media (max-width:1023px){
  .ag-actions{flex-wrap:wrap;justify-content:flex-start;width:100%;}
  .ag-actions > .sf-badge{display:none;}
  .ag-readonly{text-align:left;}
}
/* отменённый договор на полосе этапов — is-lost, тот же класс, что у проигранной продажи */
.sf-badge--o-acknowledged{background:var(--sunk);color:var(--ink-2);} .sf-badge--o-inProgress{background:var(--glacier-soft);color:var(--glacier);}
.sf-badge--o-completed{background:var(--ok-soft);color:var(--ok);}
/* та же причина, что у договора: «Принят» и «Отменён» были одной заливкой */
.sf-badge--o-cancelled{background:var(--warn-soft);color:var(--warn);}
/* статусы заказа (ТЗ «Заказ на услуги» 1.4, раздел 8) — той же гаммой, что статусы договора */
.sf-badge--o-draft{background:var(--sunk);color:var(--ink-2);} .sf-badge--o-signing{background:var(--amber-soft);color:var(--amber);}
.sf-badge--o-signed{background:var(--glacier-soft);color:var(--glacier);} .sf-badge--o-provisioning{background:var(--glacier-soft);color:var(--glacier);}
.sf-badge--o-billing{background:var(--amber-soft);color:var(--amber);} .sf-badge--o-active{background:var(--ok-soft);color:var(--ok);}
.sf-badge--o-suspended,.sf-badge--o-terminating{background:var(--amber-soft);color:var(--amber);}
.sf-badge--o-closed,.sf-badge--o-replaced{background:var(--sunk);color:var(--ink-2);}
/* сервисный заказ (ТЗ «Сервисные заказы (SOM)», раздел 7): коды TMF641; «Есть сбой» — признак рядом со статусом.
   Позиция сервисного заказа — статусами позиции заказа o-*: коды и названия те же */
.sf-badge--so-acknowledged{background:var(--sunk);color:var(--ink-2);} .sf-badge--so-pending{background:var(--glacier-soft);color:var(--glacier);}
.sf-badge--so-inProgress{background:var(--glacier-soft);color:var(--glacier);} .sf-badge--so-held,.sf-badge--so-atRisk,.sf-badge--so-cancelPending{background:var(--amber-soft);color:var(--amber);}
.sf-badge--so-completed,.sf-badge--so-closed{background:var(--ok-soft);color:var(--ok);}
.sf-badge--so-cancelled,.sf-badge--so-failure,.sf-badge--so-broken{background:var(--warn-soft);color:var(--warn);}
/* задача сервисного заказа: «Ожидает» — приглушённо (её не берут), «Сбой» — отказом */
.sf-badge--sot-waiting,.sf-badge--sot-cancelled{background:var(--sunk);color:var(--ink-3);} .sf-badge--sot-ready{background:var(--glacier-soft);color:var(--glacier);}
.sf-badge--sot-inProgress{background:var(--amber-soft);color:var(--amber);} .sf-badge--sot-completed{background:var(--ok-soft);color:var(--ok);}
.sf-badge--sot-failed{background:var(--warn-soft);color:var(--warn);} .sf-badge--sot-skipped{background:var(--sunk);color:var(--ink-2);}
/* проработка Q-N (ТЗ SOM 1.9): статус qs-*, итог qo-*, результат по точке qp-*; «Проработка устарела» — qs-stale */
.sf-badge--qs-new{background:var(--sunk);color:var(--ink-2);} .sf-badge--qs-inProgress{background:var(--glacier-soft);color:var(--glacier);}
.sf-badge--qs-held,.sf-badge--qs-stale{background:var(--amber-soft);color:var(--amber);} .sf-badge--qs-done{background:var(--ok-soft);color:var(--ok);}
.sf-badge--qs-cancelled{background:var(--sunk);color:var(--ink-3);}
.sf-badge--qo-qualified,.sf-badge--qp-yes{background:var(--ok-soft);color:var(--ok);} .sf-badge--qo-conditional,.sf-badge--qp-build{background:var(--amber-soft);color:var(--amber);}
.sf-badge--qo-alternate{background:var(--glacier-soft);color:var(--glacier);} .sf-badge--qo-unqualified,.sf-badge--qp-no{background:var(--warn-soft);color:var(--warn);}
/* наряд W-N и выезд W-N/k (ТЗ FSM 1.4, раздел 7): статус наряда wo-*, «Ждёт решения», риск срока и приоритет — wo-decision,
   wo-atRisk, wo-broken, wo-critical, wo-high; статус выезда wv-* (подстатус — текстом после него) */
.sf-badge--wo-draft,.sf-badge--wo-check,.sf-badge--wv-waiting{background:var(--sunk);color:var(--ink-2);}
.sf-badge--wo-ready,.sf-badge--wo-assigned,.sf-badge--wv-planned,.sf-badge--wv-assigned,.sf-badge--wv-accepted{background:var(--glacier-soft);color:var(--glacier);}
.sf-badge--wo-inProgress,.sf-badge--wo-held,.sf-badge--wo-decision,.sf-badge--wo-atRisk,.sf-badge--wo-high,.sf-badge--wv-inProgress{background:var(--amber-soft);color:var(--amber);}
.sf-badge--wo-completed,.sf-badge--wv-completed{background:var(--ok-soft);color:var(--ok);}
.sf-badge--wo-failed,.sf-badge--wo-broken,.sf-badge--wo-critical,.sf-badge--wv-failed{background:var(--warn-soft);color:var(--warn);}
.sf-badge--wo-cancelled,.sf-badge--wv-draft,.sf-badge--wv-cancelled{background:var(--sunk);color:var(--ink-3);}
/* инцидент INC-N (ТЗ SD 1.1, раздел 7): статус inc-*, приоритет по матрице inc-p1…inc-p4 */
.sf-badge--inc-new,.sf-badge--inc-p4{background:var(--sunk);color:var(--ink-2);}
.sf-badge--inc-inProgress,.sf-badge--inc-held,.sf-badge--inc-p2{background:var(--amber-soft);color:var(--amber);}
.sf-badge--inc-resolved,.sf-badge--inc-closed{background:var(--ok-soft);color:var(--ok);}
.sf-badge--inc-cancelled{background:var(--sunk);color:var(--ink-3);}
.sf-badge--inc-p1{background:var(--warn-soft);color:var(--warn);}
.sf-badge--inc-p3{background:var(--glacier-soft);color:var(--glacier);}
/* счётчик SLA инцидента (ТЗ SD, срез 1б, FR-08): идёт — по пройденному порогу, просрочен — сплошной заливкой, на паузе, итог */
.sf-badge--sla-ok{background:var(--glacier-soft);color:var(--glacier);}
.sf-badge--sla-50{background:var(--amber-soft);color:var(--amber);}
.sf-badge--sla-75,.sf-badge--sla-missed{background:var(--warn-soft);color:var(--warn);}
.sf-badge--sla-breached{background:var(--warn);color:var(--warn-contrast);}
.sf-badge--sla-paused,.sf-badge--sla-cancelled{background:var(--sunk);color:var(--ink-2);}
.sf-badge--sla-met{background:var(--ok-soft);color:var(--ok);}
/* навык и допуск техника по сроку (ТЗ FSM, FR-20, FR-40): действует, истекает за 30 дней — жёлтым, истёк — красным; отсутствие — серым */
.sf-badge--sk-ok{background:var(--ok-soft);color:var(--ok);} .sf-badge--sk-expiring{background:var(--amber-soft);color:var(--amber);}
.sf-badge--sk-expired{background:var(--warn-soft);color:var(--warn);} .sf-badge--sk-absent{background:var(--sunk);color:var(--ink-2);}
/* окно визита (ТЗ FSM, FR-25; TMF646): предложено клиенту — жёлтым, пока не подтверждено; подтверждено — зелёным; отменено — серым */
.sf-badge--win-proposed{background:var(--amber-soft);color:var(--amber);} .sf-badge--win-confirmed{background:var(--ok-soft);color:var(--ok);}
.sf-badge--win-cancelled{background:var(--sunk);color:var(--ink-3);}
/* табель техника (ТЗ FSM, FR-27): черновик — серым, на согласовании — синим, согласован — зелёным, возвращён — жёлтым */
.sf-badge--ts-draft{background:var(--sunk);color:var(--ink-2);} .sf-badge--ts-submitted{background:var(--glacier-soft);color:var(--glacier);}
.sf-badge--ts-approved{background:var(--ok-soft);color:var(--ok);} .sf-badge--ts-returned{background:var(--amber-soft);color:var(--amber);}
/* задача «Ожидает» в очереди и плане — серым: её не берут, она ждёт предшественника (ТЗ SOM, FR-10) */
.sf-table tr.som-waiting td{color:var(--ink-3);}
/* просроченное у заказа: оригинал не сдан неделю после подписания */
.sf-warn-text{color:var(--warn);font-weight:600;}
/* действие-ссылка внутри строки таблицы: «удалить» у позиции заказа */
.sf-link-btn{border:0;background:none;padding:0;font:inherit;color:var(--danger);text-decoration:underline;cursor:pointer;}

/* недоступный этап — цветом, а не прозрачностью: при opacity .7 «Выиграна» давала 3.18:1 (проверка 25.09.2026) */
/* серый — только будущему этапу: у текущего и пройденного он перебивал цвет, контраст падал до 1,7 : 1 (аудит UX 27.09.2026, H-8) */
.sf-path li.is-blocked:not(.is-current):not(.is-complete) .sf-path-step{color:var(--ink-3);}
.sf-path li.is-lost .sf-path-step{background:var(--warn);color:var(--warn-contrast);}
.sf-gates{display:flex;flex-wrap:wrap;gap:6px 18px;padding:0 16px 12px;font-family:var(--mono);font-size:var(--fs-min);color:var(--ink-3);}
.sf-gates .ok{color:var(--ok);} .sf-gates .no{color:var(--ink-3);}
.sf-btn.is-on{border-color:var(--rope);color:var(--rope);}
.sf-toast--error{background:var(--warn);color:var(--warn-contrast);}
.sf-toast--error span:first-child{font-weight:700;}

.sf-checks{display:grid;grid-template-columns:1fr 1fr;gap:8px 20px;}
@media (max-width:599px){.sf-checks{grid-template-columns:1fr;}}
.sf-check-row{display:flex;gap:10px;align-items:flex-start;font-size:13px;cursor:pointer;}
.sf-check-row .muted{font-size:12px;color:var(--ink-3);}
.sf-field-inline{display:flex;flex-direction:column;gap:4px;}
.sf-field-inline .k{font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3);}
/* Длинное значение в выпадающем списке (номер договора с датой) распирало
   строку: 29–453 px при экране 412 (повторный аудит, Н-02). */
.sf-inline-form select,.sf-inline-form input{max-width:100%;}
.sf-field-inline input,.sf-inline-form input,.sf-inline-form select,.sf-tech-form input{height:32px;padding:0 9px;border:1px solid var(--line-control);border-radius:var(--r-sm);background:var(--surface);font-size:13px;color:var(--ink);}
.sf-field-inline input:focus,.sf-inline-form input:focus,.sf-inline-form select:focus,.sf-tech-form input:focus{border-color:var(--rope);}
.sf-note{font-size:12.5px;padding:9px 12px;border-radius:var(--r-sm);background:var(--glacier-soft);color:var(--ink);}
/* предупреждение: не хватает данных, задача возвращена — «внимание» янтарём (tokens.css); до 28.09.2026 правила не было */
.sf-note--warn{background:var(--amber-soft);}
/* запрет отмены заказа: объяснение и кнопка действия в одной строке (аудит UX 27.09.2026, M-10) */
.ord-cancel-note{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;}
.sf-inline-form{display:flex;gap:8px;align-items:center;flex-wrap:wrap;padding:10px 16px;border-top:1px solid var(--divider);}
/* «Передать» на карточке задачи: над списком подпись — кнопка по низу списка, а не по центру строки (29.09.2026) */
.tk-reassign{align-items:flex-end;}
.tk-reassign>label{display:flex;flex-direction:column;gap:4px;flex:1;min-width:160px;}
/* выполненная активность — приглушённым названием, а не прозрачностью: при opacity .6 текст и плашки
   под ним опускались до 2.45:1 (проверка 25.09.2026) */
.sf-list li.is-done .txt > b{color:var(--ink-2);font-weight:500;}
/* статус активности значком (26.09.2026): закрытая отличается от открытой с первого взгляда */
.sf-act-status{white-space:nowrap;align-self:flex-start;}
.sf-badge--act-new{background:var(--glacier-soft);color:var(--glacier);}
.sf-badge--act-work{background:var(--amber-soft);color:var(--amber);}
.sf-badge--act-resolved{background:var(--warn-soft);color:var(--warn);}
.sf-badge--act-done{background:var(--ok-soft);color:var(--ok);}
.sf-badge--act-off{background:var(--sunk);color:var(--ink-3);}
/* состояние сотрудника (ТЗ «Пользователи» 1.1, С-2) */
.sf-badge--u-active{background:var(--ok-soft);color:var(--ok);}
.sf-badge--u-leaving{background:var(--amber-soft);color:var(--amber);}
.sf-badge--u-dismissed{background:var(--amber-soft);color:var(--amber);}
.sf-badge--u-locked{background:var(--warn-soft);color:var(--warn);}
.sf-badge--u-disabled{background:var(--sunk);color:var(--ink-3);}
/* шаг «Настройки системы»: готов / не заполнен; необязательный незаполненный — нейтральная .sf-badge */
.sf-badge--setup-done{background:var(--ok-soft);color:var(--ok);}
.sf-badge--setup-todo{background:var(--amber-soft);color:var(--amber);}
.sf-act-outcome{margin-top:4px;font-size:12.5px;color:var(--ink-2);white-space:pre-line;}
.sf-act-outcome .k{color:var(--ink-3);}
.sf-result{margin-top:6px;font-size:12px;color:var(--ink-2);display:flex;gap:8px;flex-wrap:wrap;align-items:center;}
.sf-tech-form{margin-top:8px;padding:10px 12px;border:1px dashed var(--line);border-radius:var(--r-sm);display:flex;flex-direction:column;gap:8px;background:var(--surface);}
.sf-tech-form .row{display:flex;gap:10px;flex-wrap:wrap;align-items:flex-end;}
.sf-tech-form label{display:flex;flex-direction:column;gap:3px;font-size:var(--fs-min);color:var(--ink-3);min-width:0;max-width:100%;}
.sf-tech-form input,.sf-tech-form select{max-width:100%;}
.sf-tech-form label input[type=number]{width:110px;}
.sf-tech-form input[type=file]{height:auto;min-height:40px;padding:5px 9px;line-height:28px;cursor:pointer;}

.sf-quote{border-top:1px solid var(--divider);}
.sf-quote.is-accepted{background:color-mix(in srgb, var(--ok-soft) 40%, transparent);}
.sf-quote-head{display:flex;align-items:center;gap:10px;padding:10px 16px;flex-wrap:wrap;font-size:13px;}
.sf-quote-sum{margin-left:auto;font-size:12.5px;}
.sf-quote-actions{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:8px 16px 12px;}
.sf-table--compact th,.sf-table--compact td{padding:7px 12px;}
.sf-agreement{display:grid;grid-template-columns:1.4fr 1fr 1fr auto;gap:14px;align-items:start;font-size:13px;}
.sf-agreement .k{display:block;font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3);margin-bottom:2px;}
@media (max-width:1023px){.sf-agreement{grid-template-columns:1fr;}}
.sf-orders-head{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-bottom:6px;}

/* ==== crm-v8.css ==== */
/* v8: варианты КП, первичное, услуги в продаже, installed base, MACD */
.sf-variant{border-top:1px solid var(--line);}
.sf-variant.is-primary{background:color-mix(in srgb, var(--rope-soft) 35%, transparent);}
.sf-variant-head{display:flex;align-items:center;gap:10px;padding:10px 16px;flex-wrap:wrap;}
.sf-variant-head .name{font-size:14px;font-weight:600;}
.sf-badge--primary{background:var(--rope);color:var(--rope-contrast);}
.sf-badge--variant{background:var(--sunk);color:var(--ink-2);font-family:var(--mono);}
.sf-variant-versions{padding:0 16px 10px;font-family:var(--mono);font-size:var(--fs-min);color:var(--ink-3);display:flex;gap:12px;flex-wrap:wrap;}
.sf-variant-tech{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:8px 16px;font-size:12.5px;border-top:1px dashed var(--divider);}
.sf-badge--act-add{background:var(--ok-soft);color:var(--ok);}
.sf-badge--act-change{background:var(--amber-soft);color:var(--amber);}
.sf-badge--act-disconnect{background:var(--warn-soft);color:var(--warn);}
.sf-delta{font-family:var(--mono);font-variant-numeric:tabular-nums;}
.sf-delta.pos{color:var(--ok);} .sf-delta.neg{color:var(--warn);}
.sf-was{font-size:var(--fs-min);color:var(--ink-3);font-family:var(--mono);}
.sf-dealitems{margin-top:14px;}
.sf-dealitems .sf-table td{padding:8px 14px;}
.sf-badge--p-active{background:var(--ok-soft);color:var(--ok);} .sf-badge--p-suspended{background:var(--amber-soft);color:var(--amber);} .sf-badge--p-terminated{background:var(--sunk);color:var(--ink-3);}
/* статусы запроса (ТЗ-ГП-ЗПР-01) */
.sf-badge--rq-new{background:var(--glacier-soft);color:var(--glacier);} .sf-badge--rq-deal,.sf-badge--rq-in_work{background:var(--amber-soft);color:var(--amber);}
.sf-badge--rq-done{background:var(--ok-soft);color:var(--ok);} .sf-badge--rq-not_done,.sf-badge--rq-cancelled{background:var(--sunk);color:var(--ink-3);} .sf-badge--rq-high{background:var(--warn-soft);color:var(--warn);}
/* две оси статуса услуги (ТЗ на заказ 1.9, Р-15): оказание и тарификация */
.sf-badge--tech-inService{background:var(--ok-soft);color:var(--ok);} .sf-badge--tech-provisioning,.sf-badge--tech-disconnecting{background:var(--glacier-soft);color:var(--glacier);}
.sf-badge--tech-blocked{background:var(--amber-soft);color:var(--amber);} .sf-badge--tech-disconnected{background:var(--sunk);color:var(--ink-3);}
.sf-badge--bill-billing{background:var(--glacier-soft);color:var(--glacier);} .sf-badge--bill-awaiting{background:var(--warn-soft);color:var(--warn);}
.sf-badge--bill-suspended,.sf-badge--bill-pendingTerminate{background:var(--amber-soft);color:var(--amber);} .sf-badge--bill-terminated{background:var(--sunk);color:var(--ink-3);}
.chip.mode-change{border-color:var(--amber);color:var(--amber);background:var(--amber-soft);}
.tot.neg .v{color:var(--warn);}

/* ==== crm-v12.css ==== */
/* v12: история версий КП и раскрытие позиций начислений */

/* версии в истории варианта — ссылки, а не текст */
.sf-variant-versions a{color:var(--ink-2);text-decoration:none;border-bottom:1px dashed var(--line);}
.sf-variant-versions a:hover{color:var(--rope);border-bottom-color:var(--rope);}

/* раскрытие «из чего сложилась цена» */
.sf-lines-toggle{margin-top:4px;}
.sf-lines-toggle > summary{list-style:none;display:inline-block;}
.sf-lines-toggle > summary::-webkit-details-marker{display:none;}
.sf-lines-toggle > summary::before{content:"▸ ";color:var(--ink-3);}
.sf-lines-toggle[open] > summary::before{content:"▾ ";}
.sf-lines-toggle > summary:hover{color:var(--rope);}

/* таблица позиций внутри строки услуги — визуально вложенная */
.sf-lines{background:var(--sunk);border:1px solid var(--divider);border-radius:3px;}
.sf-lines th{font-size:var(--fs-min);letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3);}
.sf-lines td{padding:7px 10px;vertical-align:top;}
.sf-lines tbody tr + tr td{border-top:1px solid var(--divider);}

/* ==== crm-v14.css ==== */
/* v14: услуги в КП — карточки на всю ширину вместо таблицы.
   Позиции начислений перестают жить в первой ячейке и получают всю ширину блока. */

.sf-svc-list{display:flex;flex-direction:column;}
.sf-svc{padding:14px 16px;border-top:1px solid var(--divider);}
.sf-svc:first-child{border-top:1px solid var(--line);}

.sf-svc-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap;}
.sf-svc-title{flex:1 1 260px;min-width:0;}
.sf-svc-name{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;font-size:14px;}

/* суммы — три подписанные ячейки, цифры выровнены по разряду */
.sf-svc-sums{display:flex;gap:20px;margin-left:auto;}
.sf-svc-sum{display:flex;flex-direction:column;align-items:flex-end;min-width:92px;}
.sf-svc-sum .k{font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.06em;text-transform:uppercase;color:var(--ink-3);}
.sf-svc-sum .v{font-family:var(--mono);font-size:13.5px;font-variant-numeric:tabular-nums;margin-top:2px;}

.sf-svc-actions{display:flex;gap:6px;align-items:center;}
.sf-svc-chars{font-size:12.5px;color:var(--ink-2);margin:8px 0 10px;}
.sf-svc-chars .sf-was{color:var(--ink-3);}

/* таблица позиций внутри карточки — во всю ширину, без внешней рамки */
.sf-svc .sf-lines{width:100%;background:var(--sunk);border:1px solid var(--divider);border-radius:3px;}
.sf-svc .sf-lines td{padding:8px 12px;}
.sf-svc .sf-lines th{padding:7px 12px;}

@media (max-width:1023px){
  .sf-svc-sums{margin-left:0;gap:14px;}
  .sf-svc-sum{min-width:78px;}
  .sf-svc-actions{margin-left:auto;}
}

/* ==== crm-v15.css ==== */
/* v15: ручные цены менеджера поверх рекомендованных каталогом */

.sf-price-input{
  width:104px;padding:4px 7px;text-align:right;
  font-family:var(--mono);font-size:12.5px;font-variant-numeric:tabular-nums;
  border:1px solid var(--line);border-radius:2px;background:var(--surface);color:var(--ink);
}
.sf-price-input:hover{border-color:var(--ink-3);}
.sf-price-input:focus{outline:2px solid var(--rope);outline-offset:1px;}
/* цена, отличающаяся от каталожной, читается сразу */
.sf-price-input.is-manual{border-color:var(--amber);background:var(--amber-soft);color:var(--ink);font-weight:600;}

.sf-price-list{
  font-family:var(--mono);font-size:var(--fs-min);color:var(--ink-3);margin-top:3px;white-space:nowrap;
}
.sf-line--manual td{background:color-mix(in srgb, var(--amber-soft) 40%, transparent);}

.sf-price-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:8px;}

/* скрываем стрелки number — цена вводится с клавиатуры */
.sf-price-input::-webkit-outer-spin-button,
.sf-price-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0;}
.sf-price-input{-moz-appearance:textfield;}

/* v16: живой пересчёт и несохранённое состояние */
.sf-price-list.is-hidden{display:none;}
.sf-price-dirty{
  font-size:var(--fs-min);font-weight:600;color:var(--amber);
  background:var(--amber-soft);border:1px solid var(--amber);border-radius:2px;padding:3px 8px;
}
.sf-svc.is-dirty .sf-svc-sum .v{color:var(--amber);}
.sf-svc.is-dirty{box-shadow:inset 3px 0 0 var(--amber);}

/* ==== crm-v17.css ==== */
/* v17: позиции начислений разбиты на ежемесячные и разовые */

.sf-lines-group{margin-top:10px;}
.sf-lines-group + .sf-lines-group{margin-top:14px;}

.sf-lines-title{
  font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.12em;text-transform:uppercase;
  margin-bottom:5px;display:flex;align-items:center;gap:7px;
}
.sf-lines-title .cnt{
  font-size:var(--fs-min);color:var(--ink-3);border:1px solid var(--line);border-radius:2px;padding:1px 5px;
}

/* тип платежа читается цветом полосы: ежемесячные — ледник, разовые — янтарь */
.sf-lines-group[data-type="recurring"] .sf-lines{border-left:2px solid var(--glacier);}
.sf-lines-group[data-type="oneTime"] .sf-lines{border-left:2px solid var(--amber);}
.sf-lines-group[data-type="recurring"] .sf-lines-title{color:var(--glacier);}
.sf-lines-group[data-type="oneTime"] .sf-lines-title{color:var(--amber);}

.sf-lines-total td{
  border-top:1px solid var(--line);font-weight:600;font-size:12px;padding:8px 12px;
  background:color-mix(in srgb, var(--sunk) 60%, transparent);
}
.sf-lines-total .v{font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:13px;}

/* ==== crm-v18.css ==== */
/* v18: подписи «со скидкой N» рядом с суммами.
   v34: скидка из КП убрана — подписи не выводятся, от файла осталась только раскладка сумм варианта. */

.sf-quote-sum{display:inline-flex;align-items:baseline;gap:4px;flex-wrap:wrap;}

/* ==== crm-v19.css ==== */
/* v19: единая таблица позиций начислений с разделами внутри */

/* строка-раздел: «Ежемесячные платежи» / «Разовые платежи» */
.sf-lines .sf-lines-section td{
  font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.12em;text-transform:uppercase;
  padding:9px 12px 7px;background:color-mix(in srgb, var(--sunk) 75%, transparent);
  border-top:1px solid var(--line);
}
.sf-lines tbody tr.sf-lines-section:first-child td{border-top:0;}
.sf-lines .sf-lines-section .cnt{
  font-size:var(--fs-min);letter-spacing:0;color:var(--ink-2);
  border:1px solid var(--line);border-radius:2px;padding:1px 5px;margin-left:6px;
}
/* тип платежа читается цветом: ежемесячные — ледник, разовые — янтарь */
.sf-lines .sf-lines-section[data-type="recurring"] td{color:var(--glacier);box-shadow:inset 2px 0 0 var(--glacier);}
.sf-lines .sf-lines-section[data-type="oneTime"] td{color:var(--amber);box-shadow:inset 2px 0 0 var(--amber);}
/* П-06 повторной проверки 25.09.2026: текст разделов шёл на грани — 4.67:1 в светлой теме, в отчёте на
   другом фоне строки 4.42. Цвет раздела с долей основного текста — запас при любом фоне строки */
.sf-lines .sf-lines-section[data-type="recurring"] td{color:color-mix(in srgb, var(--glacier) 75%, var(--ink));}
.sf-lines .sf-lines-section[data-type="oneTime"] td{color:color-mix(in srgb, var(--amber) 75%, var(--ink));}

/* итоги внизу таблицы */
.sf-lines tfoot .sf-lines-total td{
  border-top:1px solid var(--line);font-weight:600;font-size:12px;padding:8px 12px;
  background:color-mix(in srgb, var(--sunk) 60%, transparent);
}
.sf-lines tfoot .sf-lines-total[data-type="recurring"] td{border-top-width:2px;}
.sf-lines tfoot .sf-lines-total .v{
  font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:13px;
}
.sf-lines tfoot .sf-lines-total[data-type="recurring"] .v{color:var(--glacier);}
.sf-lines tfoot .sf-lines-total[data-type="oneTime"] .v{color:var(--amber);}

/* ==== crm-v20.css ==== */
/* v20: зебра вместо линий + правило позиции под раскрытие.
   Строка стала одноэкранной, граница читается площадью фона, а не волосяной линией. */

/* --- убираем прежние разделители: они не читались на тёмном фоне --- */
.sf-lines tbody tr + tr td{border-top:0;}

/* --- зебра --- */
.sf-lines tbody tr.d-even td{background:color-mix(in srgb, var(--surface) 75%, transparent);}
.sf-lines tbody tr.d-odd  td{background:transparent;}
.sf-lines tbody tr.d-odd:hover td,
.sf-lines tbody tr.d-even:hover td{background:color-mix(in srgb, var(--glacier) 12%, transparent);}

/* ручная цена сильнее зебры — иначе подсветка теряется на чётных строках */
.sf-lines tbody tr.sf-line--manual td,
.sf-lines tbody tr.sf-line--manual:hover td{background:color-mix(in srgb, var(--amber-soft) 55%, transparent);}

/* --- название и код позиции в одну строку, правило по клику --- */
.sf-why{margin:0;}
.sf-why > summary{
  list-style:none;cursor:pointer;display:flex;align-items:baseline;gap:8px;min-height:24px;
}
.sf-why > summary::-webkit-details-marker{display:none;}
.sf-why > summary .nm{min-width:0;}
.sf-why > summary .pop{
  font-size:var(--fs-min);color:var(--rope-on-soft);border:1px solid var(--rope-line);border-radius:2px;
  padding:1px 5px;white-space:nowrap;flex:0 0 auto;
}
.sf-why > summary:hover .pop{background:var(--rope-soft);}
.sf-why[open] > summary .pop{background:var(--rope-soft);}
.sf-why .why{
  font-size:var(--fs-min);line-height:1.45;color:var(--ink-3);
  margin-top:5px;padding-left:10px;border-left:2px solid var(--rope-line);
}

/* ==== crm-v21.css ==== */
/* v21: итог раздела стоит в его подзаголовке, строк «Итого …» внизу больше нет */

/* сумма в подзаголовке: крупнее подписи раздела, цифры выровнены по разряду */
.sf-lines .sf-lines-section .v{
  font-family:var(--mono);font-size:12.5px;font-weight:600;
  font-variant-numeric:tabular-nums;letter-spacing:0;text-transform:none;
  white-space:nowrap;
}
.sf-lines .sf-lines-section[data-type="recurring"] .v{color:color-mix(in srgb, var(--glacier) 75%, var(--ink));}
.sf-lines .sf-lines-section[data-type="oneTime"] .v{color:color-mix(in srgb, var(--amber) 75%, var(--ink));}

/* подложка раздела распространяется на обе ячейки, включая ячейку с суммой */
.sf-lines .sf-lines-section td{vertical-align:baseline;}

/* ==== crm-v22.css ==== */
/* v22: зебра убрана. Ячейки строк — на поверхности карточки, разделены видимыми границами.
   Фоном подсвечены только строки разделов «Ежемесячные платежи» и «Разовые платежи».
   «Белый» задан токеном --raised: в светлой теме это #FFFFFF, в тёмной — приподнятая поверхность. */

.sf-lines{background:transparent;border:1px solid var(--line);}

/* --- строки данных: одинаковый фон, видимые границы --- */
.sf-lines tbody tr.d-odd  td,
.sf-lines tbody tr.d-even td{background:var(--raised);}
.sf-lines tbody tr + tr td{border-top:1px solid var(--line);}

.sf-lines tbody tr.d-odd:hover td,
.sf-lines tbody tr.d-even:hover td{background:color-mix(in srgb, var(--glacier) 9%, var(--raised));}

/* ручная цена по-прежнему сильнее обычного фона */
.sf-lines tbody tr.sf-line--manual td,
.sf-lines tbody tr.sf-line--manual:hover td{background:color-mix(in srgb, var(--amber-soft) 70%, var(--raised));}

/* --- подсвечены только разделы ---
   Подложка — оттенок на карточке, а не на утопленной поверхности: на --sunk ледник давал 3,8:1,
   янтарь 4,0:1 при норме 4,5 (аудит 15.09.2026). 12 % — плотнее подсветки строки при наведении (9 %).
   Контраст проверяет tests/Unit/DesignTokensTest.php. */
.sf-lines .sf-lines-section[data-type="recurring"] td{
  background:color-mix(in srgb, var(--glacier) 12%, var(--raised));
  border-top:1px solid var(--line);
}
.sf-lines .sf-lines-section[data-type="oneTime"] td{
  background:color-mix(in srgb, var(--amber) 12%, var(--raised));
  border-top:1px solid var(--line);
}
.sf-lines tbody tr.sf-lines-section:first-child td{border-top:0;}

/* ==== crm-v23.css ==== */
/* v23: шапка таблицы приведена к разделам, вертикальные полосы убраны,
   позиции сворачиваются переключателем «Детализация +/−». */

/* --- шапка колонок: утоплена, а не поднята: перестаёт спорить с разделами --- */
.sf-lines thead th{
  background:var(--sunk);
  border-bottom:1px solid var(--line);
  color:var(--ink-3);
}

/* --- убираем вертикальные полосы в строках разделов --- */
.sf-lines .sf-lines-section[data-type="recurring"] td,
.sf-lines .sf-lines-section[data-type="oneTime"] td{box-shadow:none;}

/* --- сворачивание позиций --- */
.sf-detail{margin-top:10px;}
.sf-detail > summary{
  list-style:none;cursor:pointer;display:inline-flex;align-items:center;gap:9px;
  padding:5px 0;user-select:none;
}
.sf-detail > summary::-webkit-details-marker{display:none;}

.sf-detail-toggle{
  width:18px;height:18px;flex:0 0 auto;
  display:inline-flex;align-items:center;justify-content:center;
  border:1px solid var(--line);border-radius:2px;background:var(--raised);
  font-family:var(--mono);font-size:13px;line-height:1;color:var(--ink-2);
}
.sf-detail-toggle::before{content:"+";}
.sf-detail[open] .sf-detail-toggle::before{content:"−";}
.sf-detail > summary:hover .sf-detail-toggle{border-color:var(--rope);color:var(--rope);}

.sf-detail-label{font-size:12.5px;font-weight:600;}
.sf-detail-cnt{
  font-family:var(--mono);font-size:var(--fs-min);color:var(--ink-3);
  border:1px solid var(--line);border-radius:2px;padding:1px 6px;
}
.sf-detail > summary:focus-visible{outline:2px solid var(--rope);outline-offset:2px;border-radius:2px;}
.sf-detail[open] > summary{margin-bottom:6px;}

/* ==== crm-v24.css ==== */
/* v24: ручная цена подсвечивается только в поле ввода.
   Строка целиком больше не красится — сигнал точечный, там где было изменение. */

/* строка с ручной ценой ведёт себя как обычная */
.sf-lines tbody tr.sf-line--manual td{background:var(--raised);}
.sf-lines tbody tr.sf-line--manual:hover td{background:color-mix(in srgb, var(--glacier) 9%, var(--raised));}

/* весь сигнал — в поле цены */
.sf-price-input.is-manual{
  border-color:var(--amber);
  background:color-mix(in srgb, var(--amber-soft) 80%, var(--raised));
  color:var(--ink);font-weight:600;
  box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--amber) 45%, transparent);
}
.sf-price-input.is-manual:hover{border-color:var(--amber);}

/* каталожная цена под полем — тем же цветом, чтобы читалось как одна подсказка */
.sf-line--manual .sf-price-list{color:var(--amber);}

/* ==== crm-v27.css ==== */
/* v27: автосохранение цены — кнопки «Сохранить цены» больше нет,
   вместо неё индикатор состояния рядом с полем действий. */

.sf-save-state{
  font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.04em;
  padding:3px 8px;border-radius:2px;border:1px solid transparent;white-space:nowrap;
}
.sf-save-state[data-state="idle"]{display:none;}
.sf-save-state[data-state="dirty"]{color:var(--ink-3);border-color:var(--line);}
.sf-save-state[data-state="saving"]{color:var(--glacier);border-color:var(--glacier);}
.sf-save-state[data-state="saved"]{color:var(--ok, #6FA32B);border-color:var(--ok, #6FA32B);}
.sf-save-state[data-state="error"]{color:var(--warn);border-color:var(--warn);background:var(--warn-soft);cursor:pointer;}

/* поле в момент отправки — лёгкий намёк, что данные уходят */
.sf-price-input:focus{border-color:var(--rope);}

/* ==== crm-v28.css ==== */
/* v28: основное КП выделено зелёным.
   Цвета взяты из семантических токенов --ok / --ok-soft, поэтому работают в обеих темах:
   светлая — тёмно-зелёный #2F6B4F на светлой подложке, тёмная — светло-зелёный #7FC9A3. */

/* плашка «Основное» */
.sf-badge--primary{
  background:var(--ok);
  color:var(--rope-contrast);   /* контраст к заливке: белый в светлой теме, near-black в тёмной */
  border:0;
}

/* сам блок основного КП — нежно-зелёная подложка вместо прежней «верёвочной» */
.sf-variant.is-primary{
  background:color-mix(in srgb, var(--ok-soft) 55%, transparent);
  box-shadow:inset 3px 0 0 var(--ok);
}

/* строки внутри основного КП остаются на своей поверхности, чтобы таблица не позеленела */
.sf-variant.is-primary .sf-lines tbody tr.d-odd td,
.sf-variant.is-primary .sf-lines tbody tr.d-even td{background:var(--raised);}

/* ==== crm-v29.css ==== */
/* v29: вкладки вариантов КП со сводкой на самой вкладке */

.sf-qtabs{
  display:flex;gap:6px;align-items:stretch;flex-wrap:wrap;
  padding:12px 16px 0;border-bottom:1px solid var(--line);
}

.sf-qtab{
  flex:0 1 auto;min-width:190px;max-width:280px;
  display:flex;flex-direction:column;gap:5px;align-items:flex-start;
  padding:9px 12px 10px;cursor:pointer;text-align:left;
  background:var(--sunk);color:var(--ink-2);
  border:1px solid var(--line);border-bottom:0;
  border-radius:3px 3px 0 0;margin-bottom:-1px;
}
.sf-qtab:hover{color:var(--ink);background:var(--surface);}

/* активная вкладка сливается с панелью под собой */
.sf-qtab.is-active{
  background:var(--surface);color:var(--ink);
  border-color:var(--line);
  box-shadow:inset 0 2px 0 var(--rope);
}
.sf-qtab.is-active::after{
  content:"";position:relative;display:block;height:0;
}
.sf-qtab.is-primary.is-active{box-shadow:inset 0 2px 0 var(--ok);}
.sf-qtab:focus-visible{outline:2px solid var(--rope);outline-offset:-2px;}

.sf-qtab .l1{display:flex;align-items:baseline;gap:7px;}
.sf-qtab .l1 .nm{font-size:13px;font-weight:600;}
.sf-qtab .l1 .ver{font-size:var(--fs-min);color:var(--ink-3);}
.sf-qtab .l2{display:flex;gap:5px;flex-wrap:wrap;}
.sf-qtab .l3{
  display:flex;flex-direction:column;gap:1px;
  font-family:var(--mono);font-variant-numeric:tabular-nums;
}
.sf-qtab .l3 b{font-size:12.5px;font-weight:600;}
.sf-qtab .l3 i{font-style:normal;font-size:var(--fs-min);color:var(--ink-3);}
.sf-qtab.is-active .l3 b{color:var(--ink);}
.sf-qtab.is-primary .l3 b{color:var(--ok);}

/* панель выбранного варианта: верхняя граница уже нарисована полосой вкладок */
.sf-qtabs + .sf-variant{border-top:0;}

/* «+» справа от вкладок, как в браузере: создаёт вариант сразу */
.sf-qtab-add-form{display:flex;align-items:flex-end;margin-bottom:-1px;}
.sf-qtab-add{
  width:30px;height:30px;margin:0 0 7px 2px;
  display:flex;align-items:center;justify-content:center;
  border:1px solid transparent;border-radius:3px;background:transparent;
  color:var(--ink-3);font-size:19px;line-height:1;cursor:pointer;
}
.sf-qtab-add:hover{background:var(--surface);border-color:var(--line);color:var(--rope);}
.sf-qtab-add:focus-visible{outline:2px solid var(--rope);outline-offset:1px;}

@media (max-width:1023px){
  .sf-qtab{min-width:0;flex:1 1 46%;}
}

/* ==== crm-v32.css ==== */
/* v32: переименование варианта КП прямо на вкладке */

.sf-qtab{cursor:pointer;}

/* карандаш появляется при наведении на вкладку и у активной — чтобы не рябило.
   Цель 24×24 при глифе 16 (WCAG 2.5.8; аудит 15.09.2026), как и у крестика ниже. */
.sf-qtab-edit{
  display:inline-flex;align-items:center;justify-content:center;
  width:24px;height:24px;padding:0;margin-left:2px;
  border:1px solid transparent;border-radius:2px;background:transparent;
  color:var(--ink-3);cursor:pointer;opacity:0;transition:opacity .12s;
}
.sf-qtab:hover .sf-qtab-edit,
.sf-qtab.is-active .sf-qtab-edit,
.sf-qtab-edit:focus-visible{opacity:1;}
.sf-qtab-edit:hover{color:var(--rope);border-color:var(--line);background:var(--raised);}
.sf-qtab-edit:focus-visible{outline:2px solid var(--rope);outline-offset:1px;}

/* поле переименования на месте названия */
.sf-qtab-rename{
  width:100%;max-width:170px;padding:2px 6px;
  font-size:13px;font-weight:600;font-family:inherit;
  border:1px solid var(--rope);border-radius:2px;
  background:var(--raised);color:var(--ink);
}
.sf-qtab-rename:focus{box-shadow:0 0 0 2px color-mix(in srgb, var(--rope) 30%, transparent);}
.sf-qtab-rename:disabled{opacity:.6;}

/* ==== crm-v33.css ==== */
/* v33: карандаш вплотную к названию, версия с вкладки убрана,
   поле переименования лежит в разметке и только показывается. */

.sf-qtab .l1{gap:5px;}
.sf-qtab-edit{margin-left:0;}

/* поле занимает место названия, не раздвигая вкладку */
.sf-qtab-rename{
  width:100%;min-width:120px;max-width:200px;padding:2px 6px;
  font-size:13px;font-weight:600;font-family:inherit;
  border:1px solid var(--rope);border-radius:2px;
  background:var(--raised);color:var(--ink);
}
.sf-qtab-rename:focus{box-shadow:0 0 0 2px color-mix(in srgb, var(--rope) 30%, transparent);}
.sf-qtab-rename:disabled{opacity:.6;}

/* ==== crm-v38.css ==== */
/* v38: шапка варианта КП — сроки, суммы, история версий, проработка ТВ и действия одним блоком над услугами.
   Раньше действия висели внизу панели: при длинном списке услуг «Отправить клиенту» уезжало за экран,
   а глаз искал управление в двух местах. */

.sf-variant-top{
  border-bottom:1px solid var(--line);
  background:color-mix(in srgb, var(--sunk) 45%, transparent);
}
.sf-variant-top .sf-variant-head{padding-bottom:6px;}
.sf-variant-top .sf-variant-versions{padding-bottom:8px;}
.sf-variant-top .sf-quote-actions{
  padding:8px 16px 10px;
  border-top:1px dashed var(--divider);
}
/* список услуг начинается сразу под шапкой */
.sf-variant-top + .sf-svc-list{padding-top:12px;}

/* ==== crm-v42.css ==== */
/* v42: отметка об отправке КП — дата, канал, комментарий в одну строку под предпросмотром */

.sf-send-mark{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap;width:100%;}
.sf-send-mark label{display:flex;flex-direction:column;gap:3px;font-size:12px;color:var(--ink-2);}
.sf-send-mark label.grow{flex:1;min-width:220px;}
.sf-send-mark .k{font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.06em;text-transform:uppercase;color:var(--ink-3);}
.sf-send-mark input,.sf-send-mark select{
  height:32px;padding:0 9px;border:1px solid var(--line);border-radius:var(--r-sm,3px);
  background:var(--surface);font-size:13px;color:var(--ink);font-family:var(--font);
}
.sf-send-mark input:focus,.sf-send-mark select:focus{border-color:var(--rope);}

/* ==== crm-v43.css ==== */
/* v43: действия со статусом КП, которым нужна причина — раскрываются на месте, без отдельного экрана */

.sf-inline-pop{position:relative;display:inline-block;}
.sf-inline-pop > summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;}
.sf-inline-pop > summary::-webkit-details-marker{display:none;}
.sf-inline-pop[open] > summary{border-color:var(--rope);color:var(--rope);}
.sf-pop-form{
  position:absolute;z-index:20;top:calc(100% + 6px);left:0;min-width:420px;
  display:flex;gap:8px;align-items:flex-end;flex-wrap:wrap;
  padding:10px 12px;background:var(--raised);border:1px solid var(--line);border-radius:var(--r,4px);box-shadow:var(--shadow);
}
.sf-pop-form label{display:flex;flex-direction:column;gap:3px;font-size:12px;color:var(--ink-2);}
.sf-pop-form label.grow{flex:1;min-width:180px;}
.sf-pop-form .k{font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.06em;text-transform:uppercase;color:var(--ink-3);}
.sf-pop-form input,.sf-pop-form select{
  height:30px;padding:0 8px;border:1px solid var(--line);border-radius:var(--r-sm,3px);
  background:var(--surface);font-size:13px;color:var(--ink);font-family:var(--font);
}
.sf-pop-form input:focus,.sf-pop-form select:focus{border-color:var(--rope);}
@media (max-width:1023px){.sf-pop-form{min-width:0;width:min(92vw,420px);}}

/* ==== crm-v53.css ==== */
/* v53: полоса вкладок КП — одна строка с горизонтальной прокруткой и стрелками.
   Перенос на вторую строку («в работе» вперемешку с историей) занимал пол-экрана
   и ломал ощущение одной линейки документов. */

.sf-qtabs-bar{
  display:flex;align-items:stretch;gap:2px;
  padding:12px 16px 0;border-bottom:1px solid var(--line);
}

/* сама полоса: без переноса, скроллится, полосу прокрутки прячем — есть стрелки */
.sf-qtabs{
  flex:1 1 auto;min-width:0;
  display:flex;gap:6px;align-items:stretch;flex-wrap:nowrap;
  padding:0;border-bottom:0;
  overflow-x:auto;overflow-y:hidden;
  scrollbar-width:none;-ms-overflow-style:none;
}
.sf-qtabs::-webkit-scrollbar{height:0;}
.sf-qtab{flex:0 0 auto;}

/* стрелки: появляются только когда есть куда листать */
.sf-qtabs-nav{
  flex:0 0 auto;align-self:center;
  width:26px;height:30px;margin-bottom:7px;
  display:flex;align-items:center;justify-content:center;
  border:1px solid var(--line);border-radius:3px;background:var(--raised);
  color:var(--ink-2);font-size:17px;line-height:1;cursor:pointer;
}
.sf-qtabs-nav:hover{color:var(--rope);border-color:var(--rope);}
.sf-qtabs-nav:focus-visible{outline:2px solid var(--rope);outline-offset:1px;}
.sf-qtabs-nav[hidden]{display:none;}

.sf-qtabs-bar .sf-qtab-add-form{align-items:flex-end;}

/* панель выбранного КП примыкает к полосе */
.sf-qtabs-bar + .sf-variant{border-top:0;}

@media (max-width:1023px){
  .sf-qtab{min-width:170px;}
}

/* колонка сетки по умолчанию не ужимается (min-width:auto) и растягивалась под ширину полосы —
   из-за этого прокрутка не включалась, а горизонтально ехала вся страница */
.sf-grid > .sf-stack,
.sf-grid > .sf-card{min-width:0;}

/* v54: крестик удаления рядом с карандашом — только у нетронутого черновика */
.sf-qtab-del-form{display:inline-flex;margin-left:2px;}
.sf-qtab-del{
  display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;
  border:0;background:transparent;cursor:pointer;padding:0;line-height:1;
  color:var(--ink-3);font-size:12px;opacity:0;transition:opacity .12s,color .12s;
}
.sf-qtab:hover .sf-qtab-del,
.sf-qtab.is-active .sf-qtab-del,
.sf-qtab-del:focus-visible{opacity:1;}
.sf-qtab-del:hover{color:var(--warn);}

/* ==== crm-v55.css ==== */
/* v55: подтверждение удаления КП — пузырёк у крестика.
   Системное окно браузера уводит внимание на середину экрана и не показывает, что именно удаляют;
   пузырёк живёт в body с position:fixed, потому что полоса вкладок скроллится и обрезала бы его. */

.sf-confirm{
  position:fixed;z-index:80;min-width:210px;max-width:280px;
  padding:10px 12px 11px;
  background:var(--raised);border:1px solid var(--line);border-radius:var(--r,4px);
  box-shadow:var(--shadow, 0 8px 24px rgba(0,0,0,.18));
  font-size:12.5px;color:var(--ink);
}
.sf-confirm[hidden]{display:none;}
.sf-confirm .txt{display:block;margin-bottom:9px;line-height:1.35;}
.sf-confirm .txt b{font-weight:600;}
.sf-confirm .note{display:block;margin-bottom:9px;font-size:var(--fs-min);color:var(--ink-3);}
.sf-confirm .row{display:flex;gap:8px;justify-content:flex-end;}
.sf-confirm::before{
  content:"";position:absolute;top:-6px;right:14px;width:10px;height:10px;
  background:var(--raised);border-left:1px solid var(--line);border-top:1px solid var(--line);
  transform:rotate(45deg);
}

/* ==== crm-v56.css ==== */
/* v56: линейка этапов продажи — «Отложена» отдельным состоянием рядом с проигрышем */

.sf-path li.is-hold .sf-path-step{
  background:var(--amber-soft);color:var(--amber);border-color:transparent;
}
.sf-hold-note{
  display:inline-flex;align-items:center;gap:6px;padding:0 10px;height:30px;
  border:1px dashed var(--amber);border-radius:var(--r-sm,3px);
  color:var(--amber);font-size:12px;
}

/* ==== crm-v59.css ==== */
/* v59: сортировка списка сделок по заголовку колонки.
   Стрелка — две маленькие стрелки, у неактивной колонки обе приглушены; у активной горит та, куда идёт порядок. */

.sf-table th a.sf-sort{
  display:inline-flex;align-items:center;gap:5px;
  color:inherit;text-decoration:none;
}
.sf-table th a.sf-sort:hover{color:var(--ink-2);}
.sf-table th a.sf-sort:focus-visible{outline:2px solid var(--rope);outline-offset:2px;border-radius:2px;}
.sf-sort .arr{flex:0 0 auto;display:block;}
.sf-sort .arr path{fill:currentColor;opacity:.25;transition:opacity .12s;}
.sf-sort:hover .arr path{opacity:.5;}
.sf-sort.is-asc,.sf-sort.is-desc{color:var(--ink);}
.sf-sort.is-asc .arr .up,.sf-sort.is-desc .arr .dn{fill:var(--rope);opacity:1;}
.sf-sort.is-asc .arr .dn,.sf-sort.is-desc .arr .up{opacity:.18;}

/* ==== crm-v45.css ==== */
/* v45: «Заменено» — версия, поверх которой выпущена новая. Архивная, поэтому нейтральнее отказа. */

.sf-badge--q-superseded{background:var(--sunk);color:var(--ink-3);border:1px dashed var(--line);}

/* ==== аудит 18.09.2026, Р8: просроченная активность ==== */
/* Срок в прошлом — это не просто дата, а «уже поздно»: цветом и словом (И-8.1). */

.sf-due{
  display:inline-block;margin-left:6px;padding:0 6px;border-radius:var(--r-sm,3px);
  background:var(--sunk);color:var(--ink-2);font-size:12px;white-space:nowrap;max-width:100%;
}
/* П-09 повторной проверки 25.09.2026: «просрочено на N дней» без переноса выходило за край колонки
   главной на 1024 px (940…1069) и экрана на 360. Переносится, если в строку не помещается. */
@container main (max-width:960px){ .sf-due{white-space:normal;} }
.sf-due.is-overdue{background:var(--warn-soft);color:var(--warn);font-weight:600;}
/* дата закрытия открытой продажи прошла (аудит UX 27.09.2026, C-4) */
.deal-close.is-overdue{color:var(--warn);font-weight:600;}
.sf-list .when.is-overdue{color:var(--warn);font-weight:600;}

/* ==== аудит 18.09.2026, Р9: масштаб главной и высота колонок ==== */
/* Переключатель «Мои / Команда»: масштаб один на все цифры страницы (И-9.2). */

.sf-scope{display:inline-flex;border:1px solid var(--line-control);border-radius:var(--r-sm,3px);overflow:hidden;}
.sf-scope a{
  display:inline-flex;align-items:center;min-height:28px;padding:0 12px;
  font-size:12.5px;font-weight:600;color:var(--ink-2);text-decoration:none;background:var(--raised);
}
.sf-scope a + a{border-left:1px solid var(--line-control);}
.sf-scope a:hover{background:var(--sunk);}
.sf-scope a.is-on{background:var(--rope);color:var(--rope-contrast);}
.sf-scope a:focus-visible{outline:2px solid var(--rope);outline-offset:-2px;}

/* Колонки главной растут по содержимому: короткий блок не растягивается
   пустой высотой под соседний длинный (И-9.4). */
.sf-grid--2,.sf-grid--3{align-items:start;}
/* Исключение — ряд коротких карточек постоянного состава («Квартальная цель» и «Воронка»):
   их низ на одной линии. Разница в полтора десятка пикселей читается как ошибка вёрстки,
   поэтому карточки тянутся до общей высоты, а запас уходит внутрь: остаток до цели
   прижимается к низу, строки воронки расходятся. Пустой полосы под блоком нет — И-9.4 в силе
   (замечание владельца 25.09.2026). */
.sf-grid--even{align-items:stretch;}
.sf-grid--even > .sf-card{display:flex;flex-direction:column;}
.sf-grid--even > .sf-card > .sf-card-body{flex:1;display:flex;flex-direction:column;}
.sf-grid--even .sf-legend{margin-bottom:10px;}
.sf-grid--even .sf-goal-rest{margin-top:auto;}
.sf-grid--even .sf-funnel,.sf-grid--even .sf-bars{justify-content:space-between;}

/* ==== аудит 18.09.2026, Р11: область нажатия не меньше 24 × 24 ==== */
/* WCAG 2.5.8. Растёт область, а не кегль: у строчной ссылки вертикальный отступ
   увеличивает рамку, не трогая высоту строки и не ломая многоточие в ячейке (И-11.1). */

.sf-table th a.sf-sort{min-height:24px;padding:2px;}
/* Т-05 (С-03): ссылка в строке таблицы — цель нажатия не меньше 24 px (WCAG 2.5.8).
   Отступов сверху и снизу по 4 px не хватало: строчный бокс при 13 px шрифта даёт
   15 px, и выходило 23. Семнадцать ссылок на договорах, три в отчётах, четыре
   в оглавлении документации и три в ленте лида (аудит 20.09.2026). */
.sf-table td a,.sf-list a,.sf-fields a,.sf-dl dd a,.sf-card-body a[href^="tel:"],.sf-card-body a[href^="mailto:"]
  {display:inline-block;padding-block:4px;line-height:16px;min-height:24px;}
/* В-03: то же правило там, где ссылка занимает строку целиком, — название
   записи в шапке, строка ленты отношений, «изменено N дней назад», сторона
   договора. Высоту строчной рамке даёт не line-height: её считают по метрикам
   шрифта, и 13 px давали 17. Отсюда inline-block. */
.feed-title a,.history-last a,.sf-highlights h1 a,.sf-party-name a
  {display:inline-block;min-height:24px;line-height:24px;}
/* Высоту цели тексту даёт line-height, а не inline-flex: флекс-контейнер
   выбрасывает пробельные узлы между потомками, и «9 из 22 · Все продажи»
   читалось как «9из 22· Все продажи» (третий проход аудита, Н3-07).
   Очередь записей живёт внутри крошек, поэтому правило крошек её и накрывало:
   `.sf-breadcrumb a` весомее, чем `.sf-queue-pos`. */
.sf-breadcrumb a,.sf-queue-pos{display:inline-block;min-height:24px;line-height:24px;}
/* у кнопок со значком внутри ничего, кроме значка, нет — им флекс не мешает */
.sf-queue-btn,.sf-more a{min-height:24px;display:inline-flex;align-items:center;}
/* флажок — сам себе цель: увеличивать нечего, кроме него самого */
input[type="checkbox"],input[type="radio"]{min-width:24px;min-height:24px;}
/* всплывающая панель фильтра колонки не участвует в доступном имени заголовка (И-11.3) */
.lf-pop[hidden]{display:none;}

/* аудит 18.09.2026, И-13.2: сводка ошибок над формой — сначала объём работы,
   потом ссылки на поля; фокус приходит сюда. */
.sf-form-errors{
  margin:0 0 12px;padding:10px 12px;border:1px solid var(--warn);border-radius:var(--r-sm);
  background:var(--warn-soft);color:var(--warn);font-size:13px;
}
.sf-form-errors:focus-visible{outline:2px solid var(--warn);outline-offset:2px;}
.sf-form-errors ul{margin:6px 0 0;padding-left:18px;}
.sf-form-errors a{color:inherit;}

/* ==== аудит 18.09.2026, Р19: выделение строк и сохранённые срезы ==== */

.sf-table th.col-pick,.sf-table td.col-pick{width:36px;padding-left:10px;padding-right:0;}
/* Флажок выделения строки завёрнут в подпись: увеличенная область нажатия
   должна переключать флажок, а ячейка таблицы сама по себе не кликабельна
   (третий проход 20.09.2026, Т3-02). На рабочем столе подпись размером
   с флажок и ничего не меняет. */
.col-pick .pick{display:inline-flex;align-items:center;justify-content:center;}
.sf-bulk{
  position:sticky;bottom:0;z-index:2;display:flex;align-items:center;
  padding:8px 14px;border-top:1px solid var(--line);background:var(--raised);
}
.sf-bulk form{display:flex;align-items:center;gap:8px;flex-wrap:wrap;width:100%;}
.sf-bulk .n{font-size:13px;color:var(--ink-2);}
.sf-bulk select,.sf-bulk input{height:30px;padding:0 8px;border:1px solid var(--line-control);border-radius:var(--r-sm);background:var(--surface);color:var(--ink);font-size:13px;}
.sf-bulk [data-bulk-clear]{margin-left:auto;}

.sf-panel li.sv{display:flex;align-items:center;gap:4px;}
.sf-panel li.sv > a{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;}
.sf-panel li.sv form{margin:0;}
.sf-panel .sv-x{min-width:24px;min-height:24px;border:0;background:none;color:var(--ink-3);font-size:15px;line-height:1;border-radius:var(--r-sm);}
.sf-panel .sv-x:hover{background:var(--sunk);color:var(--warn);}
.sf-panel .sv-add{display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:6px 6px 2px;}
.sf-panel .sv-add input[name="name"]{flex:1 1 100%;min-width:0;height:30px;padding:0 8px;border:1px solid var(--line-control);border-radius:var(--r-sm);background:var(--surface);color:var(--ink);font-size:12.5px;}
.sf-panel .sv-team{display:inline-flex;align-items:center;gap:4px;font-size:var(--fs-min);color:var(--ink-2);}

/* аудит 18.09.2026, И-15.2: срезы списка каталога — такой же горизонтальной
   полосой, как срезы в панели остальных разделов. */
.sf-slices{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 10px;}
.sf-slices a{
  display:inline-flex;align-items:center;gap:6px;min-height:28px;padding:0 12px;
  border:1px solid var(--line-control);border-radius:var(--r-chip);
  color:var(--ink-2);font-size:12.5px;text-decoration:none;background:var(--raised);
}
.sf-slices a:hover{background:var(--sunk);text-decoration:none;}
.sf-slices a[aria-current]{background:var(--rope-soft);color:var(--rope-on-soft);border-color:transparent;font-weight:600;}

/* Р11, уточнение после повторного прогона ui-audit на стенде: ссылки и поля,
   до которых первое правило не дотянулось. Строчная ссылка получает свою
   высоту строки, а не отступ: так рамка ровно 24 px и ничего не съезжает. */
.sf-fields .v a,.sf-variant-versions a,.sf-dl dd a,.sf-legend a,.sf-agreement a{display:inline-block;min-height:24px;line-height:24px;}
.sf-table td.num a{display:inline-block;min-width:24px;min-height:24px;line-height:24px;}
.sf-card input:not([type="checkbox"]):not([type="radio"]),.sf-card select,.sf-card textarea{min-height:24px;}

/* v118: завершение договора формой (решения владельца 23.09.2026; Д-09, Д-18) */
.ag-callout--done{background:var(--sunk);color:var(--ink);}
.ag-callout--done > svg{color:var(--ink-3);}
.ag-close{width:min(320px,calc(100vw - 48px));}
.ag-more-cancel select{height:32px;padding:0 6px;border:1px solid var(--line-control);border-radius:var(--r-sm);background:var(--surface);color:var(--ink);font-size:13px;}
.ag-close-block{font-size:12.5px;line-height:1.45;color:var(--ink);background:var(--amber-soft);border-radius:var(--r-sm);padding:8px 10px;}
.ag-close-block ul{margin:2px 0 4px;padding-left:16px;}
.ag-close-hint{font-size:12px;color:var(--ink-3);min-height:1em;}
.ag-close-hint:empty{display:none;}

/* v118: незаполненные существенные условия (решение владельца 23.09.2026):
   метка у пустого поля в просмотре и знак у поля в формах правки — отдельный
   от звёздочки: звёздочка — «нельзя сохранить», знак — «нельзя отправить на подпись» */
.ag-need{display:inline-block;margin-left:6px;padding:1px 7px;border-radius:999px;background:var(--amber-soft);color:var(--amber);
  font-size:11px;font-weight:500;line-height:16px;white-space:nowrap;vertical-align:1px;}
.ag-sides-cell.is-need{background:color-mix(in srgb, var(--amber-soft) 45%, transparent);}
.ag-need-mark{display:inline-block;width:7px;height:7px;margin-left:5px;border-radius:50%;background:var(--amber);vertical-align:2px;}
.ag-ready-list a{color:inherit;text-decoration:underline;text-decoration-color:var(--amber);text-underline-offset:2px;}

/* v118: подтверждения в карточке вместо окон браузера (Д-18) */
.ag-confirm > summary{list-style:none;}
.ag-confirm > summary::-webkit-details-marker{display:none;}
.ag-confirm .ag-more-menu{width:min(320px,calc(100vw - 48px));}
.ag-confirm .ag-more-cancel{border-top:0;padding-top:0;}
.ag-confirm-txt{margin:0;font-size:12.5px;line-height:1.45;color:var(--ink);}

/* v118: условия во времени — стороны подписанного договора на дату подписания */
.ag-snap{padding:10px 16px 8px;font-size:12.5px;color:var(--ink-3);}
.ag-correct{display:flex;flex-direction:column;gap:6px;padding:10px 12px;margin-bottom:12px;border-radius:var(--r-sm);background:var(--amber-soft);}
.ag-correct label{display:flex;flex-direction:column;gap:3px;}
.ag-correct label.ag-check{flex-direction:row;align-items:center;gap:6px;font-size:12.5px;}

/* ДС (ТЗ «Дополнительное соглашение» 1.1): карточка соглашения и его след в договоре */
.sf-badge--am-draft{background:var(--sunk);color:var(--ink-2);} .sf-badge--am-signing{background:var(--amber-soft);color:var(--amber);}
.sf-badge--am-signed{background:var(--glacier-soft);color:var(--glacier);} .sf-badge--am-active{background:var(--ok-soft);color:var(--ok);}
.sf-badge--am-ended{background:var(--sunk);color:var(--ink-3);} .sf-badge--am-cancelled{background:var(--warn-soft);color:var(--warn);}
.ag-callout--plan{background:var(--glacier-soft);color:var(--ink);}
.ag-callout--plan > svg{color:var(--glacier);}
.am-kicker{font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3);}
.am-kicker a{letter-spacing:.06em;}
.am-facts{grid-template-columns:repeat(4,minmax(0,1fr));}
.am-confirm{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--ink-2);}
.am-hint{padding-top:0;font-size:12.5px;color:var(--ink-3);}
.am-mini{font-size:12px;line-height:1.4;margin:2px 0 0;}
.am-stale{color:var(--warn);}
.am-list, .am-clauses{margin:0 0 8px;padding-left:18px;display:flex;flex-direction:column;gap:6px;}
.am-clauses blockquote{margin:4px 0 0;padding:6px 10px;border-left:3px solid var(--line);color:var(--ink-2);white-space:pre-line;}
.am-inline{display:inline;margin-left:6px;}
.am-row-form{display:flex;flex-wrap:wrap;gap:8px;align-items:flex-end;}
.am-row-form label{display:flex;flex-direction:column;gap:3px;font-size:12.5px;}
.am-add > summary{list-style:none;cursor:pointer;display:inline-flex;}
.am-add > summary::-webkit-details-marker{display:none;}
.am-clause-form{margin-top:10px;}
@media (max-width:1023px){
  .am-facts{grid-template-columns:repeat(2,minmax(0,1fr));}
}
.am-filter{display:flex;flex-wrap:wrap;gap:6px;}
.sf-form label.am-check{display:flex;flex-direction:row;align-items:center;gap:8px;font-size:13px;color:var(--ink);} .sf-form label.am-check input{width:16px;height:auto;flex:none;}

/* ДС: что соглашение меняет — подсветкой в формах «Условия договора» и «Стороны договора»
   (замечание владельца 23.09.2026); прежнее значение — в разделе «История» */
.sf-dl > div.am-chg{background:var(--amber-soft);margin:0 -8px;padding-left:8px;padding-right:8px;border-radius:var(--r-sm);}
.ag-sides-cell.am-chg{background:var(--amber-soft);}
.sf-form label.am-chg > span:first-child, .am-fromcard.am-chg .am-label{color:var(--amber);font-weight:600;}
.sf-form label.am-chg select{border-color:var(--amber);}
.am-chg-mark{display:inline-block;margin-left:6px;padding:1px 6px;border-radius:999px;background:var(--amber);color:var(--surface);
  font-size:11px;font-weight:600;line-height:1.5;vertical-align:1px;white-space:nowrap;}
.am-fromcard{display:flex;flex-direction:column;gap:4px;}
.am-label{font-size:var(--fs-min);color:var(--ink-2);}
.am-stale-row{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:10px;}
.sf-form label.am-chg input, .sf-form label.am-chg select{border-color:var(--amber);background:var(--amber-soft);}

/* Меню «Ещё» на телефоне (шестой проход аудита, Н-14): привязка к правому краю кнопки
   уводила меню на −171 px — с формой завершения внутри. На узком экране меню встаёт
   под кнопкой во всю ширину карточки. */
@media (max-width:599px){
  .sf-highlights{position:relative;}
  .ag-more{position:static;}
  .ag-more-menu, .ag-confirm .ag-more-menu{left:12px;right:12px;top:auto;min-width:0;width:auto;margin-top:4px;}
}

/* поле, к которому привела ссылка чек-листа (НН-07): заметно на пару секунд */
.ag-focus-flash{outline:2px solid var(--rope);outline-offset:3px;border-radius:var(--r-sm);transition:outline-color .6s;}

/* ==== повторная проверка экранных форм 25.09.2026 ==== */
/* П-10: шкала этапов не сжималась ниже суммы подписей этапов, и «Следующий этап: Выиграна» уходила
   за край на 768, 853 и 1024 px (654…861, 980…1187). Шкала сжимается, а если кнопке рядом тесно —
   кнопка встаёт строкой ниже, у правого края.
   Уже 760 px шкала и так стоит столбцом. */
@media (min-width:1024px){
  .sf-path{flex-wrap:wrap;row-gap:8px;}
  .sf-path ol{flex:1 1 520px;min-width:0;}
  .sf-path li{min-width:0;}
  .sf-path .sf-btn{margin-left:auto;}
}
/* Там же: отказ по КП раскрывался плашкой шириной 420 px от кнопки в середине строки и уходил за край
   планшета (353…773 при 768). На узком экране плашка — строкой под кнопками, во всю ширину. */
@media (max-width:1023px){
  .sf-quote-actions{flex-wrap:wrap;}
  .sf-inline-pop[open]{flex:1 1 100%;}
  .sf-inline-pop .sf-pop-form{position:static;min-width:0;width:auto;margin-top:6px;box-shadow:none;}
}

/* имя стороны договора в шапке и в фактах — цель не ниже 24 px: на 600…720 px ссылка 18 px стояла вплотную
   к полю раскрытой формы (проверка 25.09.2026) */
.ag-sides-name a,.ag-fact dd > a{display:inline-block;min-height:24px;padding-block:3px;box-sizing:border-box;}

/* ---------- v103: модальное окно sf-modal (решение владельца 27.09.2026: прежнее окно подтверждения «выглядело плохо»).
   Шапка с подписью и заголовком, тело — факты сеткой, список строками, заметки, подвал с действиями. Одно окно
   для подтверждения отключения и для выбора типа запроса; tk-dialog задач остаётся до переноса. ---------- */
.sf-modal{border:0;border-radius:var(--r);background:var(--raised);color:var(--ink);padding:0;width:min(600px,calc(100vw - 32px));max-height:calc(100vh - 48px);
  box-shadow:0 24px 64px -16px rgba(20,25,34,.45),0 0 0 1px var(--line);overflow:hidden;}
.sf-modal::backdrop{background:rgba(20,25,34,.55);backdrop-filter:blur(2px);}
.sf-modal[open]{animation:sfModalIn .16s ease-out;}
@keyframes sfModalIn{from{opacity:0;transform:translateY(8px);}to{opacity:1;transform:none;}}
.sf-modal-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:18px 20px 14px;border-bottom:1px solid var(--line);}
.sf-modal-kicker{display:block;font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);}
.sf-modal-head h3{margin:3px 0 0;font-size:17px;font-weight:600;line-height:1.3;overflow-wrap:anywhere;}
.sf-modal-x{flex:none;width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:var(--r-sm);background:transparent;color:var(--ink-3);cursor:pointer;}
.sf-modal-x:hover{background:var(--sunk);color:var(--ink);}
.sf-modal-body{padding:16px 20px;display:flex;flex-direction:column;gap:14px;overflow:auto;max-height:calc(100vh - 200px);}
.sf-modal-facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px 16px;margin:0;}
.sf-modal-facts dt{font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);}
.sf-modal-facts dd{margin:3px 0 0;font-size:14px;font-weight:600;overflow-wrap:anywhere;}
.sf-modal-list{border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden;}
.sf-modal-list>div{display:flex;gap:12px;align-items:baseline;padding:9px 12px;font-size:13px;}
.sf-modal-list>div+div{border-top:1px solid var(--line);}
.sf-modal-list .mono{flex:none;color:var(--ink-3);font-size:12.5px;}
.sf-modal-list b{font-weight:600;}
.sf-modal-list small{display:block;color:var(--ink-2);font-size:12.5px;margin-top:1px;}
.sf-modal-note{display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border-radius:var(--r-sm);background:var(--sunk);color:var(--ink-2);font-size:12.5px;line-height:1.45;}
.sf-modal-note .ico{flex:none;margin-top:1px;}
.sf-modal-note.is-warn{background:var(--warn-soft);color:var(--warn);}
.sf-modal-foot{display:flex;gap:8px;align-items:center;justify-content:flex-end;padding:12px 20px 16px;border-top:1px solid var(--line);}
.sf-modal-foot .muted{margin-right:auto;font-size:12.5px;}
@media (max-width:599px){.sf-modal-facts{grid-template-columns:1fr 1fr;}.sf-modal-foot{flex-wrap:wrap;}}

/* окно выбора типа запроса */
.rq-search{display:flex;align-items:center;gap:8px;padding:0 10px;border:1px solid var(--line-control);border-radius:var(--r-sm);background:var(--surface);color:var(--ink-3);}
.rq-search input{flex:1;border:0;background:transparent;height:36px;font:inherit;color:var(--ink);outline:0;min-width:0;padding:0;}
.rq-search:focus-within{border-color:var(--rope);outline:2px solid var(--rope);outline-offset:1px;}
.rq-types{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:10px;}
.rq-type{display:flex;gap:12px;align-items:flex-start;padding:12px 14px;border:1px solid var(--line);border-radius:var(--r);background:var(--surface);color:var(--ink);text-decoration:none;position:relative;transition:border-color .12s,background .12s;}
.rq-type:hover,.rq-type:focus-visible{border-color:var(--rope);background:var(--rope-soft);text-decoration:none;outline:0;}
.rq-type-ico{flex:none;width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--r-sm);background:var(--sunk);color:var(--rope-on-soft);}
.rq-type-text{display:flex;flex-direction:column;gap:3px;min-width:0;}
.rq-type-text b{font-size:14px;font-weight:600;}
.rq-type-text small{font-size:12.5px;color:var(--ink-2);line-height:1.4;}
.rq-type-recent{position:absolute;top:8px;right:10px;font-family:var(--mono);font-size:var(--fs-min);letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3);}
.off-notices{display:flex;flex-direction:column;gap:4px;font-size:12.5px;}

/* ---------- раздел «Биллинг» заказа (решения владельца 27.09.2026): «+» в шапке, строка состояния, задачи ---------- */
.bl-add{margin-left:auto;}
.bl-add-btn{width:32px;padding:0;justify-content:center;list-style:none;}
.bl-add-btn::-webkit-details-marker{display:none;}
.bl-add-menu{min-width:300px;gap:2px;padding:6px;}
.bl-add-item,.bl-add-off{display:flex;flex-direction:column;align-items:flex-start;gap:2px;width:100%;padding:8px 10px;border:0;border-radius:var(--r-sm);background:none;color:var(--ink);font:inherit;text-align:left;}
.bl-add-item{cursor:pointer;}
.bl-add-item:hover,.bl-add-item:focus-visible{background:var(--sunk);outline:0;}
.bl-add-item b,.bl-add-off b{font-size:13px;font-weight:600;}
.bl-add-item small,.bl-add-off small{font-size:12px;color:var(--ink-2);}
.bl-add-off{cursor:not-allowed;opacity:.55;}
.bl-state{margin:0;font-weight:600;}
.bl-sum{display:flex;gap:6px;}
.bl-sum select{flex:none;width:56px;}
.bl-sum input{flex:1;min-width:0;}

/* места позиции (ТЗ «Места предоставления услуги» 1.6, FR-3): точка предоставления или A и B —
   над адресом код объекта, под ним этаж, помещение, уточнение. Компонент дизайн-системы Places. */
.pl{display:flex;flex-direction:column;gap:6px;}
.pl-point{display:flex;gap:8px;align-items:flex-start;min-width:0;}
.pl-point > div{min-width:0;display:flex;flex-direction:column;}
.pl-role{flex:none;width:20px;height:20px;border-radius:var(--r-sm);background:var(--glacier-soft);color:var(--glacier);
  font:600 11px/20px var(--font);text-align:center;}
.pl-addr{font-weight:400;overflow-wrap:anywhere;}
.pl-site{font-size:12px;color:var(--ink-2);}
.pl-meta{font-size:12px;color:var(--ink-3);}
.pl-form{margin-top:6px;display:flex;flex-direction:column;gap:10px;}
.pl-edit{border:0;margin:0;padding:0;display:flex;flex-direction:column;gap:4px;}
.pl-edit legend{font-size:12px;font-weight:600;color:var(--ink-2);padding:0;margin-bottom:4px;}
/* «Контакт на объекте» точки — выбор из контактов клиента на всю ширину, поля нового контакта — сеткой полей точки (Ф-02) */
.pl-edit .addr-extra > [data-sc]{grid-column:1 / -1;display:flex;flex-direction:column;gap:8px;}
.pl-edit [data-sc] select{width:100%;}
.pl-edit [data-sc] .hint{font-size:12px;color:var(--ink-3);margin:2px 0 0;}
.pl-edit [data-sc-new]{grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px;}

/* «Диспетчерская» (ТЗ FSM 1.10, этап 2, FR-22; ServiceNow Dispatcher Workspace): очередь слева, доска дня справа — техники строками,
   часы столбцами; блок выезда цветом статуса, полоса дороги перед ним, недоступное время штриховкой; на телефоне — список */
.dp-tools{align-items:center;}
/* флажок в панели над страницей и в фильтре очереди — по центру строки 32 px, как кнопки рядом; поля оформляет базовое правило
   в начале листа (замечание владельца 27.10.2026: «выпадающие списки угловаты, не как поле „Сегодня“») */
.sf-actions .check,.dp-filter .check{display:inline-flex;align-items:center;gap:6px;min-height:32px;font-size:13px;color:var(--ink);white-space:nowrap;cursor:pointer;}
.sf-actions .check input,.dp-filter .check input{margin:0;transform:none;}
.dp-summary{display:flex;flex-wrap:wrap;gap:6px 18px;align-items:baseline;padding:8px 18px;margin:-6px 0 12px;font-size:13px;}
.dp-summary b{font-weight:600;color:var(--ink-2);margin-right:4px;}
.dp-summary .dp-hint{margin-left:auto;font-size:12px;}
.dp{display:grid;grid-template-columns:minmax(260px,320px) minmax(0,1fr);gap:14px;align-items:start;}
.dp-queue{position:sticky;top:12px;max-height:calc(100vh - 140px);display:flex;flex-direction:column;}
.dp-filter{display:flex;flex-wrap:wrap;gap:6px;padding:10px 12px;border-bottom:1px solid var(--line);}
.dp-filter select{flex:1 1 130px;min-width:0;padding:0 6px;}
.dp-cards{overflow:auto;padding:10px;display:flex;flex-direction:column;gap:8px;}
.dp-card{border:1px solid var(--line);border-radius:var(--r);padding:8px 10px;background:var(--raised);cursor:grab;display:flex;flex-direction:column;gap:3px;}
.dp-card.is-risk{border-left:3px solid var(--amber);}
.dp-card.is-dragging,.dp-block.is-dragging{opacity:.45;}
.dp-card-top{display:flex;flex-wrap:wrap;gap:4px;align-items:center;font-size:12px;}
.dp-card-title{font-size:13.5px;line-height:1.3;}
.dp-card-meta{font-size:12px;color:var(--ink-2);}
.dp-card-act{margin-top:4px;display:flex;flex-wrap:wrap;gap:8px;}
.dp-board{min-width:0;overflow-x:auto;}
.dp-grid{min-width:calc(170px + var(--dp-hours) * 48px);}
.dp-head,.dp-row{display:grid;grid-template-columns:170px minmax(0,1fr);}
.dp-head{position:sticky;top:0;z-index:2;background:var(--raised);border-bottom:1px solid var(--line);font-size:12px;color:var(--ink-3);}
.dp-head .dp-who{padding:8px 10px;border-right:1px solid var(--line);}
/* линии часов: в шапке и в строках — одна и та же сетка из ячеек, граница у начала часа. До 27.10.2026 строки рисовали линии
   градиентом у конца часа, а шапка — границей ячейки: при дробной ширине часа (широкий экран) линии расходились на 1–2 px
   (замечание владельца: «сетка поломана»). Ячейки сетки браузер округляет одинаково, градиент — нет. */
.dp-scale,.dp-hours{display:grid;grid-template-columns:repeat(var(--dp-hours),minmax(0,1fr));}
.dp-scale span{padding:8px 4px;font-family:var(--mono);}
.dp-scale span + span,.dp-hours i + i{border-left:1px solid var(--line);}
.dp-hours{position:absolute;inset:0;pointer-events:none;}
.dp-row{border-bottom:1px solid var(--line);min-height:52px;}
.dp-row .dp-who{padding:6px 10px;display:flex;flex-direction:column;gap:2px;font-size:12.5px;border-right:1px solid var(--line);}
.dp-row .dp-who span{font-size:11.5px;}
.dp-lane{position:relative;}
.dp-off{position:absolute;top:0;bottom:0;background:repeating-linear-gradient(135deg,var(--sunk) 0,var(--sunk) 6px,transparent 6px,transparent 10px);pointer-events:none;}
.dp-off--break{opacity:.7;}
.dp-road{position:absolute;top:50%;height:3px;margin-top:-1px;background:var(--ink-3);opacity:.55;border-radius:2px;pointer-events:none;}
.dp-block{position:absolute;top:6px;bottom:6px;min-width:6px;border-radius:6px;padding:3px 6px;overflow:hidden;display:flex;flex-direction:column;justify-content:center;
  font-size:11.5px;line-height:1.2;text-decoration:none;color:var(--ink);background:var(--glacier-soft);border:1px solid var(--glacier);}
.dp-block[draggable=true]{cursor:grab;}
.dp-block-name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600;}
.dp-block-num{white-space:nowrap;overflow:hidden;color:var(--ink-2);font-size:10.5px;}
.dp-block--planned{background:var(--raised);border-style:dashed;}
.dp-block--inProgress{background:var(--amber-soft);border-color:var(--amber);}
.dp-block--completed{background:var(--ok-soft);border-color:var(--ok);}
.dp-block--failed{background:var(--warn-soft);border-color:var(--warn);}
.dp-block--cancelled{background:var(--sunk);border-color:var(--line);color:var(--ink-3);text-decoration:line-through;}
.dp-block.is-critical{box-shadow:inset 3px 0 0 var(--warn);}
/* выезд «В работе» стоит на доске дня по факту, хотя план — на другой день (аудит FSM 27.10.2026, Д-01): пунктир снизу */
.dp-block.is-offplan{background-image:repeating-linear-gradient(90deg,var(--amber) 0 6px,transparent 6px 10px);background-size:100% 2px;background-repeat:no-repeat;background-position:bottom;}
/* длительность растягиванием правого края (FR-22, как у событий Google Календаря): ручка видна при наведении; наезд — красной рамкой */
/* пауза идущей работы: штриховка от начала паузы до конца блока, подпись блока остаётся читаемой (аудит FSM, прогон 3, Ж-04) */
.dp-block-pause{position:absolute;top:0;right:0;bottom:0;border-left:2px dashed var(--amber);pointer-events:none;
  background:repeating-linear-gradient(135deg,var(--raised) 0,var(--raised) 4px,transparent 4px,transparent 8px);opacity:.7;}
.dp-block-resize{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:ew-resize;touch-action:none;}
.dp-block-resize::after{content:"";position:absolute;top:25%;bottom:25%;right:2px;width:2px;border-radius:1px;background:var(--ink-2);opacity:0;transition:opacity .15s;}
.dp-block:hover .dp-block-resize::after,.dp-block.is-resizing .dp-block-resize::after{opacity:.6;}
.dp-block.is-resizing{z-index:4;outline:2px solid var(--brand,var(--glacier));outline-offset:1px;}
.dp-block.is-conflict{outline-color:var(--warn);}
.dp-panel-duration{display:inline-flex;flex-wrap:wrap;align-items:center;gap:6px;}
.dp-panel-duration input{width:80px;}
.dp-ghost{position:absolute;top:4px;bottom:4px;border:2px dashed var(--brand,var(--glacier));border-radius:6px;background:var(--sunk);
  font-style:normal;font-size:11px;font-family:var(--mono);padding:2px 4px;pointer-events:none;z-index:3;}
.dp-list{display:none;}
.dp-status{position:fixed;left:50%;bottom:20px;transform:translateX(-50%);z-index:50;padding:8px 14px;border-radius:var(--r);background:var(--ink);color:var(--raised);font-size:13px;box-shadow:var(--shadow);}
.dp-status.is-bad{background:var(--warn);color:var(--raised);}
.drawer--wide{width:min(560px,100vw);}
.dp-cand-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px;}
.dp-cand-item{border:1px solid var(--line);border-radius:var(--r);padding:8px 10px;display:flex;flex-direction:column;gap:4px;}
.dp-cand-main{display:flex;justify-content:space-between;align-items:center;gap:8px;}
.dp-cand-score{font-family:var(--mono);font-weight:700;padding:2px 8px;border-radius:999px;background:var(--ok-soft);color:var(--ok);}
.dp-cand-warn{font-size:12px;color:var(--amber);}
.dp-cand-err{font-size:12.5px;color:var(--warn);}
.dp-cand-act{display:flex;flex-wrap:wrap;gap:8px;align-items:center;}
.dp-card-meta.is-warn{color:var(--amber);}
/* контроль хода дня (FR-26): лента «Требует внимания», отметка на блоке доски, вид отметки бейджем */
.dp-attention{margin-bottom:14px;padding:10px 14px;}
.dp-attention summary{cursor:pointer;display:flex;flex-wrap:wrap;gap:6px;align-items:center;font-size:13px;}
.dp-attention-list{list-style:none;margin:8px 0 0;padding:0;display:flex;flex-direction:column;gap:6px;font-size:13px;}
.dp-attention-list li{display:flex;flex-wrap:wrap;gap:4px 8px;align-items:center;padding-top:6px;border-top:1px solid var(--line);}
.dp-attention-why{font-size:12px;color:var(--ink-2);}
/* отметка контроля дня в строке реестра «Выезды» — цветом предупреждения; на телефоне — основным цветом (mobile.css, М-02) */
.dp-attention-why.fsm-alert{color:var(--warn);}
.dp-block.is-alert{border-color:var(--warn);box-shadow:inset 0 0 0 1px var(--warn);}
.dp-block-alert{display:inline-block;min-width:14px;text-align:center;border-radius:999px;background:var(--warn);color:var(--raised);font-size:10px;line-height:14px;}
.sf-badge--dp-overrun,.sf-badge--dp-not_on_site{background:var(--warn-soft);color:var(--warn);}
.sf-badge--dp-not_departed,.sf-badge--dp-expired,.sf-badge--dp-rejected{background:var(--amber-soft);color:var(--amber);}
/* «Предложить окна» (FR-25): дни строками, окна сетки столбцами; выбранное — рамкой */
.win-table td,.win-table th{text-align:center;}
.win-table td:first-child,.win-table th:first-child{text-align:left;}
.win-slot{font:inherit;font-size:12px;padding:3px 8px;border-radius:999px;border:1px solid var(--ok);background:var(--ok-soft);color:var(--ok);cursor:pointer;white-space:nowrap;}
.win-slot:hover{filter:brightness(.97);}
.win-slot.is-picked{background:var(--ok);color:var(--raised);}
/* выбор выезда (FR-22, как у ServiceNow): выбранный — рамкой; у техников — подсказка, неподходящие — приглушены; окно визита — полосой;
   справа — панель выезда; события техника на часть дня и закреплённое время */
.dp-card.is-selected,.dp-block.is-selected{outline:2px solid var(--brand,var(--glacier));outline-offset:1px;}
.dp-card{cursor:pointer;}
.dp-who-top{display:flex;align-items:center;justify-content:space-between;gap:8px;}
.dp-who-menu .ag-more-menu{min-width:220px;display:flex;flex-direction:column;align-items:flex-start;gap:8px;}
.dp-who-hint{font-size:11.5px;color:var(--ok);line-height:1.3;}
.dp-who-hint.is-bad{color:var(--warn);}
.dp-lane.is-blocked{opacity:.55;}
.dp-winband{position:absolute;top:0;bottom:0;background:var(--ok-soft);border-left:2px solid var(--ok);border-right:2px solid var(--ok);pointer-events:none;}
.dp-event{position:absolute;top:4px;bottom:4px;border-radius:6px;background:repeating-linear-gradient(45deg,var(--amber-soft) 0,var(--amber-soft) 6px,var(--raised) 6px,var(--raised) 10px);
  border:1px solid var(--amber);font-style:normal;font-size:10.5px;color:var(--ink-2);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding:2px 4px;pointer-events:none;}
.dp-block-lock{display:inline-flex;vertical-align:-1px;color:var(--ink-2);}
.dp-block-lock .ico{width:11px;height:11px;}
.dp-cap-dow{white-space:nowrap;}
.dp-ready{color:var(--ink-2);text-decoration:none;}
.dp-ready.is-warn{color:var(--amber);}
/* панель выезда — поверх правого края доски, а не третьей колонкой: на экране 1440 с панелью раздела доска иначе сжималась до трёх часов (стенд 27.10.2026) */
.dp-side{position:fixed;top:64px;right:16px;bottom:16px;width:min(360px,calc(100vw - 32px));overflow:auto;z-index:40;box-shadow:var(--shadow);}
.dp-side-head{display:flex;justify-content:space-between;align-items:center;padding:10px 12px;border-bottom:1px solid var(--line);}
.dp-side-head .x{border:0;background:none;font-size:20px;line-height:1;cursor:pointer;color:var(--ink-2);min-width:32px;min-height:32px;}
.dp-panel-body{padding:10px 12px;display:flex;flex-direction:column;gap:8px;}
.dp-panel-top{display:flex;flex-wrap:wrap;gap:4px 8px;align-items:center;font-size:12px;}
.dp-panel-title{font-size:15px;margin:0;line-height:1.3;}
.dp-panel-dl{font-size:12.5px;}
.dp-panel-act{display:flex;flex-wrap:wrap;gap:8px;}
.dp-panel-grp{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-3);margin-top:4px;}
.dp-panel-log{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px;font-size:12px;}
/* ёмкость группы на 14 дней: день — полоса (запланировано — сплошная, ждёт — светлее), перегруз — красным */
.dp-capacity{margin-bottom:14px;padding:10px 14px;}
.dp-capacity summary{cursor:pointer;font-size:13px;}
.dp-cap-days{display:grid;grid-template-columns:repeat(auto-fill,minmax(84px,1fr));gap:8px;margin-top:8px;}
.dp-cap-day{display:flex;flex-direction:column;gap:3px;padding:6px 8px;border:1px solid var(--line);border-radius:var(--r);text-decoration:none;color:var(--ink);font-size:11.5px;min-height:44px;}
.dp-cap-day.is-current{border-color:var(--glacier);box-shadow:inset 0 0 0 1px var(--glacier);}
.dp-cap-day.is-off{color:var(--ink-3);background:var(--sunk);}
.dp-cap-bar{display:flex;height:6px;border-radius:3px;background:var(--sunk);overflow:hidden;}
.dp-cap-bar i{display:block;height:100%;}
.dp-cap-bar .is-planned{background:var(--glacier);}
.dp-cap-bar .is-waiting{background:var(--glacier-soft);}
.dp-cap-day.is-over .dp-cap-pct{color:var(--warn);font-weight:600;}
.dp-cap-day.is-over .dp-cap-bar .is-planned{background:var(--warn);}
/* «Готовность к планированию» (Scheduling Health): плитки проверок со счётчиком, список под ними */
.rd-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;}
.rd-tile{border:1px solid var(--line);border-radius:var(--r);padding:10px 12px;background:var(--raised);}
.rd-tile summary{cursor:pointer;display:flex;flex-direction:column;gap:2px;list-style:none;}
.rd-tile summary::-webkit-details-marker{display:none;}
.rd-n{font-size:26px;font-weight:600;line-height:1.1;}
.rd-tile.is-ok .rd-n{color:var(--ok);}
.rd-tile.is-bad .rd-n{color:var(--warn);}
.rd-tile.is-soft .rd-n{color:var(--amber);}
.rd-tile ul{margin:8px 0 0;padding-left:18px;font-size:12.5px;display:flex;flex-direction:column;gap:2px;}
@media (max-width:1023px){
  .dp{grid-template-columns:minmax(0,1fr);}
  .dp-side{position:static;width:auto;box-shadow:none;}
  .dp-queue{position:static;max-height:none;}
  .dp-grid{display:none;}
  .dp-list{display:block;padding:8px 12px;}
  .dp-list-tech{margin-top:10px;font-size:13.5px;}
  .dp-list-item{display:block;padding:6px 0;border-bottom:1px solid var(--line);font-size:13px;}
  .dp-summary .dp-hint{display:none;}
}
