/* Калька D-3 — ПРИМИТИВЫ: кнопка, поле, select, чекбокс/радио, бейдж,
   тег уверенности, таблица, фокус. Ред. 1 · 17.08.2026.
   Канон вёрстки — static/design/gd-styleguide.html (правки синхронизировать!),
   канон значений — gd-tokens.css. Ни одного hex вне комментариев.

   Файл грузится ТОЛЬКО при config.KALKA_ENABLED (templates/_kalka_css.html),
   ПОСЛЕ kalka-bridge.css. Два слоя:
   1) элемент-селекторы (button/input/select/textarea/th/td) — общий вид всей
      платформы; легаси-классы с большей специфичностью побеждают точечно —
      их цвета уже мостированы bridge'ем, расхождения добираются на D-хвосте;
   2) алиасы ходовых легаси-классов (.btn-*, .form-control) — чтобы вариант
      кнопки не выпадал из системы;
   3) новые примитивы с префиксом .gd-* (короткие имена стайлгайда .tag/.cb/
      .field заняты легаси — проверено грепом 2026-08-17: .tag в 5 файлах).

   Слово button в комментариях ниже = и <button>, и .btn-алиасы. */

/* ── фокус: единый видимый контур ─────────────────────────────────────── */
:focus-visible{outline:2px solid var(--gd-water);outline-offset:1px}

/* ── кнопки ───────────────────────────────────────────────────────────── */
button,.btn{
  font-family:var(--gd-mono);font-size:var(--gd-t-label);letter-spacing:.1em;
  text-transform:uppercase;background:transparent;
  border:1px solid var(--gd-edge);color:var(--gd-ink);
  border-radius:var(--gd-radius);cursor:pointer;box-shadow:none;
}
button:hover,.btn:hover{
  background:var(--gd-ink);color:var(--gd-paper);border-color:var(--gd-ink);
}
/* заливка тушью: главное действие */
button.primary,.btn-primary,.btn-success,.btn-info{
  background:var(--gd-ink);color:var(--gd-paper);border-color:var(--gd-ink);
}
button.primary:hover,.btn-primary:hover,.btn-success:hover,.btn-info:hover{
  background:transparent;color:var(--gd-ink);
}
/* тихая: вторичные действия */
button.quiet,.btn-secondary,.btn-ghost,.btn-outline,
.btn-outline-primary,.btn-outline-secondary{
  background:transparent;border-color:var(--gd-hair);color:var(--gd-muted);
}
button.quiet:hover,.btn-secondary:hover,.btn-ghost:hover,.btn-outline:hover,
.btn-outline-primary:hover,.btn-outline-secondary:hover{
  background:var(--gd-ink);border-color:var(--gd-ink);color:var(--gd-paper);
}
/* сурик: срочность/удаление (warning в Кальке = тот же сурик, см. bridge) */
button.danger,.btn-danger,.btn-warning,.btn-outline-danger{
  background:transparent;border-color:var(--gd-signal);color:var(--gd-signal);
}
button.danger:hover,.btn-danger:hover,.btn-warning:hover,.btn-outline-danger:hover{
  background:var(--gd-signal);border-color:var(--gd-signal);color:var(--gd-paper);
}
button:disabled,.btn:disabled,.btn.disabled{
  border-color:var(--gd-hair);color:var(--gd-hair);background:transparent;
  cursor:not-allowed;
}
button:disabled:hover,.btn:disabled:hover{background:transparent;color:var(--gd-hair)}

/* ── поля ввода ───────────────────────────────────────────────────────────
   width не трогаем — это раскладка, не кожа (легаси сам решает). */
