/* ===== 16-shared-form-faq.css ===== */
/* Общие правила формы заявки, дропзоны и блока вопросов.
   Раньше они лежали в постраничном 15-contacts-v3.css: пока весь CSS грузился
   на каждой странице, это работало, а после разделения по страницам форма и
   FAQ «разъезжались» на «Отраслях», «О компании» и Главной. Номер 16 выбран,
   чтобы порядок каскада относительно соседних файлов не изменился. */
/* Форма: поля 52px на десктопе, textarea и дропзона одной высоты */
@media (min-width: 768px) {
  body:not(.admin-body) .quote-form textarea {
    min-height: 132px;
    padding: 14px 16px;
    border-radius: 10px;
    font-size: 16px;
    line-height: 1.45;
  }
  body:not(.admin-body) .quote-form .file-dropzone {
    min-height: 132px;
    padding: 18px;
    border-radius: 10px;
  }}
body:not(.admin-body) .quote-form label {
  font-size: 14px;
  line-height: 1.3;
  font-weight: 600;
}
body:not(.admin-body) .quote-form .field-error {
  font-size: 13px;
  line-height: 1.35;
  margin-top: 6px;
}
body:not(.admin-body) .quote-form .has-error input,
body:not(.admin-body) .quote-form .has-error textarea { border-color: var(--color-error); }

/* Согласие: строка кликабельна целиком */
body:not(.admin-body) .quote-form .consent {
  /* Согласие — отдельной строкой над кнопкой (просьба 26.08.2026).
     Первая колонка по ширине чекбокса: при жёстких 22px он выходил
     за неё и наезжал на текст (просьба 28.08.2026) */
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: 10px;
  align-items: center;
  font-size: 12.5px;
  line-height: 1.4;
}
body:not(.admin-body) .quote-form .consent input[type="checkbox"] { margin-top: 0; cursor: pointer; }
body:not(.admin-body) .quote-form .consent label { cursor: pointer; font-weight: 400; }
/* Тач-цели ≥ 44px (третий аудит «Отраслей», Д5): подпись привязана к
   чекбоксу через for, поэтому строку целиком делаем зоной клика, а у
   ссылки на политику зону расширяет прозрачный падинг — визуально ничего
   не меняется */
body:not(.admin-body) .quote-form .consent label {
  padding-block: 10px;
  margin-block: -10px;
}
body:not(.admin-body) .quote-form .consent label a {
  position: relative;
  padding-block: 10px;
  margin-block: -10px;
}
body:not(.admin-body) .quote-form .consent-policy-note {
  margin-top: 8px;
  font-size: 13px;
  line-height: 1.4;
}

/* Дропзона: мобильный заголовок скрыт на десктопе */
body:not(.admin-body) .file-dropzone-title--mobile { display: none; }
/* FAQ: строки-карточки,
стрелка вращается */
body:not(.admin-body) .contact-faq-card.contact-faq-card.contact-faq-card { padding: 34px 32px 26px; border-radius: var(--radius-card); }
body:not(.admin-body) .contact-faq-list.contact-faq-list.contact-faq-list { display: grid; gap: 10px; }
body:not(.admin-body) .contact-faq-item.contact-faq-item.contact-faq-item {
  border: 1px solid var(--color-border);
  border-radius: var(--radius-control);
  background: #fff;
}
body:not(.admin-body) .contact-faq-item.contact-faq-item.contact-faq-item summary {
  min-height: 58px;
  padding: 16px 18px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  cursor: pointer;
  list-style: none;
}
body:not(.admin-body) .contact-faq-item.contact-faq-item.contact-faq-item summary::after {
  content: "";
  flex-shrink: 0;
  width: 16px;
  height: 16px;
  background: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center / contain no-repeat;
  transition: transform var(--mo-hover) ease;
}
body:not(.admin-body) .contact-faq-item.contact-faq-item.contact-faq-item[open] summary::after { transform: rotate(180deg); }
/* Аккордеон: ответ раскрывается плавно, в такт со стрелкой.
   height: auto не анимируется, а приём с grid-template-rows 0fr → 1fr тут
   схлопывается: у <p> нет опорной высоты, и fr-трек резолвится в ноль.
   Поэтому едет max-height, а точное значение подставляет JS в --faq-height
   (kabem.js, data-faq-single) — тогда закрытие анимируется так же, как
   раскрытие. Состоянием управляет класс: <details> прячет содержимое сам,
   минуя каскад, и перехода из display: none не бывает. Без JS остаётся
   обычное нативное поведение. Длительность — var(--mo-expand): токен был
   объявлен ровно под этот случай и ни разу не использовался. */
body:not(.admin-body) .contact-faq-item.contact-faq-item.contact-faq-item > p {
  padding: 0 18px 16px;
  margin: 0;
  overflow: hidden;
  max-height: var(--faq-height, none);
  transition: max-height var(--mo-expand) var(--mo-ease),
              padding-bottom var(--mo-expand) var(--mo-ease);
}

body:not(.admin-body) .contact-faq-item.contact-faq-item.contact-faq-item.is-collapsed > p {
  padding-bottom: 0;
  max-height: 0;
}

body:not(.admin-body) .contact-faq-item.contact-faq-item.contact-faq-item.is-collapsed summary::after {
  transform: none;
}

@media (prefers-reduced-motion: reduce) {
  body:not(.admin-body) .contact-faq-item.contact-faq-item.contact-faq-item > p {
    transition: none;
  }
}
@media (prefers-reduced-motion: reduce) {
body:not(.admin-body) .contact-faq-item.contact-faq-item.contact-faq-item summary::after { transition: none; }}

/* ============================================================
   МОБИЛЬНАЯ ВЕРСИЯ /contacts (≤767)
   ============================================================ */
@media (max-width: 767px) {

  /* Дропзона: без drag-and-drop текста */
  body:not(.admin-body) .file-dropzone-title { display: none; }
  body:not(.admin-body) .file-dropzone-title--mobile { display: block; }
  body:not(.admin-body) .file-dropzone-subtitle { display: none; }
  /* FAQ */
  body:not(.admin-body) .contact-faq-card.contact-faq-card.contact-faq-card { padding: 22px 20px; }
body:not(.admin-body) .contact-faq-title.contact-faq-title.contact-faq-title { font-size: 28px; line-height: 1.15; margin-bottom: 18px; }
body:not(.admin-body) .contact-faq-item.contact-faq-item.contact-faq-item summary {
    min-height: 54px;
    padding: 13px 14px;
    font-size: 15px;
    line-height: 1.3;
  }
body:not(.admin-body) .contact-faq-item.contact-faq-item.contact-faq-item > p { padding: 0 14px 14px; }}

/* Подсказки под полями */
body:not(.admin-body) .quote-form .field-hint {
  margin: 6px 0 0;
  font-size: 13px;
  line-height: 1.35;
  color: #5C6E84;
  font-weight: 400;
}

/* Согласие: обычное начертание, чекбокс по первой строке */
body:not(.admin-body) .quote-form .consent label {
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
}
body:not(.admin-body) .quote-form .consent input[type="checkbox"] { margin-top: 0; }
body:not(.admin-body) .quote-form .consent-policy-note {
  font-size: 13px;
  line-height: 1.45;
  color: #5C6E84;
}

/* Нижняя строка формы: кнопка + подпись рядом, email отдельной строкой */
body:not(.admin-body) .quote-form .quote-form-actions {
  display: block;
}
body:not(.admin-body) .quote-form .quote-form-actions-row {
  display: flex;
  align-items: center;
  gap: 20px;
  flex-wrap: wrap;
}
body:not(.admin-body) .quote-form .quote-form-actions-row .form-response-note { margin: 0; }
body:not(.admin-body) .quote-form .quote-direct-email { margin: 12px 0 0; }

/* FAQ: chevron 18px, hover и focus состояния */
body:not(.admin-body) .contact-faq-item.contact-faq-item.contact-faq-item summary::after {
  width: 18px;
  height: 18px;
}
body:not(.admin-body) .contact-faq-item.contact-faq-item.contact-faq-item summary:hover {
  color: #1870BD;
}
body:not(.admin-body) .contact-faq-item.contact-faq-item.contact-faq-item summary:focus-visible {
  outline: 2px solid #1675D1;
  outline-offset: 2px;
  border-radius: var(--radius-control);
}

/* Полезные карточки: одинаковая высота, отступ до FAQ */
@media (min-width: 768px) {
body:not(.admin-body) .contact-faq-section.contact-faq-section.contact-faq-section { padding-top: 56px; }}

/* Контакты: отступ FAQ → футер = 24px (как между полезными разделами и FAQ) */
body:not(.admin-body) section.section.section-compact.contact-faq-section.contact-faq-section.contact-faq-section {
  padding-bottom: 24px;
}

/* Индикатор отправки заявки (редакция 3, §4.9) */
body:not(.admin-body) .quote-upload-progress {
  flex-basis: 100%;
  margin: 10px 0 0;
  position: relative;
  font-size: 14px;
  line-height: 1.45;
  color: var(--color-text-muted);
}
/* Спиннер убран: состояние отправки показывает бегущая строка по кнопке
   (промпт 13.08.2026, Н8 и О6). Крутилка сообщала только «ждите». */

/* Кнопка в состоянии отправки: собственный текст скрыт, вместо него по
   кнопке идёт строка «Отправляем спецификацию · …». Один проход 2,4s. */
body:not(.admin-body) .quote-form .btn.is-sending.is-sending.is-sending {
  position: relative;
  overflow: hidden;
}

body:not(.admin-body) .quote-form .btn.is-sending.is-sending.is-sending::before {
  content: attr(data-sending-text);
  position: absolute;
  top: 50%;
  left: 0;
  white-space: nowrap;
  color: var(--color-text-invert);
  transform: translate(0, -50%);
  animation: mo-sending-marquee 2400ms linear infinite;
}

@keyframes mo-sending-marquee {
  from { transform: translate(0, -50%); }
  to { transform: translate(-50%, -50%); }
}

@media (prefers-reduced-motion: reduce) {
  body:not(.admin-body) .quote-form .btn.is-sending.is-sending.is-sending {
    color: var(--color-text-invert);
  }
  body:not(.admin-body) .quote-form .btn.is-sending.is-sending.is-sending::before {
    content: none;
  }
}

/* ============================================================
   Перенесено из 08-contacts.css (файл удалён: 98% правил не доживали
   до рендера, их перекрывал 09-design-system.css). Здесь — только живое.
   ============================================================ */
body:not(.admin-body) .contact-link-arrow {
  width: 16px;
  height: 16px;
  flex: 0 0 16px;
  display: inline-block;
  background: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'/%3E%3Cpolyline points='12 5 19 12 12 19'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'/%3E%3Cpolyline points='12 5 19 12 12 19'/%3E%3C/svg%3E") center / contain no-repeat;
  transition: transform var(--mo-hover) ease;
}
body:not(.admin-body) .contact-link-card:hover .contact-link-arrow { transform: translateX(3px); }

body:not(.admin-body) .contact-form-wrap {
  border-radius: var(--radius-card);
}

/* Печать страницы «Контакты»: остаются только реквизиты */
@media print {
  body:not(.admin-body) .contact-requisites-section { padding: 0; }}

/* Форма заявки на узких экранах: колонка грида не должна раздуваться
   по min-content — иначе поля вылезают за пределы .wrap. */
body:not(.admin-body) .quote-form {
  grid-template-columns: minmax(0, 1fr);
}
body:not(.admin-body) .quote-form .quote-grid {
  min-width: 0;
}

/* Поля формы не должны вылезать за контейнер на узких телефонах */
body:not(.admin-body) .quote-form input,
body:not(.admin-body) .quote-form textarea,
body:not(.admin-body) .quote-form select {
  max-width: 100%;
  box-sizing: border-box;
}

/* Скрытый file-input не должен участвовать в раскладке ни на одной странице:
   раньше он оставался шириной с контейнер и давал горизонтальный скролл */
body:not(.admin-body) .quote-form .file-dropzone input[type="file"] {
  position: absolute;
  width: 1px;
  height: 1px;
  min-height: 0;
  padding: 0;
  border: 0;
  clip-path: inset(50%);
  overflow: hidden;
  white-space: nowrap;
}

/* ============================================================
   Мобильные «Контакты», доработка 11.08.2026 (список из 10 пунктов)
   ============================================================ */
@media (max-width: 767px) {

  /* 10. Шапка после скролла ниже — экран отдаёт меньше места навигации */
  body:not(.admin-body) .site-header .header-inner {
    /* высота переключается без перехода — см. 05-header-motion.css */
  }
  body:not(.admin-body) .site-header.is-compact .header-inner {
    min-height: 56px;
  }
  body:not(.admin-body) .site-header.is-compact .brand-logo {
    transform: scale(0.76);
  }}

/* Подпись группы полей — справа от заголовка, в одной строке с ним */
body:not(.admin-body) .quote-grid > .quote-group-head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  column-gap: 12px;
  row-gap: 2px;
}
body:not(.admin-body) .quote-grid > .quote-group-head > .quote-group-title,
body:not(.admin-body) .quote-grid > .quote-group-head > .quote-group-note {
  margin: 0;
  max-width: none;
}

/* Сводка ошибок: только проявление, без движения — это текст, который
   человек читает, он не должен ехать. Место под неё заранее НЕ резервируем:
   пустой блок висел на всех страницах с формой и удлинял её. Сдвига макета
   это не даёт: сводка появляется в ответ на нажатие, а сдвиги после действия
   пользователя в CLS не попадают. */
body:not(.admin-body) .quote-validation-summary {
  animation: quote-summary-in var(--mo-micro) var(--mo-ease) both;
}

@keyframes quote-summary-in {
  from { opacity: 0; }
  to { opacity: 1; }
}

@media (prefers-reduced-motion: reduce) {
  body:not(.admin-body) .quote-validation-summary {
    animation: none;
  }
}

