/* static mirror fix: кросс-браузерные / адаптивные визуальные правки зеркала.
   Подключается <link>-ом последним в <head> всех страниц (tools/patch_fixes.py),
   поэтому переопределяет бандлы по порядку источников без !important.
   Кэш: must-revalidate (см. _headers) — при правках поднять ?v= в patch_fixes.py. */

/* --- Горизонтальный overflow на планшете (~768px) ---------------------------
   Ряд full-bleed блоков шаблона (.directions с margin:0 -40px, общий CTA-блок
   .contact__picture с margin:0 -48px, галереи/грид на .container) на брейкпоинте
   768px вылезают за вьюпорт и дают горизонтальный скролл (главная +76px,
   внутренние +10px). Баг унаследован от оригинала. overflow-x:clip обрезает
   вынос по X, не создавая скролл-контейнер и не ломая вертикальный скролл,
   position:sticky (хедер тут static) и fixed-попапы/куки-баннер.
   Подтверждено в WebKit/Chromium/Firefox: overflow сведён к 0 на всех страницах. */
html,
body {
  overflow-x: clip;
}

/* --- Попап «Обсудить проект» на мобильном/планшете (бургер, ≤1200px) --------
   На ширинах с бургер-меню кнопка «Обсудить проект» (a.header__discuss) не
   открывала попап: штатный обработчик оригинала висит на десктопном
   span.header__discuss, а сам .promo__modal скрыт медиазапросом display:none и
   при .active не показывался (баг унаследован — на мобильном попап был
   недоступен). Открытие вешает mirror-forms.js (класс .active), а этот оверрайд
   делает контейнер видимым. Внутренние слои модала уже корректны — форс нужен
   только внешнему .promo__modal. Порог 1200px совпадает с появлением бургера;
   десктоп (≥1201px) не затрагивается. */
@media (max-width: 1200px) {
  .promo__modal.active {
    display: flex;
  }
}

/* --- Система отступов: токены + безопасная нормализация (2026-07-16) ----------
   Первый, самодостаточный этап унификации spacing (аудит — SPACING-AUDIT.md).
   Вводит 4px-шкалу как CSS-переменные (словарь для дальнейшей работы) и применяет
   только те правки, что НЕ зависят от соседних блоков:
     • боковой инсет контейнера на планшете (768–1023): было ~40px — шире, чем на
       десктоп-миддле (32px); сводим к 32px → инсет монотонный 16→32→центрирование;
     • зазоры сетки карточек проектов на главной → единый --grid-gap (было
       рассинхронное 20/30 desktop, 15/25 tablet, 20/20 mobile).
   Ритм между секциями и типографика заголовков сюда НЕ входят: секции авторски
   взаимозависимы (.promo/.coop обнуляют свои margin на ≤768 и берут отступ от
   соседей — блочный оверрайд задвоил бы spacing), это отдельный погэповый этап. */
:root {
  /* базовая шкала расстояний (брать отступы только отсюда) */
  --sp-4: 4px;   --sp-8: 8px;   --sp-12: 12px; --sp-16: 16px;
  --sp-20: 20px; --sp-24: 24px; --sp-32: 32px; --sp-40: 40px;
  --sp-48: 48px; --sp-64: 64px; --sp-80: 80px; --sp-96: 96px;
  --sp-120: 120px;

  /* семантические токены (mobile-first; ↓ переопределяются по брейкпоинтам).
     Применяются пока только --gutter и --grid-gap; остальные — словарь на будущее. */
  --gutter: var(--sp-16);     /* боковой инсет контейнера            */
  --grid-gap: var(--sp-16);   /* зазор в сетках карточек             */
  --section-y: var(--sp-80);  /* ритм между блоками (ещё не применён) */
  --stack-h1: var(--sp-24);   /* H1 → контент      (ещё не применён) */
  --stack-h2: var(--sp-16);   /* H2 → контент      (ещё не применён) */
  --text-flow: var(--sp-24);  /* между абзацами    (ещё не применён) */
}
@media (min-width: 768px) {
  :root {
    --gutter: var(--sp-32);
    --grid-gap: var(--sp-20);
    --section-y: var(--sp-96);
    --stack-h1: var(--sp-32);
    --stack-h2: var(--sp-20);
  }
}
@media (min-width: 1024px) {
  :root {
    --grid-gap: var(--sp-24);
    --section-y: var(--sp-120);
    --stack-h1: var(--sp-48);
    --stack-h2: var(--sp-24);
  }
}