input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="file"]):not([type="submit"]):not([type="button"]),
textarea,.form-control{
  font-family:var(--gd-serif);font-size:var(--gd-t-body);
  background:var(--gd-field);border:1px solid var(--gd-edge);
  color:var(--gd-ink);border-radius:var(--gd-radius);box-shadow:none;
}
select{
  font-family:var(--gd-mono);font-size:var(--gd-t-label);letter-spacing:.08em;
  text-transform:uppercase;background:var(--gd-field);
  border:1px solid var(--gd-edge);color:var(--gd-ink);
  border-radius:var(--gd-radius);
}
input::placeholder,textarea::placeholder{color:var(--gd-muted);opacity:1}
input:disabled,select:disabled,textarea:disabled,.form-control:disabled{
  border-color:var(--gd-hair);color:var(--gd-muted);cursor:not-allowed;
}
/* invalid: и живая валидация браузера, и явная разметка */
input:user-invalid,textarea:user-invalid,select:user-invalid,
input[aria-invalid="true"],textarea[aria-invalid="true"],
select[aria-invalid="true"],.is-invalid{
  border-color:var(--gd-signal);
}

/* ── чекбокс и радио ──────────────────────────────────────────────────────
   Чекбокс: заливка тушью. Радио: квадрат с точкой (скруглений нет по канону;
   различие состояний — заливка vs центр). */
input[type="checkbox"],input[type="radio"]{
  appearance:none;-webkit-appearance:none;width:14px;height:14px;
  flex:0 0 14px;border:1px solid var(--gd-ink);background:var(--gd-field);
  cursor:pointer;border-radius:0;vertical-align:middle;
}
input[type="checkbox"]:checked{background:var(--gd-ink)}
input[type="radio"]:checked{
  background:radial-gradient(circle,var(--gd-ink) 0 4px,transparent 4.5px);
}
input[type="checkbox"]:disabled,input[type="radio"]:disabled{
  border-color:var(--gd-hair);cursor:not-allowed;
}

/* ── подпись поля и ошибка (примитив формы) ─────────────────────────────── */
.gd-field{margin-bottom:var(--gd-s2)}
.gd-lbl{
  display:block;margin-bottom:3px;font-family:var(--gd-mono);
  font-size:var(--gd-t-label);letter-spacing:.12em;text-transform:uppercase;
  color:var(--gd-muted);
}
.gd-err{
  color:var(--gd-signal);font-family:var(--gd-mono);font-size:10px;
  letter-spacing:.05em;margin-top:3px;
}

/* ── бейдж ────────────────────────────────────────────────────────────── */
.gd-tag{
  display:inline-block;font-family:var(--gd-mono);font-size:9px;
  letter-spacing:.07em;text-transform:uppercase;color:var(--gd-muted);
  border:1px solid var(--gd-hair);padding:2px 5px;border-radius:0;
}
.gd-tag.now{color:var(--gd-signal);border-color:var(--gd-signal)}
.gd-tag.doc{color:var(--gd-water);border-color:var(--gd-water)}
.gd-tag.ink{color:var(--gd-paper);background:var(--gd-ink);border-color:var(--gd-ink)}

/* ── тег уверенности ──────────────────────────────────────────────────────
   ПЕРЕЕХАЛ в kalka-cards.css (26.08, B-05). Причина: этот файл грузится
   ТОЛЬКО при KALKA_ENABLED, а уверенность выводов показывается на обычных
   дашбордах. Оставленный здесь, .gd-conf был бы виден одному владельцу
   флага — то есть почти никому (#17). Второй копии не заводим. */

/* ── таблица ──────────────────────────────────────────────────────────── */
th{
  font-family:var(--gd-mono);font-size:9px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--gd-muted);text-align:left;
  border-bottom:1px solid var(--gd-ink);font-weight:400;
}
/* Высота строки — ИЗ ТОКЕНА, а не из содержимого. Это и есть D-10: без
   этой строки `--gd-row` (34/26/42px) не использовался в CSS НИ РАЗУ, и
   переключатель плотности менял только кегль в трёх местах. «Просторная»
   не делала вообще ничего. Замер до правки: normal 19px, dense 18px,
   loose 19px — то есть три режима давали два почти одинаковых результата.
   В табличной раскладке height у ячейки работает как МИНИМУМ: длинный
   текст по-прежнему растит строку. */