/* ============================================================
   Правила формы, снятые со страниц «Контакты» и «Заявка» (13.08.2026).
   Форма одна на 16 страниц, а её вид задавали постраничные файлы 15 и 23 —
   поэтому на «Отраслях», Главной и остальных она была крупнее эталона.
   Привязка .pages.contacts/.pages.quote снята, правила общие.
   ============================================================

/* Согласие: обычное начертание (перебивает жирные label формы) */ body:not(.admin-body) .quote-form .consent label, body:not(.admin-body) .quote-form .consent label, body:not(.admin-body).pages.complex_supply .quote-form .consent label {
  font-weight: 400 !important;
  font-size: 14px;
}
body:not(.admin-body) .quote-form label .label-hint {
  display: block;
  font-size: 13px;
  font-weight: 400;
  color: var(--color-text-muted);
  margin-top: 2px;
}
/* Согласие: фирменный чекбокс */ body:not(.admin-body) .quote-form .consent input[type="checkbox"] {
  appearance: none;
  -webkit-appearance: none;
  width: 24px;
  height: 24px;
  align-self: center;
  flex-shrink: 0;
  border: 1.5px solid var(--color-border);
  border-radius: 6px;
  background: #fff;
  cursor: pointer;
  position: relative;
  transition: background-color var(--mo-micro) ease, border-color var(--mo-micro) ease;
}
body:not(.admin-body) .quote-form .consent input[type="checkbox"]:checked {
  background: #0B3B62;
  border-color: #10233C;
}
body:not(.admin-body) .quote-form .consent input[type="checkbox"]:checked::after {
  content: "";
  position: absolute;
  inset: 0;
  background-color: #fff;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 13 4 4 10-10'/%3E%3C/svg%3E") center / 14px no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 13 4 4 10-10'/%3E%3C/svg%3E") center / 14px no-repeat;
}
body:not(.admin-body) .quote-form .consent input[type="checkbox"]:focus-visible {
  outline: 2px solid #1870BD;
  outline-offset: 2px;
}
body:not(.admin-body) .quote-form .consent label a { color: #1870BD; }
/* Дроп-зона: drag-over — голубой фон и синяя граница */ body:not(.admin-body) .file-dropzone.is-dragging {
  background: #F1F8FE !important;
  border-color: #1870BD !important;
}
body:not(.admin-body) .file-dropzone { border: 1px dashed #9FC6E8; border-radius: 10px; }
body:not(.admin-body) .quote-form .field {
  gap: 4px;
}
body:not(.admin-body) .quote-form .field > label {
  font-size: 14px;
  line-height: 1.25;
}
body:not(.admin-body) .quote-grid > .quote-group-title, body:not(.admin-body) .quote-grid > .quote-group-head {
  margin-top: 8px;
}
body:not(.admin-body) .quote-grid .file-pii-note {
  max-width: none;
}
body:not(.admin-body) .quote-form-copy h2 {
  margin-bottom: 6px;
}
/* Позиции: название поля и подсказка в одну строку — экономит строку над контролом */ body:not(.admin-body) .quote-form label.label-inline {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 4px 8px;
}
body:not(.admin-body) .quote-form label.label-inline .label-hint {
  display: inline;
  margin-top: 0;
}
/* Лид формы занимает всю ширину — описание умещается в строку */ body:not(.admin-body) .quote-form-lead p { max-width: none; }
/* Подзаголовки групп: минимальная высота */ body:not(.admin-body) .quote-group-title {
  font-size: 12px;
  line-height: 1.3;
}
body:not(.admin-body) .quote-grid > .quote-group-title, body:not(.admin-body) .quote-grid > .quote-group-head {
  margin-top: 2px;
}
body:not(.admin-body) .quote-group-note {
  font-size: 13px;
  line-height: 1.4;
}
/* Лид формы: одна строка на десктопе */ body:not(.admin-body) .quote-form-lead p {
  font-size: 14px;
  line-height: 1.5;
}
body:not(.admin-body) .quote-form-actions { margin-top: 10px; }
body:not(.admin-body) .file-dropzone-ico { width: 22px; height: 22px; }

/* Медийные правила формы, снятые с постраничных файлов 15 и 23 */
@media (min-width: 768px) {
  body:not(.admin-body) .quote-form input, body:not(.admin-body) .quote-form input[type="text"], body:not(.admin-body) .quote-form input[type="tel"], body:not(.admin-body) .quote-form input[type="email"] {
    height: 48px;
    min-height: 48px;
    padding: 0 16px;
    border-radius: 10px;
    font-size: 16px;
  }
}
@media (min-width: 768px) {
  body:not(.admin-body) .quote-form .consent input[type="checkbox"] {
    height: 24px;
    min-height: 24px;
    width: 24px;
    align-self: center;
    padding: 0;
  }
}
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form input, body:not(.admin-body) .quote-form input[type="text"], body:not(.admin-body) .quote-form input[type="tel"], body:not(.admin-body) .quote-form input[type="email"] {
    height: 48px;
    min-height: 48px;
    font-size: 16px;
  }
}
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form .consent input[type="checkbox"] {
    height: 24px;
    width: 24px;
    min-height: 24px;
    align-self: center;
  }
}
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form textarea { height: 112px; min-height: 112px; font-size: 16px; }
}
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form .file-dropzone { min-height: 112px; padding: 12px; }
}
@media (min-width: 768px) {
  body:not(.admin-body) .quote-form { padding: 20px 24px 24px; }
}
@media (min-width: 768px) {
  body:not(.admin-body) .quote-form .quote-grid { row-gap: 10px; }
}
@media (min-width: 768px) {
  body:not(.admin-body) .quote-form .quote-form-copy { margin-bottom: 14px; }
}
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form textarea {
    height: 76px;
    min-height: 76px;
  }
}
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form .quote-grid {
    row-gap: 4px;
  }
}
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form-copy {
    margin-bottom: 6px;
  }
}
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form-actions {
    margin-top: 6px;
    gap: 6px;
  }
}
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form-copy h2 {
    font-size: 20px;
    line-height: 1.2;
  }
}
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form .field {
    gap: 3px;
  }
}
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form input[type="text"], body:not(.admin-body) .quote-form input[type="email"], body:not(.admin-body) .quote-form input[type="tel"] {
    height: 44px;
    min-height: 44px;
  }
}
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form .consent {
    gap: 8px;
    line-height: 1.3;
  }
}
@media (max-width: 767px) {
  /* Форма: подписи полей и групповые заголовки плотнее */ body:not(.admin-body) .quote-form .field > label, body:not(.admin-body) .quote-form .field > label {
    line-height: 16px;
  }
}
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form .quote-group-head {
    gap: 2px;
  }
}
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form-lead {
    gap: 4px;
  }
}
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form {
    padding: 16px;
  }
}
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form .quote-group-title {
    margin: 2px 0 0;
  }
}

/* ============================================================
   Эталон формы (13.08.2026)
   Вид формы задавали постраничные файлы 15-contacts-v3 и 23-contacts-final,
   которые грузятся только на «Контактах» и «Заявке». На остальных
   четырнадцати страницах та же форма выходила крупнее: описание 18px
   вместо 14, textarea и кнопка 16px вместо 15. Здесь значения эталона
   зафиксированы для всех страниц сразу. Повтор класса поднимает вес до
   постраничных правил, новых !important не добавляем.
   ============================================================ */
body:not(.admin-body) .quote-form.quote-form .quote-form-copy h2 {
  max-width: 630px;
}

body:not(.admin-body) .quote-form.quote-form .quote-form-copy p {
  font-size: 14px;
  line-height: 19.6px;
}

body:not(.admin-body) .quote-form.quote-form textarea {
  font-size: 15px;
  line-height: 22.5px;
}

/* Последние три расхождения с эталоном: зазор внутри поля был 6px вместо 4,
   ввод 16px вместо 15, заголовок формы отбивался на 6px лишних */
body:not(.admin-body) .quote-form.quote-form .field {
  gap: 4px;
}

body:not(.admin-body) .quote-form.quote-form input,
body:not(.admin-body) .quote-form.quote-form select {
  font-size: 15px;
}

body:not(.admin-body) .quote-form.quote-form .quote-form-copy h2 {
  margin-bottom: 0;
}

/* Сама форма — grid без зазора: на «Контактах» блоки разведены собственными
   отступами, а на остальных страницах сверху добавлялся gap 24px и форма
   выходила на 48px выше */
body:not(.admin-body) .quote-form.quote-form {
  gap: 0;
}

body:not(.admin-body) .quote-form.quote-form button[type="submit"],
body:not(.admin-body) .quote-form.quote-form input[type="submit"] {
  /* 16, не 15: подпись кнопки — токенный кегль (аудит «Контактов» К3) */
  font-size: var(--fs-body);
}

@media (min-width: 1024px) {
  body:not(.admin-body) .quote-form.quote-form .file-dropzone {
    min-height: 108px;
    box-sizing: border-box;
  }

  body:not(.admin-body) .quote-form.quote-form textarea {
    height: 108px;
    min-height: 108px;
  }
}

/* Правила формы, снятые с постраничных файлов «Контактов» и «Заявки»:
   форма одна на 16 страниц, её вид не должен зависеть от страницы */

/* Мобильные значения эталона: те же, что действовали на «Контактах»,
   «Заявке» и «Комплексных» из постраничных файлов — теперь общие */
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form.quote-form {
    padding: 16px 24px 20px;
  }

  body:not(.admin-body) .quote-form.quote-form .quote-grid {
    row-gap: 8px;
  }

  body:not(.admin-body) .quote-form.quote-form .quote-form-copy {
    margin-bottom: 8px;
  }

  body:not(.admin-body) .quote-form.quote-form .file-dropzone {
    min-height: 112px;
  }

  body:not(.admin-body) .quote-form.quote-form textarea {
    height: 112px;
    min-height: 112px;
  }
}

/* Мобильные правила формы переехали из 23-contacts-final: файл грузится
   только на «Контактах» и «Заявке», а форма стоит на шестнадцати страницах */
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form { padding: 18px 16px 20px; }
  body:not(.admin-body) .quote-form-copy { margin-bottom: 12px; }
  body:not(.admin-body) .quote-form-copy h2 { font-size: 22px; line-height: 1.2; }
  body:not(.admin-body) .quote-form-lead { gap: 2px; }
  body:not(.admin-body) .quote-form .quote-grid { row-gap: 10px; }
  body:not(.admin-body) .quote-form input[type="text"],
  body:not(.admin-body) .quote-form input[type="email"],
  body:not(.admin-body) .quote-form input[type="tel"] {
    height: 48px;
    min-height: 48px;
  }
  body:not(.admin-body) .quote-form .file-dropzone { min-height: 112px; }
  body:not(.admin-body) .quote-form textarea { height: 112px; min-height: 112px; }
  body:not(.admin-body) .quote-form-actions { margin-top: 12px; }
}

/* Последние правила формы из 15-contacts-v3: падинг карточки формы и
   компактная дропзона на телефоне. Файл грузится на трёх страницах из
   шестнадцати, поэтому форма там была ниже остальных на 18px */
body:not(.admin-body) .quote-form.quote-form {
  padding: 18px 16px 20px;
  border-radius: var(--radius-control);
}

@media (max-width: 767px) {
  body:not(.admin-body) .quote-form.quote-form .file-dropzone {
    min-height: 76px;
    height: 76px;
    padding: 8px;
    gap: 2px;
  }
}

/* Мобильный низ формы: на «Контактах» и «Заявке» кнопка и сноска идут
   колонкой с зазором 6px и сноской 13px, на остальных страницах сноска
   была крупнее и отбивалась на 12px — форма выходила на 18px выше */
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form.quote-form .quote-form-actions {
    display: flex;
    flex-direction: column;
    gap: 6px;
  }

  body:not(.admin-body) .quote-form.quote-form .quote-form-actions .form-note {
    font-size: 13px;
    margin-top: 0;
  }
}

/* Последнее расхождение с эталоном: подпись согласия шла 14px и блок
   получал лишние отступы — на «Контактах» и «Заявке» это 13px без них */
body:not(.admin-body) .quote-form.quote-form .consent label {
  font-size: 13px;
  line-height: 19.5px;
}

/* ============================================================
   ФОРМА ЗАЯВКИ ПО РЕНДЕРУ 15.08.2026
   Парные поля в две колонки, значок в кнопке отправки и конверт
   у строки с почтой.
   ============================================================ */

/* Значок самолётика в кнопке: подпись и знак — одной группой по центру */
body:not(.admin-body) .quote-form .quote-submit {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
}

body:not(.admin-body) .quote-form .quote-submit-ico {
  width: 18px;
  height: 18px;
  flex: 0 0 18px;
  background: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 2 11 13'/%3E%3Cpath d='M22 2l-7 20-4-9-9-4z'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 2 11 13'/%3E%3Cpath d='M22 2l-7 20-4-9-9-4z'/%3E%3C/svg%3E") center / contain no-repeat;
}

/* Строка «Или отправьте файл на…» — со значком конверта, по центру */
/* flex-wrap обязателен: без него строка «Предпочитаете почту? Отправьте
   файл на info@kab-em.ru» не переносится и на узком экране вылезает за
   карточку формы — страница получает горизонтальную прокрутку (15.08.2026) */
/* Значок почты идёт первой строкой текста, а не отдельной колонкой: на
   телефоне подпись переносится на две строки, и у флекса значок вставал
   между ними (просьба 14.09.2026) */
body:not(.admin-body) .quote-form .quote-direct-email {
  display: block;
  text-align: center;
}

body:not(.admin-body) .quote-form .quote-direct-email-ico {
  width: 16px;
  height: 16px;
  display: inline-block;
  margin-right: 8px;
  vertical-align: -3px;
  background: #5C6E84;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2' y='4' width='20' height='16' rx='2'/%3E%3Cpath d='m22 6-10 7L2 6'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2' y='4' width='20' height='16' rx='2'/%3E%3Cpath d='m22 6-10 7L2 6'/%3E%3C/svg%3E") center / contain no-repeat;
}

/* Парные поля в две колонки — по рендеру 15.08.2026, начиная с 420px.
   Классы повторены намеренно: постраничное правило
   body:not(.admin-body).pages.contacts .quote-grid ставит одну колонку до
   767px и по специфичности сильнее обычной записи. Повтор — тот же приём,
   что в остальном проекте; !important не заводим.
   Ниже пара не делается: при 375px на колонку остаётся около 140px, и
   подпись «Электронная почта» переносится по слогам. */
@media (min-width: 420px) and (max-width: 767px) {
  body:not(.admin-body) .quote-form.quote-form .quote-grid.quote-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  /* Через всю строку: заголовки групп, телефон, компания, файл, описание,
     согласие — как на рендере */
  body:not(.admin-body) .quote-form.quote-form .quote-grid.quote-grid > .quote-group-title,
  body:not(.admin-body) .quote-form.quote-form .quote-grid.quote-grid > .quote-group-head,
  body:not(.admin-body) .quote-form.quote-form .quote-grid.quote-grid > .field-wide,
  body:not(.admin-body) .quote-form.quote-form .quote-grid.quote-grid > .file-field,
  body:not(.admin-body) .quote-form.quote-form .quote-grid.quote-grid > .field-message,
  body:not(.admin-body) .quote-form.quote-form .quote-grid.quote-grid > .consent {
    grid-column: 1 / -1;
  }

  body:not(.admin-body) .quote-form.quote-form .quote-grid.quote-grid > .field:nth-of-type(3),
  body:not(.admin-body) .quote-form.quote-form .quote-grid.quote-grid > .field:nth-of-type(4) {
    grid-column: 1 / -1;
  }
}

/* ============================================================
   Форма по макету KabEm Quote Web (26.08.2026, разрешение получено).
   Правила общие: форма одинакова на всех страницах — это её главный
   принцип. Пять :not() — вес выше постраничных файлов.
   ============================================================ */
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form {
  /* 20 вместо 40: форму просили ниже дважды — 28.08.2026 сначала до 32,
     потом ещё на 50px */
  padding: 20px;
  /* Панельный радиус системы: 24 был третьим значением вне 16/12 */
  border-radius: var(--radius-card);
}

body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .quote-grid {
  gap: 10px 28px;
}

/* Поля: 48px — общая высота управляющих элементов сайта (--control-h) */
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form input[type="text"],
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form input[type="email"],
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form input[type="tel"] {
  min-height: 48px;
  padding: 0 16px;
  border-radius: var(--radius-control);
}

body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form textarea {
  min-height: 80px;
  padding: 16px;
  border-radius: var(--radius-control);
  line-height: 1.6;
}

/* Дропзона одной высоты с полем перечня — пара стоит ровно */
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .file-dropzone {
  min-height: 80px;
  border-radius: var(--radius-control);
}

body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form button[type="submit"],
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form input[type="submit"] {
  min-height: 48px;
  padding: 0 34px;
  border-radius: var(--radius-control);
}

@media (max-width: 767px) {
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form {
    padding: 20px 16px 22px;
    border-radius: var(--radius-card);
  }

  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .quote-grid {
    gap: 14px;
  }

  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .file-dropzone,
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form textarea {
    min-height: 112px;
  }

  /* Кнопка на телефоне — 48, как все кнопки сайта (правило проекта);
     54 из макета Quote Web остаётся десктопным */
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form button[type="submit"],
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form input[type="submit"] {
    min-height: 48px;
  }
}

/* Мобильный макет формы 26.08.2026 (KabEm Quote Mobile):
   короткие поля парами, вкладки «файл / вручную» вместо двух блоков
   подряд — их включает скрипт, без него видны оба поля. */
@media (max-width: 767px) {
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .quote-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 12px 10px;
  }

  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .quote-grid > .field-wide,
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .quote-grid > .file-field,
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .quote-grid > .field-message,
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .quote-grid > .quote-group-title {
    grid-column: 1 / -1;
  }

  /* Имя и почта — во всю ширину; телефон с компанией и город со сроком парами */
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .quote-grid > .field:nth-of-type(1),
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .quote-grid > .field:nth-of-type(2) {
    grid-column: 1 / -1;
  }

  /* Вкладки блока «Позиции» */
  body:not(.admin-body) .quote-tabs {
    display: flex;
    gap: 5px;
    padding: 4px;
    border-radius: 12px;
    background: var(--color-bg-soft);
    grid-column: 1 / -1;
  }

  body:not(.admin-body) .quote-tab {
    flex: 1;
    /* 44 — минимальная цель нажатия; на /quote так и было, на «Наличии»
       и «Контактах» те же вкладки шли 40 (разбор 26.08.2026) */
    min-height: var(--tap-min);
    border: 0;
    border-radius: var(--radius-control);
    background: none;
    color: #5F7089;
    font-size: 13px;
    font-weight: var(--fw-bold);
    cursor: pointer;
  }

  body:not(.admin-body) .quote-tab.is-active {
    background: var(--color-bg);
    color: var(--color-text);
  }

  body:not(.admin-body) .quote-form .quote-grid > .is-tab-hidden { display: none; }
}

@media (min-width: 768px) {
  body:not(.admin-body) .quote-tabs { display: none; }
}

