/* Примадок — мастер /edit. Токены сняты со сайта. Радиус ≤6px. */
/* ТОКЕНЫ СНЯТЫ ПИКСЕЛЬНО СО СКРИНШОТА САЙТА. Радиус везде ≤ 6px. */
:root{
  --accent:#3b4ee0; --accent-dark:#3242c4; --accent-wash:#f4f6ff;
  --tonal:#eef1f6; --tonal-hover:#e4e8f0; --quiet:#f6f7fa;
  --ink:#1c1b19; --ink-2:#54585f; --ink-3:#7d838c;
  /* Рамка поля заметно темнее: светло-серо-зелёная полоска на белом фоне почти не читалась
     («бордеры полей инпутов… сейчас это 1 полоски светлозеленого, лучше как-то чуть потемнее»). */
  --field-line:#a8b2c0; --field-line-ok:#6aab8d; --line:#dcdfe5; --line-soft:#e6e6e2;
  --paper:#f0efec; --highlight:#fff3c4; --ok:#12855a; --ok-wash:#e8f6ef;
  --pay:#a9640a; --pay-wash:#fff6e3;
  --r:6px; --pad:28px;
  --ui:"Onest",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif;
}
*{box-sizing:border-box}
html,body{margin:0;background:#fff;color:var(--ink);font:15px/1.55 var(--ui);-webkit-font-smoothing:antialiased}
/* один шрифт на все контролы: убирает «кривой» моно у textarea и date */
input,textarea,select,button{font-family:var(--ui);font-size:inherit;color:inherit}
button{cursor:pointer}
a{color:var(--accent);text-decoration:none}

/* ---------- шапка ---------- */
.top{display:flex;align-items:center;gap:16px;height:58px;padding:0 var(--pad);
  background:#f7f8fc;border-bottom:1px solid var(--line);position:sticky;top:0;z-index:40}
.top .logo{height:22px;width:152px;display:block;flex:0 0 auto}
.top h1{margin:0;font-size:15px;font-weight:600;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.top .back{font-size:13px;color:var(--ink-2);white-space:nowrap}

/* ---------- три колонки ---------- */
.app{display:grid;grid-template-columns:272px minmax(440px,560px) minmax(520px,1fr);
  align-items:stretch;min-height:calc(100vh - 58px)}
.app > * + *{border-left:1px solid var(--line)}
@media (max-width:1300px){.app{grid-template-columns:248px minmax(380px,480px) minmax(420px,1fr)}}
@media (max-width:1040px){.app{grid-template-columns:1fr}
  .app > * + *{border-left:none;border-top:1px solid var(--line)}
  /* Колонки встали друг под друга — прокрутка снова общая: коробка высотой в экран внутри
     ленты означала бы скролл внутри скролла, худшее, что бывает на телефоне. */
  .side,.right{position:static!important;height:auto!important}
  .mid{height:auto!important;overflow:visible!important}}

/* ---------- колонка 1 ---------- */
.side{position:sticky;top:58px;height:calc(100vh - 58px);display:flex;flex-direction:column;padding:18px 14px 0}
.cap{font-size:12px;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-3);margin:0 0 10px;padding:0 8px}
.nav{display:grid;gap:2px}
.nav a{display:grid;grid-template-columns:20px 1fr auto;gap:10px;align-items:center;
  padding:10px 8px;border-radius:var(--r);font-size:15px;color:var(--ink)}
.nav a:hover{background:var(--quiet)}
.nav a.on{background:var(--tonal);color:var(--accent);font-weight:600}
.nav a .n{font-size:13px;color:var(--ink-3);text-align:center;font-variant-numeric:tabular-nums}
.nav a.on .n{color:var(--accent)}
.nav a.ok{color:var(--ok);font-weight:700}
.nav a.ok .n{color:var(--ok)}
.nav a.ok .c{color:var(--ok);font-weight:700;font-size:15px}
.nav a .c{font-size:13px;color:var(--ink-3);font-weight:400;font-variant-numeric:tabular-nums}
.nav a.ok .c{color:var(--ok)}

.acts{margin-top:16px;padding-top:14px;border-top:1px solid var(--line-soft);display:grid;gap:6px}
/* Высота кнопки — минимальная, а не фиксированная: в узкой колонке подпись «Открыть доступ
   по ссылке» переносится на две строки, и при height:42px текст выходил за рамку кнопки. */
.b{min-height:42px;border:none;border-radius:var(--r);font-size:14px;font-weight:600;
  display:flex;align-items:center;gap:10px;padding:7px 13px;text-align:left;background:var(--quiet);color:var(--ink)}
.b:hover{background:var(--tonal)}
.b .ic{flex:0 0 18px;display:grid;place-items:center;color:var(--ink-3)}
.b.main{background:var(--accent);color:#fff;min-height:46px;font-size:15px;justify-content:center}
.b.main:hover{background:var(--accent-dark)}
.b.main .ic{color:#fff}
/* Строка-переключатель в списке действий (доступ по ссылке): подпись слева, тумблер справа. */
.b.sw{cursor:default}
.b.sw .lbl{flex:1 1 auto;min-width:0;cursor:pointer;line-height:1.3;white-space:normal;overflow-wrap:anywhere}
.b.sw .tg{flex:0 0 auto;border:1px solid var(--line);background:#fff;border-radius:999px;
  padding:4px 7px;display:inline-flex;align-items:center;cursor:pointer}
.b.sw .tg i{width:30px;height:18px;border-radius:999px;background:#d9d7d2;position:relative;
  transition:background .15s;display:block}
.b.sw .tg i::after{content:"";position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;
  background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.25);transition:transform .15s}
.b.sw .tg.on{border-color:#bfe3d2}
.b.sw .tg.on i{background:var(--ok)}
.b.sw .tg.on i::after{transform:translateX(12px)}
.b.sw .tg:hover{border-color:var(--accent)}

.tech{margin-top:auto;padding:14px 8px 16px;border-top:1px solid var(--line-soft);
  font-size:13px;color:var(--ink-2);display:grid;gap:7px}
.tech .row{display:flex;justify-content:space-between;gap:10px;align-items:baseline}
.tech .row span{color:var(--ink-3)}
.tech b{font-weight:600;color:var(--ink);font-variant-numeric:tabular-nums;text-align:right}
.tech .dot{width:7px;height:7px;border-radius:50%;background:var(--ok);display:inline-block;margin-right:7px}
/* Стоимость — единственная строка панели, за которой стоит решение: выделяем цветом бренда. */
.tech b.price{color:var(--accent);font-size:14px}
/* Строка-переключатель в панели: сам переключатель мельче кнопочного, но с той же механикой. */
.tech .sw-row{align-items:center}
.tech .tg{flex:0 0 auto;width:34px;height:19px;border-radius:10px;border:1px solid var(--line);
  background:var(--line-soft);position:relative;cursor:pointer;padding:0;transition:background .15s,border-color .15s}
.tech .tg i{position:absolute;inset:0;display:block}
.tech .tg i::after{content:"";position:absolute;top:2px;left:2px;width:13px;height:13px;border-radius:50%;
  background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.25);transition:transform .15s}
.tech .tg.on{border-color:#bfe3d2;background:var(--ok-wash)}
.tech .tg.on i::after{transform:translateX(15px);background:var(--ok)}
.tech .tg:hover{border-color:var(--accent)}

/* ---------- колонка 2 ---------- */
/* Средняя колонка прокручивается сама, как левая и правая. Раньше своя прокрутка была только у
   навигации и у листа предпросмотра, а форму двигала общая прокрутка страницы: человек тянул
   колесо над полями, а ехал весь макет — соседние колонки при этом стояли на месте, и было
   непонятно, что вообще прокручивается. Три колонки — три независимых потока. */
.mid{padding:22px var(--pad) 40px;min-width:0;height:calc(100vh - 58px);overflow-y:auto;overscroll-behavior:contain}
.flow{max-width:672px}
.part{position:relative;padding:0 0 28px 44px}
.part::before{content:"";position:absolute;left:14px;top:34px;bottom:4px;width:2px;background:var(--line-soft)}
.part:last-child::before{display:none}
.part .num{position:absolute;left:0;top:0;width:30px;height:30px;border-radius:var(--r);
  background:var(--tonal);color:var(--accent);font-weight:700;font-size:14px;display:grid;place-items:center}
.part.done .num{background:var(--ok);color:#fff}
.part.done::before{background:#cfe9dd}
.part h2{margin:3px 0 2px;font-size:18px;scroll-margin-top:78px}
.part .st{font-size:13px;color:var(--ink-3);margin:0 0 14px}
.part .st b{color:var(--ok);font-weight:600}

/* вопросы: разделитель между ними, опции прижаты к отметке */
.q{padding:20px 0}
.q + .q{border-top:1px solid var(--line-soft)}
.q:first-of-type{padding-top:0}
/* Именно :last-child, а не :last-of-type: за последним вопросом в разделе может идти блок полей
   (группа step_group, дописанная в служебный раздел). С :last-of-type у вопроса срезался нижний
   отступ, и подписи полей вставали вплотную к тому, что над ними. */
.q:last-child{padding-bottom:0}
.q .lbl{font-weight:600;font-size:15px}
.q .why{font-size:13px;color:var(--ink-2);margin:2px 0 9px}
.choices{display:grid;gap:5px}
.ch{display:flex;gap:9px;align-items:flex-start;padding:10px 12px;border:1px solid var(--line);
  border-radius:var(--r);background:#fff;font-size:15px;text-align:left;width:100%}
.ch:hover{border-color:#b9c2d6;background:#fdfdfe}
.ch.on{border-color:var(--accent);background:var(--accent-wash)}
.ch .mark{flex:0 0 17px;height:17px;margin-top:3px;border:1.5px solid var(--field-line);border-radius:50%;
  position:relative;background:#fff}
.ch.box .mark{border-radius:3px}
.ch.on .mark{border-color:var(--accent);background:var(--accent)}
.ch.on .mark::after{content:"";position:absolute;inset:0;margin:auto;width:6px;height:6px;background:#fff;border-radius:50%}
.ch.box.on .mark::after{width:9px;height:5px;border-radius:0;background:none;
  border-left:2px solid #fff;border-bottom:2px solid #fff;transform:rotate(-45deg) translate(1px,-2px)}
.ch .txt{min-width:0;line-height:1.4}
.ch .txt b{display:block;font-weight:600}
.ch .txt small{color:var(--ink-2);font-size:13px}
.eff{font-size:13px;color:var(--ok);min-height:0}
.eff:not(:empty){margin-top:9px}

/* поля */
.fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(252px,1fr));gap:18px}
.f{min-width:0}
.f label{display:block;font-size:14px;font-weight:600;margin-bottom:6px}
.f .req{color:#c62d1f}
.f .row{display:flex;gap:8px}
.f input,.f textarea{width:100%;min-width:0;height:42px;padding:0 12px;font-size:15px;background:#fff;
  border:1px solid var(--field-line);border-radius:var(--r)}
.f .row input{flex:1 1 auto}
.f textarea{height:auto;min-height:88px;padding:10px 12px;line-height:1.5;resize:vertical}
.f input:focus,.f textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px #e0e4fb}
.f input.filled{border-color:var(--field-line-ok);background:#fbfffd}
.f .hint{font-size:13px;color:var(--ink-3);margin-top:5px}
.f .inline{flex:0 0 auto;height:42px;border:none;background:var(--tonal);border-radius:var(--r);
  padding:0 13px;font-size:14px;font-weight:600;white-space:nowrap}
.f .inline:hover{background:var(--tonal-hover)}

/* состав документа */
.parts{display:grid;gap:7px}
.item{display:grid;grid-template-columns:24px 1fr auto;gap:11px;align-items:center;
  border:1px solid var(--line);border-radius:var(--r);padding:12px 13px;background:#fff}
.item .i{width:24px;height:24px;border-radius:var(--r);display:grid;place-items:center;font-size:13px;
  background:var(--ok-wash);color:var(--ok)}
.item .nm{font-size:15px;font-weight:600;line-height:1.35}
.item .nm small{display:block;font-weight:400;font-size:13px;color:var(--ink-2);margin-top:1px}
.item .state{font-size:13px;color:var(--ok);font-weight:600;white-space:nowrap}
.item.off{background:#fcfcfc;border-style:dashed}
.item.off .i{background:var(--quiet);color:var(--ink-3)}
.item.off .nm{color:var(--ink-2)}
.item.off .state{color:var(--ink-3);font-weight:500}
.item.paid .i{background:var(--pay-wash);color:var(--pay)}
.item.paid .state{color:var(--pay)}
/* Системное ТЗ §4.2 — подпункт в «Составе документа»: сдвиг и полоса слева показывают, что
   строка принадлежит разделу выше. Заголовок мельче родительского: это часть, а не раздел. */
.item.sub{margin-left:18px;border-left:3px solid var(--line);padding-left:11px}
.item.sub .nm{font-size:14px;font-weight:500}
@media (max-width:560px){.item.sub{margin-left:10px}}

/* ---------- колонка 3 ---------- */
.right{position:sticky;top:58px;height:calc(100vh - 58px);display:flex;flex-direction:column;background:var(--paper)}
.rbar{display:flex;align-items:center;gap:10px;height:44px;padding:0 16px;background:#f7f8fc;
  border-bottom:1px solid var(--line);font-size:13px;color:var(--ink-2)}
.rbar .sp{flex:1}
.rbar button{width:28px;height:28px;border:1px solid var(--line);background:#fff;border-radius:var(--r);line-height:1}
.zoom{display:flex;align-items:center;gap:4px;font-variant-numeric:tabular-nums}
.doc{flex:1;overflow:auto;overscroll-behavior:contain;padding:18px}
/* Лист предпросмотра — НАСТОЯЩИЙ A4 теми же числами, что уходят в файл (ГОСТ Р 7.0.97:
   210 мм, поля 20/15/18 мм, кегль 12 pt, интерлиньяж 1.15; см. DocumentComposer::printCss).
   Раньше здесь было 920 px ширины при кегле 15 px и интерлиньяже 1.55: на экране в строку
   влезало в полтора раза больше слов, чем на лист. Человек скачивал PDF и видел «увеличенный
   шрифт» — хотя кегль в файле не менялся, это предпросмотр показывал документ мельче, чем он
   есть. Ширина A4 задана в мм, кегль — в pt: в браузере это те же абсолютные единицы. */
.sheet{background:#fff;box-shadow:0 1px 3px rgba(28,27,25,.1);padding:18mm 15mm 18mm 20mm;max-width:210mm;margin:0 auto;
  font-family:"Times New Roman",Georgia,serif;font-size:12pt;line-height:1.15;text-align:justify}
/* Альбомный лист — 297 мм и меньшие вертикальные поля: журнал, табель, график. Кегль приходит
   инлайном из лейаута документа, поэтому здесь его не задаём — иначе перебил бы масштаб. */
.sheet.is-land{max-width:297mm;padding:12mm 15mm 12mm 20mm}
.approve{text-align:right;margin:0 0 14pt;font-size:1em;line-height:1.15}
.dtitle{text-align:center;font-weight:700;font-size:1em;margin:0 0 6px}
.dcity{display:flex;justify-content:space-between;font-size:1em;margin:0 0 12pt}
.sec{margin:0 0 13px}
.sec b{display:block;margin-bottom:3px}
.signs{margin-top:24pt;padding-top:14px;border-top:1px solid #e8e6e0;font-size:1em}
.signs .r{display:flex;justify-content:space-between;gap:20px;margin-bottom:12px}
.signs .r i{font-style:normal;color:#9a958c}
.ph{background:var(--highlight);padding:0 3px;border-radius:3px;cursor:pointer}
.ph.set{background:none;font-weight:600;cursor:default}
.lockrow{border:1px dashed #dcd0ad;background:#fffdf5;border-radius:var(--r);padding:11px 13px;margin:0 0 13px;
  color:#8a7433;position:relative}
.lockrow b{color:#6d5a1f}
.lockrow .t{position:absolute;top:-10px;right:10px;font-size:11px;background:#fff;border:1px solid #e6dcbd;
  border-radius:var(--r);padding:2px 8px;font-family:var(--ui)}
.rlegend{height:40px;display:flex;align-items:center;gap:14px;padding:0 16px;background:#f7f8fc;
  border-top:1px solid var(--line);font-size:13px;color:var(--ink-2)}
.rlegend i{width:12px;height:12px;background:#ffd83d;border:1px solid #c9a300;border-radius:2px;
  display:inline-block;margin-right:6px;vertical-align:-2px}
/* Заметка про водяной знак: на узком экране она уступает место счётчику незаполненного. */
.rlegend .wmn{color:#8a7433;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rlegend #left{margin-left:auto;white-space:nowrap}
@media (max-width:900px){.rlegend .wmn{display:none}}
.right.full{position:fixed;inset:58px 0 0 0;z-index:45;height:auto}

/* ---------- модалка: два шага ---------- */
.ovl{position:fixed;inset:0;background:rgba(28,27,25,.5);display:none;place-items:center;z-index:60;padding:20px}
.ovl.on{display:grid}
.modal{background:#fff;border-radius:var(--r);max-width:520px;width:100%;box-shadow:0 20px 50px rgba(28,27,25,.3);overflow:hidden}
.mhead{display:flex;gap:12px;align-items:center;padding:18px 20px;border-bottom:1px solid var(--line);background:#f7f8fc}
.mhead .ic{width:36px;height:36px;border-radius:var(--r);background:var(--accent);color:#fff;display:grid;place-items:center;font-size:17px}
.mhead h3{margin:0;font-size:17px}
.mhead .s{margin:2px 0 0;font-size:13px;color:var(--ink-2);display:flex;gap:8px;flex-wrap:wrap}
.mbody{padding:18px 20px}
.mstep{display:none}.mstep.on{display:block}
.mlbl{font-size:14px;font-weight:600;margin:0 0 6px}
.mnote{font-size:13px;color:var(--ink-2);background:var(--quiet);border-radius:var(--r);padding:10px 12px;margin:14px 0 0}
.mmail{display:flex;gap:8px}
.mmail input{flex:1;height:42px;border:1px solid var(--field-line);border-radius:var(--r);padding:0 12px;font-size:15px}
.mmail input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px #e0e4fb}
.mways{display:grid;gap:5px;margin-top:12px}
.fmt{display:grid;grid-template-columns:1fr 1fr;gap:7px}
.fmt .ch{padding:10px 12px}
.fmt .ic{flex:0 0 26px;height:26px;border-radius:var(--r);display:grid;place-items:center;font-size:11px;font-weight:700;
  background:var(--tonal);color:var(--ink-2);margin-top:0}
.fmt .ic svg.ic{width:15px;height:15px;flex:none;background:none;border-radius:0}
.fmt .ch.on .ic{background:var(--accent);color:#fff}
.mfoot{display:flex;gap:8px;justify-content:flex-end;align-items:center;padding:14px 20px;border-top:1px solid var(--line);background:#fcfcfd}
.mfoot .back{margin-right:auto;background:none;color:var(--ink-2);font-weight:500}
.mfoot .b{height:42px}
.mfoot .b.main{justify-content:center;padding:0 18px}
.b[disabled]{opacity:.5;pointer-events:none}
/* Все галочки в модалке выглядят одинаково: обязательная и необязательная отличались фоном,
   и вторая читалась как элемент другого рода. Отличие оставлено только смысловое (текст). */
.chk{display:flex;gap:10px;font-size:14px;margin:10px 0 0;align-items:flex-start;
  padding:11px 12px;background:var(--quiet);border-radius:var(--r);cursor:pointer}
.chk input{margin-top:3px;width:17px;height:17px;accent-color:var(--accent);flex:0 0 auto}
.chk i{font-style:normal;color:var(--ink-3);font-size:13px}
.chk a{text-decoration:underline}
.mhelp{font-size:13px;color:var(--ink-2);margin-top:9px;line-height:1.45}

/* ================================================================
   Дополнения к комплекту: то, чего в прототипе не было, а в бою есть.
   Правило прежнее — радиус не больше 6px, длинных тире в интерфейсе нет.
   ================================================================ */

/* селект и чекбокс в сетке полей: тот же рост и та же рамка, что у input */
.f select{width:100%;min-width:0;height:42px;padding:0 34px 0 11px;font-size:15px;background:#fff;
  border:1px solid var(--field-line);border-radius:var(--r);appearance:none;
  background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='none' stroke='%237d838c' stroke-width='1.6' d='M1 1.5 6 6.5 11 1.5'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 12px center}
.f select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px #e0e4fb}
.f select.filled{border-color:var(--field-line-ok);background-color:#fbfffd}
.f.wide{grid-column:1/-1}
.f .err{font-size:13px;color:#c62d1f;margin-top:5px}
/* Скрываем именно атрибутом hidden: раньше стоял display:none, и сообщение об ошибке
   не показывалось никогда — поэтому «23.34.534» проходило молча. */
.f .err[hidden]{display:none}
.f input.bad,.f textarea.bad,.f select.bad{border-color:#c62d1f;background:#fffafa}
.f input.bad:focus,.f textarea.bad:focus{border-color:#c62d1f;box-shadow:0 0 0 3px #fae0dd}
.f.bad input,.f.bad select,.f.bad textarea{border-color:#e0a29b}
.f.bad .err{display:block}
.f .choices{margin-top:2px}

/* ---------- ритм внутри раздела ----------
   Разделы собираются из разных кусков (вопросы, реквизиты сторон, сетки полей, дописанные группы),
   и раньше вертикальные отступы задавал только тот кусок, который случайно шёл первым: где-то между
   блоками было 0, где-то 30px, а подписи полей налезали на подсказку предыдущего блока. Ниже —
   один набор правил на все сочетания. */
.part .st:empty{display:none}
.part > .why{font-size:13px;color:var(--ink-2);margin:0 0 16px;max-width:62ch}
/* сетка полей сразу после заголовка раздела или подписи вопроса */
.part > .fields{margin-top:2px}
.q > .fields{margin-top:16px}
.q > .choices + .fields,
.q > .eff + .fields{margin-top:18px}
/* два блока полей подряд (тип стороны переключает группы, дописанная группа идёт следом) */
.part > .fields + .fields,
.part > .q + .fields{margin-top:22px;padding-top:22px;border-top:1px solid var(--line-soft)}
.fields + .fields:not([data-party-group]){margin-top:18px}
/* последний элемент раздела не должен добавлять свой отступ к отступу самого раздела */
.part > :last-child{margin-bottom:0}

/* блок-подсказка над разделом «Состав документа» */
.upsell{border:1px solid #e6dcbd;background:var(--pay-wash);border-radius:var(--r);
  padding:12px 14px;margin:0 0 12px;font-size:14px;color:#6d5a1f;line-height:1.45}
.upsell b{color:#5a4a19}
.item.paid{background:var(--pay-wash);border-color:#e6dcbd}
.item .go{border:none;background:none;color:var(--accent);font-size:13px;font-weight:600;padding:0}

/* пустой раздел (все поля скрыты условиями) */
.part.hidden{display:none}
.q.hidden,.f.hidden{display:none}

/* ---------- лист предпросмотра: классы приходят из DocumentComposer ---------- */
.sheet .doc-title{text-align:center;font-weight:700;font-size:1em;margin:0 0 10pt;line-height:1.15;text-transform:uppercase}
.sheet .doc-city{width:100%;border-collapse:collapse;font-size:1em;margin:0 0 12pt}
.sheet .doc-city td{border:0;padding:0;vertical-align:top}
.sheet .doc-city td.dc-r{text-align:right}
.sheet .doc-addressee{text-align:right;margin:0 0 18px;font-size:14px;line-height:1.45}
.sheet .doc-h{font-weight:700;margin:10pt 0 3pt;text-align:left}
.sheet .doc-h:first-child{margin-top:0}
.sheet .doc-body{margin:0 0 9px}
.sheet .doc-p{margin:0 0 4pt;text-align:justify;text-indent:0.75cm}
.sheet .doc-p.doc-preamble{text-indent:0.75cm;margin-bottom:10pt}
.sheet .doc-p.doc-sub{margin-left:0;text-indent:0}
/* Картинка в документе: размеры приходят в теге из директивы [[image:…]]. */
.sheet .doc-img{margin:6pt 0}
.sheet .doc-img img{display:inline-block;max-width:100%}
/* Гриф — шапка документа («УТВЕРЖДЕНО приказом…», наименование организации, адресат):
   без номера и без выключки по формату, строки идут ровно так, как их набрал автор. */
.sheet .doc-grif{margin:0 0 12px}
.sheet .doc-grif .doc-p{text-align:left;text-indent:0;margin:0 0 2pt}
.sheet .doc-subnum{font-weight:600}
.sheet .doc-blur{filter:blur(3px);user-select:none;opacity:.75}
.sheet .doc-lock{font-style:normal}
/* Черновик на листе редактора — диагональная подложка ЧЕРНОВИК / ПРИМАДОК, а не баннер
   в тексте: предупреждение про водяной знак переехало в строку состояния (.rlegend). */
.sheet .doc-draft{display:none}
.sheet:has(.doc-draft){position:relative;z-index:0}
.sheet:has(.doc-draft)::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='196'%3E%3Cg font-family='Arial,Helvetica,sans-serif' font-size='23' font-weight='700' letter-spacing='2' fill='%231F3A5F' fill-opacity='0.08' text-anchor='middle' transform='rotate(-27 150 98)'%3E%3Ctext x='150' y='92'%3EЧЕРНОВИК%3C/text%3E%3Ctext x='150' y='120'%3EПРИМАДОК%3C/text%3E%3C/g%3E%3C/svg%3E");
  background-repeat:repeat;background-position:center top}
.sheet .doc-reqs{display:table;width:100%;table-layout:fixed;border-collapse:collapse;
  margin-top:18px;font-size:14px}
.sheet .doc-req-role{font-weight:700;margin-bottom:4px}
.sheet td.doc-req{width:50%;border:none;padding:0 18px 0 0;vertical-align:top;line-height:1.45}
.sheet td.doc-req:last-child{padding:0 0 0 18px}
.sheet .doc-sign-line{margin-top:18px}
.sheet .doc-mp{color:#9a958c}
.sheet .doc-appendix{margin-top:26px;padding-top:14px;border-top:1px solid #e8e6e0}
.sheet .doc-app-title{font-weight:700;margin:0 0 6px}
/* Канцелярская таблица — теми же правилами, что в печатном CSS: ширины граф из <colgroup>,
   раскладка фиксированная, шапка по центру и по середине высоты. */
.sheet table.doc-table{border-collapse:collapse;width:100%;margin:6pt 0;font-size:.92em;table-layout:fixed;word-wrap:break-word}
.sheet .doc-table td,.sheet .doc-table th{border:1px solid #444;padding:1.4mm 1.2mm;vertical-align:middle;text-align:left}
.sheet .doc-table thead th{font-weight:700;text-align:center;vertical-align:middle}
.sheet .doc-table tbody tr.tr-cols td{text-align:center;font-size:.85em}
@media (max-width:640px){.sheet{padding:9mm 7mm 9mm 9mm;font-size:11pt}
  .sheet .doc-reqs,.sheet .doc-reqs tbody,.sheet .doc-reqs tr{display:block}
  .sheet td.doc-req{display:block;width:auto;padding:0 0 18px}}

/* незаполненное поле в листе: жёлтый бланк, кликом уводит в поле формы */
.sheet .doc-ph{background:var(--highlight);padding:0 3px;border-radius:3px;cursor:pointer;
  color:#7a6410;text-decoration:none}
.sheet .doc-ph:hover{background:#ffe89a}

/* чип нормы права внутри листа */
.lawref{position:relative;display:inline;font:inherit;color:var(--accent);background:none;border:none;
  border-bottom:1px dashed var(--accent);cursor:pointer;padding:0;white-space:nowrap}
.lawref-pop{display:none;position:absolute;z-index:60;left:0;top:1.7em;width:290px;max-width:80vw;
  background:#fff;border:1px solid var(--line);border-radius:var(--r);box-shadow:0 8px 26px rgba(28,27,25,.18);
  padding:12px 14px;font-weight:400;white-space:normal;text-align:left;font-family:var(--ui);font-size:14px}
.lawref-pop.open{display:block}
.lawref-pop .lp-code{font-size:12px;color:var(--ink-3);text-transform:uppercase;letter-spacing:.04em}
.lawref-pop .lp-title{font-weight:600;margin:2px 0 6px}
.lawref-pop .lp-sum{color:var(--ink-2);line-height:1.5}
.lawref-plain{color:var(--ink-2)}

/* ---------- всплывающая подсказка о сохранении/ошибке ---------- */
.toast{position:fixed;left:50%;bottom:24px;transform:translateX(-50%) translateY(12px);z-index:70;
  background:var(--ink);color:#fff;font-size:14px;padding:11px 16px;border-radius:var(--r);
  box-shadow:0 10px 30px rgba(28,27,25,.28);opacity:0;pointer-events:none;transition:opacity .15s,transform .15s}
.toast.on{opacity:1;transform:translateX(-50%) translateY(0)}
.toast.bad{background:#c62d1f}

/* состояние «идёт пересборка» — лист не мигает пустотой, просто гаснет */
.doc.busy .sheet{opacity:.55;transition:opacity .12s}

/* клик по жёлтому пропуску в листе: поле формы коротко подсвечивается, чтобы взгляд его нашёл */
.f.flash input,.f.flash textarea,.f.flash select{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-wash)}
.f.flash>label{color:var(--accent)}

/* модалка: строка ошибки и блок оплаты */
.merr{font-size:13px;color:#c62d1f;margin-top:9px;display:none}
.merr.on{display:block}
.mpay{border:1px solid #e6dcbd;background:var(--pay-wash);border-radius:var(--r);
  padding:12px 14px;margin-top:14px;font-size:14px;color:#6d5a1f;line-height:1.45;display:none}
.mpay.on{display:block}
.mpay .b{margin-top:10px;background:var(--accent);color:#fff;justify-content:center;height:42px;width:100%}
.mpay .b:hover{background:var(--accent-dark)}

/* мобильная раскладка: правая колонка не липнет и получает свою высоту */
@media (max-width:1040px){
  .right{height:auto}
  .doc{max-height:70vh}
  .top{padding:0 16px}
  .mid{padding:18px 16px 32px}
  .side{padding:16px 12px 0}
  .right.full{position:static;inset:auto}
}

/* ── растущие поля ──────────────────────────────────────────────────────
   Однострочное на вид поле, которое разворачивается на 2–3 строки, когда значение не влезает
   (высоту ставит wizard.js). Ручной resize отключён: высотой управляет содержимое. */
.f textarea[data-grow]{height:42px;min-height:42px;padding:9px 12px;line-height:1.45;resize:none;overflow:hidden}
.f .row textarea[data-grow]{flex:1 1 auto}
.f textarea.filled{border-color:var(--field-line-ok);background:#fbfffd}

/* варианты адреса из реестра — видимыми кнопками под полем, а не скрытым datalist */
.sugs{display:flex;flex-wrap:wrap;gap:6px;margin-top:7px}
.sug{border:1px solid var(--line);background:#fff;border-radius:var(--r);padding:6px 10px;
  font-size:13px;line-height:1.3;text-align:left;color:var(--ink-2);cursor:pointer}
.sug:hover{border-color:var(--accent);color:var(--ink)}

/* ── переключатель пункта в «Составе документа» ─────────────────────────
   Каждый пункт включается и выключается пользователем; выбор не решается за него. */
/* Ширина тумблера фиксирована: подпись «включён/выключен» жила внутри кнопки и меняла её размер,
   из-за чего строки списка прыгали при каждом переключении. Состояние читается по самому тумблеру
   (и по aria-label для скринридеров), надпись не нужна. */
.item .tg{display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--line);
  background:#fff;border-radius:999px;padding:5px 8px;color:var(--ink-3);cursor:pointer}
.item .tg i{width:30px;height:18px;border-radius:999px;background:#d9d7d2;position:relative;
  transition:background .15s;flex:0 0 auto}
.item .tg i::after{content:"";position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;
  background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.25);transition:transform .15s}
.item .tg.on{color:var(--ok);border-color:#bfe3d2}
.item .tg.on i{background:var(--ok)}
.item .tg.on i::after{transform:translateX(12px)}
.item .tg:hover{border-color:var(--accent)}
.item.paid .tg.on{color:var(--pay);border-color:#e6dcbd}
.item.paid .tg.on i{background:var(--pay)}
/* пункт, отсечённый ответами: переключать нечего — показываем причину, а не мёртвый тумблер */
.item.na{opacity:.72}
.item.na .state{color:var(--ink-3);font-weight:500}

/* ================================================================
   Редактор комплекта — /edit/pack/{slug}
   ----------------------------------------------------------------
   Комплект собирается на том же рабочем месте, что и документ: слева разделы,
   по центру лента полей, справа лист предпросмотра. Раньше в третьей колонке был
   только перечень «что соберётся»: человек заполнял поля вслепую и видел документы
   впервые уже внутри скачанного архива. Теперь колонка та же, что у /edit, а над
   листом — переключатель документов комплекта: вот такой документ, вот такой.
   ================================================================ */

/* Иконки спрайта в мастере: до этого значки были типографскими знаками разной высоты. */
svg.ic{width:17px;height:17px;flex:none;display:block}
.b .ic svg.ic{width:17px;height:17px}

/* Пропорции как у /edit: лист документа требует ширины, перечень полей — нет. */
.app.pkg{grid-template-columns:272px minmax(420px,520px) minmax(480px,1fr)}
@media (max-width:1300px){.app.pkg{grid-template-columns:248px minmax(360px,460px) minmax(420px,1fr)}}
@media (max-width:1040px){.app.pkg{grid-template-columns:1fr}
  .app.pkg > * + *{border-left:none;border-top:1px solid var(--line)}
  .app.pkg .right{position:static!important;height:auto!important}
  .app.pkg .doc{max-height:70vh}}

/* название документа в навигации бывает длинным — обрезаем, а не ломаем колонку */
.nav a .t{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Комплект из десяти документов даёт длинный список разделов: прокручиваем навигацию,
   а не выдавливаем панель действий и счётчики за пределы экрана. */
.app.pkg .nav{overflow:auto;min-height:0}

/* ---------- колонка 3: лист и переключатель документов ---------- */
/* Переключатель — не декоративные вкладки, а ответ на вопрос «что именно я сейчас читаю»:
   у каждой кнопки название документа и его регистрационный номер. Полоса прокручивается
   вбок: в комплекте бывает десяток позиций, и переносить их в три ряда — съедать лист. */
.pkgtabs{flex:none;display:flex;gap:8px;padding:9px 14px;background:var(--quiet);
  border-bottom:1px solid var(--line);overflow-x:auto;overscroll-behavior-x:contain}
.pkgtabs .pt{display:flex;align-items:center;gap:8px;flex:none;max-width:250px;cursor:pointer;
  border:1px solid var(--line);background:#fff;border-radius:var(--r);padding:6px 11px;
  font:inherit;font-size:13px;color:var(--ink-2);text-align:left}
.pkgtabs .pt .t{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600}
.pkgtabs .pt small{color:var(--ink-3);font-size:12px;white-space:nowrap}
.pkgtabs .pt:hover{border-color:var(--accent)}
.pkgtabs .pt.on{border-color:var(--accent);background:var(--accent-wash);color:var(--ink)}
.pkgtabs .pt.on small{color:var(--ink-2)}

/* Номер документа комплекта: у каждой позиции свой, поэтому поля идут списком со значком. */
.pkgnums{display:grid;gap:10px;margin:14px 0 0}
.pkgnums .r{display:grid;grid-template-columns:22px minmax(0,1fr) 132px;gap:10px;align-items:center}
.pkgnums .r .nm{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px}
.pkgnums .r input{width:100%}
@media (max-width:560px){.pkgnums .r{grid-template-columns:22px minmax(0,1fr);grid-auto-rows:auto}
  .pkgnums .r input{grid-column:1 / -1}}

/* ---------- лента: свои блоки ---------- */
.pkg-err{border:1px solid #e0a29b;background:#fffafa;color:#c62d1f;border-radius:var(--r);
  padding:12px 14px;font-size:14px;margin:0 0 22px}
.pkg-hint{font-size:13px;color:var(--ink-2);margin:16px 0 0}
.pkg-link{border:none;background:none;padding:0;color:var(--accent);font-weight:600;text-decoration:underline}
.pkg-fin{border-top:1px solid var(--line-soft);padding-top:20px;margin-top:4px;max-width:520px}
.pkg-fin .b.main{width:100%}
.pkg-fin p{font-size:13px;line-height:1.5;color:var(--ink-2);margin:11px 0 0}
.pkg-empty{max-width:560px;margin:64px auto;padding:0 24px;text-align:center}
.pkg-empty h2{font-size:20px;margin:0 0 8px}
.pkg-empty p{color:var(--ink-2);margin:0 0 14px}

/* ответ «да/нет» в разделе состава: рамка-карточка от .ch, отметка нативная */
.pkg-ch{align-items:center;cursor:pointer}
.pkg-ch input{width:17px;height:17px;accent-color:var(--accent);flex:0 0 auto;margin:0}
.ch:has(input:checked){border-color:var(--accent);background:var(--accent-wash)}

/* ---------- сторона комплекта ---------- */
.pkg-party{border:1px solid var(--line);border-radius:var(--r);padding:16px 17px 18px;background:#fff}
.pkg-party + .pkg-party{margin-top:14px}
.pp-h{font-size:15px;font-weight:600;margin:0 0 13px}
.pkg-party .fields + .fields{margin-top:16px}
.pp-g{padding-top:15px;border-top:1px solid var(--line-soft)}
/* Селектор с тегом: `.f label{display:block}` выше по файлу той же специфичности и перебивал
   `display:flex` — флексбокса не было, `gap` не применялся, и текст стоял впритык к квадратику. */
.f label.pkg-chk,label.pkg-chk{display:flex;gap:10px;align-items:center;font-weight:600;font-size:15px;cursor:pointer;
  padding:11px 12px;border:1px solid var(--line);border-radius:var(--r);background:#fff;margin-bottom:0}
.pkg-chk input{width:17px;height:17px;accent-color:var(--accent);flex:0 0 auto;margin:0}
.pkg-chk>span{min-width:0}

/* Календарь у поля даты: системный date-picker лежит поверх кнопки и невидим, кнопка — только
   иконка. Так остаётся ручной ввод дд.мм.гггг (маска) и появляется выбор мышью, без библиотеки. */
.f .inline[data-datepick]{padding:0 11px;display:inline-flex;align-items:center;justify-content:center;color:var(--ink-2)}
.f .inline[data-datepick] svg.ic{width:18px;height:18px}
.f .row{position:relative}
.f input.dp-native{position:absolute;right:0;top:0;width:44px;height:42px;opacity:0;border:none;
  padding:0;background:none;pointer-events:none}

/* ================================================================
   Табличное поле мастера (repeater) — системное ТЗ §2.
   Строка = сетка ячеек; ширины колонок приходят из Blade одним
   значением в переменной --rp-cols. Именно переменной, а не
   инлайновым grid-template-columns: инлайновый стиль сильнее любого
   media-запроса, и на телефоне колонки остались бы прибитыми к
   десктопным долям — ровно та ошибка, из-за которой раньше «ехали»
   реквизиты сторон.
   ================================================================ */
.rp{display:grid;gap:10px}
.rp-rows{display:grid;gap:10px}
.rp-row{display:grid;grid-template-columns:26px 1fr 34px;align-items:start;gap:8px}
.rp-n{padding-top:30px;font-size:13px;color:var(--ink-3);text-align:right;font-variant-numeric:tabular-nums}
.rp-row.blank .rp-n{color:var(--line)}
.rp-cells{display:grid;gap:8px;min-width:0;grid-template-columns:var(--rp-cols,1fr)}
.rp-cell{min-width:0}
.rp-cell label{display:block;font-size:12px;font-weight:600;color:var(--ink-2);margin-bottom:5px}
/* Подпись колонки нужна один раз — над первой строкой. Дальше она превращается в шум и
   растит форму втрое, поэтому у остальных строк её прячем, оставляя в разметке для
   скринридера и для мобильной карточки, где строки идут одна под другой. */
.rp-row + .rp-row .rp-cell label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.rp-row + .rp-row .rp-n{padding-top:9px}
.rp-calc output{display:block;height:42px;line-height:42px;padding:0 12px;font-size:15px;
  border:1px solid var(--line);border-radius:var(--r);background:var(--accent-wash);
  color:var(--ink);text-align:right;font-variant-numeric:tabular-nums;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.rp-row.blank .rp-calc output{color:var(--ink-3)}
.rp-del{width:34px;height:42px;margin-top:30px;border:1px solid var(--line);border-radius:var(--r);
  background:#fff;color:var(--ink-3);font-size:19px;line-height:1;cursor:pointer;padding:0}
.rp-row + .rp-row .rp-del{margin-top:0}
.rp-del:hover:not(:disabled){border-color:#e0a29b;color:#c62d1f;background:#fffafa}
.rp-del:disabled{opacity:.35;cursor:default}
.rp-foot{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;
  padding-top:11px;border-top:1px solid var(--line-soft)}
.rp-add{height:38px;padding:0 15px;border:1px solid var(--line);border-radius:var(--r);background:#fff;
  font-size:14px;font-weight:600;color:var(--accent);cursor:pointer}
.rp-add:hover:not(:disabled){background:var(--accent-wash);border-color:var(--accent)}
.rp-add:disabled{color:var(--ink-3);cursor:default;font-weight:400}
.rp-tot{display:flex;flex-wrap:wrap;gap:16px;font-size:15px;font-weight:600;
  font-variant-numeric:tabular-nums;text-align:right}
.rp-tot span{display:inline-flex;gap:8px;align-items:baseline}
.rp-tot i{font-style:normal;font-weight:400;color:var(--ink-2)}
.rp-tot[hidden]{display:none}
.rp-empty{font-size:14px;color:var(--ink-2);padding:12px;border:1px dashed var(--line);border-radius:var(--r)}

/* Телефон: строка перестаёт быть строкой и становится карточкой — колонки в столбик,
   подписи возвращаются у каждой ячейки, номер строки уходит в шапку карточки. На 360px
   пять колонок в ряд нечитаемы при любой ширине шрифта. */
@media (max-width:560px){
  .rp-rows{gap:14px}
  .rp-row{grid-template-columns:1fr auto;gap:6px 10px;padding:12px;border:1px solid var(--line);
    border-radius:var(--r);background:#fff;align-items:center}
  .rp-n{grid-column:1;padding-top:0;text-align:left;font-weight:600;color:var(--ink-2)}
  .rp-n::before{content:'Строка '}
  .rp-cells{grid-column:1/-1;grid-template-columns:1fr;gap:10px}
  .rp-cell label,.rp-row + .rp-row .rp-cell label{position:static;width:auto;height:auto;clip:auto;
    overflow:visible;white-space:normal}
  .rp-del,.rp-row + .rp-row .rp-del{grid-column:2;grid-row:1;width:36px;height:36px;margin-top:0}
  .rp-row + .rp-row .rp-n{padding-top:0}
  .rp-foot{flex-direction:column;align-items:stretch}
  .rp-add{width:100%;height:44px}
  .rp-tot{justify-content:space-between}
}
/* §3.4 — широкая сетка бланка в предпросмотре мастера. */
.sheet table.doc-table-wide{font-size:.8em}
.sheet .doc-table-wide th{padding:1.6mm 1mm}
.sheet .doc-table-wide td{padding:2.2mm 1mm}

/* Подпись сервиса в самом документе («Примадок — конструктор правовых документов.») —
   она есть в скачанном файле, поэтому и на листе редактора должна выглядеть так же:
   мелко, курсивом, отбито от подписей сторон. */
.sheet .doc-disclaimer{margin-top:22px;font-size:12px;font-style:italic;color:#8a857d}

/* ── Русский календарь у полей даты (assets/datepicker.js) ───────────────────────────────
   Те же классы, что на страницах документа, но переменные редактора: у него своя палитра.
   Попап лежит в <body> и позиционируется fixed — иначе его срезал бы overflow колонки формы. */
.rudp{position:fixed;z-index:120;display:none;width:268px;padding:10px;background:#fff;
  border:1px solid var(--line);border-radius:var(--r);box-shadow:0 18px 40px -18px rgba(20,22,30,.45);
  font-family:var(--ui);font-size:14px;color:var(--ink)}
.rudp.on{display:block}
.rudp-h{display:flex;align-items:center;gap:6px;margin-bottom:8px}
.rudp-nav{flex:none;width:28px;height:28px;border:1px solid var(--line);background:#fff;border-radius:var(--r);
  color:var(--ink-2);font-size:16px;line-height:1;cursor:pointer}
.rudp-nav:hover{border-color:var(--accent);color:var(--accent)}
.rudp-m,.rudp-y{height:28px;min-width:0;border:1px solid var(--line);border-radius:var(--r);
  background:#fff;color:var(--ink);font-family:inherit;font-size:13.5px;padding:0 4px;cursor:pointer}
.rudp-m{flex:1}
.rudp-y{flex:none;width:72px}
.rudp-wd{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:4px;
  font-size:11.5px;font-weight:600;color:var(--ink-3);text-align:center}
.rudp-g{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.rudp-e{height:32px}
.rudp-d{height:32px;border:1px solid transparent;background:transparent;border-radius:var(--r);
  font-family:inherit;font-size:13.5px;color:var(--ink);cursor:pointer;font-variant-numeric:tabular-nums}
.rudp-d:hover{background:var(--tonal)}
/* Сегодня — обводкой, выбранное — заливкой: два разных факта, показывать их одинаково нельзя. */
.rudp-d.now{border-color:var(--accent);color:var(--accent);font-weight:700}
.rudp-d.on{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:700}
.rudp-f{display:flex;gap:6px;margin-top:8px;padding-top:8px;border-top:1px solid var(--line-soft)}
.rudp-b{flex:1;height:30px;border:1px solid var(--line);background:#fff;border-radius:var(--r);
  font-family:inherit;font-size:13px;color:var(--ink-2);cursor:pointer}
.rudp-b:hover{border-color:var(--accent);color:var(--accent)}