td{border-bottom:1px solid var(--gd-hair);font-size:var(--gd-t-small);
   height:var(--gd-row)}
td.n{font-family:var(--gd-mono);font-variant-numeric:tabular-nums;text-align:right}

/* ── скругления: «чертёж не имеет скруглений» ─────────────────────────────
   Токенные радиусы занулены bridge'ем; это правило гасит ЗАХАРДКОЖЕННЫЕ
   px-радиусы (3 239 мест в легаси-CSS и inline-стилях — им нужен
   !important). Файл живёт только под флагом — вне Кальки ничего не меняет.

   ИСКЛЮЧЕНИЕ (прод-скрин владельца 2026-08-17: «вместо кружков квадратное
   всё»): внутренности КАРТ — не интерфейс, а картография; кружок-маркер =
   условный знак, ему положено быть круглым. :not с комбинатором —
   Selectors 4, во всех целевых браузерах.

   Специфичность здесь несёт смысл, НЕ трогать бездумно:
   • это правило = (0,3,0) — три :not(.класс). Оно обязано давить легаси-
     !important-радиусы уровня (0,1,0)-(0,2,0) (16 живых: пилюли, карточки
     12-16px — проверено грепом 2026-08-17). :where()-обнуление НЕЛЬЗЯ —
     все 16 всплывут.
   • исключения ниже (спиннеры) паддятся до (0,4,0) фиктивным
     :not(.gd-void)×3 (.gd-void нигде не существует) — иначе при равном
     !important они проигрывают этой тройке (реальный дефект: фикстура
     показала спиннер 0px). Фикстура — /tmp/radius_check.py. */
*:not(.leaflet-container *):not(.maplibregl-map *):not(.mapboxgl-map *),
*:not(.leaflet-container *):not(.maplibregl-map *):not(.mapboxgl-map *)::before,
*:not(.leaflet-container *):not(.maplibregl-map *):not(.mapboxgl-map *)::after{
  border-radius:0 !important
}
/* Попапы карт — снова интерфейс: углы прямые, как у всех панелей.
   Паддинг до (0,4,0) и здесь: шаблонные <style> стоят ПОЗЖЕ наших ссылок
   и при равной (0,1,0) выигрывали бы порядком (живой случай:
   okc_public.html — попап 10px !important). */
:is(.leaflet-popup-content-wrapper,.leaflet-popup-tip,
    .maplibregl-popup-content,.mapboxgl-popup-content):not(.gd-void):not(.gd-void):not(.gd-void){
  border-radius:0 !important
}
/* Крутящиеся лоадеры обязаны быть кругами — вращающийся квадрат читается
   как поломка, а не как ожидание.
   Элементы: ЗАКРЫТЫЙ список спиннер-классов (полный грep-обход шаблонов/
   JS/CSS 2026-08-17). Широкий [class*="spin"] на элементах НЕЛЬЗЯ — он
   ловит и носителей состояния (.kb-card-btn.is-spinning — кнопка стала бы
   эллипсом). Псевдоэлементы: у spin-классов + перечисленных pseudo-лоадеров
   без spin в имени (.map-loading, .ed-btn[data-loading], .econ-check). */
[class*="spinner"]:not(.gd-void):not(.gd-void):not(.gd-void),
[class*="loader"]:not(.gd-void):not(.gd-void):not(.gd-void),
:is(.gc-spin,.av-spin,.sc-spin,.cpw-spin,.ap-spin,.aim-spin,.dw-spin,
    .animate-spin,.fa-spin,.spinner-grow):not(.gd-void):not(.gd-void):not(.gd-void),
/* Приборы орбиты Пульса — круглые бейджи-условные знаки, как маркеры карт
   (прод-скрин владельца 18.08: «остались квадраты у ролей»). */