/* Метка согласия — обычный текстовый поток: flex рвал фразу на три части
   («…в соответствии с» / ссылка / точка), из-за чего строка шла в три
   ряда и точка уезжала отдельно (26.08.2026) */
body:not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .consent label {
  display: block;
  margin: 0;
  font-size: 12.5px;
  line-height: 1.4;
}

body:not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .consent label a {
  display: inline;
}

/* Ссылка внутри согласия — часть текстовой строки: правило области
   касания давало ей высоту 40px, и строки метки разъезжались (26.08.2026) */
body:not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .consent label a {
  display: inline;
  min-height: 0;
  padding: 0;
  /* Кегль и высота строки — как у текста метки: своя типографика ссылки
     давала лишние строки и разъезд строк (26.08.2026) */
  font-size: inherit;
  line-height: inherit;
}

/* Кнопка в ряду с согласием: верхний отступ 22px оставался от прежней
   раскладки, где она стояла отдельной строкой, и сбивал выравнивание */
body:not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .quote-form-actions-row .quote-submit {
  margin-top: 0;
}

/* Кнопка не растягивается, всю оставшуюся ширину отдаём согласию: в
   узкой колонке его текст шёл в три строки и блок оказывался выше
   кнопки (26.08.2026) */
body:not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .quote-form-actions-row .quote-submit {
  flex: 0 0 auto;
}

/* Подсказка про почту — справа от кнопки отправки (просьба 26.08.2026) */
body:not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .quote-form-actions-row {
  justify-content: space-between;
  /* Без переноса: подсказка сжимается и остаётся в строке с кнопкой */
  flex-wrap: nowrap;
  gap: 24px;
}

body:not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .quote-form-actions-row .quote-direct-email {
  margin: 0;
  flex: 1 1 auto;
  min-width: 0;
  justify-content: flex-end;
  text-align: right;
}

/* Подсказка про почту — справа от кнопки отправки (просьба 26.08.2026) */
body:not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .quote-form-actions-row {
  justify-content: space-between;
}

body:not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .quote-form-actions-row .quote-direct-email {
  margin: 0;
  text-align: right;
}

/* Заголовок формы и «* Обязательные поля» — одной строкой (26.08.2026) */
body:not(.admin-body) .quote-form .quote-form-headline {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 24px;
  flex-wrap: wrap;
}

body:not(.admin-body) .quote-form .quote-form-headline .quote-required-note {
  margin: 0;
  flex: none;
}

/* Воздух между лидом формы и первой группой полей (просьба 26.08.2026) */
body:not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .quote-form-copy {
  margin-bottom: 13px;
}

@media (max-width: 767px) {
  /* На телефоне подсказка уходит под кнопку */
  body:not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .quote-form-actions-row {
    flex-wrap: wrap;
    gap: 12px;
  }

  body:not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .quote-form-actions-row .quote-direct-email {
    flex: 1 1 100%;
    justify-content: center;
    text-align: center;
  }
}

/* Подсказка про почту — одной строкой рядом с кнопкой, без переноса
   адреса на вторую строку (просьба 26.08.2026) */
/* 320–360: подпись «Отправить спецификацию» (211px) со значком не
   помещалась между полями кнопки по 34px */
@media (max-width: 360px) {
  body:not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .quote-form-actions-row .quote-submit {
    height: auto;
    padding-inline: 16px;
    white-space: normal;
  }
}

/* Если рядом с кнопкой места нет (колонка формы «Заявки» на 1024–1199),
   подсказка целиком уходит строкой ниже: с nowrap в одном ряду она
   выталкивала страницу вбок на 223px (аудит 16.09.2026) */
@media (min-width: 1024px) {
  body:not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .quote-form-actions-row {
    flex-wrap: wrap;
  }

  body:not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .quote-form-actions-row .quote-direct-email {
    white-space: nowrap;
    flex: 0 1 auto;
    margin-left: auto;
  }
}

/* ============================================================
   Правки по перепроверке формы 26.08.2026
   ============================================================ */

/* Поле с ошибкой было помечено только красным текстом под ним: рамка
   оставалась обычной, и в двух колонках не читалось, к какому из соседних
   полей относится сообщение. Повторы класса нужны, чтобы перебить правила
   полей из 09 и 18 — они задавали границу тем же одним классом. */
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .has-error input[type="text"],
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .has-error input[type="email"],
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .has-error input[type="tel"],
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .has-error textarea,
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .has-error .file-dropzone {
  border-color: #A8342B;
}

/* Метка согласия была 12,5px — самый мелкий текст на сайте, и при этом
   юридический. Минимум по правилу проекта — 13. */
body:not(.admin-body) .quote-form.quote-form.quote-form .consent label {
  font-size: 13px;
  line-height: 1.5;
}

/* Ссылка внутри строки текста не должна отличаться только цветом
   (WCAG 1.4.1); на юридических страницах такие же ссылки подчёркнуты */
body:not(.admin-body) .quote-form.quote-form.quote-form .consent label a {
  text-decoration: underline;
  text-underline-offset: 2px;
}

/* На узких экранах пары полей разворачиваются в колонку: при 390 и 360
   поле получалось 140–155px, метки «Город / регион поставки» и «Желаемый
   срок поставки» вставали в две строки, а подсказка была видна на треть.
   Порог — 420, как и обещает комментарий у самой пары; специфичность
   повторяет парное правило, иначе оно перебивает (14.09.2026) */
@media (max-width: 419px) {
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .quote-grid {
    grid-template-columns: minmax(0, 1fr);
  }

  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .quote-grid > .field {
    grid-column: 1 / -1;
  }
}

/* Отступ панели был немонотонным: 32 на десктопе, 40 на планшете, 18 на
   телефоне — на планшете больше, чем на большом экране. Планшет приводим
   к десктопным 32; мобильные 18 остаются по макету Contacts Mobile. */
@media (min-width: 768px) and (max-width: 1023px) {
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form {
    padding: 32px;
  }
}

/* Зазоры сетки формы шли по 20 и 28 — вне принятой шкалы (15/16/24) */
@media (min-width: 768px) {
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form.quote-form .quote-grid {
    gap: 16px 24px;
  }
}

/* Кнопка выбора файла была 36px — ниже минимальной области касания.
   На телефоне все кнопки сайта 48, на широких хватает 44. */
body:not(.admin-body):not(.admin-body):not(.admin-body).pages.contacts .file-select-button,
body:not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .file-select-button,
body:not(.admin-body):not(.admin-body):not(.admin-body).pages.stock .file-select-button {
  min-height: 44px;
}

@media (max-width: 767px) {
  body:not(.admin-body):not(.admin-body):not(.admin-body).pages.contacts .file-select-button,
  body:not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .file-select-button,
  body:not(.admin-body):not(.admin-body):not(.admin-body).pages.stock .file-select-button {
    min-height: var(--tap-min);
  }
}

/* Один межстрочный у второстепенного текста формы: подпись «* Обязательные
   поля» и лид шли 14/19.6, а такой же текст рядом — 14/21 (разбор
   26.08.2026). Форма одна на трёх страницах, правка в общем файле. */
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .quote-required-note,
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .quote-form-lead,
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .quote-form-lead p {
  line-height: 1.5;
}

/* Кнопка выбора файла — 48, как остальные кнопки формы (было 44) */
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .file-select-button {
  min-height: 48px;
}

/* Подводка формы прижата к полям: вместе с паддингом и зоной файла это
   даёт минус 50px к высоте (просьба 28.08.2026) */
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-form .quote-form-copy {
  margin-bottom: 4px;
}

/* ===== 17-headings.css ===== */
/* Единый стиль заголовков по образцу H1 на «Наличии на складе»: Inter 600.
   Трекинг с 13.08.2026 отрицательный по трём ступеням — блок ниже.
   Цвет не задаём глобально — на тёмных hero заголовки остаются светлыми. */
body:not(.admin-body) h1,
body:not(.admin-body) h2,
body:not(.admin-body) h3 {
  font-weight: 600;
}

/* ============================================================
   ТРЕКИНГ КРУПНОГО ТЕКСТА (промпт 13.08.2026, Л1)
   Всё крупнее 24px шло с letter-spacing: normal — заголовок читался как
   системный шрифт. Отрицательный трекинг по трём ступеням, кегли ≤17px
   не трогаем, надзаголовки сохраняют свои 0.08em.
   ============================================================ */
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) main h1,
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) h1,
body:not(.admin-body) .hero-title,
body:not(.admin-body) .h1-size {
  letter-spacing: var(--ls-h1);
  text-wrap: balance;
}

body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) main h2,
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) h2,
body:not(.admin-body) .section-title,
body:not(.admin-body) .stat-value,
body:not(.admin-body) .fact-value,
body:not(.admin-body) .hm-number-value,
body:not(.admin-body) .cs-fact-value {
  letter-spacing: var(--ls-h2);
}

body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) main h3,
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) h3,
body:not(.admin-body) .card-title {
  letter-spacing: var(--ls-h3);
}

/* Числовые показатели — табличными цифрами, иначе колонка «шатается» */
body:not(.admin-body) .stat-value,
body:not(.admin-body) .fact-value,
body:not(.admin-body) .hm-number-value,
body:not(.admin-body) .cs-fact-value,
body:not(.admin-body) .hm-metric-value,
body:not(.admin-body) .ind-req-num,
body:not(.admin-body) .stock-file-meta,
body:not(.admin-body) [data-numeric] {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}

/* Надзаголовки живут по своим правилам — разрядка вместо трекинга */
body:not(.admin-body) .eyebrow,
body:not(.admin-body) .kicker {
  letter-spacing: 0.08em;
}

/* ============================================================
   H3 — одно значение по всему сайту: 17 / 22.1 / −0.006em
   (прогон мобильной версии 26.08.2026: девять разных значений,
   включая дробные 16,5 и 13,5). Исключений нет: карточки «Почему
   КабЭм» на Главной приведены к общему кеглю 28.08.2026.
   ============================================================ */
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) main h3 {
  font-size: 17px;
  line-height: 1.3;
  letter-spacing: var(--ls-h3);
}

/* Эти места держали свой кегль сильнее общего правила. Названия карточек
   каталога сюда не входят: у них 16px, чтобы не было переносов (правило
   26.08.2026; при 17 на 1440 рвались «Трубы…» и «Датчики…», 16.09.2026) */
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) main .stock-step-copy h3,
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) main .contact-link-card h3 {
  font-size: 17px;
  line-height: 1.3;
  letter-spacing: var(--ls-h3);
}

/* ===== 18-quote.css ===== */
/* Страница /quote «Отправить спецификацию» — переработка по рендеру.
   Типографика и карточки — по эталону страницы «Наличие на складе».
   Отдельный файл по образцу Дед Глеб; подключается последним. */

/* ===== Первый экран ===== */

/* Карточка «Что произойдёт после отправки» */
body:not(.admin-body).pages.quote .qp-contacts-link { font-weight: 600; }

/* ===== Форма ===== */
body:not(.admin-body).pages.quote .qp-form-wrap .quote-form {
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: 14px;
  padding: 32px;
}

/* ===== Как мы работаем ===== */
body:not(.admin-body).pages.quote .qp-process { padding-block: 16px 8px; }
body:not(.admin-body).pages.quote .qp-process-card {
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: 14px;
  padding: 28px 32px;
}
body:not(.admin-body).pages.quote .qp-process-card h2 { margin: 0 0 22px; font-size: 24px; }
body:not(.admin-body).pages.quote .qp-process-list {
  list-style: none;
  margin: 0 0 20px;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 32px;
  position: relative;
}
body:not(.admin-body).pages.quote .qp-process-item { margin: 0; position: relative; }
body:not(.admin-body).pages.quote .qp-process-item:not(:first-child)::before {
  content: "";
  position: absolute;
  left: -26px;
  top: 15px;
  width: 20px;
  height: 2px;
  background: #D7E3EE;
}
body:not(.admin-body).pages.quote .qp-process-item h3 {
  font-size: 15px;
  margin: 12px 0 6px;
  color: #10233C;
}
body:not(.admin-body).pages.quote .qp-process-item p {
  font-size: 13px;
  line-height: 1.5;
  margin: 0;
  color: #5C6E84;
  max-width: 260px;
}
body:not(.admin-body).pages.quote .qp-process-cta { display: flex; justify-content: flex-end; }

/* ===== Полезно перед отправкой ===== */

/* ===== Планшет ===== */
@media (max-width: 1023px) {
  body:not(.admin-body).pages.quote .qp-process-list { grid-template-columns: 1fr; gap: 18px; }
  body:not(.admin-body).pages.quote .qp-process-item:not(:first-child)::before { content: none; }
}

/* ===== Мобайл ===== */
@media (max-width: 767px) {
  body:not(.admin-body).pages.quote .qp-form-wrap .quote-form { padding: 22px 20px; }
  body:not(.admin-body).pages.quote .qp-process-card { padding: 22px 20px; }
  body:not(.admin-body).pages.quote .qp-process-cta { justify-content: stretch; }
  body:not(.admin-body).pages.quote .qp-process-cta .btn { width: 100%; min-height: 50px; }
}

@media (prefers-reduced-motion: reduce) {
}

/* H1 по эталону «Наличия» */
@media (min-width: 768px) {
}

/* ============================================================
   Форма на /quote — идентична эталонной форме на /contacts
   ============================================================ */
@media (min-width: 768px) {
  body:not(.admin-body).pages.quote .qp-form-wrap .quote-form {
    padding: 24px;
    border-color: var(--color-border);
  }
  body:not(.admin-body).pages.quote .quote-form .quote-grid { row-gap: 18px; }
  body:not(.admin-body).pages.quote .quote-form .quote-form-copy { margin-bottom: 18px; }
  body:not(.admin-body).pages.quote .quote-form .quote-form-copy h2 { font-size: 28px; }
  body:not(.admin-body).pages.quote .quote-form .quote-form-copy .kicker { font-size: 13px; letter-spacing: 0.08em; }
  body:not(.admin-body).pages.quote .quote-form label { font-size: 13px; }
  body:not(.admin-body).pages.quote .quote-form input[type="text"],
  body:not(.admin-body).pages.quote .quote-form input[type="tel"],
  body:not(.admin-body).pages.quote .quote-form input[type="email"] { border-color: var(--color-border); }
  body:not(.admin-body).pages.quote .quote-form .file-dropzone { min-height: 120px; }
}

/* Вертикальные зазоры между блоками — как на «Наличии» (20–26px) */
@media (min-width: 768px) {
  body:not(.admin-body).pages.quote section.section.qp-process { padding-top: 10px; padding-bottom: 10px; }
}

/* ============================================================
   Типографика /quote по эталону «Наличия на складе»
   ============================================================ */
