/* Э3 «Версии валидаторов». Неймспейс .vcat-*, токены из tokens.css — экран должен
   выглядеть частью сервиса, а не отдельным инструментом. */

#vcatBody,#vldBody{--vcat-mono:ui-monospace,SFMono-Regular,"JetBrains Mono",Consolas,monospace}

.vcat-empty{padding:22px;color:var(--ink-soft);font-size:13px;text-align:center}
.vcat-muted{color:var(--ink-faint)}
.vcat-mono{font-family:var(--vcat-mono);font-size:12px}

/* ── панель фильтров ─────────────────────────────────── */
.vcat-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  padding:10px 14px;margin-bottom:10px;background:var(--card);
  border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow)}
.vcat-search{flex:1 1 260px;min-width:200px;padding:7px 11px;font:inherit;font-size:13px;
  border:1px solid var(--line-2);border-radius:8px;color:var(--ink);background:#fff}
.vcat-search:focus{outline:2px solid var(--accent-soft);border-color:var(--accent)}
.vcat-f{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--ink-soft);white-space:nowrap}
.vcat-f select{padding:6px 8px;font:inherit;font-size:12px;color:var(--ink);
  border:1px solid var(--line-2);border-radius:7px;background:#fff}
.vcat-count{margin-left:auto;order:0;font-size:12px;color:var(--ink-soft);
  font-variant-numeric:tabular-nums;white-space:nowrap}
/* «Показать все» и «развернуть всё» — действия, а не навигация: кнопка-ссылка */
.vcat-link{padding:5px 9px;font:inherit;font-size:12px;color:var(--accent);
  background:none;border:1px solid transparent;border-radius:7px;cursor:pointer;white-space:nowrap}
.vcat-link:hover{border-color:var(--accent);background:var(--accent-soft)}
.vcat-pager{display:flex;gap:4px}
.vcat-pager button{width:30px;height:30px;font-size:15px;line-height:1;color:var(--ink);
  background:#fff;border:1px solid var(--line-2);border-radius:7px;cursor:pointer}
.vcat-pager button:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}
.vcat-pager button:disabled{opacity:.4;cursor:default}

/* ── таблица ─────────────────────────────────────────── */
.vcat-scroll{overflow:auto;max-height:calc(100vh - 230px);
  background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow)}
.vcat-table{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}
.vcat-table th{position:sticky;top:0;z-index:2;text-align:left;white-space:nowrap;
  padding:9px 12px;font-family:var(--vcat-mono);font-size:11px;font-weight:500;
  color:var(--ink-soft);background:var(--bg);border-bottom:1px solid var(--line-2)}