:is(.role-orbit,.role-orbits-handle,.orbit-core__pulse,.worker-indicator):not(.gd-void):not(.gd-void):not(.gd-void),
[class*="spin"]:not(.gd-void):not(.gd-void):not(.gd-void)::before,
[class*="spin"]:not(.gd-void):not(.gd-void):not(.gd-void)::after,
:is(.map-loading,.ed-btn[data-loading],.econ-check.is-loading span):not(.gd-void):not(.gd-void):not(.gd-void)::before,
:is(.map-loading,.ed-btn[data-loading],.econ-check.is-loading span):not(.gd-void):not(.gd-void):not(.gd-void)::after{
  border-radius:50% !important
}

/* ── штамп (D-7): рамка-паспорт экрана, канон gd-styleguide ───────────── */
.gd-stamp{border:1px solid var(--gd-ink);background:var(--gd-field)}
.gd-stamp-top{display:flex;flex-wrap:wrap}
.gd-stamp-cell{padding:8px 12px;border-right:1px solid var(--gd-hair)}
.gd-stamp-cell:last-child{border-right:0}
.gd-stamp-grow{flex:1 1 auto}
.gd-stamp-title{font-size:var(--gd-t-h2);letter-spacing:-.01em}
.gd-stamp-num{font-family:var(--gd-mono);font-size:var(--gd-t-num);
  font-variant-numeric:tabular-nums;line-height:1}
.gd-stamp-num small{display:block;font-size:9px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--gd-muted)}
.gd-stamp-bar{display:flex;gap:8px;align-items:center;
  border-top:1px solid var(--gd-hair);padding:6px 12px}

/* ── экспликация (D-7): легенда-переключатели слоёв, канон .leg ────────── */
.gd-leg{display:flex;align-items:center;gap:8px;width:100%;padding:5px 4px;
  border:0;border-bottom:1px solid var(--gd-hair);background:transparent;
  text-align:left;cursor:pointer;font-family:var(--gd-serif);font-size:13px;
  text-transform:none;letter-spacing:0;color:var(--gd-ink)}
.gd-leg:hover{background:color-mix(in srgb,var(--gd-ink) 8%,transparent);
  color:var(--gd-ink)}
.gd-leg[aria-pressed="true"]{background:var(--gd-ink);color:var(--gd-paper)}
.gd-leg i{width:16px;height:16px;flex:0 0 16px;
  border:1px solid var(--gd-ink);display:block}
.gd-leg .c{margin-left:auto;font-family:var(--gd-mono);font-size:10px;
  color:var(--gd-muted)}
.gd-leg[aria-pressed="true"] .c,
.gd-leg[aria-pressed="true"] i{color:var(--gd-paper);
  border-color:var(--gd-paper)}

/* ── выбор плотности (D-10) ───────────────────────────────────────────────
   Живёт в настройках профиля, а не на каждом экране (ТЗ §5). Прежняя
   плавающая кнопка удалена: она прилипала к левому нижнему углу везде, где
   рядом не оказывалось переключателя темы, и висела там обрезанным чипом. */
.gd-density-set{display:flex;flex-direction:column;gap:6px}
.gd-density-opt{display:flex;align-items:baseline;gap:8px;cursor:pointer;
  padding:6px 8px;border:1px solid var(--gd-hair)}
.gd-density-opt:hover{background:var(--gd-field)}
.gd-density-opt__name{font-weight:500}
.gd-density-opt__hint{color:var(--gd-muted);font-size:var(--gd-t-small)}
.gd-density-off{color:var(--gd-muted);font-size:var(--gd-t-small);margin:0}

/* ── движение: только при разрешении пользователя ─────────────────────── */
@media (prefers-reduced-motion: no-preference){
  button,.btn{transition:background .12s ease,color .12s ease,border-color .12s ease}
}