/* Инсет контейнера на планшете: убираем «горб» ~40px в диапазоне 768–1023.
   Ниже 768 остаётся 16px, с 1024 оригинал уже даёт 32px — трогаем только середину.
   Файл линкуется последним → плоский .container побеждает бандл по порядку. */
@media (min-width: 768px) and (max-width: 1023px) {
  .container {
    margin-left: var(--gutter);
    margin-right: var(--gutter);
  }
}

/* Зазоры сетки карточек проектов на главной → единый --grid-gap (col = row). */
.projects__items {
  gap: var(--grid-gap);
}

/* --- Система отступов: этап 2 (2026-07-16) ----------------------------------
   Продолжение унификации spacing. Всё проверено замерами до/после на 3
   брейкпоинтах. Кегль заголовков (H1 56/60) — вне spacing-мандата, не трогаем;
   heading→контент на шаблонах с mb:0 (решения/сервис берут отступ из обёртки) —
   отдельный per-template этап, здесь НЕ трогается. */

/* Сетки карточек листингов → тот же --grid-gap, что и на главной.
   Было рассинхронно: проекты 30/21, новости 24/21 (row/col). Стало col = row. */
.project-sect__items,
.news-list__list {
  gap: var(--grid-gap);
}

/* Абзацы текстовых блоков → единый --text-flow (было 27px новости / 25px юр-текст).
   Скоупим на контент-контейнеры, чтобы не задеть мета-строки (дата/теги, mb:0). */
.news-detail__text p,
.about__pres-text p {
  margin-bottom: var(--text-flow);
}

/* Ритм секций главной → --section-y (токенизация ручных 118/119/97/81).
   Визуально ±1–4px (соседние margin схлопываются) — цель в консистентности значений.
   .news-main держит margin на всех тирах; .promo/.coop обнуляют его на ≤1023 и берут
   ритм от соседей, поэтому их трогаем ТОЛЬКО с 1024 (иначе впрыснём отступ на планшет).
   .projects (mb 80) НЕ трогаем — это авторски меньший зазор перед строкой .info. */
.news-main {
  margin-top: var(--section-y);
  margin-bottom: var(--section-y);
}
@media (min-width: 1024px) {
  .promo,
  .coop {
    margin-top: var(--section-y);
    margin-bottom: var(--section-y);
  }
}

/* --- Система отступов: этап 3 — H1 → контент, поблочно (2026-07-16) ----------
   Унификация отступа заголовка страницы H1 до контента между семействами шаблонов.
   H1 держит СВОЙ margin-bottom (owns) только в двух семействах — у обоих чистые
   классовые хуки, различающие их от «структурных» заголовков:
     • корпоративные (о компании, карьера, новости, контакты, юр-страницы):
       `h1.section__title` — было 54/27/20 (desktop/tablet/mobile);
     • карточка проекта: `.detail-head__top-info h1` — было 40/·/20.
   → оба к `var(--stack-h1)` = 48/32/24. Изменения ±5–8px, сходятся к 4px-шкале.

   Селектор `h1.section__title` намеренно с тегом: тот же класс на главной висит на
   h2 (заголовки секций) с mb:0 и отступом от `.section__header` — их НЕ трогаем.
   Решения/сервис используют ДРУГОЙ класс `.scheme__title` (mb:0, отступ структурный
   от `.scheme__section`) — тоже НЕ трогаем.

   H2 → контент НЕ трогаем: роль «заголовок секции» (46px) уже консистентна, а редкие
   «голые» h2-выбросы (26/32px) не имеют классовых хуков для безопасного скоупа —
   их правка требует правки HTML (классы), что для зеркала нецелесообразно.

   Хуки (проверено обходом шаблонов):
     • `.container > h1` — «голый» H1-заголовок страницы, прямой ребёнок .container
       (карьера/.vacancy, новости/.news-list, контакты/.contacts и др. — везде mb54).
       Структурные H1 (решения `.scheme__title` в `.scheme__header`; карточка проекта
       в `.detail-head__top-info`) — ВНУКИ .container, этим селектором НЕ ловятся.
     • `h1.section__title` — простые текстовые страницы (privacy/agreement/…): mb54.
     • `.detail-head__top-info h1` — карточка проекта: mb40. */
.container > h1,
h1.section__title,
.detail-head__top-info h1 {
  margin-bottom: var(--stack-h1);
}