.vcat-table td{padding:9px 12px;vertical-align:top;border-bottom:1px solid var(--line)}
.vcat-table tbody tr:hover td{background:#FAFBFD}
.vcat-table tbody tr:last-child td{border-bottom:none}

/* Первая колонка липкая: таблица шире экрана, и при горизонтальном скролле надо
   видеть, о каком валидаторе строка. Заголовок липкий по обеим осям — иначе на
   пересечении он проезжает под ячейками. */
.vcat-col-name{position:sticky;left:0;z-index:1;min-width:210px;max-width:280px;
  background:var(--card);box-shadow:1px 0 0 var(--line)}
.vcat-table tbody tr:hover .vcat-col-name{background:#FAFBFD}
.vcat-table th.vcat-col-name{z-index:3;background:var(--bg)}
/* Длинные названия не должны раздувать строку: две строки и многоточие. Клампить
   надо внутренний блок — на самой ячейке display:-webkit-box ломает table-cell, и
   текст режется по живому без многоточия. */
.vcat-name{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden;line-height:1.35;cursor:pointer}
/* раскрытие: по клику на строке или разом по кнопке «развернуть всё» */
.vcat-name.open,
.vcat-all-open .vcat-name{display:block;-webkit-line-clamp:unset}
.vcat-all-open .vcat-tip{display:block;color:var(--ink)}

.vcat-col-tip{min-width:260px;max-width:400px}
.vcat-col-cmt{min-width:120px;max-width:220px;color:var(--ink-soft);font-size:12px}
.vcat-col-use{min-width:230px}
.vcat-ver{color:var(--primary);font-weight:500}

/* тултип длинный: показываем три строки, по клику разворачиваем целиком */
.vcat-tip{white-space:pre-wrap;color:var(--ink-soft);font-size:12px;line-height:1.45;
  cursor:pointer;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.vcat-tip.open{display:block;color:var(--ink)}

.vcat-dep{display:inline-block;padding:2px 7px;font-size:11px;border-radius:10px;
  color:var(--rose);background:var(--rose-soft)}

/* ── где используется ────────────────────────────────── */
.vcat-use{padding:2px 8px;font:inherit;font-size:12px;color:var(--accent);
  background:var(--accent-soft);border:1px solid transparent;border-radius:10px;cursor:pointer}
.vcat-use:hover{border-color:var(--accent)}
.vcat-use b{font-variant-numeric:tabular-nums}
.vcat-chip{display:inline-block;margin-left:4px;padding:2px 7px;font-family:var(--vcat-mono);
  font-size:11px;color:var(--ink-soft);background:var(--bg);border-radius:10px}
.vcat-chip--more{color:var(--ink-faint)}

/* «нет данных» — не приговор, а честное незнание: подчёркиваем пунктиром, чтобы
   отличалось от «не проставлена», где ответ у нас есть */
.vcat-nodata{color:var(--ink-faint);border-bottom:1px dashed var(--line-2);cursor:help}

.vcat-stub td{background:#FFFCF5}
.vcat-stub:hover td{background:#FFF8EA}
.vcat-stubmark{display:inline-block;margin-top:4px;padding:1px 7px;font-size:11px;
  color:var(--amber);background:var(--amber-soft);border-radius:9px}

.vcat-stage{display:inline-block;padding:2px 8px;font-size:11px;border-radius:10px;
  color:var(--ink-soft);background:var(--bg);white-space:nowrap}
.vcat-stage--released{color:var(--green);background:var(--green-soft)}
.vcat-stage--merged{color:var(--amber);background:var(--amber-soft)}
.vcat-stage--draft{color:var(--ink-soft);background:var(--bg)}

/* ── панель «где используется» ───────────────────────── */
#vcatDrawer,#vldDrawer{position:fixed;top:0;right:0;bottom:0;width:min(460px,92vw);z-index:60;
  background:var(--card);border-left:1px solid var(--line);
  box-shadow:-18px 0 40px -24px rgba(16,24,40,.35);
  transform:translateX(100%);transition:transform .18s ease;display:flex;flex-direction:column}
#vcatDrawer.open,#vldDrawer.open{transform:none}
@media (prefers-reduced-motion:reduce){#vcatDrawer,#vldDrawer{transition:none}}
.vcat-drawer-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;
  padding:16px 18px;border-bottom:1px solid var(--line)}
.vcat-drawer-title{font-family:var(--vcat-mono);font-size:13px;color:var(--ink);word-break:break-all}
.vcat-drawer-sub{margin-top:4px;font-size:12px;color:var(--ink-soft)}
.vcat-drawer-body{overflow:auto;padding:12px 18px 24px}
.vcat-clinic{margin-bottom:14px}
.vcat-clinic-name{display:flex;align-items:center;gap:8px;margin-bottom:6px;
  font-family:var(--vcat-mono);font-size:12px;color:var(--ink)}
.vcat-clinic-name span{padding:1px 6px;font-size:11px;color:var(--ink-soft);
  background:var(--bg);border-radius:9px;font-variant-numeric:tabular-nums}
.vcat-slices{display:flex;flex-wrap:wrap;gap:5px}
.vcat-slice{padding:3px 8px;font-family:var(--vcat-mono);font-size:11px;
  color:var(--ink-soft);background:var(--bg);border-radius:9px}
.vcat-slice i{margin-left:5px;font-style:normal;color:var(--amber)}

/* ── форма правки в панели ───────────────────────────── */
.vcat-col-act{width:70px;white-space:nowrap}
.vcat-link--primary{color:var(--primary);font-weight:500}
.vcat-fld{display:block;margin-bottom:12px}
/* Форма «Валидаторы» (заход 201): скрытые поля внизу и настройка полей — одна для всех. */
/* Живая проверка формы валидатора (заход 202): что будет при сохранении — словами и цветом полосы. */
.vld-check{margin:4px 0 10px; padding:8px 10px; border-radius:8px; font-size:12.5px; line-height:1.45;
  border-left:3px solid var(--line-2); background:var(--bg); color:var(--ink)}
.vld-check--warn{border-left-color:var(--amber)}
.vld-check--bad{border-left-color:var(--rose); color:var(--rose)}
.vld-check--ok{border-left-color:var(--emerald,#2F6E56)}
.vcat-fld.vld-need input, .vcat-fld.vld-need select, .vcat-fld.vld-need textarea{border-color:var(--amber)}
.vld-more{margin:4px 0 12px; border-top:1px dashed var(--line); padding-top:8px}
.vld-more > summary{cursor:pointer; font-size:12.5px; color:var(--accent); margin-bottom:10px}
/* «Для каких специальностей» (заход 318): выбранные — чипами, добавить — своим списком с поиском. Подпись поля остаётся
   моноширинной, как у соседей; чипы и выбор — обычным шрифтом (у `.vcat-fld span` своё оформление подписи). */
.vld-forspec-chips{display:flex; flex-wrap:wrap; gap:6px; margin-bottom:6px}
.vld-forspec-chips > span{margin:0; font-family:inherit; font-size:12.5px}
.vld-forspec .vld-forspec-chip{display:inline-flex; align-items:center; gap:2px; padding:3px 3px 3px 10px;
  border-radius:20px; background:var(--accent-soft); color:var(--accent)}
.vld-forspec-x{border:0; background:none; color:inherit; cursor:pointer; font-size:15px; line-height:1;
  padding:1px 6px; border-radius:20px}
.vld-forspec-x:hover{background:#fff}
.vld-forspec .vpick span{margin:0; font-size:13px; color:inherit}
.vld-forspec .vpick .vpick-caret{color:var(--ink-soft); font-size:10px}
.vld-cfg-bar{display:flex; justify-content:flex-end; margin-bottom:6px}
.vld-cfg{border:1px solid var(--line); background:var(--bg); border-radius:10px; padding:10px 12px;
  margin-bottom:12px; font-size:12.5px}
.vld-cfg-head{color:var(--ink); margin-bottom:4px}
.vld-cfg-note{color:var(--ink-soft); margin-bottom:8px; line-height:1.45}
.vld-cfg-list{display:grid; grid-template-columns:repeat(auto-fill, minmax(190px, 1fr)); gap:4px 12px}
.vld-cfg-item{display:flex; gap:6px; align-items:center; font-family:var(--vcat-mono); font-size:11.5px;
  color:var(--ink)}
.vld-cfg-foot{display:flex; gap:10px; align-items:center; margin-top:10px; flex-wrap:wrap}
.vcat-fld span{display:block;margin-bottom:4px;font-family:var(--vcat-mono);
  font-size:11px;color:var(--ink-soft)}
.vcat-fld input,.vcat-fld textarea{width:100%;padding:7px 10px;font:inherit;font-size:13px;
  color:var(--ink);background:#fff;border:1px solid var(--line-2);border-radius:8px}
.vcat-fld textarea{font-size:12px;line-height:1.5;resize:vertical;white-space:pre-wrap}
/* Имя и тип версии — из «Валидаторов», не правятся (заход 301): текстом, а не погашенным полем ввода. */
.vcat-ro{padding:7px 10px;font-size:13px;line-height:1.45;color:var(--ink);background:var(--bg);
  border:1px dashed var(--line-2);border-radius:8px;white-space:pre-wrap;word-break:break-word}
.vcat-ro-note{margin:-4px 0 12px;font-size:11.5px;line-height:1.45;color:var(--ink-faint)}
/* Над описанием версии — «Вставить фразу ▾» и «Взять описание из версии…» (заход 303). Список фраз — свой, поверх формы. */
.vcat-tip-tools{display:flex;flex-wrap:wrap;align-items:center;gap:6px 14px;margin:0 0 6px}
.vcat-tip-tools > .vcat-link{padding:3px 0}
.vcat-phr{position:relative}
.vcat-phr > .vcat-link{padding:3px 0}
.vcat-phr-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:30;width:min(430px,78vw);max-height:340px;
  overflow:auto;padding:6px;background:var(--card);border:1px solid var(--line-2);border-radius:10px;
  box-shadow:0 6px 24px rgba(20,30,60,.14)}
.vcat-phr-item{display:flex;flex-direction:column;align-items:flex-start;gap:2px;width:100%;padding:7px 9px;
  font:inherit;font-size:12.5px;line-height:1.4;color:var(--ink);text-align:left;background:none;border:0;
  border-radius:7px;cursor:pointer}
.vcat-phr-item:hover,.vcat-phr-item:focus-visible{background:var(--accent-soft);outline:none}
.vcat-phr-uses{font-size:11px;color:var(--ink-faint);font-variant-numeric:tabular-nums}
.vcat-phr-empty{padding:8px 9px;font-size:12px;color:var(--ink-faint)}
.vcat-phr-edit{display:block;width:100%;margin-top:4px;padding:8px 9px 4px;font:inherit;font-size:12px;
  color:var(--primary);text-align:left;background:none;border:0;border-top:1px solid var(--line);cursor:pointer}
.vcat-phr-edit:hover,.vcat-phr-edit:focus-visible{text-decoration:underline;outline:none}
.vcat-from-ver,.vcat-phr-cfg{flex-basis:100%}
.vcat-from-ver{padding:8px 10px;background:var(--bg);border:1px solid var(--line);border-radius:8px}
.vcat-from-head{margin-bottom:6px;font-size:11.5px;color:var(--ink-soft)}
.vcat-from-choice{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;margin-top:6px;font-size:12px}
.vcat-from-choice:empty{display:none}
.vcat-phr-rows{display:flex;flex-direction:column;gap:6px;margin:8px 0}
.vcat-phr-row{display:flex;align-items:flex-start;gap:4px}
.vcat-phr-row textarea{flex:1;min-width:0;padding:6px 8px;font:inherit;font-size:12.5px;line-height:1.4;color:var(--ink);
  background:#fff;border:1px solid var(--line-2);border-radius:7px;resize:vertical}
.vcat-phr-row textarea:focus{outline:2px solid var(--accent-soft);border-color:var(--accent)}
.vcat-phr-row .vcat-link{padding:4px 6px}
.vcat-phr-row .vcat-link:disabled{opacity:.35;cursor:default}
.vcat-fld input:focus,.vcat-fld textarea:focus{outline:2px solid var(--accent-soft);
  border-color:var(--accent)}
.vcat-form-foot{display:flex;align-items:center;gap:12px;margin:14px 0 20px}
.vcat-btn{padding:8px 16px;font:inherit;font-size:13px;color:#fff;background:var(--primary);
  border:none;border-radius:8px;cursor:pointer}
.vcat-btn:hover{background:var(--primary-hover)}
/* ⚠️ Погашенная кнопка обязана ВЫГЛЯДЕТЬ погашенной. Она выглядела как обычная — тот же
   цвет, курсор-палец, полная непрозрачность, — и вся защита «нельзя нажать» была
   невидимой: человек жмёт и решает, что сломалось. На этом стоят четыре запрета:
   «выключить нельзя», «выберите версию», «отметьте специальности», «базовый набор так не
   правится» (найдено осмотром экрана, заход 96). */
.vcat-btn:disabled,.vcat-btn[disabled]{background:var(--line-2,#C9CED6);color:#fff;
  cursor:not-allowed;opacity:.75}
.vcat-btn:disabled:hover,.vcat-btn[disabled]:hover{background:var(--line-2,#C9CED6)}
.vcat-err{font-size:12px;color:var(--rose)}

.vcat-hist{border-top:1px solid var(--line);padding-top:14px}
.vcat-hist-title{margin-bottom:8px;font-size:12px;color:var(--ink-soft)}
.vcat-hist-row{padding:7px 0;border-bottom:1px solid var(--line)}
.vcat-hist-row:last-child{border-bottom:none}
.vcat-hist-meta{font-family:var(--vcat-mono);font-size:11px;color:var(--ink-faint)}
.vcat-hist-diff{margin-top:3px;font-size:12px;color:var(--ink-2);word-break:break-word}
.vcat-hist-diff s{color:var(--ink-faint)}

.vcat-viagraph{color:var(--accent-ink)}
.vcat-warn{margin:-6px 0 12px;padding:7px 10px;font-size:12px;color:var(--amber);
  background:var(--amber-soft);border-radius:8px}
.vcat-warn .vcat-link{padding:2px 6px;color:var(--amber)}
/* Код и имя используемой версии не меняются (заход 334): причина фактом и дорога — новая версия по образцу. */
.vcat-lock{margin:-4px 0 12px;padding:8px 10px;font-size:12px;line-height:1.5;color:var(--amber);
  background:var(--amber-soft);border-radius:8px}
.vcat-lock ul{margin:2px 0 6px;padding-left:16px}
.vcat-lock-btn{padding:4px 10px;font-size:12px;color:var(--ink);background:var(--card);
  border:1px solid var(--line-2);border-radius:7px}
/* Где стоит версия и «Перевести на другую версию…» (заход 335) — над списком клиник панели «где используется». */
.vcat-where{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;margin:0 18px;
  padding:8px 10px;font-size:12.5px;color:var(--ink-2);background:var(--bg);border-radius:8px}
.vcat-where b{font-weight:600;font-variant-numeric:tabular-nums}
.vcat-where-aside{display:block;margin-top:2px;font-size:11.5px;color:var(--ink-soft)}
/* Срез в выключенном столбце — бледнее и с пометкой «выкл.» (поправка 335): в выгрузку не идёт, перевод его не трогает. */
.vcat-slice--off{opacity:.6;text-decoration:line-through dotted}
/* Клиники окна перевода — галочками, число клеток справа. */
.vcat-move-list{max-height:180px;overflow:auto;padding:4px 8px;border:1px solid var(--line);border-radius:9px}
.vcat-move-row{display:flex;align-items:center;gap:8px;padding:4px 0;font-size:13px;cursor:pointer;
  border-bottom:1px solid var(--line)}
.vcat-move-row:last-child{border-bottom:none}
.vcat-move-row .vcat-muted{margin-left:auto;white-space:nowrap;font-variant-numeric:tabular-nums}
/* «Новая версия» окном поверх «Настроек клиник» (заход 334): поля формы — как в панели «Версий валидаторов». */
.vcat-win-form .vcat-fld:last-of-type{margin-bottom:0}
.vcat-fld select{width:100%;padding:7px 10px;font:inherit;font-size:13px;color:var(--ink);
  background:#fff;border:1px solid var(--line-2);border-radius:8px}

/* ── Э1 «Валидаторы» ─────────────────────────────────────
   Двадцать две колонки листа. Прятать их нельзя (три читает прод доквалидатора),
   поэтому таблица шире экрана и скроллится, а колонка кода липкая — при скролле
   должно быть видно, о каком валидаторе строка. Панель правки — та же, что у Э3. */
#vldDrawer{--vcat-mono:ui-monospace,SFMono-Regular,"JetBrains Mono",Consolas,monospace;
  width:min(560px,94vw)}

.vld-col-code{position:sticky;left:0;z-index:1;min-width:220px;max-width:260px;
  background:var(--card);box-shadow:1px 0 0 var(--line);word-break:break-all}
.vcat-table tbody tr:hover .vld-col-code{background:#FAFBFD}
.vcat-table th.vld-col-code{z-index:3;background:var(--bg)}

/* Ячейки листа бывают в абзац длиной. Две строки с многоточием, по клику —
   целиком: клампить надо внутренний блок, на table-cell это ломает раскладку. */
.vld-cell{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden;line-height:1.35;min-width:120px;max-width:280px;cursor:pointer;
  font-size:12px;color:var(--ink-2)}
.vld-cell.open{display:block;-webkit-line-clamp:unset;color:var(--ink)}

/* ── выбор колонок ──────────────────────────────────────
   Настройка, которую надо повторять после каждой перезагрузки, — не настройка,
   поэтому выбор живёт в localStorage. */
.vld-cols{position:relative}
/* привязка к правому краю: кнопка стоит в правой половине панели фильтров, и от
   левого края список уезжал за пределы экрана */
.vld-cols-panel{display:none;position:absolute;top:calc(100% + 6px);right:0;z-index:20;
  width:230px;max-height:340px;overflow:auto;padding:8px;background:var(--card);
  border:1px solid var(--line-2);border-radius:9px;box-shadow:0 6px 24px rgba(20,30,60,.13)}
.vld-cols-panel.open{display:block}
.vld-cols-head{display:flex;align-items:center;justify-content:space-between;gap:6px;
  margin-bottom:6px;padding-bottom:6px;font-size:11px;color:var(--ink-soft);
  border-bottom:1px solid var(--line)}
.vld-cols-row{display:flex;align-items:center;gap:7px;padding:3px 4px;border-radius:6px;
  font-family:var(--vcat-mono);font-size:11px;color:var(--ink-2);cursor:pointer}
.vld-cols-row:hover{background:var(--bg)}
.vld-cols-row input[disabled]{opacity:.45}

/* ── связи строки, в панели правки ──────────────────────
   Числа сами по себе шифр: «3 в. 255 ср.» не читается. Поэтому словами и с тем,
   чем это грозит, — предупреждение до правки лучше отказа после неё. */
.vld-ties{margin:-4px 0 14px;padding:10px 12px;font-size:12px;line-height:1.5;
  color:var(--ink-2);background:var(--amber-soft);border-radius:9px}
.vld-ties-head{color:var(--ink);margin-bottom:6px}
.vld-ties-list{margin:0 0 4px;padding-left:18px}
.vld-ties-list li{margin-bottom:5px}
.vld-ties code{font-family:var(--vcat-mono);font-size:11px}
.vld-ties .vcat-link{padding:2px 0;color:var(--amber)}

/* обязательное поле помечается, а не запрещается: у черновика пробелы штатны */
.vld-req{float:right;font-style:normal;font-size:10px;color:var(--amber);
  letter-spacing:.02em}
.vld-pair-own{padding-left:10px;border-left:2px solid var(--line-2)}

/* ── Э2 «Настройки клиник», срезы А и Б ────────────────────────
   Матричная часть листа. Два разных вида пустоты, и различать их обязательно:
   заштрихованная колонка — столбца в листе нет; «— пусто —» — столбец есть,
   значение не проставлено. Первое значит «здесь ничего не настраивали».

   Оформление у срезов общее намеренно: это один экран и одни и те же ячейки,
   просто повёрнутые другой стороной. Две таблицы, оформленные врозь, читались бы
   как два разных инструмента. */
#vmxBody{--vcat-mono:ui-monospace,SFMono-Regular,"JetBrains Mono",Consolas,monospace}

/* Переключатель проекции. Стоит первым в панели: он отвечает на вопрос «что я вообще
   сейчас вижу», и всё остальное в панели читается уже под этот ответ. */
.vmx-slices{display:inline-flex; gap:2px; padding:2px; background:var(--bg);
  border:1px solid var(--line); border-radius:9px}
.vmx-slice{padding:5px 11px; font:inherit; font-size:12px; color:var(--ink-soft);
  background:transparent; border:0; border-radius:7px; cursor:pointer; white-space:nowrap}
.vmx-slice:hover{color:var(--ink)}
.vmx-slice.on{background:var(--card); color:var(--ink); font-weight:600;
  box-shadow:0 1px 2px rgba(22,26,36,.08)}

/* Пометка «здесь правили». Маленькая и в углу: она сообщает о наличии истории, а не
   спорит за внимание со значением ячейки. */
.vmx-hist{margin-left:6px; padding:0 5px; min-width:16px; font:inherit; font-size:9.5px;
  line-height:14px; color:var(--primary); background:var(--accent-soft);
  border:0; border-radius:20px; cursor:pointer; vertical-align:2px}
.vmx-hist:hover{background:var(--primary); color:#fff}

/* Всплывашка истории у места клика — не модалка: вопрос мелкий, уводить внимание со
   всего экрана ради него незачем. */
.vmx-pop{position:fixed; z-index:90; min-width:260px; max-width:340px; max-height:320px;
  overflow:auto; padding:4px; background:var(--card); border:1px solid var(--line-2);
  border-radius:var(--radius); box-shadow:0 8px 26px rgba(22,26,36,.14)}
.vmx-pop-head{padding:7px 10px; font-family:var(--vcat-mono); font-size:11px;
  color:var(--ink); border-bottom:1px solid var(--line)}
.vmx-pop-head i{display:block; margin-top:2px; font-style:normal; font-size:10.5px;
  color:var(--ink-faint)}
.vmx-pop-row{padding:7px 10px; border-bottom:1px solid var(--line)}
.vmx-pop-row:last-child{border-bottom:none}
.vmx-pop-row--last{background:var(--accent-soft)}
.vmx-pop-when{font-size:10.5px; color:var(--ink-soft)}
.vmx-pop-what{margin-top:2px; font-family:var(--vcat-mono); font-size:11.5px;
  color:var(--ink-2); word-break:break-all}
.vmx-pop-what b{color:var(--ink)}
/* Фраза, а не код (заход 192): «Заведён вместе с клиникой…» не рвём посреди слова. */
.vmx-pop-what--text{font-family:inherit; word-break:normal}
/* Шапка словами (окно «Откуда специальность», заход 296): имя клиники и вкладки — не код. */
.vmx-pop-head--text{font-family:inherit; font-size:12px; font-weight:600}
.vmx-pop-sub{padding:6px 10px 2px; font-size:10px; letter-spacing:.04em; text-transform:uppercase;
  color:var(--ink-faint); border-bottom:1px solid var(--line)}

/* Срез В: шапка столбца и код строки — входы в операцию, поэтому кликабельны. */
.vmxv-head{cursor:pointer}
.vmxv-head:hover{color:var(--primary)}
.vmxv-name{margin-top:3px; font-size:11px; color:var(--ink-faint); line-height:1.3;
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden}

/* Кнопка операции в шапке столбца среза А. Выключенная остаётся видимой: исчезнувшая
   кнопка читается как «такого не бывает», а тут дело в снятом фильтре. */
.vmx-colop{display:block; margin-top:4px; padding:1px 7px; font:inherit; font-size:10px;
  font-style:normal; color:var(--primary); background:var(--accent-soft);
  border:0; border-radius:20px; cursor:pointer}
.vmx-colop:hover{background:var(--primary); color:#fff}
.vmx-colop--off{color:var(--ink-faint); background:var(--bg); cursor:help}

/* Многоточие в шапке столбца: действия редкие, а ширину отъедали постоянно. */
.vmx-head-line{display:flex; align-items:center; gap:2px}
.vmx-colmenu{flex:none; padding:0 3px; font:inherit; font-size:13px; line-height:13px;
  color:var(--ink-faint); background:transparent; border:0; border-radius:5px;
  cursor:pointer}
.vmx-colmenu:hover{color:var(--primary); background:var(--accent-soft)}
.vmx-menu{display:flex; flex-direction:column; min-width:250px}
.vmx-menu button{padding:9px 12px; font:inherit; font-size:12.5px; text-align:left;
  color:var(--ink); background:none; border:0; border-radius:7px; cursor:pointer}
.vmx-menu button:hover{background:var(--accent-soft); color:var(--primary)}
.vmx-menu-off{padding:9px 12px; font-size:12px; color:var(--ink-faint); cursor:help}

/* Шапка «только просмотр». Одна на все экраны каталога: экран, который молча не
   сохраняет, хуже экрана, который сразу сказал. */
.vcat-readonly{margin:0 0 12px; padding:9px 14px; font-size:12.5px; color:var(--amber);
  background:var(--amber-soft); border:1px solid var(--amber); border-radius:var(--radius)}

/* «Права доступа» */
#vaccBody{--vcat-mono:ui-monospace,SFMono-Regular,"JetBrains Mono",Consolas,monospace}
.vacc-login{font-size:11px; color:var(--ink-faint)}
.vacc-cap{display:inline-block; margin:0 5px 3px 0; padding:2px 9px; font-size:11px;
  color:var(--primary); background:var(--accent-soft); border-radius:20px}
.vacc-cap--cfg{color:var(--ink-soft); background:var(--bg); cursor:help}

/* ── «История правок»: операции каталога ──────────────────
   Экран минимальный намеренно: список и откат. Оформление общее с каталогом —
   это тот же инструмент, просто вид со стороны «что уже сделали». */
#vopsBody{--vcat-mono:ui-monospace,SFMono-Regular,"JetBrains Mono",Consolas,monospace}
.vops-note{flex:1; min-width:260px; font-size:12px; color:var(--ink-soft); line-height:1.45}
/* Что отобрано — словами над списком (заход 304): число на «Фильтры · 2» не говорит, что именно. */
.vops-picked{display:flex; flex-wrap:wrap; align-items:center; gap:6px 10px; margin:8px 0 0; padding:7px 12px;
  font-size:12.5px; color:var(--ink); background:var(--accent-soft); border-radius:8px}
.vops-picked .vcat-link{padding:2px 8px}
/* Низ окна «Откуда специальность» — дорога к правкам (заход 304). */
.vmx-pop-foot{padding:8px 10px 6px; border-top:1px solid var(--line); margin-top:4px; font-size:12px}
.vmx-pop-foot .vcat-link{padding:2px 0}
.vops-off{font-size:11.5px; color:var(--ink-faint); cursor:help}
.vops-link{margin-left:6px; font-style:normal; font-size:11px; color:var(--ink-faint)}
/* Лист клиники ушёл в архив или вернулся этой операцией (заход 257): последствие для экспертов клиники — заметно. */
.vops-sheet{margin-top:4px; font-size:11px; color:var(--warn, #B4690E)}
/* Обоснование заведения (заход 308): под «что» в «Истории правок», под «как появилась» в окне специальности,
   подсказка «не короче N знаков» под полем в окнах заведения. «Не записано» — тише: это факт, а не тревога. */
.vops-why, .vmx-pop-why{margin-top:4px; font-size:11.5px; line-height:1.4; color:var(--ink-2); white-space:normal}
.vops-why--none, .vmx-pop-why--none{color:var(--ink-faint); font-style:italic}
.rc-why-note{display:block; margin-top:3px; font-style:normal; font-size:11px; color:var(--ink-faint)}
.vops-undone td{color:var(--ink-faint)}
/* Причина отказа — до чисел и заметно: узнать о ней после сверки числа значит решить,
   что откат прошёл (заход 71). */
.vops-stop{margin:0 0 10px; padding:8px 10px; border-left:3px solid var(--rose);
  background:var(--rose-soft); color:var(--rose); font-size:13px; line-height:1.45}
.vops-row{cursor:pointer}
.vops-row:hover td{background:var(--bg)}
/* Строка с единственной записью не разворачивается — и не притворяется, что может. */
.vops-flat{cursor:default}
.vops-flat:hover td{background:transparent}
.vops-open td{background:var(--accent-soft)}
/* Подписки нет ни у кого — это задумано, а не сломано, поэтому подсказка, а не отказ
   (заход 80). Но сказать надо: иначе механизм молча мёртв. */
.vacc-quiet{margin:0 0 12px; padding:10px 12px; border-left:3px solid var(--accent);
  background:var(--accent-soft); font-size:13px; line-height:1.5; color:var(--ink-soft)}
.vacc-quiet b{color:var(--ink)}
.vacc-quiet code{font-size:12px}
/* Пришли по ссылке из уведомления: строка должна найтись глазами сразу, иначе экран
   отвечает «вот сто операций» на вопрос «покажи ту самую» (заход 79). */
.vops-focus td{box-shadow:inset 0 2px 0 var(--accent), inset 0 -2px 0 var(--accent)}
.vops-focus td:first-child{box-shadow:inset 2px 2px 0 var(--accent), inset 0 -2px 0 var(--accent)}
.vops-focus td:last-child{box-shadow:inset -2px 2px 0 var(--accent), inset 0 -2px 0 var(--accent)}
/* Строки одной правки — под названием экрана, где их видно (заход 338, вариант А заказчика 03.10.2026): одно действие
   пишет и каталог, и лист, и без названия строки читаются как записи одного журнала. Название — один раз на группу, со
   значком экрана из меню; **все группы одинаково, серым** (поправка 03.10 после показа: синий лист читался как акцент и как
   ссылка) — лист от каталога отличает сама строка, слова против кода. */
.vops-grp{margin:1px 0 3px; padding-left:8px; border-left:2px solid var(--line-2); border-radius:0}
.vops-grp + .vops-grp{margin-top:6px}
.vops-grp-name{display:flex; align-items:center; gap:4px; font-size:11px; line-height:1.3; color:var(--ink-soft)}
.vops-grp-ico{width:12px; height:12px; flex:0 0 auto}
.vops-line{margin-top:2px}
.vops-code{color:var(--ink-faint)}
.vops-col-change{min-width:280px; max-width:420px}
.vops-col-change .vcat-mono{font-size:11.5px; word-break:break-all}
.vops-more{margin-top:2px; font-size:11px; color:var(--ink-faint)}
/* «Показать ещё» под списком «Истории правок» (заход 315) — как у «Реестра обращений» (`.req-more`). */
.vops-page{display:flex; justify-content:center; align-items:center; gap:10px; padding:12px 0 16px}

/* Срез Б: клиника и кнопка правки в одной липкой колонке. Столбцов справа бывает
   257, и правка, уехавшая за край, — то же самое, что её отсутствие. */
.vmxb-col-clinic{min-width:190px; max-width:210px}
.vmxb-act{margin-top:4px; min-height:22px}
.vmxb-act .vmx-rowbtns{gap:5px}
.vmxb-act .vcat-err{display:block; width:100%; margin-top:3px; font-size:11px}

/* Код строки в срезе А — вход в срез Б. Выглядит как текст, а не как кнопка: это
   код, и он в первую очередь читается; подчёркивание появляется под курсором. */
.vmx-code{padding:0; font:inherit; font-family:var(--vcat-mono); color:inherit;
  text-align:left; background:none; border:0; cursor:pointer; word-break:break-all}
.vmx-code:hover{color:var(--primary); text-decoration:underline}

/* Поле выбора строки листа: код длинный, обрезать его нельзя — по нему и опознают. */
.vmxb-row{min-width:290px; padding:5px 9px; font:inherit; font-size:12px;
  font-family:var(--vcat-mono); color:var(--ink);
  background:var(--card); border:1px solid var(--line); border-radius:8px}
.vmxb-row:focus{outline:2px solid var(--accent-soft)}

/* Какие столбцы отвечают за срез — над таблицей, а не догадкой по данным. */
.vmx-source{display:flex; flex-wrap:wrap; align-items:center; gap:8px;
  padding:9px 14px; margin-bottom:10px; font-size:12px; color:var(--ink-soft);
  background:var(--card); border:1px solid var(--line); border-radius:var(--radius)}
.vmx-source b{font-family:var(--vcat-mono); font-size:11px; font-weight:500;
  color:var(--primary); padding:2px 8px; background:var(--accent-soft); border-radius:7px}
.vmx-source s{font-family:var(--vcat-mono); font-size:11px; text-decoration:none;
  color:var(--amber); padding:2px 8px; background:var(--amber-soft); border-radius:7px}
.vmx-source i{font-style:normal; color:var(--ink-faint)}

.vmx-col-code{position:sticky; left:0; z-index:1; min-width:230px; max-width:270px;
  background:var(--card); box-shadow:1px 0 0 var(--line); word-break:break-all}
.vcat-table tbody tr:hover .vmx-col-code{background:#FAFBFD}
.vcat-table th.vmx-col-code{z-index:3; background:var(--bg)}
.vmx-col-name{min-width:220px; max-width:320px}
.vmx-name{display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical;
  overflow:hidden; line-height:1.35; cursor:pointer; font-size:12px; color:var(--ink-2)}
.vmx-name.open{display:block; -webkit-line-clamp:unset; color:var(--ink)}
.vmx-col-act{min-width:170px; text-align:right}   /* «Сохранить» и «Отмена» — в одну строку (заход 305) */

/* столбца в листе нет — штриховка, чтобы не спутать с пустой ячейкой */
.vmx-nocol{background:repeating-linear-gradient(135deg,transparent,transparent 5px,
  var(--bg) 5px,var(--bg) 10px); color:var(--ink-faint); font-size:11px;
  text-align:center; font-style:italic}
.vmx-blank{color:var(--ink-faint)}
.vmx-on{color:var(--emerald,#2F6E56); font-weight:700}

.vmx-imp{display:inline-block; padding:2px 8px; border-radius:20px; font-size:11px;
  font-weight:600; background:var(--bg); color:var(--ink-2)}
.vmx-imp--CRITICAL{background:var(--rose-soft); color:var(--rose)}
.vmx-imp--high{background:var(--amber-soft); color:var(--amber)}

/* «Только новые» — свойство самой версии, поэтому стоит под ней, а не в строку с ней.
   Пометка отношения к базовой остаётся справа: она про сравнение, и в строку видно, с
   чем сравнили. */
.vmx-npo{display:block; margin:3px 0 0; width:max-content}
.vmx-npo,.vmx-elig{padding:1px 6px; font-style:normal;
  font-size:10px; border-radius:9px; background:var(--amber-soft); color:var(--amber)}
.vmx-elig{display:block; margin:4px 0 0; margin-left:0; width:max-content;
  background:var(--accent-soft); color:var(--primary)}

/* ── строка в режиме правки ───────────────────────────── */
.vmx-editing td{background:var(--accent-soft)}
.vmx-editing .vmx-col-code{background:var(--accent-soft)}
/* Список со свободным вводом и текстовое поле, которое его подменяет, — на вид одно
   и то же: подмена не должна выглядеть переходом в другой инструмент. */
.vcombo-own{width:100%; min-width:140px; padding:5px 8px; font:inherit; font-size:12px;
  color:var(--ink); background:var(--card); border:1px solid var(--primary);
  border-radius:7px}
.vcombo-own:focus{outline:2px solid var(--accent-soft)}
select.vmx-field{max-width:230px}

.vmx-field{width:100%; min-width:140px; padding:5px 8px; font:inherit;
  font-family:var(--vcat-mono); font-size:11.5px; color:var(--ink);
  background:#fff; border:1px solid var(--accent); border-radius:7px}
.vmx-field:focus{outline:2px solid var(--accent-soft)}
.vmx-sw{display:inline-flex; align-items:center; gap:5px; margin-top:5px;
  font-size:11px; color:var(--ink-soft); cursor:pointer}
.vmx-rowbtns{display:inline-flex; align-items:center; gap:6px; flex-wrap:wrap;
  justify-content:flex-end}
.vmx-btn{padding:5px 12px; font-size:12px}
/* На время правки строки — ширины столбцов прежние (заход 305): поля правки влезают в свою ячейку, а не раздвигают
   таблицу; «Сохранить» и «Отмена» — в одну строку, пустое место под ошибку строку не удлиняет. */
.vmx-table--frozen{table-layout:fixed}
.vmx-table--frozen .vmx-editing td:not(.vmx-col-act){overflow:hidden}
.vmx-table--frozen .vmx-editing .vmx-field,
.vmx-table--frozen .vmx-editing .vpick{width:100%; max-width:100%; min-width:0}
.vmx-table--frozen .vmx-editing .vpick-btn{min-width:0}
.vmx-editing .vmx-rowbtns{gap:4px}
.vmx-editing .vmx-rowbtns .vmx-btn{padding:5px 9px}
.vmx-editing .vmx-rowbtns .vcat-link{padding:4px 5px}
.vmx-rowbtns .vcat-err{flex-basis:100%}          /* отказ — своей строкой под кнопками */
.vmx-rowbtns .vcat-err:empty{display:none}
/* Занятая строка: имя вместо кнопки. Узнавать о занятости из отказа — поздно. */
.vmx-lock{display:inline-block; padding:2px 9px; font-size:11px; border-radius:20px;
  background:var(--amber-soft); color:var(--amber); white-space:nowrap}

/* ── общая панель фильтров и колонок (Э1, Э2, Э3) ─────────
   Кнопка со счётчиком активных фильтров: свёрнутая панель иначе прячет, что список
   уже отфильтрован, и человек ищет строку, которой в выборке нет. */
.vf{position:relative}
.vf-on{border-color:var(--accent); background:var(--accent-soft); font-weight:500}
.vf-panel{display:none; position:absolute; top:calc(100% + 6px); right:0; z-index:25;
  width:270px; max-height:380px; overflow:auto; padding:10px 12px;
  background:var(--card); border:1px solid var(--line-2); border-radius:10px;
  box-shadow:0 6px 24px rgba(20,30,60,.14)}
.vf-panel.open{display:block}
.vf-panel--cols{width:250px}
.vf-head{display:flex; align-items:center; justify-content:space-between; gap:8px;
  margin-bottom:8px; padding-bottom:7px; font-size:11px; color:var(--ink-soft);
  border-bottom:1px solid var(--line)}
.vf-head .vcat-link{padding:2px 6px}
.vf-head .vcat-link:disabled{opacity:.4; cursor:default; border-color:transparent;
  background:none}
.vf-fld{display:block; margin-bottom:9px}
.vf-fld span{display:block; margin-bottom:3px; font-size:11px; color:var(--ink-soft)}
.vf-fld select{width:100%; padding:6px 8px; font:inherit; font-size:12px;
  color:var(--ink); background:#fff; border:1px solid var(--line-2); border-radius:7px}
/* Длинный список в панели фильтра — с поиском (заход 301): версий 213, групп 19, клиник 28. */
.vf-find{display:flex; align-items:center; gap:8px; margin:0 0 6px}
.vf-find input{flex:1; min-width:0; padding:5px 8px; font:inherit; font-size:12px; color:var(--ink);
  background:#fff; border:1px solid var(--line-2); border-radius:7px}
.vf-find input:focus{outline:2px solid var(--accent-soft); border-color:var(--accent)}
.vf-found{font-size:11px; color:var(--ink-faint); white-space:nowrap; font-variant-numeric:tabular-nums}

/* После заведения и сохранения (заход 301): строка подсвечена и гаснет сама. Тень внутрь, а не фон: у липкой первой
   колонки свой непрозрачный фон, и прозрачным его оставлять нельзя. */
@keyframes vf-fresh{0%, 35%{box-shadow:inset 0 0 0 100vmax var(--accent-soft)}
  100%{box-shadow:inset 0 0 0 100vmax transparent}}
.vcat-table tbody tr.vf-fresh > td{animation:vf-fresh 6s ease-out backwards}
@media (prefers-reduced-motion: reduce){
  .vcat-table tbody tr.vf-fresh > td{animation:none; box-shadow:inset 0 0 0 100vmax var(--accent-soft)}
}
.vf-saved{display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin:8px 0 0; padding:8px 12px;
  font-size:12.5px; color:var(--ink); background:var(--accent-soft); border-radius:8px}
.vf-saved .vcat-link{padding:2px 8px}

.vf-col{display:flex; align-items:center; gap:7px; padding:3px 4px; border-radius:6px;
  font-family:var(--vcat-mono); font-size:11px; color:var(--ink-2); cursor:pointer}
.vf-col:hover{background:var(--bg)}
.vf-col input[disabled]{opacity:.45}

/* ── диалог массовых операций (Э2) ────────────────────────
   Обе операции трогают десятки и сотни ячеек. Сначала показываем, что произойдёт,
   и только потом применяем: правка вслепую по 33 тысячам настроек разбирается неделю. */
.vmx-modal-wrap{display:none; position:fixed; inset:0; z-index:80;
  align-items:center; justify-content:center; padding:24px;
  background:rgba(20,28,48,.34)}
.vmx-modal-wrap.open{display:flex}
.vmx-modal-wrap > *{--vcat-mono:ui-monospace,SFMono-Regular,"JetBrains Mono",Consolas,monospace}
.vmx-modal-wrap{flex-direction:column}
.vmx-modal-head,.vmx-modal-body,.vmx-modal-foot{width:min(520px,100%); background:var(--card)}
.vmx-modal-head{padding:15px 20px; font-size:15px; font-weight:600; color:var(--ink);
  border:1px solid var(--line-2); border-bottom:none; border-radius:14px 14px 0 0}
.vmx-modal-body{padding:16px 20px; display:flex; flex-direction:column; gap:12px;
  font-size:13.5px; color:var(--ink-2); border-left:1px solid var(--line-2);
  border-right:1px solid var(--line-2); max-height:60vh; overflow:auto}
.vmx-modal-foot{display:flex; align-items:center; gap:10px; padding:13px 20px;
  border:1px solid var(--line-2); border-top:1px solid var(--line);
  border-radius:0 0 14px 14px; background:var(--bg); flex-wrap:wrap}
/* Длинная причина отказа сжимала кнопку в столбик «Применить / 1 / изменение» (заход 327): кнопка — одной строкой,
   причина переносится ниже. */
.vmx-modal-foot .vcat-btn{white-space:nowrap; flex-shrink:0}
.vmx-rule{color:var(--ink-soft); font-size:12.5px; line-height:1.5}
.vmx-counts{display:flex; gap:18px; font-size:13px; flex-wrap:wrap}
.vmx-counts b{font-variant-numeric:tabular-nums}
.vmx-add{color:var(--emerald,#2F6E56)}
.vmx-rem{color:var(--rose)}
/* «Оставляем» и «своя версия» — не правка и не отказ, а третий ответ: строка входила
   в группу, но мы её не трогаем. Своим цветом, чтобы не читалась ни как плюс, ни как
   ошибка. */
.vmx-keep{color:var(--ink-soft)}
/* Охват: список специальностей клиники и разбивка операции по её срезам. */
.vmx-scope{display:grid; grid-template-columns:repeat(auto-fill, minmax(180px, 1fr));
  gap:2px 12px; max-height:150px; overflow:auto; padding:6px 8px;
  border:1px solid var(--line); border-radius:9px; font-size:12.5px}
.vmx-scope label{display:flex; gap:6px; align-items:center; cursor:pointer}
.vmx-scope label.hidden{display:none}
/* состояние дефекта у вкладки в выборе (заход 193): подпись справа, пустое действие — бледнее */
.rc-tab-state{margin-left:auto; padding-left:8px; font-size:11px; color:var(--ink-faint); white-space:nowrap}
.vmx-scope label.rc-tab-noop{opacity:.55; cursor:default}
/* поиск по списку специальностей: их 102, глазами такой список не читают (заход 95) */
.vmx-find{width:100%; box-sizing:border-box; margin-bottom:6px; padding:6px 10px;
  border:1px solid var(--line); border-radius:9px; font-family:inherit; font-size:12.5px}
.vmx-find:focus{outline:none; border-color:var(--accent)}
/* Разбивка предпросмотра по срезам — столбиком. ⚠️ Своё имя (заход 205): до того список звался
   `vmx-slices`, как переключатель «А · Б · В», и наследовал его `inline-flex` — семь
   специальностей вставали в ряд шире окна, и окно уезжало вбок. */
.vmx-byslice{border:1px solid var(--line); border-radius:9px; overflow:hidden;
  font-size:12px; max-height:190px; overflow-y:auto}
.vmx-byslice > div{display:flex; justify-content:space-between; gap:12px;
  padding:4px 10px; border-bottom:1px solid var(--line)}
.vmx-byslice > div:last-child{border-bottom:none}
.vmx-byslice span:first-child{font-family:var(--vcat-mono)}
.vmx-zero{color:var(--ink-faint)}
.vmx-nothing{padding:10px 12px; font-size:13px; color:var(--ink-soft);
  background:var(--bg); border-radius:9px}
.vmx-plan{border:1px solid var(--line); border-radius:9px; overflow:hidden;
  font-family:var(--vcat-mono); font-size:11px}
.vmx-plan > div{padding:6px 10px; border-bottom:1px solid var(--line)}
.vmx-plan > div:last-child{border-bottom:none}
.vmx-plan .vmx-add::before{content:"+ "}
.vmx-plan .vmx-rem::before{content:"− "}
.vmx-plan .vmx-keep::before{content:"= "}
.vmx-more{color:var(--ink-faint)}
.vmx-fld{display:block}
.vmx-fld span{display:block; margin-bottom:4px; font-family:var(--vcat-mono);
  font-size:11px; color:var(--ink-soft)}
.vmx-fld select{width:100%; padding:7px 10px; font:inherit; font-size:13px;
  color:var(--ink); background:#fff; border:1px solid var(--line-2); border-radius:8px}
/* Текстовые поля диалога — как селекты: одна форма на весь диалог (заход 67). */
.vmx-fld input[type=text], .vmx-fld input:not([type]){width:100%; padding:7px 10px;
  font:inherit; font-size:13px; color:var(--ink); background:#fff;
  border:1px solid var(--line-2); border-radius:8px}
/* Поле причины — той же формы (заход 245, находка заказчика): без своего правила `textarea` в пяти окнах
   была узкой и моноширинной — «Предложить правку», «Принять заявку», «Отклонить заявку», «Отклонить заявки»,
   «Закрыть заявку». */
.vmx-fld textarea{display:block; width:100%; padding:7px 10px; font:inherit; font-size:13px;
  line-height:1.45; color:var(--ink); background:#fff; border:1px solid var(--line-2);
  border-radius:8px; resize:vertical}
/* Поле-галочка: подпись СПРАВА от квадратика и обычным текстом, а не мелкой серой
   шапкой сверху, как у селектов (заход 133). Шапка отвечает на «что это за поле», а
   галочка — сама вопрос, и подпись к ней читают как продолжение фразы. */
.vmx-fld--check{display:flex; align-items:center; gap:8px; margin-top:10px}
.vmx-fld--check input{width:15px; height:15px; margin:0; accent-color:var(--primary)}
.vmx-fld--check span{margin:0; font-family:inherit; font-size:13px; color:var(--ink)}
.vmx-made{padding:10px 12px; font-family:var(--vcat-mono); font-size:11.5px;
  line-height:1.6; color:var(--primary); background:var(--accent-soft); border-radius:9px}
/* Фраза предпросмотра и списки вкладок — для людей, не моноширинным (заход 207): коды остаются
   моноширинными только там, где они коды. */
.vmx-made .vmx-say{font-family:'Inter',system-ui,sans-serif; font-size:13.5px; line-height:1.5;
  color:var(--ink); margin-bottom:4px}
.vmx-made .vmx-say b{font-weight:600}
.vmx-made .vmx-rule, .vmx-made .vmx-byslice{font-family:'Inter',system-ui,sans-serif}
.vmx-made .vmx-byslice span:first-child{font-family:inherit}
.vmx-made .vmx-byslice{margin-bottom:4px}
/* «нет столбца» в шапке среза — не сообщение, а вход в заведение */
.vmx-source s{cursor:pointer}
.vmx-source s:hover{background:var(--amber); color:#fff}

/* Панель прижата к правому краю кнопки; если та стоит у левого края экрана —
   переставляем, иначе выбрать в панели нельзя ничего (см. vfKeepOnScreen). */
.vf-panel--left{right:auto; left:0}

/* Отклонение от базовой версии. Помечаем меньшинство: с базовой совпадают 93% ячеек,
   и пометка на них была бы не подсветкой, а фоном. Цвет не трогаем — он занят
   значимостью, третья шкала сделает таблицу нечитаемой. */
.vmx-diff{display:inline-block; margin-left:6px; padding:1px 6px; font-style:normal;
  font-size:10px; border-radius:9px; background:var(--rose-soft); color:var(--rose);
  white-space:nowrap}
/* На листе версий меньшинство обратное: базовых 140 из 1048 — помечаем их. */
.vcat-base{display:inline-block; margin-left:6px; padding:1px 6px; font-style:normal;
  font-size:10px; border-radius:9px; background:var(--accent-soft); color:var(--primary)}

/* Переключатели показа в панели фильтров: они ничего не отбирают, поэтому отделены
   от фильтров и не идут в счётчик — иначе человек решит, что список сузился. */
.vf-sub{margin:10px 0 6px; padding-top:8px; font-size:11px; color:var(--ink-soft);
  border-top:1px solid var(--line)}
.vf-check{display:flex; align-items:center; gap:7px; padding:3px 4px; border-radius:6px;
  font-size:12px; color:var(--ink-2); cursor:pointer}
.vf-check:hover{background:var(--bg)}

/* Третье состояние: базы нет. Без него отсутствие пометки значило бы одновременно
   «совпадает» и «сравнивать не с чем». */
.vmx-nobase{display:inline-block; margin-left:6px; padding:1px 6px; font-style:normal;
  font-size:10px; border-radius:9px; background:var(--bg); color:var(--ink-faint);
  border:1px solid var(--line-2); white-space:nowrap}
.vmx-legend{font-style:normal; color:var(--ink-faint); font-size:11px}
/* Версия-черновик (С6.1, заход 206): ставить можно, но видно — янтарём, как «только новые»:
   не ошибка, а то, о чём надо знать. Пояснение выбранного черновика — строкой под полем. */
.vmx-draftver{display:inline-block; margin-left:6px; padding:1px 6px; font-style:normal;
  font-size:10px; border-radius:9px; background:var(--amber-soft); color:var(--amber);
  border:1px dashed var(--amber); white-space:nowrap}
.vcombo-note{display:block; margin-top:4px; font-size:11.5px; line-height:1.4; color:var(--amber);
  white-space:normal}
.vcombo-note:empty{display:none}

/* Множественный выбор: список галочек вместо выпадашки. Групп девятнадцать, поэтому
   у каждого поля свой скролл — иначе один длинный список утапливает остальные. */
.vf-opts{max-height:150px; overflow:auto; padding:4px 2px;
  border:1px solid var(--line-2); border-radius:7px; background:#fff}
.vf-opt{display:flex; align-items:flex-start; gap:7px; padding:3px 6px; border-radius:5px;
  font-size:12px; line-height:1.3; color:var(--ink-2); cursor:pointer}
.vf-opt:hover{background:var(--bg)}
.vf-opt input{margin-top:2px; flex:none}
/* Имя под кодом (заход 306, «Код дефекта»): код длиннее панели переносится где угодно, имя — второй строкой мельче. */
.vf-opt span{min-width:0; overflow-wrap:anywhere}
.vf-opts--sub{max-height:240px}
.vf-opt .vf-opt-sub{display:block; margin-top:1px; font-size:11px; line-height:1.3; color:var(--ink-faint);
  overflow-wrap:normal}

/* Вторая строка заголовка — специальность. `small` по умолчанию строчный, и без
   этого правила «validator_version» и «cardiologist» склеиваются в одно слово, а
   столбец становится вдвое шире нужного. */
.vcat-table th small{display:block; margin-top:2px; font-size:9.5px; font-weight:400;
  letter-spacing:0; color:var(--ink-faint); text-transform:none}

/* Столбцы сравниваемых специальностей: только показ, правится выбранная выше.
   Отделены линией и приглушены — иначе не отличить, где правишь, а где смотришь. */
.vmx-cmp{background:var(--bg); color:var(--ink-soft)}
.vmx-cmp-first{border-left:2px solid var(--line-2)}
.vcat-table th.vmx-cmp{background:var(--panel-2, var(--bg))}
/* Отличие от выбранной специальности — то, ради чего столбцы и ставят рядом. */
.vmx-cmp-off{color:var(--rose); background:var(--rose-soft)}

/* ── Столбец в подготовке: к доквалидатору не уходит (заход 178) ──────────────

   Помечаем ТРЕМЯ способами сразу, и это не излишество: слово читается без легенды и
   переживает печать, заливка видна при правке двухсотой строки, когда шапки уже нет на
   экране, а цвет связывает пометку с тем же янтарным, которым «подготовка» помечена на
   вкладках специальностей и на «Специальностях». Одной пометки не хватало: серая
   пометка среди сотни строк равна её отсутствию (заходы 45–46). */
.vcat-table th.vmx-draft{background:var(--amber-soft)}
/* ⚠️ Тон темнее токена `--amber`, и это замер, а не вкус: `--amber` на `--amber-soft`
   даёт контраст 4,42 — ниже порога 4,5 для мелкого текста, а слово набрано 9,5 px.
   Здесь 6,2. На белом фоне токен остаётся прежним (заход 166: слово, у которого не
   проверили вид, читается хуже, чем его отсутствие). */
.vmx-draft-word{display:block; margin-top:1px; font-size:9.5px; font-weight:600;
  color:#6E5410; letter-spacing:0; text-transform:none}
.vmx-table td.vmx-draft{background:#FDF7E7}
/* Ховер и правка сильнее заливки: они говорят «вот эта строка сейчас», и потерять их
   значило бы обменять работающее на новое. */
.vcat-table tbody tr:hover td.vmx-draft{background:#FAF2DE}
.vmx-editing td.vmx-draft{background:var(--accent-soft)}
/* Расхождение с выбранной специальностью тоже сильнее: это ответ на вопрос, ради
   которого столбец и поставили рядом. */
.vmx-cmp-off.vmx-draft{background:var(--rose-soft)}

/* Строка-итог над таблицей — тем же цветом, что и столбцы, о которых говорит. */
.vmx-source b.vmx-draft-note{background:var(--amber-soft); color:#6E5410;
  border:1px solid #E8CF86; border-radius:6px; padding:3px 9px; cursor:help}


/* ── Предпросмотр для человека (заход 52) ───────────────────────────────────

   Диалог показывал врачу поля модели: «в листе used → not_used · в каталоге 1 ·
   ALL_SPECIALTIES · base → — пусто —». Теперь подписи строит сервер, а экран их
   раскладывает: что делаем — крупно, две стороны правки — списком, коды — тише
   названий. Моноширинный шрифт снят: он превращает русскую фразу в лог.

   Коды остаются: разработчик их копирует. Меняется вес, а не состав. */
.rc-what{font-size:14px; font-weight:600; color:var(--ink); line-height:1.4}

/* Сводка листа согласования — НЕ `vmx-made`: та моноширинная и синяя, она сделана для
   технического разбора среза каталога и превращает русскую фразу в лог (заход 54). */
.rc-plan{display:flex; flex-direction:column; gap:10px}

/* Шапка сводки (заход 54): действие — крупно, под ним клиника и специальность. Врач
   решает «делать или нет», и три эти вещи и есть его решение. Разбор по ячейкам ушёл
   под «Подробно»: наверху он не помогал решать, а отнимал внимание. */
/* Выключаем — красным, включаем — зелёным, значимость — нейтрально (решение заказчика,
   заход 56). Цвет ничего не несёт в одиночку: слово «Выключаем» стоит на месте и без
   него, поэтому это подкрепление, а не носитель смысла. Красный тут значит «правило
   перестаёт работать», а не «ошибка». Тон приходит с сервера. */
.rc-head{padding:12px 14px; background:var(--accent-soft); border-radius:10px;
  border-left:3px solid transparent}
.rc-head.rc-tone-off{background:var(--rose-soft); border-left-color:var(--rose)}
.rc-head.rc-tone-off .rc-head-act{color:var(--rose)}
.rc-head.rc-tone-on{background:#E8F3EE; border-left-color:var(--emerald,#2F6E56)}
.rc-head.rc-tone-on .rc-head-act{color:var(--emerald,#2F6E56)}
b.rc-tone-off{color:var(--rose)}
b.rc-tone-on{color:var(--emerald,#2F6E56)}
.rc-cell.rc-tone-off{border-left:3px solid var(--rose)}
.rc-cell.rc-tone-on{border-left:3px solid var(--emerald,#2F6E56)}
.rc-cell.rc-tone-neutral{border-left:3px solid var(--accent)}
/* Полный охват — редкий случай и единственный, где слово «все» правда. */
.rc-all{font-weight:700}

/* Оговорки листа согласования — человеческий текст, а не моноширинный лог `vmx-plan`:
   тот сделан для разбора среза каталога и здесь читался как трассировка (заход 56). */
.rc-note{padding:9px 12px; border-radius:9px; font-size:12.5px; line-height:1.5}
.rc-note-warn{background:var(--amber-soft); color:var(--ink-2)}
.rc-note-stop{background:var(--rose-soft); color:var(--rose)}
.rc-head-act{font-size:16px; font-weight:700; color:var(--ink); line-height:1.25}
.rc-head-where{margin-top:3px; font-size:13.5px; color:var(--ink); font-weight:600}
/* Оговорка про охват — тише самого охвата: она объясняет, а не сообщает новое. */
.rc-head-note{margin-top:5px; font-size:12px; color:var(--ink-soft); line-height:1.4}
.rc-line{font-size:13.5px; color:var(--ink); line-height:1.5}
.rc-line b{font-weight:600}
.rc-line-soft{color:var(--ink-soft); font-size:12.5px}
/* Снимаем — значит красным: правило заказчика от 23.08.2026, одно на все диалоги. */
.rc-line.rc-tone-off{color:var(--rose)}

/* «Подробно» закрыто по умолчанию: это работа разработчика, а не врача. Открывается
   одним кликом и остаётся открытым на время диалога. */
.rc-more{border:1px solid var(--line); border-radius:10px; overflow:hidden}
.rc-more > summary{padding:8px 12px; font-size:12.5px; color:var(--ink-soft);
  cursor:pointer; user-select:none; background:var(--bg)}
.rc-more > summary:hover{color:var(--ink)}
.rc-more[open] > summary{border-bottom:1px solid var(--line)}
.rc-more .rc-cells{border:none; border-radius:0; max-height:180px}
.rc-more .rc-line{padding:8px 12px}

/* Кто просит: имя и в каком качестве, следом обоснование. Читают это первым — до
   того, как смотреть, что именно изменится. */
.rc-asked{padding:10px 13px; background:var(--bg); border-left:3px solid var(--line-2);
  border-radius:0 10px 10px 0}
.rc-asked-who{font-size:12.5px; font-weight:600; color:var(--ink)}
.rc-asked-why{margin-top:3px; font-size:13px; color:var(--ink-2); white-space:pre-wrap}
/* Ждущая заявка в диалоге правки — янтарная, как её чип в строке: один смысл, один
   цвет. Приписка под ней говорит, что с заявкой станет (заход 55). */
.rc-asked-live{border-left-color:var(--amber); background:var(--amber-soft)}
.rc-asked-note{margin-top:6px; font-size:12px; color:var(--ink-soft)}

.rc-cells{border:1px solid var(--line); border-radius:10px; overflow:hidden;
  max-height:210px; overflow-y:auto}
.rc-cell{padding:8px 12px; border-bottom:1px solid var(--line); font-size:12.5px}
.rc-cell:last-child{border-bottom:none}
.rc-cell-name{color:var(--ink); font-weight:600; line-height:1.35}
.rc-cell-sub{color:var(--ink-soft); font-size:11.5px; margin-top:2px; line-height:1.4}
.rc-cell.vmx-add{border-left:3px solid var(--emerald,#2F6E56)}
.rc-cell.vmx-keep{border-left:3px solid var(--line-2)}
.rc-cell.vmx-rem{border-left:3px solid var(--rose)}
.rc-code{font-family:var(--vcat-mono); font-size:10.5px; color:var(--ink-faint)}


/* ── Э5 «Очередь заявок» (заходы 49, 50) ────────────────────────────────────

   Вид взят у таблиц основного продукта: карточка на светлом фоне, крупная строка,
   значения-чипы вместо голого текста. Строк тут единицы, а не сотни, поэтому плотность
   выбрана в пользу читаемости — решение принимают по тексту обоснования, а его надо
   прочитать, а не разглядеть. */
.vq-card{background:var(--card); border:1px solid var(--line); border-radius:var(--radius);
  box-shadow:var(--shadow); padding:18px 20px}
.vq-bar{display:flex; gap:14px; align-items:center; flex-wrap:wrap; margin-bottom:16px}
.vq-count{color:var(--ink-soft); font-size:12.5px; margin-left:auto}
.vq-bar select{border:1px solid var(--line-2); border-radius:9px; padding:6px 10px;
  font:inherit; font-size:13px; color:var(--ink); background:var(--card)}

.vq-table{width:100%; border-collapse:separate; border-spacing:0; font-size:13px}
.vq-table th{text-align:left; font-size:11px; text-transform:uppercase; letter-spacing:.04em;
  color:var(--ink-faint); font-weight:700; padding:0 14px 10px; white-space:nowrap}
.vq-table td{padding:14px; border-top:1px solid var(--line); vertical-align:top;
  color:var(--ink); line-height:1.45}
.vq-table tbody tr:hover td{background:var(--bg)}
.vq-table tbody tr.on td{background:var(--accent-soft)}
.vq-pick{width:38px; padding-right:0}
.vq-pick input{width:15px; height:15px; accent-color:var(--accent); cursor:pointer}

.vq-name{font-weight:600}
/* Код — опознавательный знак разработчика, а решает врач: код тише названия. */
.vq-code{font-family:var(--vcat-mono); font-size:10.5px; color:var(--ink-faint); margin-top:3px}
.vq-why{max-width:420px; color:var(--ink-soft)}
/* «Решить…» у строки — под просьбой: действие относится к ней (заход 237) */
.vq-decide{display:block; margin-top:8px; padding:0; font-size:12.5px}
.vq-who{font-size:11px; color:var(--ink-faint); margin-top:4px}

/* Чип действия: «что просят» читается с одного взгляда, а не вычитывается. */
.vq-chip{display:inline-block; font-size:11.5px; font-weight:600; border-radius:20px;
  padding:3px 10px; white-space:nowrap}
.vq-chip-off{color:var(--rose); background:var(--rose-soft)}
.vq-chip-on{color:var(--green); background:var(--green-soft)}
.vq-chip-neutral{color:var(--accent); background:var(--accent-soft)}
.vq-clinic{display:inline-block; font-size:12px; font-weight:600; color:var(--ink);
  background:var(--bg); border:1px solid var(--line); border-radius:7px; padding:3px 9px;
  white-space:nowrap}

.vq-actions{display:flex; gap:14px; align-items:center; margin-top:16px; padding-top:14px;
  border-top:1px solid var(--line)}
.vq-actions .vmx-rule{margin-right:auto}
.vq-empty{padding:34px 10px; text-align:center; color:var(--ink-soft); font-size:13.5px}


/* ── Э6 «Готовность к релизу» (ADR 0031, заход 64) ──────────────────────────

   Экран отвечает на один вопрос и ничего не решает: числа, источники и адрес, куда
   идти чинить. Поэтому вердикта-плашки «можно выкатывать» здесь нет — есть два числа,
   которые нельзя сложить: «останавливает» и «посмотреть» это разные разговоры. */
.rck-wrap{display:flex; flex-direction:column; gap:18px}
.rck-head{background:var(--card); border:1px solid var(--line); border-radius:var(--radius);
  box-shadow:var(--shadow); padding:18px 20px; display:flex; flex-wrap:wrap;
  align-items:center; gap:14px 22px}
.rck-title{font-size:17px; font-weight:700; color:var(--ink)}
.rck-nums{display:flex; gap:18px; flex-wrap:wrap}
.rck-num{font-size:13px; color:var(--ink-soft)}
.rck-num b{font-size:20px; font-variant-numeric:tabular-nums; margin-right:5px}
.rck-rel{margin-left:auto; font-size:12.5px; color:var(--ink-soft);
  display:flex; align-items:center; gap:7px}
.rck-rel select{border:1px solid var(--line-2); border-radius:9px; padding:6px 10px;
  font:inherit; font-size:13px; color:var(--ink); background:var(--card)}
.rck-note{flex-basis:100%; font-size:12.5px; color:var(--ink-soft)}

/* Строгость — цветом полосы, а не фоном карточки: фон на четырёх карточках подряд
   превращает экран в светофор, где всё одинаково громко. */
/* Колонка не уже 340px: при 280 текст находки ломался по одному слову в строку —
   ссылка с `nowrap` рядом с ним отъедала всю ширину (заход 65). */
.rck-checks{display:grid; grid-template-columns:repeat(auto-fit, minmax(340px, 1fr)); gap:14px;
  align-items:start}
.rck-check{background:var(--card); border:1px solid var(--line);
  border-left:3px solid var(--line-2); border-radius:var(--radius); padding:14px 16px}
.rck-check.rck-bad{border-left-color:var(--rose)}
.rck-check.rck-warn{border-left-color:var(--amber)}
.rck-check.rck-ok{border-left-color:var(--emerald,#2F6E56)}
.rck-check-top{display:flex; align-items:baseline; gap:9px; flex-wrap:wrap}
.rck-check-n{font-size:22px; font-weight:700; font-variant-numeric:tabular-nums; color:var(--ink)}
.rck-check-t{font-size:13.5px; font-weight:600; color:var(--ink); flex:1; min-width:0}
.rck-check-sv{font-size:11px; text-transform:uppercase; letter-spacing:.04em; color:var(--ink-faint)}
.rck-bad .rck-check-n, .rck-bad .rck-check-sv{color:var(--rose)}
.rck-warn .rck-check-n, .rck-warn .rck-check-sv{color:var(--amber)}
.rck-ok .rck-check-n, .rck-ok .rck-check-sv{color:var(--emerald,#2F6E56)}
/* Источник — тише числа, но всегда виден: чужой факт и наш разного веса (ADR 0016). */
/* Что это — обычным текстом; чем грозит — тише, но рядом: число без последствия не
   помогает решить, выкатывать ли (заход 65). */
.rck-what{margin-top:8px; font-size:12.5px; color:var(--ink-2); line-height:1.5}
.rck-why{margin-top:5px; font-size:12.5px; color:var(--ink-soft); line-height:1.5}
.rck-findings{margin-top:10px; display:flex; flex-direction:column; gap:8px}
/* Находка — колонкой, а не строкой: число и текст сверху, примеры и ссылка ниже.
   Строкой ссылка с `nowrap` не оставляла тексту ширины. */
.rck-finding{display:flex; flex-direction:column; gap:5px; padding:9px 11px;
  background:var(--bg); border-radius:9px; font-size:12px; line-height:1.45}
.rck-finding-head{display:flex; gap:8px; align-items:baseline}
.rck-finding-n{font-weight:700; font-variant-numeric:tabular-nums; color:var(--ink)}
.rck-finding-t{flex:1; min-width:0; color:var(--ink-2)}
.rck-finding-s{font-family:var(--vcat-mono); font-size:10.5px; color:var(--ink-faint);
  word-break:break-word}
.rck-finding-go{font-size:11.5px}
.rck-check-src{margin-top:10px; padding-top:8px; border-top:1px solid var(--line);
  font-size:11.5px; color:var(--ink-faint); line-height:1.45}
.rck-go{color:var(--accent); text-decoration:none; white-space:nowrap; font-weight:600}
.rck-go:hover{text-decoration:underline}

.rck-going{background:var(--card); border:1px solid var(--line); border-radius:var(--radius);
  box-shadow:var(--shadow); padding:18px 20px}
.rck-going-h{font-size:14.5px; font-weight:600; color:var(--ink)}
.rck-going-h b{font-variant-numeric:tabular-nums}
.rck-going-sub{font-weight:400; font-size:12.5px; color:var(--ink-soft); margin-left:8px}
/* «Было → стало» по-человечески (заход 199). **Без рамки со своей прокруткой** — замечание
   заказчика 17.09.2026: список целиком на странице, а полоса с видом, фильтрами и числом
   прилипает под шапкой (60 px), чтобы при прокрутке длинного списка не терять, что показано.
   ⚠️ Только на просторном экране: в узком окне полоса в четыре строки занимала 240 px из 560 —
   прилипшей она закрывала половину списка (найдено осмотром, заход 199). */
.rck-going-top{display:flex; align-items:baseline; justify-content:space-between; gap:12px; flex-wrap:wrap}
/* «Уехало = забрано» (заход 213): полосой слева, как проверки выше, — повод посмотреть, а не ошибка. */
.rck-fetch{display:flex; flex-wrap:wrap; align-items:baseline; gap:4px 10px; margin-top:10px;
  padding:8px 12px; border-radius:8px; border-left:3px solid var(--line-2); background:var(--bg);
  font-size:13px; color:var(--ink)}
.rck-fetch.rck-ok{border-left-color:var(--emerald,#2F6E56)}
.rck-fetch.rck-warn{border-left-color:var(--amber)}
.rck-fetch-k{font-size:11px; letter-spacing:.06em; text-transform:uppercase; color:var(--ink-soft)}
.rck-fetch-rel{font-weight:600}
.rck-fetch-none .rck-fetch-t{color:var(--ink-soft)}
.rck-bar{background:var(--card); margin:14px -20px 0; padding:10px 20px;
  border-bottom:1px solid var(--line); display:flex; flex-direction:column; gap:8px}
@media (min-width: 1100px) and (min-height: 700px){
  .rck-bar{position:sticky; top:60px; z-index:4}
}
.rck-bar .vmx-slices{display:flex; flex-wrap:wrap; align-self:flex-start; max-width:100%}
.rck-filters{display:flex; flex-wrap:wrap; gap:8px; align-items:center}
.rck-filters select, .rck-filters input{border:1px solid var(--line-2); border-radius:8px;
  padding:5px 9px; font:inherit; font-size:12.5px; color:var(--ink); background:var(--card);
  max-width:280px; min-width:0}
.rck-bar .rck-cmp-total{margin-top:0}
.rck-list{margin-top:12px; display:flex; flex-direction:column; gap:10px}
.rck-group{border:1px solid var(--line); border-radius:10px}
.rck-group-h{display:flex; align-items:baseline; gap:8px; width:100%; text-align:left; border:none;
  background:var(--bg); border-radius:9px; padding:8px 12px; font:inherit; color:var(--ink); cursor:pointer}
.rck-group-h:focus-visible, .rck-tg:focus-visible{outline:2px solid var(--accent); outline-offset:2px}
.rck-arrow{color:var(--ink-soft); width:1em}
.rck-group-t{font-size:13.5px; font-weight:600}
.rck-group-n{margin-left:auto; font-size:12px; color:var(--ink-soft); font-variant-numeric:tabular-nums}
.rck-item{padding:7px 12px; border-top:1px solid var(--line); font-size:13px; color:var(--ink); line-height:1.45}
/* Стрелка — своей колонкой: во flex-переносе узкого окна она уезжала строкой выше текста. */
.rck-item-line{display:grid; grid-template-columns:1.3em minmax(0,1fr); column-gap:8px; align-items:baseline}
.rck-item-line > .rck-item-sub{grid-column:2}
.rck-item-t{min-width:0; overflow-wrap:anywhere}
.rck-item-t b{font-weight:600}
.rck-item-sub{font-size:12px; color:var(--ink-soft); overflow-wrap:anywhere}
.rck-tg{border:none; background:none; padding:0; width:1.3em; cursor:pointer; color:var(--accent); font:inherit}
.rck-tg-gap{display:inline-block; width:1.3em}
.rck-det{margin:6px 0 2px 1.9em; padding:8px 10px; background:var(--bg); border-radius:8px;
  display:flex; flex-direction:column; gap:5px; font-size:12px}
.rck-cell, .rck-defect{display:flex; gap:10px; flex-wrap:wrap; align-items:baseline}
.rck-defects{margin:4px 0 4px 1.9em; display:flex; flex-direction:column; gap:3px}
.rck-sub-h{padding:8px 12px 3px; border-top:1px solid var(--line); font-size:12px; font-weight:600;
  color:var(--ink-soft)}
.rck-where{color:var(--ink-soft)}
.rck-where-list{margin:2px 0 0 1.9em; font-size:12px; color:var(--ink-2)}
.rck-tech{margin-top:10px; font-size:12px; color:var(--ink-soft)}
/* Две секции «Было → стало» (заход 207): «В каталоге» — таблицей по листам выгрузки, «В настройках
   клиник» — со своей полосой видов. Заголовок секции — ступенью выше групп клиник. */
.rck-sum{margin-top:2px}
.rck-sec{margin-top:16px}
.rck-sec-h{display:flex; align-items:baseline; gap:10px; margin:0 0 8px; font-size:14px; font-weight:600;
  color:var(--ink)}
.rck-sec-n{font-size:12px; font-weight:400; color:var(--ink-soft); font-variant-numeric:tabular-nums}
.rck-cat{border:1px solid var(--line); border-radius:10px; overflow:hidden}
.rck-cat-row{display:grid; grid-template-columns:minmax(0,1.6fr) minmax(0,1fr) minmax(0,1.2fr);
  column-gap:12px; padding:8px 12px; border-top:1px solid var(--line); font-size:13px; line-height:1.45;
  align-items:start}
.rck-cat-head{border-top:none; background:var(--bg); font-size:12px; color:var(--ink-soft); padding:6px 12px}
.rck-cat-head span:first-child{padding-left:calc(1.3em + 8px)}
.rck-cat-code{display:block; font-size:10.5px}
.rck-cat-pill{display:inline-block; padding:1px 8px; border-radius:9px; font-size:12px;
  background:var(--bg); color:var(--ink-2); border:1px solid var(--line-2)}
.rck-cat-add{background:var(--green-soft); color:var(--green); border-color:transparent}
.rck-cat-rem{background:var(--rose-soft); color:var(--rose); border-color:transparent}
.rck-cat-chg{color:var(--amber)}
.rck-cat-pill.rck-cat-chg{background:var(--amber-soft); border-color:transparent}
.rck-cat-det{margin:0 12px 8px calc(12px + 1.9em)}
/* Узкое окно: колонки друг под другом, заголовки колонок не нужны — у ячеек свои слова. */
@media (max-width: 720px){
  .rck-cat-row{grid-template-columns:minmax(0,1fr); row-gap:4px}
  .rck-cat-head{display:none}
}
.rck-empty{margin-top:10px; font-size:13px; color:var(--ink-soft)}
/* «Было → стало» (заходы 196, 198) */
.rck-sides{display:grid; grid-template-columns:minmax(0,1fr) auto minmax(0,1fr); gap:10px;
  align-items:stretch; margin-top:12px}
.rck-side{position:relative; min-width:0; background:var(--bg); border:1px solid var(--line);
  border-radius:10px; padding:10px 12px; display:flex; flex-direction:column; gap:3px}
.rck-side-arrow{align-self:center; color:var(--ink-soft); font-size:18px}
.rck-side-k{font-size:11px; letter-spacing:.06em; text-transform:uppercase; color:var(--ink-soft)}
.rck-side-t{font-size:14px; font-weight:600; color:var(--ink); overflow-wrap:anywhere}
.rck-side-none{font-weight:400; color:var(--ink-soft)}
.rck-side-m{font-size:12.5px; color:var(--ink-soft); font-variant-numeric:tabular-nums}
.rck-side-c{font-size:12.5px; color:var(--ink); font-style:italic; overflow-wrap:anywhere}
.rck-side-why{font-size:12px; color:var(--ink-soft); margin-top:2px}
.rck-side-chosen{color:var(--accent); font-weight:600; margin-right:6px}
.rck-link{border:none; background:none; padding:0; font:inherit; color:var(--accent); cursor:pointer;
  text-decoration:underline; text-underline-offset:2px; text-align:left}
.rck-link:focus-visible, .rck-pop-row:focus-visible{outline:2px solid var(--accent); outline-offset:2px}
.rck-side-pick{align-self:flex-start; margin-top:6px}
.rck-pop{position:absolute; z-index:60; left:0; right:0; top:calc(100% + 6px); background:var(--card);
  border:1px solid var(--line-2); border-radius:10px; box-shadow:var(--shadow); padding:8px}
.rck-pop-q{width:100%; box-sizing:border-box; border:1px solid var(--line-2); border-radius:8px;
  padding:6px 10px; font:inherit; font-size:13px; color:var(--ink); background:var(--card)}
.rck-pop-list{margin-top:6px; max-height:300px; overflow:auto; display:flex; flex-direction:column; gap:2px}
.rck-pop-row{display:flex; flex-direction:column; gap:1px; text-align:left; border:none;
  background:none; border-radius:7px; padding:6px 8px; cursor:pointer; font:inherit; color:var(--ink)}
.rck-pop-row:hover{background:var(--bg)}
.rck-pop-row[aria-selected="true"]{background:var(--bg)}
.rck-pop-t{font-size:13px; font-weight:600; display:flex; gap:6px; align-items:baseline; flex-wrap:wrap}
.rck-pop-cur{color:var(--accent)}
.rck-pop-auto{font-size:11px; font-weight:500; color:var(--ink-soft); border:1px solid var(--line);
  border-radius:6px; padding:0 5px}
.rck-pop-m{font-size:12px; color:var(--ink-soft); font-variant-numeric:tabular-nums}
.rck-pop-c{font-size:12px; color:var(--ink); font-style:italic; overflow-wrap:anywhere}
.rck-pop-foot{margin-top:6px; font-size:11.5px; color:var(--ink-soft)}
@media (max-width: 720px){
  .rck-sides{grid-template-columns:minmax(0,1fr)}
  .rck-side-arrow{justify-self:center; transform:rotate(90deg)}
}
.rck-cmp-take{display:flex; flex-wrap:wrap; align-items:center; gap:8px; margin-top:12px}
.rck-cmp-comment{flex:1 1 240px; min-width:0; border:1px solid var(--line-2); border-radius:9px;
  padding:6px 10px; font:inherit; font-size:13px; color:var(--ink); background:var(--card)}
.rck-cmp-msg{font-size:12.5px; color:var(--ink-soft)}
.rck-cmp-total{margin-top:12px; font-size:13.5px; color:var(--ink)}
.rck-cmp-total b{font-variant-numeric:tabular-nums}

/* ═══ «Снимки каталога» (заход 210, план снимков — С2; таблицей — заход 211) ═══
   Таблица, а не карточки (предложение заказчика 19.09.2026): снимки сравнивают друг с другом по
   дате, виду, релизу — глазу нужны столбцы. Действия — под ⋮, строка — чтобы читать. Строка
   «каталог не менялся» — тихая, между снимками: она про паузу, а не про событие. */
.snp-box{background:var(--card); border:1px solid var(--line); border-radius:var(--radius);
  box-shadow:var(--shadow); padding:14px 16px 6px}
.snp-bar{display:flex; flex-wrap:wrap; align-items:center; gap:8px 14px; padding-bottom:10px}
.snp-bar2{padding-bottom:12px; border-bottom:1px solid var(--line)}
.snp-bar .vmx-slices{display:flex; flex-wrap:wrap; max-width:100%}
.snp-rel{display:flex; align-items:center; gap:6px; font-size:12.5px; color:var(--ink-soft); cursor:pointer}
.snp-q{flex:1 1 220px; min-width:0; border:1px solid var(--line-2); border-radius:9px;
  padding:6px 10px; font:inherit; font-size:13px; color:var(--ink); background:var(--card)}
.snp-period{display:flex; flex-wrap:wrap; align-items:center; gap:6px 8px; font-size:12.5px;
  color:var(--ink-soft)}
.snp-period-k{font-weight:600; color:var(--ink)}
.snp-period input[type="date"]{border:1px solid var(--line-2); border-radius:9px; padding:4px 8px;
  font:inherit; font-size:12.5px; color:var(--ink); background:var(--card)}
.snp-found{font-size:12.5px; color:var(--ink-soft); font-variant-numeric:tabular-nums; margin-left:auto}
.snp-take{flex-basis:100%; margin-top:0}
.snp-table-wrap{overflow-x:auto}
.snp-table{width:100%; border-collapse:collapse; font-size:13px; color:var(--ink)}
.snp-table th{position:sticky; top:0; z-index:1; background:var(--card); text-align:left;
  font-size:11.5px; font-weight:600; color:var(--ink-soft); padding:9px 8px;
  border-bottom:1px solid var(--line-2); white-space:nowrap}
.snp-table td{padding:9px 8px; border-bottom:1px solid var(--line); vertical-align:top}
.snp-sort{display:inline-flex; align-items:center; gap:4px; padding:0; border:0; background:none;
  font:inherit; color:inherit; cursor:pointer}
.snp-sort:hover, .snp-sort.on{color:var(--ink)}
.snp-sort:focus-visible, .snp-menu:focus-visible, .snp-pick:focus-visible{outline:2px solid var(--accent); outline-offset:2px}
.snp-arrow{font-size:11px; color:var(--ink-faint)}
.snp-sort.on .snp-arrow{color:var(--accent)}
.snp-c-pick{width:28px}
/* ⋮ прилипает к правому краю: на узком экране таблица едет вбок, а меню остаётся под рукой. */
.snp-c-menu{width:28px; text-align:right; position:sticky; right:0; background:var(--card)}
.snp-table th.snp-c-menu{z-index:2}
.snp-pick{width:16px; height:16px; margin:1px 0 0; accent-color:var(--accent); cursor:pointer}
.snp-tr:hover td{background:var(--bg)}
.snp-tr.snp-picked td{background:var(--bg)}
.snp-tr.snp-focus td{background:var(--accent-soft)}
.snp-date{white-space:nowrap; font-variant-numeric:tabular-nums}
/* «доквалидатор · тестовый» (заход 307): второй строкой, тише — не для релиза. */
.snp-who-note{display:block; margin-top:2px; font-size:11.5px; color:var(--ink-faint)}
.snp-rel-tag{white-space:nowrap; font-weight:600}
.snp-none{color:var(--ink-faint)}
.snp-changes{min-width:170px}
.snp-n{font-weight:700; color:var(--accent); text-decoration:none; font-variant-numeric:tabular-nums;
  margin-right:6px}
.snp-n:hover{text-decoration:underline}
.snp-words{font-size:12px; color:var(--ink-soft)}
.snp-comment{min-width:110px; max-width:300px; font-size:12.5px; overflow-wrap:anywhere}
.snp-more-note{font-size:12px; white-space:nowrap}
.snp-comment-all{margin:0; padding-left:0; list-style:none; display:flex; flex-direction:column; gap:4px}
.snp-note-meta{display:block; font-size:11px; color:var(--ink-soft)}
.snp-menu{font-size:16px; line-height:16px; padding:2px 6px}
.snp-sub td{background:var(--bg)}
.snp-note{margin-top:0}
.snp-quiet{padding:6px 8px; font-size:12px; color:var(--ink-soft); border-bottom:1px dashed var(--line);
  font-variant-numeric:tabular-nums}
.snp-sr{position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap}
.snp-more{padding:10px 6px; font-size:12.5px; color:var(--ink-soft); display:flex;
  align-items:center; gap:10px}
.vmx-menu a{padding:9px 12px; font-size:12.5px; color:var(--ink); text-decoration:none; border-radius:7px}
.vmx-menu a:hover, .vmx-menu a:focus-visible, .vmx-menu button:focus-visible{background:var(--accent-soft); color:var(--primary); outline:none}

/* ═══ Э7 «Перенос клиник» (заходы 87–88, ADR 0034) ═══
   Переход идёт по клиникам, и для запущенной истина — каталог. Слева список клиник,
   справа ОДНА таблица строк: заход 87 показывал корзины по восемь строк, и остальные
   924 нельзя было раскрыть. Выбор — нажатием на само значение, а не точкой в отдельном
   столбце: точку приходится расшифровывать, значение говорит само. */
.dr-wrap{display:grid; grid-template-columns:minmax(210px,260px) minmax(0,1fr); gap:18px}
@media (max-width:860px){.dr-wrap{grid-template-columns:1fr}}
.dr-side{display:flex; flex-direction:column; gap:3px; align-content:start}
.dr-side-h{font-size:11.5px; letter-spacing:.04em; text-transform:uppercase;
  color:var(--ink-faint); padding:10px 12px 4px}
.dr-side-h--muted{margin-top:8px; border-top:1px solid var(--line); padding-top:12px}
/* Два числа у клиники значат разное, и подписать их надо словами: цвет читают не все,
   а всплывающая подсказка не считается объяснением (заход 65). */
.dr-legend{font-size:11px; color:var(--ink-faint); line-height:1.7; padding:0 12px 8px}
.dr-legend .dr-badge{margin-right:3px}
.dr-legend .dr-badge + span{margin-left:8px}
.dr-clinic--on{background:var(--card); border-color:var(--line); font-weight:600}
.dr-side-h--warn{margin-top:8px; border-top:1px solid var(--line); padding-top:12px;
  color:var(--warn, #b26a00)}
/* Клиника, которую каталог знает, а листа нет: не выбирается — её заводят кнопкой. */
.dr-clinic--new{cursor:default; display:flex; align-items:center; gap:8px;
  justify-content:space-between}
.dr-clinic--new:hover{background:none}
.dr-clinic--off{cursor:default; color:var(--ink-faint)}
.dr-clinic--off:hover{background:none}
.dr-badge{font-size:11.5px; font-variant-numeric:tabular-nums; color:var(--accent);
  background:var(--accent-soft); border-radius:9px; padding:1px 7px; flex:0 0 auto}
.dr-badge--warn{color:var(--rose); background:var(--rose-soft)}
.dr-badge--ok{color:var(--ink-faint); background:var(--bg)}

.dr-main-h{display:flex; align-items:center; gap:10px; margin-bottom:14px}
.dr-main-h h3{margin:0; font-size:17px}

.dr-act{display:flex; align-items:center; flex-wrap:wrap; gap:12px; margin:6px 0 18px}
.dr-act-note{font-size:12px; color:var(--ink-faint)}

/* ═══ старое от «Разбора расхождений» (заход 72) — часть классов ещё в ходу ═══
   Образ заказчика — конфликт в гите: слева клиники, справа две стороны рядом и выбор.
   Три числа в шапке, потому что они про разное: спор, «решается не здесь» и то, что
   вовсе не спор. Смешать их значило бы выдать сотни ложных задач за работу. */
.dr-note{flex:1; min-width:280px; font-size:12.5px; color:var(--ink-soft); line-height:1.5}

.dr-totals{display:flex; flex-wrap:wrap; gap:12px; margin:14px 0}
.dr-total{flex:1; min-width:200px; background:var(--card); border:1px solid var(--line);
  border-radius:var(--radius); padding:14px 16px}
.dr-total b{display:block; font-size:26px; font-weight:700; line-height:1.1;
  font-variant-numeric:tabular-nums; color:var(--ink-soft)}
.dr-total span{display:block; font-size:13px; font-weight:600; color:var(--ink); margin-top:2px}
.dr-total i{display:block; font-style:normal; font-size:11.5px; color:var(--ink-faint);
  margin-top:5px; line-height:1.45}
.dr-total-main b{color:var(--accent)}
.dr-total-stop b{color:var(--rose)}

.dr-gap{margin:0 0 14px; padding:12px 16px; background:var(--bg);
  border:1px solid var(--line); border-radius:var(--radius);
  font-size:12.5px; color:var(--ink-soft); line-height:1.55}
.dr-gap div + div{margin-top:6px}

.dr-split{display:grid; grid-template-columns:minmax(200px,240px) minmax(0,1fr); gap:16px}
@media (max-width:860px){.dr-split{grid-template-columns:1fr}}

.dr-clinics{display:flex; flex-direction:column; gap:4px; align-content:start}
.dr-clinic{display:flex; justify-content:space-between; align-items:center; gap:10px;
  width:100%; text-align:left; font-family:inherit; font-size:13px; cursor:pointer;
  padding:9px 12px; border:1px solid transparent; border-radius:9px;
  background:none; color:var(--ink)}
.dr-clinic:hover{background:var(--bg)}
.dr-clinic.on{background:var(--card); border-color:var(--line); font-weight:600}
.dr-clinic-name{overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
  /* Шаблон в одном списке с клиниками — метка словом, а не цветом: цвет тут уже
     занят состояниями «сведена» и «решает человек» (заход 177).
     ⚠️ Метка идёт ПОД именем, а не рядом: в строке её не хватало места, и имя
     обрезалось до «Базов…» — поймано осмотром. Строка списка узкая, а название и
     состояние важнее метки. */
  .dr-clinic--tpl{flex-wrap:wrap}
  .dr-clinic--tpl .dr-clinic-name{flex:1 1 auto; min-width:0}
  .dr-tpl-mark{flex:0 0 100%; order:3; margin-top:2px; font-size:10.5px; font-weight:700;
    letter-spacing:.02em; text-transform:uppercase; color:#5F6773}
.dr-clinic-counts{display:flex; gap:6px; font-variant-numeric:tabular-nums}
.dr-n{color:var(--accent)}
.dr-n-stop{color:var(--rose)}
.dr-zero{color:var(--ink-faint); font-weight:400}
.dr-sep{font-style:normal; color:var(--ink-faint)}

.dr-rows-head{display:flex; justify-content:space-between; align-items:baseline;
  gap:12px; margin-bottom:10px; font-size:15px}
.dr-rows-head span{font-size:12.5px; color:var(--ink-soft)}

.dr-row{background:var(--card); border:1px solid var(--line); border-radius:var(--radius);
  padding:14px 16px; margin-bottom:10px}
.dr-row-quiet{background:var(--bg); box-shadow:none}
.dr-row-stop{border-color:var(--rose)}
.dr-row-head{display:flex; justify-content:space-between; gap:14px; align-items:flex-start}
.dr-row-name{font-size:14px; font-weight:600; line-height:1.35}
.dr-row-code{font-family:var(--vcat-mono); font-size:11px; color:var(--ink-faint); margin-top:2px}
.dr-row-what{font-size:11.5px; color:var(--ink-faint); white-space:nowrap}

/* Две стороны рядом — то самое «как в гите». Ровно две колонки: третьего источника
   правды нет, и место под него оставлять незачем. */
.dr-sides{display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-top:12px}
@media (max-width:560px){.dr-sides{grid-template-columns:1fr}}
.dr-side{display:flex; flex-direction:column; align-items:flex-start; gap:4px;
  background:var(--bg); border:1px solid var(--line); border-radius:9px; padding:10px 12px}
.dr-side-k{font-size:11px; letter-spacing:.03em; color:var(--ink-faint)}
.dr-side b{font-size:15px; font-weight:600; word-break:break-word}
/* Адрес обеих сторон на экране: «для какой специальности» — вопрос заказчика, и ответ
   на него «ни для какой отдельной» (заход 73). Мелко, но не спрятано. */
.dr-side-where{font-size:11px; color:var(--ink-faint); line-height:1.4}
/* Цвет значения — из признака с сервера, не из подписи. Три состояния, а не два:
   «не задана» это не «выключено». */
.dr-val-on{color:var(--green,#2F6E56)}
.dr-val-off{color:var(--rose)}
.dr-val-none{color:var(--ink-faint)}
/* Кнопка стоит под своей стороной и прижата к низу карточки: колонки бывают разной
   высоты, а кнопки должны стоять на одной линии. */
.dr-side .dr-choice{margin-top:auto; align-self:stretch; text-align:center}
.dr-sides{align-items:stretch}

.dr-talk{display:flex; flex-wrap:wrap; align-items:baseline; gap:10px; margin-top:12px;
  padding-top:10px; border-top:1px solid var(--line); font-size:12px}
.dr-talk a{color:var(--accent); text-decoration:none; font-weight:600}
.dr-talk a:hover{text-decoration:underline}
.dr-talk-n{color:var(--ink-faint)}

.dr-reason{margin-top:11px; font-size:12.5px; color:var(--ink-soft); line-height:1.5}
.dr-row-stop .dr-reason{color:var(--rose)}
.dr-choices{display:flex; flex-wrap:wrap; gap:8px; margin-top:13px}
.dr-choice{font-size:12.5px}

.dr-clean{background:var(--card); border:1px solid var(--line); border-radius:var(--radius);
  padding:20px; font-size:13.5px; color:var(--ink-soft)}
.dr-clean b{display:block; color:var(--ink); font-size:15px; margin-bottom:5px}

.dr-version{margin:0 0 14px; padding:12px 14px; background:var(--bg);
  border:1px solid var(--line); border-radius:9px}
.dr-version label{display:block; font-size:12px; color:var(--ink-soft)}
.dr-version select{display:block; width:100%; margin-top:5px; font-family:inherit;
  font-size:13px; padding:7px 9px; border:1px solid var(--line-2); border-radius:8px;
  background:#fff; color:var(--ink)}
.dr-version-why{margin-top:7px; font-size:11.5px; color:var(--ink-faint); line-height:1.45}



/* ── два блока: состояние и значимость ──
   Они про разное — «проверяется ли» и «насколько важен», — и в одной таблице сливались
   (заказчик, 26.08.2026). Своя карточка, свой счётчик, своя кнопка. */
.drt-block{background:var(--card); border:1px solid var(--line);
  border-radius:var(--radius); padding:14px 16px 4px; margin-bottom:14px}
.drt-block-h{display:flex; align-items:baseline; gap:10px}
.drt-block-h h4{margin:0; font-size:15px; color:var(--ink)}
.drt-block-n{font-size:15px; font-weight:700; font-variant-numeric:tabular-nums;
  color:var(--accent)}
.drt-block-todo{font-size:11.5px; font-weight:600; color:var(--rose);
  background:var(--rose-soft); border-radius:9px; padding:1px 8px}
.drt-block-note{font-size:12px; color:var(--ink-soft); line-height:1.5; margin:5px 0 12px}
.drt-block .drt{margin-bottom:0}
.drt-block .dr-act{margin:10px 0 12px}

/* ── таблица строк переноса (заход 88) ──
   Четыре колонки: что за дефект, про кого он, и две стороны рядом. Стороны подписаны
   в шапке — заказчик про первую редакцию: «не видно, где какая сторона». */
.drt{width:100%; border-collapse:collapse; font-size:13px; margin-bottom:6px}
.drt thead th{text-align:left; font-size:11.5px; letter-spacing:.03em;
  text-transform:uppercase; color:var(--ink-faint); font-weight:600;
  padding:0 10px 8px; border-bottom:1px solid var(--line-2); white-space:nowrap}
.drt th.drt-c, .drt td.drt-c{width:22%}
.drt tbody tr{border-bottom:1px solid var(--line)}
.drt tbody tr:hover{background:var(--card)}
.drt td{padding:5px 10px; vertical-align:middle}
.drt-name{color:var(--ink); line-height:1.35}
.drt-sp{color:var(--ink-soft); font-size:12px; white-space:nowrap}
.drt-r--todo .drt-name{font-weight:600}
.drt-why{display:block; font-style:normal; font-size:11.5px; color:var(--ink-faint);
  line-height:1.4; margin-top:2px}
/* Разбор группы значимости (заход 215): из чего сложился ответ каталога — по строке с её
   значением. Тише объяснения «почему нельзя», но той же семьи; строка во всю ширину —
   в колонке имени разбор рвался в столбик по одному-два слова. */
.drt-detail{display:block; font-style:normal; font-size:11.5px; color:var(--ink-soft);
  line-height:1.4; margin-top:2px}
/* Откуда значение листа (заход 291): факт одной строкой под именем. Принятая заявка клиники — цветом акцента: её при
   разборе ищут первой; наша правка — спокойнее; «следа нет» — тише всех, но не бледнее 4,5 контраста (урок захода 166). */
.drt-origin{display:block; font-size:11.5px; line-height:1.35; margin-top:2px; font-weight:400}
.drt-origin--clinic{color:var(--accent)}
.drt-origin--staff{color:var(--ink-soft)}
.drt-origin--none{color:var(--ink-soft); font-style:italic}
/* Старый сервис прятал принятое решение (заходы 288, 291) — янтарной чертой, как разговор со «Обсудить»: это повод
   посмотреть, а не отказ. */
.drt-old{display:block; font-style:normal; font-size:12px; line-height:1.4; margin-top:2px; color:var(--ink);
  padding:6px 10px; border-radius:8px; background:var(--amber-soft); border-left:3px solid var(--amber)}
.drt-filts{display:flex; flex-wrap:wrap; align-items:center; gap:6px 8px; margin:0 0 12px}
.drt-filts-k{font-size:12px; color:var(--ink-soft)}
.drt-filt{border:1px solid var(--line-2); background:var(--card); color:var(--ink); border-radius:999px;
  padding:3px 11px; font:inherit; font-size:12px; cursor:pointer}
.drt-filt b{font-variant-numeric:tabular-nums}
.drt-filt:hover:not(:disabled){border-color:var(--accent)}
.drt-filt.on{background:var(--accent); border-color:var(--accent); color:#fff}
.drt-filt:disabled{cursor:not-allowed; color:var(--ink-faint); opacity:.6}
.drt-filt:focus-visible{outline:2px solid var(--accent); outline-offset:2px}
.drt-note td{padding-top:0; border-top:0}
.drt-r--noted td{border-bottom:0}
/* Разговор, который жил состоянием листа (заход 216): выбор без умолчания прямо в строке. */
.drt-talk{display:flex; flex-wrap:wrap; align-items:center; gap:6px 10px; margin-top:4px;
  padding:8px 10px; border-radius:8px; background:var(--bg);
  border-left:3px solid var(--amber)}
.drt-talk-k{font-size:12px; color:var(--ink)}
.drt-mark{border:1px solid var(--line-2); background:var(--card); color:var(--accent);
  border-radius:8px; padding:3px 10px; font:inherit; font-size:12px; cursor:pointer}
.drt-mark:hover{border-color:var(--accent)}
.drt-mark.on{background:var(--accent); border-color:var(--accent); color:#fff}
.drt-topic{flex:1 1 260px; min-width:0; border:1px solid var(--line-2); border-radius:8px;
  padding:4px 9px; font:inherit; font-size:12.5px; color:var(--ink); background:var(--card)}
.drt-todo{display:inline-block; margin-left:8px; font-size:11px; font-weight:600;
  color:var(--rose); background:var(--rose-soft); border-radius:8px; padding:1px 7px}

/* Сторона — кнопка: её находят с клавиатуры, и это единственное действие в строке. */
.drt-side{display:block; width:100%; text-align:left; font-family:inherit;
  font-size:12.5px; line-height:1.3; cursor:pointer; padding:6px 10px;
  border:1px solid transparent; border-radius:8px; background:none; color:var(--ink-soft)}
.drt-side:hover{background:var(--bg); border-color:var(--line-2)}
.drt-side.on{background:var(--accent-soft); border-color:var(--accent);
  color:var(--ink); font-weight:600}
.drt-side--empty{font-style:italic; color:var(--ink-faint)}
/* Перечёркивать нельзя: зачёркнутое значение читается как «удалено», а тут оно просто
   не выбирается. Причина живёт строкой в самой таблице, а не во всплывашке. */
.drt-side--no{cursor:not-allowed; color:var(--ink-faint); opacity:.65}
.drt-side--no:hover{background:none; border-color:transparent}
.drt-tick{color:var(--accent); margin-right:5px}

.drt-bar{display:flex; flex-wrap:wrap; align-items:baseline; gap:10px 18px;
  margin:14px 0 10px}
.drt-check{font-size:12.5px; color:var(--ink); cursor:pointer; user-select:none}
.drt-check b{font-variant-numeric:tabular-nums; color:var(--rose)}
.drt-hint{font-size:12px; color:var(--ink-faint); flex:1; min-width:260px}
.drt-none{color:var(--ink-faint); font-style:normal; font-size:12.5px; padding:10px}
.drt-foot{font-size:12px; color:var(--ink-soft); line-height:1.55; margin:10px 0 0;
  padding-top:10px; border-top:1px solid var(--line)}

/* ── блок специальностей ── */
.drt-sp-block{background:var(--card); border:1px solid var(--line);
  border-radius:var(--radius); padding:10px 16px; margin-bottom:4px}
.drt-sp-block summary{cursor:pointer; font-size:13px; font-weight:600; color:var(--ink)}
.drt-sp-row{display:flex; flex-wrap:wrap; gap:8px 14px; align-items:baseline;
  margin-top:10px}
.drt-sp-lab{flex:0 0 210px; font-size:11.5px; letter-spacing:.03em;
  text-transform:uppercase; color:var(--ink-faint)}
.drt-chips{display:flex; flex-wrap:wrap; gap:5px; flex:1; min-width:220px}
.drt-chip{font-size:12px; border-radius:9px; padding:2px 8px; white-space:nowrap}
.drt-chip i{font-style:normal; color:var(--ink-faint); font-variant-numeric:tabular-nums}
.drt-chip b{color:var(--rose)}
.drt-chip--ok{background:var(--bg); color:var(--ink-soft)}
.drt-chip--go{background:var(--amber-soft); color:var(--amber)}
.drt-sp-warn{font-size:12.5px; color:var(--rose); line-height:1.5; margin:12px 0 0}
.drt-sp-note{font-size:12px; color:var(--ink-soft); line-height:1.55; margin:12px 0 2px}

/* Список специальностей в «+ Клиника» (заходы 169–170, замечания заказчика).

   ⚠️ **Две колонки, читать сверху вниз.** Сетка раскладывала по строкам, и
   «Акушер-гинеколог» с «Аллерголог-иммунологом» вставали рядом — глаз прыгал. Колонки
   строит разметка (`rcnPaintSpecs`), а не CSS: контейнер прокручивается, и высоту
   колонки заранее не знает никто.

   ⚠️ **Терапевт — строка над списком, а не его ячейка.** Он показ, а не выбор;
   объяснение ушло под «?», место отдано списку. */
.vmx-scope{display:block}
.vmx-scope label.rcn-common{display:flex;align-items:center;gap:6px;cursor:pointer;
  padding:2px 0 7px;margin-bottom:7px;border-bottom:1px solid var(--line);
  font-weight:600;position:sticky;top:-6px;background:var(--surface,#fff);z-index:1}
.vmx-scope label.rcn-common input{cursor:pointer}
.rcn-why{width:16px;height:16px;flex:0 0 auto;border-radius:50%;border:1px solid var(--line);
  background:var(--bg,#F3F4F6);color:var(--ink-soft);font-size:10.5px;font-weight:700;
  line-height:1;cursor:help;padding:0}
.rcn-why:hover{color:var(--ink);border-color:var(--ink-faint)}
.rcn-cols{display:grid;grid-template-columns:repeat(2, minmax(0, 1fr));gap:2px 12px}
.rcn-col{display:flex;flex-direction:column;gap:2px;min-width:0}
.rcn-col label{display:flex;gap:6px;align-items:center;cursor:pointer;min-width:0}
.rcn-col label span, .rcn-col label{overflow-wrap:anywhere}

/* ── «+ Клиника» в две колонки и весь справочник (заход 329, заказчик 01.10.2026) ──
   Было окно 520 px и список в 150 px — около шести строк из сотни. Слева — клиника, образец, расчёт, обоснование; справа —
   список на всю высоту окна (прокручивается только он). На узком экране колонки встают одна под другую. */
.vmx-modal-wrap .rcn-wide{width:min(960px,100%)}
.vmx-modal-wrap .rcn-body{display:grid; grid-template-columns:minmax(0,.85fr) minmax(0,1.15fr); gap:18px;
  height:min(78vh,760px); max-height:none; overflow:hidden}
.rcn-left{display:flex; flex-direction:column; gap:12px; min-height:0; overflow:auto; padding-right:4px}
.rcn-right{display:flex; flex-direction:column; min-height:0}
.rcn-specs-fld{display:flex; flex-direction:column; flex:1; min-height:0}
.rcn-cap{margin-bottom:4px; font-family:var(--vcat-mono); font-size:11px; color:var(--ink-soft)}
.rcn-cap b{font-family:inherit; color:var(--ink)}
.vmx-scope.rcn-scope{flex:1; min-height:0; max-height:none}
.rcn-chips{display:flex; flex-wrap:wrap; gap:4px; max-height:68px; overflow:auto; margin-bottom:6px}
.rcn-chips:empty{display:none}
.rcn-chip{display:inline-flex; align-items:center; gap:2px; padding:1px 2px 1px 8px; font-size:12px; color:var(--accent-ink);
  background:var(--accent-soft); border-radius:6px}
.rcn-chip--dv{color:var(--amber); background:var(--amber-soft)}
.rcn-chip button{padding:0 4px; font:inherit; font-size:14px; line-height:1; color:inherit; background:none; border:none;
  cursor:pointer}
.rcn-group{display:block; width:100%; margin:8px 0 4px; padding:2px 0 3px; font:inherit; font-size:11px;
  color:var(--ink-soft); text-align:left; background:none; border:none; border-bottom:1px solid var(--line)}
.rcn-cols + .rcn-group, .rcn-group:first-child{margin-top:2px}
.rcn-group--fold{color:var(--accent-ink); cursor:pointer}
.rcn-group--fold:hover{text-decoration:underline}
.rcn-groups{display:block}
.rcn-col label{align-items:flex-start; padding:1px 0}
.rcn-col label input{margin-top:3px; flex:0 0 auto}
.rcn-txt{min-width:0}
.rcn-code{display:block; font-family:var(--vcat-mono); font-size:10.5px; line-height:1.3; color:var(--ink-faint);
  overflow-wrap:anywhere}
/* Пометка «нет у доквалидатора» — словами, а не одним значком: подсказку при наведении в Safari и на тачпаде не увидеть. */
.rc-dv-mark, .vpick-mark{padding:0 5px; font-size:10.5px; color:var(--amber); background:var(--amber-soft); border-radius:4px;
  white-space:nowrap}
.vpick-group.vpick-group--fold{display:block; width:100%; padding:7px 9px; font:inherit; font-size:11.5px;
  letter-spacing:0; text-transform:none; text-align:left; color:var(--accent-ink); cursor:pointer; border:none;
  border-bottom:1px solid var(--line)}
.vpick-group--fold:hover{text-decoration:underline}
.rc-spec-pick .vpick{width:100%; max-width:440px}
.rc-spec-title{margin-bottom:4px; font-weight:600; color:var(--ink)}
@media (max-width:760px){
  .vmx-modal-wrap .rcn-body{display:flex; flex-direction:column; height:auto; max-height:80vh; overflow:auto}
  .rcn-left{overflow:visible}
  .vmx-scope.rcn-scope{max-height:50vh}
}

/* ── выбор версии (`vpick`, заход 299): свой список с поиском вместо системного — Safari не прячет строки `<select>` ── */
.vpick{display:block; max-width:260px}
.vpick--inline{max-width:none}
.vmx-fld .vpick{max-width:none}   /* в окне — во всю ширину, как соседние поля */
.vpick-btn{display:flex; align-items:center; gap:6px; width:100%; min-width:140px; padding:5px 8px; font:inherit;
  font-family:var(--vcat-mono); font-size:11.5px; color:var(--ink); background:#fff; border:1px solid var(--accent);
  border-radius:7px; cursor:pointer; text-align:left}
.vpick-btn:focus-visible{outline:2px solid var(--accent-soft)}
.vpick-btn-val{flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.vpick-btn-val i{font-style:normal; color:var(--ink-faint)}
.vpick-caret{color:var(--ink-soft); font-size:10px}
.vpick-pop{position:fixed; z-index:95; display:flex; flex-direction:column; gap:6px; padding:8px; background:var(--card);
  border:1px solid var(--line-2); border-radius:var(--radius); box-shadow:0 10px 30px rgba(22,26,36,.18)}
.vpick-find{width:100%; padding:6px 9px; font:inherit; font-size:12.5px; color:var(--ink); background:#fff;
  border:1px solid var(--line-2); border-radius:7px}
.vpick-find:focus{outline:2px solid var(--accent-soft); border-color:var(--accent)}
.vpick-list{display:flex; flex-direction:column; max-height:280px; overflow:auto; border:1px solid var(--line);
  border-radius:7px; background:#fff}
.vpick--inline .vpick-list{max-height:220px; margin-top:6px}
.vpick-item{display:flex; flex-wrap:wrap; align-items:baseline; gap:2px 8px; width:100%; padding:6px 9px; font:inherit;
  font-size:12px; color:var(--ink); background:none; border:none; border-bottom:1px solid var(--line); text-align:left;
  cursor:pointer}
.vpick-item:last-child{border-bottom:none}
.vpick-item:hover, .vpick-item.on{background:var(--accent-soft)}
.vpick-item:focus-visible{outline:2px solid var(--accent); outline-offset:-2px}
.vpick-v{font-family:var(--vcat-mono); font-size:11.5px; word-break:break-all}
.vpick-v mark, .vpick-note mark{background:var(--amber-soft); color:inherit; border-radius:2px}
.vpick-note{font-size:11px; color:var(--ink-soft)}
.vpick-item--svc i{font-style:normal; color:var(--ink-soft)}
/* «Завести новую версию…» — не версия, а дорога к ней (заход 334): отделён чертой и цвета ссылки. */
.vpick-item--new{border-top:1px solid var(--line)}
.vpick-item--new i{color:var(--primary)}
.vpick-now{padding:6px 9px; font-family:var(--vcat-mono); font-size:11.5px; background:var(--bg);
  border-bottom:1px solid var(--line)}
.vpick-now-w{margin-right:6px; font-family:inherit; font-size:10px; letter-spacing:.04em; text-transform:uppercase;
  color:var(--ink-faint)}
.vpick-group{padding:6px 9px 3px; font-size:10px; letter-spacing:.04em; text-transform:uppercase; color:var(--ink-faint);
  background:#fff; border-bottom:1px solid var(--line); position:sticky; top:0}
.vpick-empty{padding:8px 9px; font-size:12px; color:var(--ink-soft)}
.vpick-count{font-size:11px; color:var(--ink-soft)}
/* Выбор по названию, а не версии (клиника образца, заход 317): названия — обычным шрифтом, без переноса по буквам. */
.vpick-pop--names .vpick-v, .vpick-pop--names .vpick-now, .vpick--names .vpick-btn-val{font-family:inherit;
  font-size:12.5px; word-break:normal}

/* ── образец двумя полями и «Сделать как у…» (заход 317) ── */
.rc-src{display:grid; grid-template-columns:1fr 1fr; gap:10px}
.rc-src-f{display:flex; flex-direction:column; gap:4px; min-width:0}
.rc-src-w{font-size:12px; color:var(--ink-soft)}
.rc-src .vpick{max-width:none}
/* Оба поля — одной формы, как поля окон (`vmx-fld`): кнопка списка с поиском и обычный список рядом. */
.vpick--names .vpick-btn{font-family:inherit; font-size:13px; padding:7px 10px; border-color:var(--line-2);
  border-radius:8px}
.vpick--names .vpick-btn:focus{border-color:var(--accent)}
.rc-src-sel{width:100%; max-width:none; padding:7px 10px; font:inherit; font-size:13px; color:var(--ink);
  background:#fff; border:1px solid var(--line-2); border-radius:8px}
.rc-src-sel:disabled{color:var(--ink-faint); background:var(--bg)}
.rc-like-plan{display:flex; flex-direction:column; gap:8px}
@media (max-width:560px){.rc-src{grid-template-columns:1fr}}
#cfgAddSpec .rc-src{margin:8px 0 10px}
.rc-like-list{border:1px solid var(--line); border-radius:10px; overflow:hidden}
.rc-like-list > summary{padding:7px 12px; font-size:12.5px; color:var(--ink-2); cursor:pointer; user-select:none;
  background:var(--bg)}
.rc-like-list > summary:hover{color:var(--ink)}
.rc-like-list[open] > summary{border-bottom:1px solid var(--line)}
.rc-like-row{display:flex; justify-content:space-between; gap:12px; padding:5px 12px; font-size:12.5px;
  color:var(--ink); border-bottom:1px solid var(--line)}
.rc-like-row:last-child{border-bottom:none}
.rc-like-row i{font-style:normal; color:var(--ink-soft)}
.rc-like-was{color:var(--ink-soft); white-space:nowrap}
.spec-like-cell{white-space:nowrap}
/* «Решить заявку…» в окне правки на листе (заход 344): заявка шире правки — решают её целиком; рядом с главной кнопкой,
   белая, чтобы главной оставалась «Применить». */
.rc-solve{padding:7px 14px;font:inherit;font-size:13px;color:var(--ink);background:var(--card);border:1px solid var(--line-2);
  border-radius:8px;cursor:pointer}
.rc-solve:hover{border-color:var(--ink-soft)}