body:not(.admin-body).pages.quote h1,
body:not(.admin-body).pages.quote h2,
body:not(.admin-body).pages.quote h3 { color: #10233C; }

/* ============================================================
   Форма «Отправьте спецификацию»: общая плотность для всех страниц.
   Перенесено из 15-contacts-v3.css — тот файл грузится только на своих
   страницах, а форма одинакова везде (эталон — «Контакты»).
   ============================================================ */
/* ============================================================
   Форма «Отправьте спецификацию»: компактная плотность (10.08.2026).
   Сетка и палитра прежние — сокращены только отступы и повторы.
   ============================================================ */
body:not(.admin-body) .quote-form-lead {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: 4px var(--space-6);
}

body:not(.admin-body) .quote-form-lead p {
  margin: 0;
}

body:not(.admin-body) .quote-required-note {
  flex: 0 0 auto;
  font-size: 13px;
  color: var(--color-text-muted);
}

/* Подзаголовки групп: помогают сканировать, но почти не занимают высоты */
/* Подписи групп формы — те же надзаголовки, что на страницах: 13/18,
   трекинг 0.08em, синий (сверка с правилами 26.08.2026) */
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-group-title {
  margin: 0;
  font-size: 13px;
  line-height: 18px;
  font-weight: var(--fw-bold);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: #1870BD;
}

body:not(.admin-body) .quote-grid > .quote-group-title,
body:not(.admin-body) .quote-group-head {
  margin-top: var(--space-2);
}

body:not(.admin-body) .quote-grid > .quote-group-title:first-child {
  margin-top: 0;
}

body:not(.admin-body) .quote-group-head {
  display: grid;
  gap: 4px;
}

body:not(.admin-body) .quote-group-note {
  margin: 0;
  font-size: 14px;
  line-height: 1.45;
  color: var(--color-text-muted);
}

/* Плотность сетки: строки ближе друг к другу, подпись ближе к полю */
body:not(.admin-body) .quote-grid {
  gap: var(--space-4) var(--space-6);
}

body:not(.admin-body) .quote-grid .field {
  gap: 6px;
}

/* Дропзона и textarea одной компактной высоты */
body:not(.admin-body) .quote-grid .file-dropzone {
  min-height: 128px;
  gap: 6px;
}

body:not(.admin-body) .file-dropzone-ico {
  width: 26px;
  height: 26px;
  background-color: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 16V4'/%3E%3Cpolyline points='7 9 12 4 17 9'/%3E%3Cpath d='M4 16v3a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-3'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 16V4'/%3E%3Cpolyline points='7 9 12 4 17 9'/%3E%3Cpath d='M4 16v3a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-3'/%3E%3C/svg%3E") center / contain no-repeat;
}

body:not(.admin-body) .file-dropzone-or {
  font-size: 13px;
  color: var(--color-text-muted);
}

body:not(.admin-body) .file-select-button {
  min-height: 36px;
  padding-inline: var(--space-3);
  font-size: 14px;
}

/* Юридическая строка — на всю ширину, вторичным текстом */
body:not(.admin-body) .quote-grid .file-pii-note {
  margin: 0;
  font-size: 13px;
  line-height: 1.45;
  color: var(--color-text-muted);
}


/* ============================================================
   Единая форма спецификации на всех страницах.
   Класс .quote-form--compact ставит партиал везде, кроме
   «Наличия» с приложенным файлом остатков. Тройной класс —
   чтобы перебить постраничные правила без !important.
   ============================================================ */
@media (min-width: 768px) {
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact {
    /* Низ 14px вместо 24: форма стала на 10px ниже (просьба 15.08.2026).
       Правило именно здесь — оно с утроенным классом выигрывает у всех
       остальных, и правка в общем файле формы до неё не доставала. */
    padding: 24px 24px 14px;
    /* эталон «Контактов»: скругление формы одинаково на всех страницах */
    border-radius: 14px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-grid {
    row-gap: 8px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact textarea {
    height: 96px;
    min-height: 96px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .file-dropzone {
    min-height: 96px;
    height: 96px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-form-copy {
    margin-bottom: 8px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-form-copy h2 {
    font-size: 26px;
    line-height: 1.2;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .field > label {
    font-size: 13px;
    line-height: 18px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact input[type="text"],
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact input[type="email"],
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact input[type="tel"] {
    height: 46px;
    min-height: 46px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .consent {
    padding-block: 0;
    min-height: 44px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-form-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 12px 18px;
    margin-top: 4px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-form-actions .form-note {
    margin-top: 0;
    text-align: right;
  }
}

/* Та же форма на телефоне: плотность «Контактов» на всех страницах */
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact {
    padding: 24px;
    row-gap: 0;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-form-copy {
    margin-bottom: 6px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-form-copy h2 {
    font-size: 20px;
    line-height: 1.2;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-form-lead {
    gap: 4px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-grid {
    row-gap: 4px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .field {
    gap: 3px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .field > label {
    line-height: 16px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-group-head {
    gap: 2px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact input[type="text"],
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact input[type="email"],
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact input[type="tel"] {
    height: 44px;
    min-height: 44px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .file-dropzone {
    min-height: 76px;
    height: 76px;
    padding: 8px;
    gap: 2px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact textarea {
    height: 76px;
    min-height: 76px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .consent {
    gap: 8px;
    line-height: 1.3;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-form-actions {
    margin-top: 6px;
    gap: 6px;
  }
}

/* Загрузка файла: горизонтальная раскладка текста, разделителя и кнопки
   для всех страниц, где используется общий партиал формы. */
body:not(.admin-body) .quote-form .file-dropzone,
body:not(.admin-body) .quote-grid .file-dropzone,
body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .file-dropzone {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-content: center;
  align-items: center;
  justify-content: center;
  gap: var(--space-2) var(--space-3);
  text-align: center;
}

body:not(.admin-body) .quote-form .file-dropzone::before {
  content: none;
}

body:not(.admin-body).pages.contacts .quote-form .file-dropzone::before,
body:not(.admin-body).pages.quote .quote-form .file-dropzone::before,
body:not(.admin-body).pages.complex_supply .quote-form .file-dropzone::before,
body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .file-dropzone::before {
  content: none;
  display: none;
}

body:not(.admin-body) .quote-form .file-dropzone-ico {
  flex: 0 0 auto;
}

body:not(.admin-body) .quote-form .file-dropzone-title,
body:not(.admin-body) .quote-form .file-dropzone-or,
body:not(.admin-body) .quote-form .file-select-button {
  margin: 0;
}

body:not(.admin-body) .quote-form .file-dropzone-title {
  flex: 0 1 auto;
  min-width: 0;
}

body:not(.admin-body) .quote-form .file-dropzone-or,
body:not(.admin-body) .quote-form .file-select-button {
  flex: 0 0 auto;
}

body:not(.admin-body) .quote-form .file-select-button {
  min-width: 136px;
}

@media (min-width: 768px) {
  body:not(.admin-body) .quote-form .file-dropzone-or {
    margin-inline-end: var(--space-2);
  }

  body:not(.admin-body) .quote-form .file-dropzone:focus-within:has(.file-select-button:focus) {
    outline: 0;
  }

  body:not(.admin-body) .quote-form .file-dropzone-title {
    white-space: nowrap;
  }

  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .file-dropzone {
    min-height: 96px;
    height: 96px;
  }
}

/* ============================================================
   ПЕРВЫЙ ЭКРАН ПО РЕНДЕРУ 16.08.2026 (≤280px)
   Слева плашки-факты и кнопка к форме, справа карточка «Мы на связи»
   и «Как мы работаем». Плотность подчинена бюджету высоты.
   ============================================================ */
@media (min-width: 1024px) {

  /* Зазоры первого экрана — как на «Контактах»: 10 и 6 */

}

/* Карточка справа: заголовки-строки, разделитель, шаги с номерами */

@media (min-width: 1024px) {

  /* исторические отступы контактного списка (16 сверху, 14 снизу)
     раздували карточку выше бюджета 280 */

}

/* 1024–1365px: контейнер уже — карточка 500, чтобы плашки-факты слева
   не ломались на вторые строки (бюджет 280) */
@media (min-width: 1024px) and (max-width: 1365px) {
}

/* Телефон: плашки в колонку, карточка обычной плотности */
@media (max-width: 1023px) {
}

/* ============================================================
   Шкала формы (разрешение заказчика 24.08.2026 — форма распечатана).
   Замер «Наличия» до правок: у кегля 14px было пять межстрочных,
   у 13px — два, а поля, зона файла и превью шли радиусами 10 и 8px,
   которых нет в шкале проекта (12 и 16).

   Правка лежит в файле формы, а не страницы: форма одна на «Наличии»,
   «Контактах» и /quote, и разъезжаться между ними она не должна.
   ============================================================ */
body:not(.admin-body) .quote-form input:not([type="checkbox"]):not([type="radio"]),
body:not(.admin-body) .quote-form textarea,
body:not(.admin-body) .quote-form select,
body:not(.admin-body) .quote-form .file-dropzone,
body:not(.admin-body) .quote-form .file-preview {
  border-radius: var(--radius-control);
}

/* Один межстрочный на кегль: подписи, подсказки и текстовые кнопки формы
   шли пятью разными интервалами на одном кегле */
body:not(.admin-body) .quote-form label,
body:not(.admin-body) .quote-form .label-inline,
body:not(.admin-body) .quote-form .label-hint,
body:not(.admin-body) .quote-form .file-dropzone-title,
body:not(.admin-body) .quote-form .file-select-button,
body:not(.admin-body) .quote-form .link-button,
body:not(.admin-body) .quote-form .quote-required-note,
body:not(.admin-body) .quote-form .field-error,
body:not(.admin-body) .quote-form p {
  line-height: 1.5;
}

/* ============================================================
   Мобильный макет «Отправить спецификацию» 26.08.2026
   (KabEm Quote Mobile). Только ≤767: десктоп не меняется.
   ============================================================ */
@media (max-width: 767px) {
  /* Факты первого экрана — строками с синей чертой слева */

  /* Карточка «Мы на связи»: телефон крупно, ниже почта и часы в строку */

  /* «Полезно перед отправкой»: плитки 2×2 только с названием */

  /* Плитки одной высоты: длинные названия в две строки не должны
     растягивать соседей по ряду */
}

/* ============================================================
   Раскладка «Заявки» по макету Quote Web v3 (26.08.2026):
   слева колонка 352px с заголовком, контактами и ссылками,
   справа — карточка формы.
   ============================================================ */
body:not(.admin-body).pages.quote .qp-grid {
  display: grid;
  /* 420 — чтобы «Отправить спецификацию» встало одной строкой, а «на
     расчёт» ушло на вторую (просьба 26.08.2026) */
  grid-template-columns: 420px minmax(0, 1fr);
  gap: 56px;
  align-items: start;
}

body:not(.admin-body).pages.quote .qp-side h1 { margin: 0; }

body:not(.admin-body).pages.quote .qp-side .lead { margin: 10px 0 0; }

body:not(.admin-body).pages.quote .qp-side-block {
  /* Ужато, чтобы «Как комплектуем заявки» попадал в первый экран
     (просьба 26.08.2026) */
  margin-top: 12px;
  padding-top: 12px;
  border-top: 1px solid var(--color-border);
  display: grid;
  gap: 14px;
}

/* Подпись группы, не надзаголовок секции: над H1 надзаголовков не бывает
   (правило проекта), а вид тот же — 13/18 caps синим */
body:not(.admin-body).pages.quote .qp-side-label {
  margin: 0;
  font-size: 13px;
  line-height: 18px;
  font-weight: var(--fw-bold);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: #1870BD;
}

body:not(.admin-body).pages.quote .qp-side-phone {
  font-size: 26px;
  line-height: 1.15;
  font-weight: var(--fw-bold);
  letter-spacing: var(--ls-h2);
  color: var(--color-text);
  font-variant-numeric: tabular-nums;
}

body:not(.admin-body).pages.quote .qp-side-lines { display: grid; gap: 7px; }

body:not(.admin-body).pages.quote .qp-side-line {
  margin: 0;
  display: grid;
  /* Значок 16px без плашки и по центру строки: плашка 32px ломала ритм
     колонки и уводила текст выше центра (просьба 26.08.2026) */
  grid-template-columns: 16px minmax(0, 1fr);
  align-items: center;
  gap: 10px;
  min-height: 24px;
  font-size: var(--fs-caption);
  line-height: 1.4;
  color: #5C6E84;
}

body:not(.admin-body).pages.quote .qp-side-line .icon-badge {
  width: 16px;
  height: 16px;
  min-width: 0;
  flex: none;
  background: none;
  border: 0;
  border-radius: 0;
  color: #1870BD;
}

body:not(.admin-body).pages.quote .qp-side-line .icon-badge::before {
  width: 16px;
  height: 16px;
}

/* Адрес идёт в две строки — значок к первой */
body:not(.admin-body).pages.quote .qp-side-line:last-child {
  align-items: start;
}

body:not(.admin-body).pages.quote .qp-side-line:last-child .icon-badge {
  margin-top: 2px;
}

body:not(.admin-body).pages.quote a.qp-side-line { color: #1870BD; }

/* Карточка — сама форма, а не обёртка: рамок было две, вложенных одна в
   другую (просьба 26.08.2026 «убери заднюю обводку») */
body:not(.admin-body).pages.quote .qp-form-card {
  display: grid;
}

body:not(.admin-body).pages.quote .qp-form-card .quote-form {
  width: 100%;
  padding: 40px;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-card);
  background: var(--color-bg);
  box-shadow: 0 18px 40px rgba(16, 35, 60, 0.06);
}

/* Позиции — двумя колонками рядом, зоны одной высоты (макет v3) */
body:not(.admin-body).pages.quote .qp-form-card .quote-grid .file-field,
body:not(.admin-body).pages.quote .qp-form-card .quote-grid .field-message {
  grid-column: span 1;
}

@media (max-width: 1023px) {
  body:not(.admin-body).pages.quote .qp-grid {
    grid-template-columns: minmax(0, 1fr);
    gap: 28px;
  }

  body:not(.admin-body).pages.quote .qp-form-card .quote-form { padding: var(--pad-panel); }
}

/* Линия между группами формы — как в макете Quote Web v3: «Поставка» и
   «Позиции» отделены от предыдущего блока (26.08.2026) */
body:not(.admin-body).pages.quote .quote-grid > .quote-group-title:not(:first-child),
body:not(.admin-body).pages.quote .quote-grid > .quote-group-head {
  margin-top: 10px;
  padding-top: 22px;
  border-top: 1px solid var(--color-border);
}

/* Форма на «Заявке» была растянута (просьба 26.08.2026): поле карточки
   32 вместо 40, шаг сетки 16 вместо 20, подпись под кнопкой ближе */
@media (min-width: 1024px) {
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-form-card .quote-form.quote-form {
    padding: 32px;
  }

  body:not(.admin-body).pages.quote .qp-form-card .quote-grid {
    gap: 16px 28px;
  }

  body:not(.admin-body).pages.quote .qp-form-card .quote-direct-email {
    margin-top: 8px;
  }

  body:not(.admin-body).pages.quote .qp-form-card .quote-grid > .quote-group-title:not(:first-child),
  body:not(.admin-body).pages.quote .qp-form-card .quote-grid > .quote-group-head {
    /* Воздух вокруг линий-разделителей ужат (просьба 26.08.2026) */
    margin-top: 0;
    padding-top: 12px;
  }
}

/* Дополнительно поджимаем форму «Заявки» (просьба 26.08.2026) */
@media (min-width: 1024px) {
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-form-card .quote-grid {
    gap: 14px 28px;
  }

  /* Зоны позиций ниже: 150 было под макет с крупным полем */
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-form-card .file-dropzone,
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-form-card textarea {
    min-height: 132px;
    height: 132px;
  }

  /* Подсказка про почту — одной строкой: кегль подписи и без значка */
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .quote-form-actions-row .quote-direct-email {
    font-size: 13px;
  }

  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .quote-form-actions-row .quote-direct-email-ico {
    display: none;
  }
}

@media (max-width: 767px) {
  /* Мобильная «Заявка» по тем же правилам, что в мобильных рендерах
     26.08.2026: поле карточки 18, вкладки в область касания 44 */
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-form-card .quote-form.quote-form {
    padding: 18px;
  }

  body:not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .quote-tabs button {
    min-height: var(--tap-min);
  }

  /* Согласие и кнопка — во всю ширину, подсказка под ними по центру */
  body:not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .quote-form-actions-row .quote-submit {
    width: 100%;
    justify-content: center;
  }
}

@media (max-width: 767px) {
  /* Мобильная «Заявка» по макету Quote Mobile (26.08.2026): контакты —
     карточкой с круглой кнопкой звонка, разделы — плитками 2×2 */
  body:not(.admin-body).pages.quote .qp-side-block--contacts {
    margin-top: 18px;
    padding: 18px;
    border: 1px solid var(--color-border);
    border-top: 1px solid var(--color-border);
    border-radius: var(--radius-card);
    background: var(--color-bg);
    box-shadow: 0 14px 34px rgba(11, 35, 64, 0.07);
  }

  body:not(.admin-body).pages.quote .qp-side-phone-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
  }

  body:not(.admin-body).pages.quote .qp-side-call {
    width: 44px;
    height: 44px;
    flex: none;
    border-radius: 999px;
    background: var(--color-primary);
    display: flex;
    align-items: center;
    justify-content: center;
  }

  body:not(.admin-body).pages.quote .qp-side-call span {
    width: 17px;
    height: 17px;
    background: var(--color-bg);
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 16.9v3a2 2 0 0 1-2.2 2 19.8 19.8 0 0 1-8.6-3.1 19.5 19.5 0 0 1-6-6A19.8 19.8 0 0 1 2.1 4.2 2 2 0 0 1 4.1 2h3a2 2 0 0 1 2 1.7c.1 1 .4 1.9.7 2.8a2 2 0 0 1-.5 2.1L8.1 9.9a16 16 0 0 0 6 6l1.3-1.3a2 2 0 0 1 2.1-.4c.9.3 1.8.6 2.8.7a2 2 0 0 1 1.7 2Z'/%3E%3C/svg%3E") center / contain no-repeat;
    mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 16.9v3a2 2 0 0 1-2.2 2 19.8 19.8 0 0 1-8.6-3.1 19.5 19.5 0 0 1-6-6A19.8 19.8 0 0 1 2.1 4.2 2 2 0 0 1 4.1 2h3a2 2 0 0 1 2 1.7c.1 1 .4 1.9.7 2.8a2 2 0 0 1-.5 2.1L8.1 9.9a16 16 0 0 0 6 6l1.3-1.3a2 2 0 0 1 2.1-.4c.9.3 1.8.6 2.8.7a2 2 0 0 1 1.7 2Z'/%3E%3C/svg%3E") center / contain no-repeat;
  }

}

@media (min-width: 768px) {
  /* Круглая кнопка звонка — только на телефоне: на вебе рядом стоит
     сам номер, дублировать действие незачем */
  body:not(.admin-body).pages.quote .qp-side-call { display: none; }
}

@media (max-width: 767px) {
  /* Единый мобильный H1 (разбор 26.08.2026): 26 вместо прежних 28 */
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-side h1 {
    font-size: 26px;
    line-height: 1.16;
    letter-spacing: -0.03em;
  }

  body:not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-side-phone {
    font-size: 22px;
    letter-spacing: -0.028em;
  }

  /* Почта и часы — одной строкой под телефоном, адрес живёт в подвале */
  body:not(.admin-body).pages.quote .qp-side-lines {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding-top: 14px;
    border-top: 1px solid var(--color-border);
  }

  body:not(.admin-body).pages.quote .qp-side-line {
    min-width: 0;
    grid-template-columns: 15px minmax(0, 1fr);
    gap: 9px;
  }

  body:not(.admin-body).pages.quote .qp-side-line:last-child { display: none; }
}

@media (max-width: 767px) {
  /* Первый экран на белом поле с отбивкой — по макету Quote Mobile */
  body:not(.admin-body).pages.quote .qp-side {
    margin: -15px -16px 0;
    padding: 16px 20px 24px;
    background: var(--color-bg);
    border-bottom: 1px solid var(--color-border);
  }

  /* Карточка контактов и блок разделов выходят из белого поля обратно */
  body:not(.admin-body).pages.quote .qp-side-block--contacts {
    margin: 24px -4px 0;
  }

  body:not(.admin-body).pages.quote .qp-side-block:last-child {
    margin-top: 24px;
    padding-top: 0;
    border-top: 0;
  }
}

* Страница /quote «Отправить спецификацию» — переработка по рендеру.
   Типографика и карточки — по эталону страницы «Наличие на складе».
   Отдельный файл по образцу Дед Глеб; подключается последним. */

/* ===== Первый экран ===== */

/* Карточка «Что произойдёт после отправки» */
body:not(.admin-body).pages.quote .qp-contacts-link { font-weight: 600; }

/* ===== Форма ===== */
body:not(.admin-body).pages.quote .qp-form-wrap .quote-form {
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: 14px;
  padding: 32px;
}

/* ===== Как мы работаем ===== */
body:not(.admin-body).pages.quote .qp-process { padding-block: 16px 8px; }
body:not(.admin-body).pages.quote .qp-process-card {
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: 14px;
  padding: 28px 32px;
}
body:not(.admin-body).pages.quote .qp-process-card h2 { margin: 0 0 22px; font-size: 24px; }
body:not(.admin-body).pages.quote .qp-process-list {
  list-style: none;
  margin: 0 0 20px;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 32px;
  position: relative;
}
body:not(.admin-body).pages.quote .qp-process-item { margin: 0; position: relative; }
body:not(.admin-body).pages.quote .qp-process-item:not(:first-child)::before {
  content: "";
  position: absolute;
  left: -26px;
  top: 15px;
  width: 20px;
  height: 2px;
  background: #D7E3EE;
}
body:not(.admin-body).pages.quote .qp-process-item h3 {
  font-size: 15px;
  margin: 12px 0 6px;
  color: #10233C;
}
body:not(.admin-body).pages.quote .qp-process-item p {
  font-size: 13px;
  line-height: 1.5;
  margin: 0;
  color: #5C6E84;
  max-width: 260px;
}
body:not(.admin-body).pages.quote .qp-process-cta { display: flex; justify-content: flex-end; }

/* ===== Полезно перед отправкой ===== */

/* ===== Планшет ===== */
@media (max-width: 1023px) {
  body:not(.admin-body).pages.quote .qp-process-list { grid-template-columns: 1fr; gap: 18px; }
  body:not(.admin-body).pages.quote .qp-process-item:not(:first-child)::before { content: none; }
}

/* ===== Мобайл ===== */
@media (max-width: 767px) {
  body:not(.admin-body).pages.quote .qp-form-wrap .quote-form { padding: 22px 20px; }
  body:not(.admin-body).pages.quote .qp-process-card { padding: 22px 20px; }
  body:not(.admin-body).pages.quote .qp-process-cta { justify-content: stretch; }
  body:not(.admin-body).pages.quote .qp-process-cta .btn { width: 100%; min-height: 50px; }
}

@media (prefers-reduced-motion: reduce) {
}

/* H1 по эталону «Наличия» */
@media (min-width: 768px) {
}

/* ============================================================
   Форма на /quote — идентична эталонной форме на /contacts
   ============================================================ */
@media (min-width: 768px) {
  body:not(.admin-body).pages.quote .qp-form-wrap .quote-form {
    padding: 24px;
    border-color: var(--color-border);
  }
  body:not(.admin-body).pages.quote .quote-form .quote-grid { row-gap: 18px; }
  body:not(.admin-body).pages.quote .quote-form .quote-form-copy { margin-bottom: 18px; }
  body:not(.admin-body).pages.quote .quote-form .quote-form-copy h2 { font-size: 28px; }
  body:not(.admin-body).pages.quote .quote-form .quote-form-copy .kicker { font-size: 13px; letter-spacing: 0.08em; }
  body:not(.admin-body).pages.quote .quote-form label { font-size: 13px; }
  body:not(.admin-body).pages.quote .quote-form input[type="text"],
  body:not(.admin-body).pages.quote .quote-form input[type="tel"],
  body:not(.admin-body).pages.quote .quote-form input[type="email"] { border-color: var(--color-border); }
  body:not(.admin-body).pages.quote .quote-form .file-dropzone { min-height: 120px; }
}

/* Вертикальные зазоры между блоками — как на «Наличии» (20–26px) */
@media (min-width: 768px) {
  body:not(.admin-body).pages.quote section.section.qp-process { padding-top: 10px; padding-bottom: 10px; }
}

/* ============================================================
   Типографика /quote по эталону «Наличия на складе»
   ============================================================ */
body:not(.admin-body).pages.quote h1,
body:not(.admin-body).pages.quote h2,
body:not(.admin-body).pages.quote h3 { color: #10233C; }

/* ============================================================
   Форма «Отправьте спецификацию»: общая плотность для всех страниц.
   Перенесено из 15-contacts-v3.css — тот файл грузится только на своих
   страницах, а форма одинакова везде (эталон — «Контакты»).
   ============================================================ */
/* ============================================================
   Форма «Отправьте спецификацию»: компактная плотность (10.08.2026).
   Сетка и палитра прежние — сокращены только отступы и повторы.
   ============================================================ */
body:not(.admin-body) .quote-form-lead {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: 4px var(--space-6);
}

body:not(.admin-body) .quote-form-lead p {
  margin: 0;
}

body:not(.admin-body) .quote-required-note {
  flex: 0 0 auto;
  font-size: 13px;
  color: var(--color-text-muted);
}

/* Подзаголовки групп: помогают сканировать, но почти не занимают высоты */
/* Подписи групп формы — те же надзаголовки, что на страницах: 13/18,
   трекинг 0.08em, синий (сверка с правилами 26.08.2026) */
body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body) .quote-group-title {
  margin: 0;
  font-size: 13px;
  line-height: 18px;
  font-weight: var(--fw-bold);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: #1870BD;
}

body:not(.admin-body) .quote-grid > .quote-group-title,
body:not(.admin-body) .quote-group-head {
  margin-top: var(--space-2);
}

body:not(.admin-body) .quote-grid > .quote-group-title:first-child {
  margin-top: 0;
}

body:not(.admin-body) .quote-group-head {
  display: grid;
  gap: 4px;
}

body:not(.admin-body) .quote-group-note {
  margin: 0;
  font-size: 14px;
  line-height: 1.45;
  color: var(--color-text-muted);
}

/* Плотность сетки: строки ближе друг к другу, подпись ближе к полю */
body:not(.admin-body) .quote-grid {
  gap: var(--space-4) var(--space-6);
}

body:not(.admin-body) .quote-grid .field {
  gap: 6px;
}

/* Дропзона и textarea одной компактной высоты */
body:not(.admin-body) .quote-grid .file-dropzone {
  min-height: 128px;
  gap: 6px;
}

body:not(.admin-body) .file-dropzone-ico {
  width: 26px;
  height: 26px;
  background-color: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 16V4'/%3E%3Cpolyline points='7 9 12 4 17 9'/%3E%3Cpath d='M4 16v3a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-3'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 16V4'/%3E%3Cpolyline points='7 9 12 4 17 9'/%3E%3Cpath d='M4 16v3a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-3'/%3E%3C/svg%3E") center / contain no-repeat;
}

body:not(.admin-body) .file-dropzone-or {
  font-size: 13px;
  color: var(--color-text-muted);
}

body:not(.admin-body) .file-select-button {
  min-height: 36px;
  padding-inline: var(--space-3);
  font-size: 14px;
}

/* Юридическая строка — на всю ширину, вторичным текстом */
body:not(.admin-body) .quote-grid .file-pii-note {
  margin: 0;
  font-size: 13px;
  line-height: 1.45;
  color: var(--color-text-muted);
}

/* Низ формы: кнопка и пояснение одной строкой, почта — компактной второй */
body:not(.admin-body) .quote-form-actions {
  margin-top: var(--space-5);
  display: grid;
  gap: 10px;
}

body:not(.admin-body) .quote-form-actions-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-4);
}

body:not(.admin-body) .quote-direct-email {
  margin: 0;
  font-size: 14px;
  color: var(--color-text-muted);
}

@media (max-width: 767px) {
  body:not(.admin-body) .quote-grid { gap: var(--space-3) var(--space-4); }
  body:not(.admin-body) .quote-grid .file-dropzone { min-height: 116px; }
  body:not(.admin-body) .quote-form-actions-row { gap: var(--space-3); }
  body:not(.admin-body) .quote-form-actions-row .btn { width: 100%; }
}

/* ============================================================
   Единая форма спецификации на всех страницах.
   Класс .quote-form--compact ставит партиал везде, кроме
   «Наличия» с приложенным файлом остатков. Тройной класс —
   чтобы перебить постраничные правила без !important.
   ============================================================ */
@media (min-width: 768px) {
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact {
    /* Низ 14px вместо 24: форма стала на 10px ниже (просьба 15.08.2026).
       Правило именно здесь — оно с утроенным классом выигрывает у всех
       остальных, и правка в общем файле формы до неё не доставала. */
    padding: 24px 24px 14px;
    /* эталон «Контактов»: скругление формы одинаково на всех страницах */
    border-radius: 14px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-grid {
    row-gap: 8px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact textarea {
    height: 96px;
    min-height: 96px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .file-dropzone {
    min-height: 96px;
    height: 96px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-form-copy {
    margin-bottom: 8px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-form-copy h2 {
    font-size: 26px;
    line-height: 1.2;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .field > label {
    font-size: 13px;
    line-height: 18px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact input[type="text"],
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact input[type="email"],
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact input[type="tel"] {
    height: 46px;
    min-height: 46px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .consent {
    padding-block: 0;
    min-height: 44px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-form-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 12px 18px;
    margin-top: 4px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-form-actions .form-note {
    margin-top: 0;
    text-align: right;
  }
}

/* Та же форма на телефоне: плотность «Контактов» на всех страницах */
@media (max-width: 767px) {
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact {
    padding: 24px;
    row-gap: 0;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-form-copy {
    margin-bottom: 6px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-form-copy h2 {
    font-size: 20px;
    line-height: 1.2;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-form-lead {
    gap: 4px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-grid {
    row-gap: 4px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .field {
    gap: 3px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .field > label {
    line-height: 16px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-group-head {
    gap: 2px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact input[type="text"],
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact input[type="email"],
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact input[type="tel"] {
    height: 44px;
    min-height: 44px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .file-dropzone {
    min-height: 76px;
    height: 76px;
    padding: 8px;
    gap: 2px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact textarea {
    height: 76px;
    min-height: 76px;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .consent {
    gap: 8px;
    line-height: 1.3;
  }
  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .quote-form-actions {
    margin-top: 6px;
    gap: 6px;
  }
}

/* Загрузка файла: горизонтальная раскладка текста, разделителя и кнопки
   для всех страниц, где используется общий партиал формы. */
body:not(.admin-body) .quote-form .file-dropzone,
body:not(.admin-body) .quote-grid .file-dropzone,
body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .file-dropzone {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-content: center;
  align-items: center;
  justify-content: center;
  gap: var(--space-2) var(--space-3);
  text-align: center;
}

body:not(.admin-body) .quote-form .file-dropzone::before {
  content: none;
}

body:not(.admin-body).pages.contacts .quote-form .file-dropzone::before,
body:not(.admin-body).pages.quote .quote-form .file-dropzone::before,
body:not(.admin-body).pages.complex_supply .quote-form .file-dropzone::before,
body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .file-dropzone::before {
  content: none;
  display: none;
}

body:not(.admin-body) .quote-form .file-dropzone-ico {
  flex: 0 0 auto;
}

body:not(.admin-body) .quote-form .file-dropzone-title,
body:not(.admin-body) .quote-form .file-dropzone-or,
body:not(.admin-body) .quote-form .file-select-button {
  margin: 0;
}

body:not(.admin-body) .quote-form .file-dropzone-title {
  flex: 0 1 auto;
  min-width: 0;
}

body:not(.admin-body) .quote-form .file-dropzone-or,
body:not(.admin-body) .quote-form .file-select-button {
  flex: 0 0 auto;
}

body:not(.admin-body) .quote-form .file-select-button {
  min-width: 136px;
}

@media (min-width: 768px) {
  body:not(.admin-body) .quote-form .file-dropzone-or {
    margin-inline-end: var(--space-2);
  }

  body:not(.admin-body) .quote-form .file-dropzone:focus-within:has(.file-select-button:focus) {
    outline: 0;
  }

  body:not(.admin-body) .quote-form .file-dropzone-title {
    white-space: nowrap;
  }

  body:not(.admin-body) .quote-form--compact.quote-form--compact.quote-form--compact .file-dropzone {
    min-height: 96px;
    height: 96px;
  }
}

/* ============================================================
   ПЕРВЫЙ ЭКРАН ПО РЕНДЕРУ 16.08.2026 (≤280px)
   Слева плашки-факты и кнопка к форме, справа карточка «Мы на связи»
   и «Как мы работаем». Плотность подчинена бюджету высоты.
   ============================================================ */
@media (min-width: 1024px) {

  /* Зазоры первого экрана — как на «Контактах»: 10 и 6 */

}

/* Карточка справа: заголовки-строки, разделитель, шаги с номерами */

@media (min-width: 1024px) {

  /* исторические отступы контактного списка (16 сверху, 14 снизу)
     раздували карточку выше бюджета 280 */

}

/* 1024–1365px: контейнер уже — карточка 500, чтобы плашки-факты слева
   не ломались на вторые строки (бюджет 280) */
@media (min-width: 1024px) and (max-width: 1365px) {
}

/* Телефон: плашки в колонку, карточка обычной плотности */
@media (max-width: 1023px) {
}

/* ============================================================
   Шкала формы (разрешение заказчика 24.08.2026 — форма распечатана).
   Замер «Наличия» до правок: у кегля 14px было пять межстрочных,
   у 13px — два, а поля, зона файла и превью шли радиусами 10 и 8px,
   которых нет в шкале проекта (12 и 16).

   Правка лежит в файле формы, а не страницы: форма одна на «Наличии»,
   «Контактах» и /quote, и разъезжаться между ними она не должна.
   ============================================================ */
body:not(.admin-body) .quote-form input:not([type="checkbox"]):not([type="radio"]),
body:not(.admin-body) .quote-form textarea,
body:not(.admin-body) .quote-form select,
body:not(.admin-body) .quote-form .file-dropzone,
body:not(.admin-body) .quote-form .file-preview {
  border-radius: var(--radius-control);
}

/* Один межстрочный на кегль: подписи, подсказки и текстовые кнопки формы
   шли пятью разными интервалами на одном кегле */
body:not(.admin-body) .quote-form label,
body:not(.admin-body) .quote-form .label-inline,
body:not(.admin-body) .quote-form .label-hint,
body:not(.admin-body) .quote-form .file-dropzone-title,
body:not(.admin-body) .quote-form .file-select-button,
body:not(.admin-body) .quote-form .link-button,
body:not(.admin-body) .quote-form .quote-required-note,
body:not(.admin-body) .quote-form .field-error,
body:not(.admin-body) .quote-form p {
  line-height: 1.5;
}

/* ============================================================
   Мобильный макет «Отправить спецификацию» 26.08.2026
   (KabEm Quote Mobile). Только ≤767: десктоп не меняется.
   ============================================================ */
@media (max-width: 767px) {
  /* Факты первого экрана — строками с синей чертой слева */

  /* Карточка «Мы на связи»: телефон крупно, ниже почта и часы в строку */

  /* «Полезно перед отправкой»: плитки 2×2 только с названием */

  /* Плитки одной высоты: длинные названия в две строки не должны
     растягивать соседей по ряду */
}

/* ============================================================
   Раскладка «Заявки» по макету Quote Web v3 (26.08.2026):
   слева колонка 352px с заголовком, контактами и ссылками,
   справа — карточка формы.
   ============================================================ */
body:not(.admin-body).pages.quote .qp-grid {
  display: grid;
  /* 420 — чтобы «Отправить спецификацию» встало одной строкой, а «на
     расчёт» ушло на вторую (просьба 26.08.2026) */
  grid-template-columns: 420px minmax(0, 1fr);
  gap: 56px;
  align-items: start;
}

body:not(.admin-body).pages.quote .qp-side h1 { margin: 0; }

body:not(.admin-body).pages.quote .qp-side .lead { margin: 14px 0 0; }

/* Подпись группы, не надзаголовок секции: над H1 надзаголовков не бывает
   (правило проекта), а вид тот же — 13/18 caps синим */
body:not(.admin-body).pages.quote .qp-side-label {
  margin: 0;
  font-size: 13px;
  line-height: 18px;
  font-weight: var(--fw-bold);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: #1870BD;
}

body:not(.admin-body).pages.quote .qp-side-phone {
  font-size: 26px;
  line-height: 1.15;
  font-weight: var(--fw-bold);
  letter-spacing: var(--ls-h2);
  color: var(--color-text);
  font-variant-numeric: tabular-nums;
}

body:not(.admin-body).pages.quote .qp-side-lines { display: grid; gap: 9px; }

body:not(.admin-body).pages.quote .qp-side-line {
  margin: 0;
  display: grid;
  /* Значок 16px без плашки и по центру строки: плашка 32px ломала ритм
     колонки и уводила текст выше центра (просьба 26.08.2026) */
  grid-template-columns: 16px minmax(0, 1fr);
  align-items: center;
  gap: 10px;
  min-height: 24px;
  font-size: var(--fs-caption);
  line-height: 1.4;
  color: #5C6E84;
}

body:not(.admin-body).pages.quote .qp-side-line .icon-badge {
  width: 16px;
  height: 16px;
  min-width: 0;
  flex: none;
  background: none;
  border: 0;
  border-radius: 0;
  color: #1870BD;
}

body:not(.admin-body).pages.quote .qp-side-line .icon-badge::before {
  width: 16px;
  height: 16px;
}

/* Адрес идёт в две строки — значок к первой */
body:not(.admin-body).pages.quote .qp-side-line:last-child {
  align-items: start;
}

body:not(.admin-body).pages.quote .qp-side-line:last-child .icon-badge {
  margin-top: 2px;
}

body:not(.admin-body).pages.quote a.qp-side-line { color: #1870BD; }

/* Карточка — сама форма, а не обёртка: рамок было две, вложенных одна в
   другую (просьба 26.08.2026 «убери заднюю обводку») */
body:not(.admin-body).pages.quote .qp-form-card {
  display: grid;
}

body:not(.admin-body).pages.quote .qp-form-card .quote-form {
  width: 100%;
  padding: 40px;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-card);
  background: var(--color-bg);
  box-shadow: 0 18px 40px rgba(16, 35, 60, 0.06);
}

/* Позиции — двумя колонками рядом, зоны одной высоты (макет v3) */
body:not(.admin-body).pages.quote .qp-form-card .quote-grid .file-field,
body:not(.admin-body).pages.quote .qp-form-card .quote-grid .field-message {
  grid-column: span 1;
}

@media (max-width: 1023px) {
  body:not(.admin-body).pages.quote .qp-grid {
    grid-template-columns: minmax(0, 1fr);
    gap: 28px;
  }

  body:not(.admin-body).pages.quote .qp-form-card .quote-form { padding: var(--pad-panel); }
}

/* Линия между группами формы — как в макете Quote Web v3: «Поставка» и
   «Позиции» отделены от предыдущего блока (26.08.2026) */
body:not(.admin-body).pages.quote .quote-grid > .quote-group-title:not(:first-child),
body:not(.admin-body).pages.quote .quote-grid > .quote-group-head {
  margin-top: 10px;
  padding-top: 22px;
  border-top: 1px solid var(--color-border);
}

/* Форма на «Заявке» была растянута (просьба 26.08.2026): поле карточки
   32 вместо 40, шаг сетки 16 вместо 20, подпись под кнопкой ближе */
@media (min-width: 1024px) {
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-form-card .quote-form.quote-form {
    padding: 32px;
  }

  body:not(.admin-body).pages.quote .qp-form-card .quote-grid {
    gap: 16px 28px;
  }

  body:not(.admin-body).pages.quote .qp-form-card .quote-direct-email {
    margin-top: 8px;
  }

  body:not(.admin-body).pages.quote .qp-form-card .quote-grid > .quote-group-title:not(:first-child),
  body:not(.admin-body).pages.quote .qp-form-card .quote-grid > .quote-group-head {
    /* Воздух вокруг линий-разделителей ужат (просьба 26.08.2026) */
    margin-top: 0;
    padding-top: 12px;
  }
}

/* Дополнительно поджимаем форму «Заявки» (просьба 26.08.2026) */
@media (min-width: 1024px) {
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-form-card .quote-grid {
    gap: 14px 28px;
  }

  /* Зоны позиций ниже: 150 было под макет с крупным полем */
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-form-card .file-dropzone,
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-form-card textarea {
    min-height: 132px;
    height: 132px;
  }

  /* Подсказка про почту — одной строкой: кегль подписи и без значка */
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .quote-form-actions-row .quote-direct-email {
    font-size: 13px;
  }

  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .quote-form-actions-row .quote-direct-email-ico {
    display: none;
  }
}

@media (max-width: 767px) {
  /* Мобильная «Заявка» по тем же правилам, что в мобильных рендерах
     26.08.2026: поле карточки 18, вкладки в область касания 44 */
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-form-card .quote-form.quote-form {
    padding: 18px;
  }

  body:not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .quote-tabs button {
    min-height: var(--tap-min);
  }

  /* Согласие и кнопка — во всю ширину, подсказка под ними по центру */
  body:not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .quote-form-actions-row .quote-submit {
    width: 100%;
    justify-content: center;
  }
}

@media (max-width: 767px) {
  /* Мобильная «Заявка» по макету Quote Mobile (26.08.2026): контакты —
     карточкой с круглой кнопкой звонка, разделы — плитками 2×2 */
  body:not(.admin-body).pages.quote .qp-side-block--contacts {
    margin-top: 18px;
    padding: 18px;
    border: 1px solid var(--color-border);
    border-top: 1px solid var(--color-border);
    border-radius: var(--radius-card);
    background: var(--color-bg);
    box-shadow: 0 14px 34px rgba(11, 35, 64, 0.07);
  }

  body:not(.admin-body).pages.quote .qp-side-phone-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
  }

  body:not(.admin-body).pages.quote .qp-side-call {
    width: 44px;
    height: 44px;
    flex: none;
    border-radius: 999px;
    background: var(--color-primary);
    display: flex;
    align-items: center;
    justify-content: center;
  }

  body:not(.admin-body).pages.quote .qp-side-call span {
    width: 17px;
    height: 17px;
    background: var(--color-bg);
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 16.9v3a2 2 0 0 1-2.2 2 19.8 19.8 0 0 1-8.6-3.1 19.5 19.5 0 0 1-6-6A19.8 19.8 0 0 1 2.1 4.2 2 2 0 0 1 4.1 2h3a2 2 0 0 1 2 1.7c.1 1 .4 1.9.7 2.8a2 2 0 0 1-.5 2.1L8.1 9.9a16 16 0 0 0 6 6l1.3-1.3a2 2 0 0 1 2.1-.4c.9.3 1.8.6 2.8.7a2 2 0 0 1 1.7 2Z'/%3E%3C/svg%3E") center / contain no-repeat;
    mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 16.9v3a2 2 0 0 1-2.2 2 19.8 19.8 0 0 1-8.6-3.1 19.5 19.5 0 0 1-6-6A19.8 19.8 0 0 1 2.1 4.2 2 2 0 0 1 4.1 2h3a2 2 0 0 1 2 1.7c.1 1 .4 1.9.7 2.8a2 2 0 0 1-.5 2.1L8.1 9.9a16 16 0 0 0 6 6l1.3-1.3a2 2 0 0 1 2.1-.4c.9.3 1.8.6 2.8.7a2 2 0 0 1 1.7 2Z'/%3E%3C/svg%3E") center / contain no-repeat;
  }

}

@media (min-width: 768px) {
  /* Круглая кнопка звонка — только на телефоне: на вебе рядом стоит
     сам номер, дублировать действие незачем */
  body:not(.admin-body).pages.quote .qp-side-call { display: none; }
}

@media (max-width: 767px) {
  /* Единый мобильный H1 (разбор 26.08.2026): 26 вместо прежних 28 */
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-side h1 {
    font-size: 26px;
    line-height: 1.16;
    letter-spacing: -0.03em;
  }

  body:not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-side-phone {
    font-size: 22px;
    letter-spacing: -0.028em;
  }

  /* Почта и часы — одной строкой под телефоном, адрес живёт в подвале */
  body:not(.admin-body).pages.quote .qp-side-lines {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding-top: 14px;
    border-top: 1px solid var(--color-border);
  }

  body:not(.admin-body).pages.quote .qp-side-line {
    min-width: 0;
    grid-template-columns: 15px minmax(0, 1fr);
    gap: 9px;
  }

  body:not(.admin-body).pages.quote .qp-side-line:last-child { display: none; }
}

@media (max-width: 767px) {
  /* Первый экран на белом поле с отбивкой — по макету Quote Mobile */
  body:not(.admin-body).pages.quote .qp-side {
    margin: -15px -16px 0;
    padding: 16px 20px 24px;
    background: var(--color-bg);
    border-bottom: 1px solid var(--color-border);
  }

  /* Карточка контактов и блок разделов выходят из белого поля обратно */
  body:not(.admin-body).pages.quote .qp-side-block--contacts {
    margin: 24px -4px 0;
  }

  body:not(.admin-body).pages.quote .qp-side-block:last-child {
    margin-top: 24px;
    padding-top: 0;
    border-top: 0;
  }
}

/* Блок «Может пригодиться» вынесен из колонки соседом формы: на вебе он
   остаётся под контактами в левой колонке, на телефоне уходит под форму
   — так он стоит в рендере Quote Mobile (26.08.2026) */
@media (min-width: 1024px) {
  body:not(.admin-body).pages.quote .qp-grid {
    /* Строки по содержимому: иначе первая тянется под высокую форму и
       между контактами и разделами появляется провал (26.08.2026) */
    grid-template-rows: min-content min-content;
    align-content: start;
  }

  body:not(.admin-body).pages.quote .qp-side { grid-column: 1; grid-row: 1; }

  body:not(.admin-body).pages.quote .qp-form-card { grid-column: 2; grid-row: 1 / span 2; }

}

/* На телефоне «Может пригодиться» уходит под форму — так он стоит в
   рендере Quote Mobile. display: contents поднимает детей колонки в поток
   сетки, и порядком управляет order (26.08.2026) */
@media (max-width: 1023px) {
  body:not(.admin-body).pages.quote .qp-grid {
    display: flex;
    flex-direction: column;
    gap: 0;
  }

  body:not(.admin-body).pages.quote .qp-side { display: contents; }

  body:not(.admin-body).pages.quote .qp-form-card { order: 5; }

}

/* H1 на узких экранах: связка «Отправить спецификацию» неразрывна, и при
   кегле 28 её строка — 352px против контейнера 328 на экране 360, то есть
   заголовок выносил вёрстку за край (перепроверка 26.08.2026). Уменьшаем
   кегль ступенями: перенос остаётся тем же, строка помещается. */
@media (max-width: 340px) {
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-side h1 {
    font-size: 23px;
  }
}

/* На планшете колонка становится во всю ширину (720px), вся фраза влезает
   в строку, и скрипт переносов делит заголовок не на две строки, а на одну
   (перепроверка 26.08.2026). Ограничиваем ширину: «Отправить спецификацию»
   при кегле 32 — это 420px, остальное уходит на вторую строку. */
@media (min-width: 768px) and (max-width: 1023px) {
  body:not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-side h1 {
    max-width: 460px;
  }
}

/* Телефон и почта в боковой колонке «Заявки» — цели нажатия 44px
   (прогон мобильной версии 26.08.2026: 217×25 и 120×39) */
body:not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-side a[href^="tel:"],
body:not(.admin-body):not(.admin-body):not(.admin-body).pages.quote .qp-side a[href^="mailto:"] {
  display: inline-flex;
  align-items: center;
  min-height: var(--tap-min);
}

/* ===== 19-breadcrumbs.css ===== */
/* Хлебные крошки: единый вид на всех страницах по эталону «Наличия на складе».
   Нормализующий слой поверх page-scoped правил (поэтому !important). */

body:not(.admin-body) .breadcrumbs {
  background: #FFFFFF !important;
  border-bottom: 1px solid var(--color-border) !important;
  min-height: 48px !important;
  padding: 0 !important;
  display: flex;
  align-items: center;
}
body:not(.admin-body) .breadcrumbs .wrap { width: 100%; }
body:not(.admin-body) .breadcrumbs ol {
  margin: 0 !important;
  padding: 0 !important;
  gap: 7px !important;
  font-size: 14px !important;
  line-height: 20px !important;
}
body:not(.admin-body) .breadcrumbs li,
body:not(.admin-body) .breadcrumbs a,
body:not(.admin-body) .breadcrumbs [aria-current] {
  font-size: 14px !important;
  line-height: 20px !important;
  font-weight: 400 !important;
  color: rgb(96, 117, 139) !important;
  text-decoration: none !important;
}
body:not(.admin-body) .breadcrumbs a:hover {
  color: #1870BD !important;
}

/* «Отрасли»: крошки лежат на тёмном кадре первого экрана — там они белые
   целиком, вместе с разделителем «/» и наведением (просьба 31.08.2026).
   Исключение живёт здесь: цвет крошек задан выше с !important. */
body:not(.admin-body).pages.industries .breadcrumbs li,
body:not(.admin-body).pages.industries .breadcrumbs a,
body:not(.admin-body).pages.industries .breadcrumbs a:hover,
body:not(.admin-body).pages.industries .breadcrumbs li + li::before,
body:not(.admin-body).pages.industries .breadcrumbs [aria-current] {
  color: #FFFFFF !important;
}

/* Длинная цепочка («Главная / Документы / Пользовательское соглашение») на
   узком экране переносится, а не обрезается: у крошек нет своей прокрутки. */
body:not(.admin-body) .breadcrumbs ol {
  flex-wrap: wrap;
}

/* Контейнер крошек: единая ширина и центрирование на всех страницах
   (перебивает постраничные версии .wrap — из-за них крошки «ползали») */
body:not(.admin-body) .breadcrumbs .wrap,
body:not(.admin-body) .breadcrumbs > div {
  width: min(var(--container), calc(100% - 2 * var(--gutter))) !important;
  max-width: var(--container) !important;
  margin-inline: auto !important;
  padding-inline: 0 !important;
}

/* ============================================================
   Меню: «Каталог» — прямая ссылка, выпадающая панель по наведению
   ============================================================ */
body:not(.admin-body) .nav-dropdown--hover { position: relative; }
body:not(.admin-body) .nav-dropdown--hover > .nav-dropdown-panel { display: none; }
body:not(.admin-body) .nav-dropdown--hover:hover > .nav-dropdown-panel,
body:not(.admin-body) .nav-dropdown--hover:focus-within > .nav-dropdown-panel { display: block; }

/* ============================================================
   Шапка: единый вид на всех страницах по эталону «Наличия»
   (нормализатор поверх постраничных правил) */
body:not(.admin-body) .site-header .header-inner { height: 86px !important; gap: 18px !important; }
/* После прокрутки шапка на телефоне компактнее — 58px вместо 72px.
   height задан в нормализаторе выше с !important, поэтому снимаем его здесь же. */
@media (max-width: 767px) {
  body:not(.admin-body) .site-header .header-inner { height: 72px !important; }
  body:not(.admin-body) .site-header.is-compact .header-inner { height: 58px !important; }
}
/* Полосу шапки и логотип увеличили на 20 % (13.08.2026) — пункты меню
   выросли с 13 до 15px, а «Контакты» перестали упираться в телефон:
   зазор до телефонного блока 28px вместо 24px. */
/* Воздух между пунктами меню (просьба 19.08.2026): было 4px */
body:not(.admin-body) .site-header .primary-nav { gap: 18px !important; margin-right: 28px !important; }
body:not(.admin-body) .site-header .primary-nav > a,
body:not(.admin-body) .site-header .primary-nav .nav-link {
  font-size: 15px !important;
  font-weight: 400 !important;
  letter-spacing: normal !important;
}

/* На узком вебе (≤1200px) пунктам не хватает ширины при 15px — там
   остаётся прежний кегль */
@media (max-width: 1200px) {
  body:not(.admin-body) .site-header .primary-nav > a,
  body:not(.admin-body) .site-header .primary-nav .nav-link {
    font-size: 13px !important;
  }
}
body:not(.admin-body) .site-header .header-phone strong { font-size: 15px !important; font-weight: 600 !important; }
body:not(.admin-body) .site-header .header-cta {
  font-size: 14px !important;
  min-height: 44px !important;
}

/* Пункт меню с дропдауном: убираем шеврон-::after (конфликтовал с подчёркиванием
   и давал «пятно» под активным «Каталогом»); подчёркивание живёт на ::before */
body:not(.admin-body) .primary-nav .nav-link::after,
body:not(.admin-body) .nav-dropdown .nav-link::after {
  content: none !important;
}

/* ===== МЕНЮ: лёгкий hover вместо тёмной плашки =====
   Геометрия одна на всех страницах, включая Главную (просьба 28.08.2026:
   «расстояния между разделами в верхнем меню… сделай как на других»).
   Цвета прозрачной шапки Главной перекрывает 24-home.css ===== */
body:not(.admin-body) .site-header .primary-nav > a,
body:not(.admin-body) .site-header .primary-nav .nav-link {
  position: relative;
  display: inline-flex;
  align-items: center;
  min-height: 42px;
  padding: 10px 6px !important;
  border-radius: 11px !important;
  background: transparent !important;
  color: #5C6E84 !important;
  font-weight: 400 !important;
  border: 0 !important;
  box-shadow: none !important;
  transition: color var(--mo-fast) ease, background-color var(--mo-fast) ease, box-shadow var(--mo-fast) ease, transform var(--mo-fast) ease !important;
}
@media (hover: hover) {
  body:not(.admin-body) .site-header .primary-nav > a:hover,
  body:not(.admin-body) .site-header .primary-nav .nav-link:hover,
  body:not(.admin-body) .site-header .primary-nav .nav-dropdown--hover:hover > .nav-link {
    background: rgba(20, 91, 145, 0.07) !important;
    color: #10233C !important;
    box-shadow: inset 0 0 0 1px rgba(20, 91, 145, 0.05) !important;
    transform: translateY(-1px);
  }
}
body:not(.admin-body) .site-header .primary-nav > a.is-active,
body:not(.admin-body) .site-header .primary-nav .nav-link.is-active {
  background: transparent !important;
  color: #10233C !important;
  font-weight: 600 !important;
}
@media (hover: hover) {
  body:not(.admin-body) .site-header .primary-nav > a.is-active:hover,
  body:not(.admin-body) .site-header .primary-nav .nav-link.is-active:hover {
    background: transparent !important;
    box-shadow: none !important;
    transform: none;
    color: #10233C !important;
  }
}
/* Подчёркивание активного пункта: единый стиль на ::before и ::after */
body:not(.admin-body) .site-header .primary-nav > a::after,
body:not(.admin-body) .site-header .primary-nav .nav-link::before {
  content: "";
  position: absolute;
  left: 6px !important;
  right: 6px !important;
  top: auto !important;
  bottom: 2px !important;
  width: auto !important;
  height: 2px !important;
  border: 0 !important;
  border-radius: 2px;
  background: #10233C !important;
  transform: none !important;
  opacity: 0;
  transition: opacity var(--mo-fast) ease;
}
body:not(.admin-body) .site-header .primary-nav > a.is-active::after,
body:not(.admin-body) .site-header .primary-nav .nav-link.is-active::before {
  opacity: 1;
}
body:not(.admin-body) .site-header .primary-nav > a:focus-visible,
body:not(.admin-body) .site-header .primary-nav .nav-link:focus-visible {
  outline: 2px solid #1870BD;
  outline-offset: 2px;
  background: rgba(20, 91, 145, 0.06) !important;
}
/* Телефон и CTA не трогаем этим hover — их правила специфичнее и живут отдельно */

/* Мобильное меню: полноценные строки, активный пункт светлой плашкой */
/* Пункты мобильного меню — строки-сетки (иконка, название, стрелка),
   раскладка задана в 13-mobile-final. Здесь остаётся только тач-цель:
   прежние display: flex и заливка активного пункта ломали новую сетку. */
body:not(.admin-body) .mobile-menu-panel a {
  min-height: 48px;
}

/* ===== Меню: запрет обрезания пунктов («Контак…») на любых страницах ===== */
body:not(.admin-body) .site-header .primary-nav {
  flex-wrap: nowrap !important;
  overflow: visible !important;
  min-width: 0;
}
body:not(.admin-body) .site-header .primary-nav > a,
body:not(.admin-body) .site-header .primary-nav .nav-link,
body:not(.admin-body) .site-header .primary-nav .nav-link > span {
  white-space: nowrap !important;
  overflow: visible !important;
  text-overflow: clip !important;
  flex-shrink: 0 !important;
  max-width: none !important;
}

/* Ниже 1280px десктопная навигация не помещается рядом с телефоном и кнопкой —
   отдаём её мобильному меню, иначе пункты наезжают на номер. */
@media (max-width: 1279px) {
  body:not(.admin-body) .site-header .primary-nav { display: none !important; }
  body:not(.admin-body) .site-header .mobile-menu { display: block !important; }
}

/* Перенесено из удалённого 06-industries.css: тач-цель крошек.
   По правилу проекта — 44px, было 34px. */
body:not(.admin-body) .breadcrumbs ol li a,
body:not(.admin-body) .breadcrumbs ol li span {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
}

/* Исключение для страниц, где первый экран открывает кадр: там крошки лежат
   поверх фото, и белая полоса с границей разрезала бы его пополам
   («Отрасли» по рендеру Industries Web, 27.08.2026). Правила выше стоят
   с !important, поэтому исключение снимает их тем же весом. */
body:not(.admin-body).pages.industries .breadcrumbs {
  background: transparent !important;
  border-bottom-color: transparent !important;
}

/* ===== 20-motion.css ===== */
/* Единая motion-система сайта КабЭм.
   Спокойные B2B-анимации: только opacity/transform, единый easing.
   Отдельный файл по образцу Дед Глеб; подключается последним. */

:root {
  --mo-ease: cubic-bezier(0.22, 1, 0.36, 1);
  /* Пять ступеней длительности на весь сайт (промпт 13.08.2026, Н1):
     до этого в CSS жило 55 жёстко вписанных значений */
  --mo-micro: 120ms;
  --mo-fast: 180ms;
  --mo-hover: 200ms;
  --mo-reveal: 500ms;
  --mo-expand: 240ms;
  /* Главная (промпт «моушн» 19.08.2026): вход первого экрана и крупные
     сценные эффекты — наезд фото, заливка линии, счётчики */
  --mo-hero: 650ms;
  --mo-scene: 900ms;
}

/* ===== Reveal секций (единые параметры поверх старой моушн-системы) ===== */
.reveal-ready {
  opacity: 0;
  transform: translateY(16px);
  transition: opacity var(--mo-reveal) var(--mo-ease), transform var(--mo-reveal) var(--mo-ease);
}
.reveal-ready.is-revealed {
  opacity: 1;
  transform: translateY(0);
}

/* ===== Hover карточек: -3px, рамка, мягкая тень ===== */
body:not(.admin-body) .qp-link-card,
body:not(.admin-body) .stock-related-card,
body:not(.admin-body) a.abt-object-card,
body:not(.admin-body) .industry-card {
  transition: transform var(--mo-hover) var(--mo-ease), border-color var(--mo-hover) var(--mo-ease), box-shadow var(--mo-hover) var(--mo-ease);
}
@media (hover: hover) {
  body:not(.admin-body) .qp-link-card:hover,
  body:not(.admin-body) .stock-related-card:hover,
  body:not(.admin-body) a.abt-object-card:hover,
  body:not(.admin-body) .industry-card:hover {
    transform: translateY(-3px);
    border-color: var(--color-border-hover);
    box-shadow: 0 10px 26px rgba(12, 42, 72, 0.07);
  }
}

/* ===== Стрелки: движение вправо на hover родителя ===== */
body:not(.admin-body) .contact-link-arrow,
body:not(.admin-body) .btn-arrow,
body:not(.admin-body) .btn-chevron {
  display: inline-block;
  transition: transform var(--mo-fast) var(--mo-ease);
}
@media (hover: hover) {
  body:not(.admin-body) a:hover > .contact-link-arrow,
  body:not(.admin-body) a:hover .text-link .contact-link-arrow,
  body:not(.admin-body) .text-link:hover .contact-link-arrow,
  body:not(.admin-body) .contact-link-card:hover .contact-link-arrow,
  body:not(.admin-body) .qp-link-card:hover .contact-link-arrow,
  body:not(.admin-body) a.abt-object-card:hover .contact-link-arrow {
    transform: translateX(4px);
  }
  body:not(.admin-body) .btn:hover .btn-arrow,
  body:not(.admin-body) .btn:hover .btn-chevron {
    transform: translateX(3px);
  }
}

/* ===== Кнопки ===== */
body:not(.admin-body) .btn {
  transition: transform var(--mo-hover) var(--mo-ease), box-shadow var(--mo-hover) var(--mo-ease), background-color var(--mo-hover) var(--mo-ease), color var(--mo-hover) var(--mo-ease), border-color var(--mo-hover) var(--mo-ease);
}
@media (hover: hover) {
  body:not(.admin-body) .btn:hover {
    transform: translateY(-1px);
    box-shadow: 0 8px 20px rgba(12, 42, 72, 0.14);
  }
}
body:not(.admin-body) .btn:active {
  transform: scale(0.98);
  box-shadow: 0 3px 10px rgba(12, 42, 72, 0.10);
}
body:not(.admin-body) .btn:focus-visible {
  outline: 2px solid #1675D1;
  outline-offset: 3px;
}

/* ===== Шапка: тонкая тень при прокрутке ===== */
body:not(.admin-body) .site-header {
  transition: box-shadow var(--mo-hover) var(--mo-ease), border-color var(--mo-hover) var(--mo-ease);
}
body:not(.admin-body) .site-header.is-scrolled {
  box-shadow: 0 4px 16px rgba(12, 42, 72, 0.07);
}

/* ===== Dropdown меню: мягкое появление ===== */
body:not(.admin-body) .nav-dropdown--hover > .nav-dropdown-panel {
  display: block;
  opacity: 0;
  visibility: hidden;
  transform: translateY(-6px);
  pointer-events: none;
  transition: opacity var(--mo-hover) var(--mo-ease), transform var(--mo-hover) var(--mo-ease), visibility 0s linear var(--mo-hover);
}
body:not(.admin-body) .nav-dropdown--hover:hover > .nav-dropdown-panel,
body:not(.admin-body) .nav-dropdown--hover:focus-within > .nav-dropdown-panel {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
  pointer-events: auto;
  transition: opacity var(--mo-hover) var(--mo-ease), transform var(--mo-hover) var(--mo-ease);
}

/* ===== Первый экран /about: последовательное появление (CSS, без JS) ===== */
@media (prefers-reduced-motion: no-preference) {
  body:not(.admin-body).pages.about .abt-hero .eyebrow {
    animation: mo-rise-8 var(--mo-expand) var(--mo-ease) both;
  }
  body:not(.admin-body).pages.about .abt-hero h1 {
    animation: mo-rise-12 var(--mo-reveal) var(--mo-ease) 60ms both;
  }
  body:not(.admin-body).pages.about .abt-hero .lead {
    animation: mo-rise-12 var(--mo-reveal) var(--mo-ease) var(--mo-micro) both;
  }
  body:not(.admin-body).pages.about .abt-hero-meta {
    animation: mo-rise-8 var(--mo-expand) var(--mo-ease) var(--mo-fast) both;
  }
  /* Схема появляется сдвигом справа — как в макете, где она «приезжает»
     к тексту. Анимация только по прозрачности и сдвигу, LCP не ждёт JS. */
  body:not(.admin-body).pages.about .abt-hero-doc {
    animation: mo-slide-x var(--mo-reveal) var(--mo-ease) 140ms both;
  }
}
@keyframes mo-rise-8 {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: translateY(0); }
}
@keyframes mo-rise-12 {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}
@keyframes mo-slide-x {
  from { opacity: 0; transform: translateX(16px); }
  to { opacity: 1; transform: translateX(0); }
}
@media (max-width: 767px) {
  /* на мобильных без горизонтальных въездов */
  body:not(.admin-body).pages.about .abt-hero-doc {
    animation-name: mo-rise-12;
  }
}

/* ===== FAQ / аккордеоны: плавный поворот стрелок уже задан локально ===== */

/* ===== Reduced motion: всё мгновенно ===== */
@media (prefers-reduced-motion: reduce) {
  .reveal-ready,
  .reveal-ready.is-revealed {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }
  body:not(.admin-body) .btn,
  body:not(.admin-body) .site-header,
    body:not(.admin-body) .qp-link-card,
  body:not(.admin-body) .stock-related-card,
  body:not(.admin-body) a.abt-object-card,
  body:not(.admin-body) .industry-card,
  body:not(.admin-body) .contact-link-arrow,
  body:not(.admin-body) .btn-arrow,
  body:not(.admin-body) .btn-chevron,
  body:not(.admin-body) .nav-dropdown--hover > .nav-dropdown-panel {
    transition: none !important;
    animation: none !important;
    transform: none !important;
  }
  body:not(.admin-body).pages.about .abt-tl-item {
    transition: none !important;
    transform: none !important;
    opacity: 1 !important;
  }
}

/* ===== Motion-токены (промпт «Отрасли») ===== */
:root {
  --motion-fast: 160ms;
  --motion-base: 240ms;
  --motion-slow: 420ms;
  /* Кривых две: вход и появление — --mo-ease, уход — --mo-exit.
     --ease-standard, --ease-enter и --ease-exit удалены: две из трёх
     не были применены ни разу, третья дублировала --mo-ease. */
  --mo-exit: cubic-bezier(0.4, 0, 1, 1);
}

/* ===== Фото в карточках отраслей: лёгкий zoom на hover ===== */
body:not(.admin-body) .industry-card .industry-image,
body:not(.admin-body) a.abt-object-card .abt-object-img {
  transition: transform var(--motion-base) var(--mo-ease);
}
@media (hover: hover) and (pointer: fine) {
  body:not(.admin-body) .industry-card:hover .industry-image,
  body:not(.admin-body) a.abt-object-card:hover .abt-object-img {
    transform: scale(1.015);
  }
  body:not(.admin-body) .industry-card:hover .industry-card-arrow {
    transform: translateX(4px);
  }
}
body:not(.admin-body) .industry-card-arrow {
  display: inline-block;
  transition: transform var(--mo-fast) var(--mo-ease);
}

/* ===== Отклик на нажатие: один язык на весь сайт =====
   Раньше было три правила с translateY(0/1px), и на тач-устройствах, где
   hover не существует, нажатие не подтверждалось ничем. Теперь scale(0.98)
   у всех нажимаемых поверхностей: заметно пальцу и не навязчиво. */
body:not(.admin-body) .btn,
body:not(.admin-body) .industry-card,
body:not(.admin-body) .abt-object-card,
body:not(.admin-body) .abt-principle-card,
body:not(.admin-body) .text-link {
  transition-property: transform, opacity, color, background-color, border-color, box-shadow;
  transition-duration: var(--mo-micro);
  transition-timing-function: var(--mo-ease);
}

body:not(.admin-body) .btn:active,
body:not(.admin-body) .industry-card:active,
body:not(.admin-body) .abt-object-card:active,
body:not(.admin-body) .abt-principle-card:active,
body:not(.admin-body) .text-link:active {
  transform: scale(0.98);
}

@media (prefers-reduced-motion: reduce) {
  body:not(.admin-body) .btn:active,
  body:not(.admin-body) .industry-card:active,
  body:not(.admin-body) .abt-object-card:active,
  body:not(.admin-body) .abt-principle-card:active,
  body:not(.admin-body) .text-link:active {
    transform: none;
  }
}

/* ===== Глобальный reduced-motion (страховка поверх точечных правил) ===== */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    scroll-behavior: auto !important;
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

/* ============================================================
   Блок «Адрес компании»: спокойное появление сцены за ~900ms.
   Панель — единственный наблюдаемый элемент (класс .is-revealed из
   bootScrollReveal), дальше каскад держит CSS через transition-delay.
   Стартовые состояния — только под html.motion-ready, поэтому при
   ошибке или отключённом JS содержимое остаётся видимым.
   ============================================================ */
html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-panel-copy > *,
html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-route-buttons > * {
  opacity: 0;
  transition: opacity var(--mo-reveal) var(--mo-ease), transform var(--mo-reveal) var(--mo-ease);
}

/* Заголовки — только вертикальный сдвиг */
html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-panel-copy > .eyebrow,
html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-panel-copy > h2,
html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-route-hint {
  transform: translateY(6px);
}

/* Информационные строки — короткий горизонтальный сдвиг */
html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-contact-row {
  transform: translateX(-6px);
}

/* Кнопки навигаторов */
html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-route-buttons > * {
  transform: translateY(6px);
}

/* Карта — мягкая «фокусировка», без реального зума и панорамирования */
html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-preview {
  opacity: 0;
  transform: scale(1.015);
  transition: opacity 650ms var(--mo-ease), transform 650ms var(--mo-ease);
  transition-delay: 150ms;
}

html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-load {
  opacity: 0;
  transform: translateY(5px);
  transition: opacity var(--mo-reveal) var(--mo-ease), transform var(--mo-reveal) var(--mo-ease);
  transition-delay: var(--mo-expand);
}

/* Хореография: 100 → 560ms */
html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-panel-copy > .eyebrow { transition-delay: 100ms; }
html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-panel-copy > h2 { transition-delay: 130ms; }
html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-contact-row:nth-of-type(1) { transition-delay: var(--mo-fast); }
html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-contact-row:nth-of-type(2) { transition-delay: var(--mo-expand); }
html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-contact-row:nth-of-type(3) { transition-delay: var(--mo-expand); }
html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-route-hint { transition-delay: var(--mo-reveal); }
html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-route-buttons > *:nth-child(1) { transition-delay: var(--mo-reveal); }
html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-route-buttons > *:nth-child(2) { transition-delay: var(--mo-reveal); }

/* Конечное состояние — после появления панели */
html.motion-ready body:not(.admin-body).pages.contacts .map-panel.is-revealed .map-panel-copy > *,
html.motion-ready body:not(.admin-body).pages.contacts .map-panel.is-revealed .map-route-buttons > *,
html.motion-ready body:not(.admin-body).pages.contacts .map-panel.is-revealed .map-preview,
html.motion-ready body:not(.admin-body).pages.contacts .map-panel.is-revealed .map-load {
  opacity: 1;
  transform: none;
}

/* Микро-hover кнопок навигаторов и «Открыть на карте» */
body:not(.admin-body).pages.contacts .map-route-button,
body:not(.admin-body).pages.contacts .map-load {
  transition: transform var(--mo-hover) var(--mo-ease), border-color var(--mo-hover) var(--mo-ease), background-color var(--mo-hover) var(--mo-ease);
}

body:not(.admin-body).pages.contacts .map-route-logo,
body:not(.admin-body).pages.contacts .map-load-ico {
  transition: transform var(--mo-hover) var(--mo-ease);
}

@media (hover: hover) {
  body:not(.admin-body).pages.contacts .map-route-button:hover {
    transform: translateY(-1px);
    border-color: var(--color-border-strong);
  }
  body:not(.admin-body).pages.contacts .map-route-button:hover .map-route-logo {
    transform: translateX(2px);
  }
  body:not(.admin-body).pages.contacts .map-load:hover {
    transform: translateY(-1px);
  }
  body:not(.admin-body).pages.contacts .map-load:hover .map-load-ico {
    transform: translate(2px, -2px);
  }
}

/* Мобильные: спокойнее — без горизонтального сдвига и без масштаба карты */
@media (max-width: 767px) {
  html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-contact-row {
    transform: translateY(6px);
  }
  html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-preview {
    transform: none;
    transition-delay: var(--mo-micro);
  }
}

/* Reduced motion: содержимое сразу на месте, без сдвигов и задержек */
@media (prefers-reduced-motion: reduce) {
  html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-panel-copy > *,
  html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-route-buttons > *,
  html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-preview,
  html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-load {
    opacity: 1;
    transform: none;
    transition: none;
    transition-delay: 0s;
  }
  body:not(.admin-body).pages.contacts .map-route-button,
  body:not(.admin-body).pages.contacts .map-load,
  body:not(.admin-body).pages.contacts .map-route-logo,
  body:not(.admin-body).pages.contacts .map-load-ico {
    transition: none;
  }
}

/* Контейнер кнопок сам не анимируется — появление держат две кнопки внутри */
html.motion-ready body:not(.admin-body).pages.contacts .map-panel .map-panel-copy > .map-route-buttons {
  opacity: 1;
  transform: none;
  transition: none;
}

/* ============================================================
   Единый фокус-ринг (аудит «О компании», Г5.3)
   Толщина и цвет были заданы четырьмя разными способами: 3px в 01-base,
   2px в 03-buttons, 2px и другой оттенок в 09-design-system и у FAQ.
   Файл грузится последним в ядре, поэтому сводим к одному виду здесь.
   ============================================================ */
body:not(.admin-body) :focus-visible {
  outline: 2px solid #1870BD;
  outline-offset: 2px;
}

body:not(.admin-body) .btn:focus-visible,
body:not(.admin-body) summary:focus-visible {
  outline: 2px solid #1870BD;
  outline-offset: 3px;
}

/* ============================================================
   ОТКЛИК НА НАЖАТИЕ (промпт 13.08.2026, Л4)
   На 105 правил :hover приходилось 4 правила :active — на телефоне,
   где ховера нет, интерфейс не отвечал на касание вовсе.
   Используем существующие токены --mo-micro и --mo-ease, новых не вводим.
   ============================================================ */
body:not(.admin-body) .btn,
body:not(.admin-body) button,
body:not(.admin-body) .category-card,
body:not(.admin-body) .contact-link-card,
body:not(.admin-body) .stock-related-card,
body:not(.admin-body) .thanks-link-card,
body:not(.admin-body) .ind-card,
body:not(.admin-body) .hm-tile,
body:not(.admin-body) .mobile-menu-item,
body:not(.admin-body) .contact-line-value {
  transition: transform var(--mo-micro) var(--mo-ease), background-color var(--mo-hover) var(--mo-ease), border-color var(--mo-hover) var(--mo-ease), color var(--mo-hover) var(--mo-ease);
}

body:not(.admin-body) .btn:active,
body:not(.admin-body) button:active,
body:not(.admin-body) .category-card:active,
body:not(.admin-body) .contact-link-card:active,
body:not(.admin-body) .stock-related-card:active,
body:not(.admin-body) .thanks-link-card:active,
body:not(.admin-body) .ind-card:active,
body:not(.admin-body) .hm-tile:active,
body:not(.admin-body) .mobile-menu-item:active {
  transform: scale(0.98);
}

/* Выделение текста в брендовом синем вместо системного */
body:not(.admin-body) ::selection {
  background: #0F4C81;
  color: #FFFFFF;
}

@media (prefers-reduced-motion: reduce) {
  body:not(.admin-body) .btn:active,
  body:not(.admin-body) button:active,
  body:not(.admin-body) .category-card:active,
  body:not(.admin-body) .contact-link-card:active,
  body:not(.admin-body) .stock-related-card:active,
  body:not(.admin-body) .thanks-link-card:active,
  body:not(.admin-body) .ind-card:active,
  body:not(.admin-body) .hm-tile:active,
  body:not(.admin-body) .mobile-menu-item:active {
    transform: none;
  }
}

/* Кегль и вес кнопок заданы в 03-buttons.css (промпт 13.08.2026, Л5):
   первичная 15/600, вторичная линейная 400, малая 14px. */
/* Вторичная кнопка: тот же кегль, что у первичной, вес обычный.
   Веса 500 в проекте нет — подгружены только 400 и 600. */
body:not(.admin-body) .btn-line,
body:not(.admin-body) a.btn-line,
body:not(.admin-body) button.btn-line {
  font-size: 15px;
  font-weight: 400;
}

/* ============================================================
   ПАРИТЕТ НАЖАТИЯ (промпт «моушн» 13.08.2026, Н2)
   На телефоне ховера нет вовсе: без :active интерфейс не отвечает на
   касание до самого перехода. Крупные карточки проседают слабее (0.985),
   мелкие — заметнее (0.97), кнопки посередине (0.98).
   ============================================================ */
body:not(.admin-body) .ind-other-card,
body:not(.admin-body) .req-useful-card,
body:not(.admin-body) .hm-direction-card,
body:not(.admin-body) .hm-catalog-card,
body:not(.admin-body) .cs-step-card,
body:not(.admin-body) .catalog-card,
body:not(.admin-body) .material-card,
body:not(.admin-body) .projects-card,
body:not(.admin-body) .quote-benefit-card,
body:not(.admin-body) .contact-faq-item summary,
body:not(.admin-body) .adm-quick-link {
  transition: transform var(--mo-micro) var(--mo-ease),
              background-color var(--mo-hover) var(--mo-ease),
              border-color var(--mo-hover) var(--mo-ease),
              color var(--mo-hover) var(--mo-ease);
}

body:not(.admin-body) .ind-other-card:active,
body:not(.admin-body) .req-useful-card:active,
body:not(.admin-body) .hm-direction-card:active,
body:not(.admin-body) .hm-catalog-card:active,
body:not(.admin-body) .cs-step-card:active,
body:not(.admin-body) .catalog-card:active,
body:not(.admin-body) .material-card:active,
body:not(.admin-body) .projects-card:active,
body:not(.admin-body) .quote-benefit-card:active,

body:not(.admin-body) .contact-faq-item summary:active,
body:not(.admin-body) .adm-quick-link:active,
body:not(.admin-body) .text-link:active,
body:not(.admin-body) .text-link-inline:active,
body:not(.admin-body) .contact-line-value:active,
body:not(.admin-body) .footer-nav a:active,
body:not(.admin-body) .breadcrumbs a:active {
  transform: scale(0.97);
}

body:not(.admin-body) .text-link,
body:not(.admin-body) .text-link-inline,
body:not(.admin-body) .footer-nav a,
body:not(.admin-body) .breadcrumbs a {
  display: inline-block;
  transition: transform var(--mo-micro) var(--mo-ease),
              color var(--mo-hover) var(--mo-ease);
}

@media (prefers-reduced-motion: reduce) {
  body:not(.admin-body) .ind-other-card:active,
  body:not(.admin-body) .req-useful-card:active,
  body:not(.admin-body) .hm-direction-card:active,
  body:not(.admin-body) .hm-catalog-card:active,
  body:not(.admin-body) .cs-step-card:active,
  body:not(.admin-body) .catalog-card:active,
  body:not(.admin-body) .material-card:active,
  body:not(.admin-body) .projects-card:active,
  body:not(.admin-body) .quote-benefit-card:active,
  body:not(.admin-body) .contact-faq-item summary:active,
  body:not(.admin-body) .adm-quick-link:active,
  body:not(.admin-body) .text-link:active,
  body:not(.admin-body) .text-link-inline:active,
  body:not(.admin-body) .contact-line-value:active,
  body:not(.admin-body) .footer-nav a:active,
  body:not(.admin-body) .breadcrumbs a:active {
    transform: none;
  }
}

/* ============================================================
   ВХОД ЗАГОЛОВКА ПО СТРОКАМ (промпт «моушн» 13.08.2026, Н6)
   Строки собирает скрипт по фактической раскладке, здесь только движение:
   сдвиг 12px вверх и проявление, ступенька 60ms задана инлайн-переменной.
   ============================================================ */
body:not(.admin-body) h1 .mo-line {
  display: block;
}

/* Мгновенный показ, если движение играть негде */
body:not(.admin-body) h1.is-lines-instant .mo-line {
  opacity: 1;
  transform: none;
  transition: none;
}

/* Прячем строки только когда скрипт сам пометил заголовок: без JS и в
   скрытой вкладке H1 виден сразу — это LCP-элемент, он не ждёт движения */
html.motion-ready body:not(.admin-body) h1.mo-lines-hidden .mo-line {
  opacity: 0;
  transform: translateY(12px);
  transition: opacity var(--mo-reveal) var(--mo-ease) var(--mo-line-delay, 0ms),
              transform var(--mo-reveal) var(--mo-ease) var(--mo-line-delay, 0ms);
}

html.motion-ready body:not(.admin-body) h1.mo-lines-hidden.is-lines-in .mo-line {
  opacity: 1;
  transform: translateY(0);
}

@media (prefers-reduced-motion: reduce) {
  html.motion-ready body:not(.admin-body) h1.mo-lines-hidden .mo-line {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

/* ============================================================
   ОДОМЕТР ЦИФР (промпт «моушн» 13.08.2026, Н4)
   Разряд — окно высотой в строку, внутри лента из десяти цифр. Лента
   уезжает вверх на нужную позицию; длительность задаёт скрипт: 520ms
   старшему разряду и +40ms каждому следующему, как в механическом счётчике.
   ============================================================ */
body:not(.admin-body) .mo-digit {
  display: inline-block;
  overflow: hidden;
  width: 1ch;
  /* Высота ячейки равна строке заголовка: в em она не совпадала с
     line-height и блок подрастал на пару пикселей — это сдвиг раскладки */
  height: 1lh;
  vertical-align: top;
  font-variant-numeric: tabular-nums;
}

body:not(.admin-body) .mo-digit-strip {
  display: block;
  transition-property: transform;
  transition-timing-function: var(--mo-ease);
}

body:not(.admin-body) .mo-digit-strip > span {
  display: block;
  height: 1lh;
}

@media (prefers-reduced-motion: reduce) {
  body:not(.admin-body) .mo-digit-strip {
    transition: none;
  }
}

/* ============================================================
   ШТОРКА ТЁМНОЙ ЗОНЫ (промпт Red Collar 13.08.2026, О3)
   Граница «светлое → тёмное» играет раскрытием слоя по горизонтали от
   правого края, а не сменой фона. Плюс однопиксельный шов на стыке,
   вытянутый за контейнер, чтобы линия не обрывалась у края.
   ============================================================ */
body:not(.admin-body) .site-footer.has-curtain {
  position: relative;
  isolation: isolate;
}

body:not(.admin-body) .site-footer.has-curtain::before {
  content: "";
  position: absolute;
  inset: -1px 0;
  z-index: -1;
  background: inherit;
  transform: scaleX(0);
  transform-origin: right center;
  transition: transform var(--mo-expand) var(--mo-ease);
}

body:not(.admin-body) .site-footer.has-curtain.is-curtain-open::before {
  transform: scaleX(1);
}

/* Шов на стыке зон: тонкая линия, вытянутая за контейнер */
body:not(.admin-body) .site-footer.has-curtain::after {
  content: "";
  position: absolute;
  top: -1px;
  left: 0;
  right: 0;
  height: 1px;
  background: inherit;
}

@media (prefers-reduced-motion: reduce) {
  body:not(.admin-body) .site-footer.has-curtain::before {
    transform: scaleX(1);
    transition: none;
  }
}
