/*
   performa — adaptive.css · СЛОЙ ТЕЛЕФОНА И ПЛАНШЕТА

   Подключается ПОСЛЕ styles.css, поэтому перебивает его при равной
   специфичности. Сюда — ВСЁ, что зависит от ширины экрана; в styles.css
   таких правил быть не должно.

   🔴 ЧТО ЗДЕСЬ НЕОЧЕВИДНО
   · Нижние границы clamp() в токенах считаны от латиницы. Русские слова
     длиннее, и на 320px заголовки разваливались на 8–10 строк — поэтому
     ниже есть блок @media (max-width:379px) с поджатыми дисплейными
     кеглями. Меняешь типографику — проверяй именно 320.
   · Шаговые токены на телефоне поджаты: --stack-lg = 24px против 18px
     у --stack-md. Подъём с md на lg даёт всего +6px, а не «в полтора
     раза» — нужен заметный отступ, бери множитель.
   · Правила «под палец» ищи по @media (pointer:coarse) — они привязаны
     к ВОЗМОЖНОСТЯМ устройства, а не к ширине окна.

   Отдельный слой ТЕЛЕФОНА и ПЛАНШЕТА. Подключается ПОСЛЕ styles.css.

 Здесь лежат другие
   раскладки, другой порядок блоков, другая типо-шкала и другой ритм —
   спроектированные под палец, а не унаследованные от 1440.

   Карта слоя:
     0. Токены телефона/планшета (ритм, кегли, поля)
     1. Шапка: контраст-адаптивная + бургер-панель
     2. Общие мобильные приёмы (кнопки, ссылки-стрелки, ленты)
     3. Главная — посекционно
     4. «Монетизация» — посекционно (в т.ч. окно-приложение)
     5. «Практикум» — посекционно
     6. Подвал
     7. Модалки, лайтбокс, телефон-виджет
     8. Планшет 768–1023 — собственные раскладки
*/

/*
   0. ТОКЕНЫ ТЕЛЕФОНА И ПЛАНШЕТА
   Сайт на телефоне «листался как будто час»: 18 968px против 10 436 на
   десктопе. Ритм здесь задаётся заново — плотнее, но с воздухом там, где он
   несёт смысл (стык полотен, шапка секции → контент).
*/
@media (max-width:767px){
  :root{
    --section-y:      2.75rem;   /* было ~3.5rem */
    --section-y-sm:   2rem;
    --stack-lg:       1.5rem;
    --stack-md:       1.125rem;
    --gutter:         1.25rem;
    /* Кегли телефона: заголовок секции перестаёт спорить с H1 героя. */
    --fs-h1:          clamp(1.5rem, 1.15rem + 1.6vw, 1.875rem);
    --fs-h2:          1.375rem;
    --fs-h3:          1.125rem;
    --fs-lg:          1rem;
    --hdr-h:          60px;
  }
  html{scroll-padding-top:72px}
}

@media (min-width:768px) and (max-width:1023px){
  :root{
    --section-y:      3.25rem;
    --section-y-sm:   2.25rem;
    --stack-lg:       2rem;
    --stack-md:       1.5rem;
    --gutter:         2rem;
    --hdr-h:          64px;
  }
  html{scroll-padding-top:80px}
}

/*
   1. ШАПКА
 Было: одна светлая полупрозрачная плашка на весь сайт — над тёмными
   секциями («Кейсы», финальный CTA, подвал) она читалась инородной заплаткой,
   а на телефоне навигации не было ВООБЩЕ (пункты просто гасились display:none,
   бургера не существовало).
   Стало: две темы шапки, переключаются по полотну под ней (JS ставит
   .hdr--dark), и полноценная мобильная панель на том же <nav>.
*/

/* --- 1.1 Тема шапки ------------------------------------------------------ */
@media (hover:hover) and (pointer:fine){
}

/* --- 1.2 Композиция полосы ----------------------------------------------- */
.hdr__in{gap:var(--sp-4)}
.hdr__act{display:flex;align-items:center;gap:var(--sp-3);flex:none}
.nav{flex:1 1 auto;justify-content:flex-end;gap:var(--sp-5)}

/*
 Бургер. Три штриха, которые складываются в крест — жест, а не смена
   иконки. Зона ровно 46px, чтобы после субпиксельного округления
   оставалось ≥44 (гейт §8.4).
*/
.burger{
  display:none;
  position:relative;
  width:46px;height:46px;
  flex:none;
  align-items:center;
  justify-content:center;
  border-radius:var(--r-sm);
  border:var(--rule);
  background:color-mix(in srgb, var(--c-surface) 70%, transparent);
  transition:background var(--dur) var(--ease-out),border-color var(--dur) var(--ease-out);
}
.burger__i{display:block;width:20px;height:14px;position:relative}
.burger__i i{
  position:absolute;
  left:0;right:0;height:1.8px;
  border-radius:2px;
  background:var(--c-ink);
  transition:transform var(--dur) var(--ease-spring),
             opacity var(--dur-fast) var(--ease-out),
             width var(--dur) var(--ease-out);
}
.burger__i i:nth-child(1){top:0}
.burger__i i:nth-child(2){top:6.1px;width:14px}
.burger__i i:nth-child(3){top:12.2px}
.burger[aria-expanded="true"] .burger__i i:nth-child(1){transform:translateY(6.1px) rotate(45deg)}
.burger[aria-expanded="true"] .burger__i i:nth-child(2){opacity:0;width:20px}
.burger[aria-expanded="true"] .burger__i i:nth-child(3){transform:translateY(-6.1px) rotate(-45deg)}

/* Затемнение под панелью */
.nav__scrim{
  position:fixed;
  inset:0;
  z-index:480;
  background:rgba(8,10,26,.55);
  backdrop-filter:blur(3px);
  -webkit-backdrop-filter:blur(3px);
  opacity:0;
  transition:opacity var(--dur) var(--ease-out);
}
.nav__scrim.is-on{opacity:1}

/* --- 1.3 Мобильная панель (та же <nav>) ---------------------------------- */
@media (max-width:1023px){
  .burger{display:flex}
  .hdr{padding-block:var(--sp-3)}
  .brand__desc{display:none}

  .nav{
    position:fixed;
    top:0;right:0;bottom:0;
    width:min(360px,86vw);
    z-index:520;
    flex-direction:column;
    align-items:stretch;
    justify-content:flex-start;
    gap:0;
    padding:calc(var(--hdr-h) + var(--sp-5)) var(--sp-5) var(--sp-6);
    background:var(--c-dark);
    color:var(--c-on-dark);
    /*
 clip-path вместо translateX: сдвиг за правый край создаёт
       горизонтальный скролл (WEB-СТАНДАРТ §8.4).
*/
    clip-path:inset(0 0 0 100%);
    transition:clip-path var(--dur-slow) var(--ease-out);
    overflow-y:auto;
    overscroll-behavior:contain;
  }
  .nav.is-open{clip-path:inset(0)}

  /*
 Пока панель открыта, шапка обязана перестать быть containing block
     для fixed: гасим стеклянный фильтр и сдвиг автоскрытия. Заодно полоса
     и панель становятся одной тёмной поверхностью, а крест бургера
     остаётся поверх панели.
*/
  body.nav-open .hdr{
    z-index:540;
    background:var(--c-dark);
    backdrop-filter:none;
    -webkit-backdrop-filter:none;
    transform:none;
    border-bottom-color:transparent;
  }
  body.nav-open .brand__name{color:var(--c-on-dark)}
  body.nav-open .brand__name b{color:var(--c-accent-text)}
  body.nav-open .burger{border-color:var(--c-dark-line);background:rgba(255,255,255,.06)}
  body.nav-open .burger__i i{background:var(--c-on-dark)}
  /*
 Бренд и крест обязаны лежать ВЫШЕ панели: панель — потомок шапки,
     и в её контексте наложения непозиционированные дети рисуются под ней.
*/
  body.nav-open .brand,
  body.nav-open .hdr__act{position:relative;z-index:530}

  /* Ультрамариновая аура из-за правого плеча — панель не «серая шторка». */
  .nav::before{
    content:"";
    position:absolute;inset:0;
    pointer-events:none;
    background:radial-gradient(80% 45% at 100% 0%,rgba(46,107,184,.26),transparent 64%);
  }
  .nav>*{position:relative;z-index:1}

  .nav a{
    display:flex;
    /*
 🔴 flex-direction:row задаём ЯВНО: правило §31 styles.css
       (@media pointer:coarse) ставит на .nav a column+center, и пункт
       панели разъезжался в столбик — подпись по центру, стрелка под ней.
*/
    flex-direction:row;
    align-items:center;
    justify-content:space-between;
    text-align:left;
    min-height:56px;
    padding:var(--sp-3) 0;
    font-family:var(--font-display);
    font-weight:var(--fw-display);
    font-size:1.0625rem;
    letter-spacing:var(--ls-tight);
    color:var(--c-on-dark);
    white-space:normal;
    border-bottom:var(--rule-dark);
    /*
 Прорастающее подчёркивание из десктопа здесь не нужно: строка и так
       во всю ширину, а линия дублировала бы разделитель.
*/
    transform:translateX(14px);
    opacity:0;
    transition:color var(--dur-fast) var(--ease-out),
               transform var(--dur-slow) var(--ease-out),
               opacity var(--dur-slow) var(--ease-out);
  }
  .nav a::after{display:none}
  .nav.is-open a{transform:none;opacity:1}
  /* Пункты въезжают лесенкой — панель открывается как жест, а не мигает. */
  .nav.is-open a:nth-child(1){transition-delay:60ms}
  .nav.is-open a:nth-child(2){transition-delay:105ms}
  .nav.is-open a:nth-child(3){transition-delay:150ms}
  .nav.is-open a:nth-child(4){transition-delay:195ms}
  .nav.is-open a:nth-child(5){transition-delay:240ms}
  .nav.is-open a:nth-child(6){transition-delay:285ms}
  /* Стрелка-указатель у пункта: рисуется из CSS, в разметке слов не прибавляет. */
  .nav a::before{
    content:"";
    order:2;
    width:16px;height:16px;
    flex:none;
    opacity:.5;
    background:currentColor;
    -webkit-mask:url("data:image/svg+xml;charset=utf-8,%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='M5 12h14'/%3E%3Cpath d='m12 5 7 7-7 7'/%3E%3C/svg%3E") center/16px no-repeat;
    mask:url("data:image/svg+xml;charset=utf-8,%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='M5 12h14'/%3E%3Cpath d='m12 5 7 7-7 7'/%3E%3C/svg%3E") center/16px no-repeat;
  }
  .nav .nav__home{color:var(--c-accent-text)}
  /* Панель без пунктов (404) не открывается и не рисует бургер. */
  .nav:empty{display:none}
  .hdr:has(.nav:empty) .burger{display:none}

  /*
 Один пункт («Практикум») панели не требует — он стоит в самой полосе.
     Класс ставит JS, чтобы правило не зависело от порядка страниц.
*/
  .nav--inline{
    position:static;
    width:auto;
    flex-direction:row;
    padding:0;
    background:none;
    color:inherit;
    clip-path:none;
    overflow:visible;
  }
  .nav--inline::before{display:none}
  .nav--inline a{
    min-height:44px;
    padding:var(--sp-2) 0;
    font-family:var(--font-text);
    font-weight:var(--fw-medium);
    font-size:var(--fs-sm);
    color:var(--c-muted);
    border-bottom:none;
    transform:none;
    opacity:1;
    white-space:nowrap;
  }
  .nav--inline a::before{display:none}
  /* Пункт стоит в самой полосе — бургеру открывать нечего. */
  .hdr:has(.nav--inline) .burger{display:none}

  body.nav-open{overflow:hidden}
}

/* На телефоне мини-CTA в полосе поджимается, но остаётся зоной ≥44px. */
@media (max-width:479px){
  .hdr__in{gap:var(--sp-3)}
  .nav__cta{padding-inline:.75rem;font-size:var(--fs-cap);gap:6px}
  .nav__cta .btn__ico{display:none}
  .brand__name{font-size:var(--fs-xs);white-space:normal;line-height:1.2}
}
@media (max-width:600px){
  /*
 main.js): кнопка отбирала
     у бренда пол-строки на всех телефонах, а не только на 320.
     Прежний комментарий: CTA в полосе не помещается рядом с бургером. Раньше здесь стоял display:none — и с узкого телефона кнопка
     записи исчезала из шапки совсем (в панель её никто не переносил).
     Теперь JS переставляет ТОТ ЖЕ узел в панель, а здесь он получает вид
     крупной кнопки внизу списка.
*/
  .nav>.nav__cta{
    margin-top:var(--sp-5);
    width:100%;
    min-height:56px;
    justify-content:space-between;
    padding-inline:1.35rem;
    font-size:var(--fs-sm);
    border-radius:var(--r-sm);
    border-bottom:1px solid var(--c-accent);
    color:var(--c-accent-ink);
  }
  .nav>.nav__cta .btn__ico{display:block}
  /*
 ::before у пункта панели — стрелка-маска, у кнопки — заливка-свайп.
     Это один и тот же псевдоэлемент, поэтому для кнопки возвращаем её слой
     целиком, иначе маска съедала заливку.
*/
  .nav>.nav__cta::before{
    content:"";
    position:absolute;inset:0;
    z-index:-1;
    width:auto;height:auto;
    opacity:1;
    background:var(--c-accent-press);
    -webkit-mask:none;mask:none;
    transform:translateY(101%);
  }
  /*
 Лесенка появления пунктов на кнопку не распространяется: она приезжает
     вместе с последним пунктом, а не «догоняет» его.
*/
  .nav.is-open>.nav__cta{transition-delay:285ms}
}

/*
   2. ОБЩИЕ МОБИЛЬНЫЕ ПРИЁМЫ
*/

/*
 --- 2.1 Ссылка-стрелка: стрелка НИКОГДА не отрывается от текста ----------
 На телефоне «Подробнее о проекте» + → рвались на две строки.
   nowrap склеивает их в одну строку по всему сайту.
*/
.alink{white-space:nowrap}
.alink::after{right:1.55em}

/*
 --- 2.2 Кнопки: подпись по левому краю, стрелка у правого ---------------
 Кнопка во всю ширину с подписью
   по центру — самый заметный источник «всё отцентрировано». Граница поднята с 767 до 1023: на планшете колонка героя — 361px,
   длинная подпись всё равно ложится в две строки, и по центру она читалась
   ровно тем же «лишним центрированием», от которого ушли на телефоне.
*/
@media (max-width:1023px){
  .btn:not(.btn--auto):not(.btn--mini),
  .btn-cta:not(.btn-cta--mini){
    justify-content:space-between;
    text-align:left;
    padding-inline:1.35rem;
    gap:var(--sp-4);
  }
  .btn--lg,.btn-cta--large{padding-block:1.15rem;min-height:56px;font-size:var(--fs-sm)}
}

@media (max-width:767px){
  /* --- 2.3 Шапка секции: плотнее, всегда по левому краю ------------------ */
  .sh{gap:var(--sp-3);margin-bottom:var(--stack-md)}
  .sh__kicker{margin-bottom:var(--sp-2)}
  .sh__kicker::before{width:16px}
  .sh__title{max-width:none}
  .sh__lead{margin-top:var(--sp-3)}
  .lead{font-size:var(--fs-body);max-width:none}

  /*
 --- 2.4 Горизонтальные ленты -----------------------------------------
     Мобильный паттерн вместо колонки из трёх-четырёх высоких блоков.
     Лента выходит за поля контейнера и обрезается им — карточка у края
     «подрезана», значит листается.
*/
  .m-rail{
    display:flex;
    gap:var(--sp-4);
    overflow-x:auto;
    overflow-y:hidden;
    overscroll-behavior-x:contain;
    touch-action:pan-x;
    scroll-snap-type:x mandatory;
    scrollbar-width:none;
    margin-inline:calc(-1 * var(--gutter));
    padding-inline:var(--gutter);
    scroll-padding-inline:var(--gutter);
  }
  .m-rail::-webkit-scrollbar{display:none}
  .m-rail>*{flex:0 0 min(78vw,300px);scroll-snap-align:start}
}

/*
   3. ГЛАВНАЯ
*/
@media (max-width:767px){

  /*
 --- 3.1 HERO ---------------------------------------------------------
     Порядок телефона: копия → CTA → портрет → цифры. Портрет на телефоне
     кадрируется КОРОЧЕ (3/4 вместо 4/5): в вертикали 4/5 он съедал экран
     целиком, а подпись-оверлей наезжала на лицо.
*/
  .hero{padding-top:calc(var(--hdr-h) + var(--sp-5));padding-bottom:var(--section-y)}
  .hero__grid{gap:var(--stack-md)}
  .hero h1,.hero__h1{max-width:none;margin-bottom:var(--sp-4)}
  .hero__sub{margin-bottom:var(--sp-4);max-width:none}
  .hero__badge{
    margin-bottom:var(--sp-5);
    padding-left:var(--sp-4);
    gap:var(--sp-3);
    max-width:none;
  }
  .hero__cta-row{margin-bottom:var(--sp-3)}
  .hero__media{max-width:none;justify-self:stretch}
  .hero__img{aspect-ratio:3/4}

  /*
 Подпись на кадре: имя и роль строками, регалии — лентой чипов в один
     ряд со свайпом. Раньше три чипа в столбик занимали треть кадра и
     перекрывали лицо.
*/
  /* Скрим подписи задан один раз в §10.2 — здесь только поля и ритм. */
  .hero__cred{padding:var(--sp-9) var(--sp-4) var(--sp-4);gap:var(--sp-1)}
  .hero__cred-name{font-size:1.125rem}
  .hero__cred-role{font-size:var(--fs-xs);line-height:1.35}
  /*
 Регалии переносятся, а не уезжают лентой: обрезанное на кромке кадра
     «Международное образование BA…» читается как дефект, а не как свайп.
*/
  .hero__creds{
    flex-wrap:wrap;
    gap:6px;
    margin-top:var(--sp-3);
    padding-top:var(--sp-3);
  }
  .hero__creds li{padding:.25rem .55rem;font-size:11px}

  /*
 Цифры: строка «число — подпись», а не три высоких блока.
     Было 3×110px, стало 3×64px. Колонка числа фиксирована — подписи стоят
     на одной вертикали и выровнены по левому краю (никакого центрирования).
*/
  .stats{margin-top:var(--stack-md)}
  /*
 Колонка числа была фиксированной (8.75rem = 140px),
     чтобы подписи стояли на одной вертикали. Это имело смысл, пока цифры
     лежали тремя СТРОКАМИ друг под другом. Сейчас это три карточки
     в ленте по ~300px: фикс съедал почти половину, и на подпись
     оставалось 96px — «реализованных проектов» ломалось на три строки.
     Выравнивать больше нечего (карточки разные), поэтому число стоит
     НАД подписью, и подпись получает всю ширину карточки.
*/
  .stat{
    display:grid;
    grid-template-columns:minmax(0,1fr);
    row-gap:var(--sp-1);
    padding:var(--sp-4) 0;
  }
  .stat__n{font-size:1.375rem;margin-bottom:0}
  .stat__l{max-width:none;font-size:var(--fs-xs);line-height:1.35}

  /* --- 3.2 «Старые способы роста» — лента утечек ------------------------- */
  .leaks{padding:var(--sp-5) 0;border-radius:var(--r-lg);background:var(--c-dark)}
  .leaks__list{
    display:flex;
    gap:var(--sp-4);
    overflow-x:auto;
    overflow-y:hidden;
    overscroll-behavior-x:contain;
    touch-action:pan-x;
    scroll-snap-type:x mandatory;
    scrollbar-width:none;
    padding-inline:var(--sp-5);
    scroll-padding-inline:var(--sp-5);
  }
  .leaks__list::-webkit-scrollbar{display:none}
  .leak{
    flex:0 0 min(76vw,290px);
    scroll-snap-align:start;
    padding-top:var(--sp-4);
    gap:var(--sp-2);
  }
  .leak__ico{width:38px;height:38px;margin-bottom:var(--sp-1)}
  .leak__t{font-size:1.0625rem}
  .leak__d{font-size:var(--fs-xs);line-height:1.5}
  .leak__meter{margin-top:var(--sp-3)}
  .leaks__out{
    margin:var(--sp-5) var(--sp-5) 0;
    padding:var(--sp-5) 0 0 var(--sp-5);
    font-size:1.0625rem;
    line-height:1.35;
  }
  .leaks__out::before{top:var(--sp-5)}
  .domino{font-size:1.125rem;margin-top:var(--stack-md)}

  /* --- 3.3 «Три способа начать» ----------------------------------------- */
  .cases{gap:var(--sp-4)}
  .card{padding:var(--sp-4);gap:var(--sp-3);border-radius:var(--r-sm)}
  .card__d{font-size:var(--fs-sm);line-height:1.5}
  .card__t{font-size:1.0625rem}

  /* --- 3.4 Флагман ------------------------------------------------------- */
  .flag{gap:var(--sp-4);margin-bottom:var(--stack-md)}
  .flag__h{font-size:1.375rem;line-height:1.15;max-width:none}
  .flag__cols{gap:var(--sp-4);padding-top:var(--sp-4)}
  .flag__note{font-size:var(--fs-xs);padding-left:var(--sp-4);line-height:1.5}
  .flag__lead{font-size:var(--fs-body);line-height:1.5}
  .flag__rail{padding-top:var(--sp-4);gap:var(--sp-4)}
  .fchips{gap:var(--sp-3) 0}
  .fchip{gap:var(--sp-1);padding-left:var(--sp-3)}
  .fchip__ico{width:18px;height:18px}
  .panel--dark{padding:var(--sp-5) var(--sp-4)}
  .row__t{font-size:1.0625rem;max-width:none}
  .row__d{font-size:var(--fs-xs);line-height:1.5;max-width:none}
  /*
 CTA-ряд по левому краю: центрированный заголовок в акцентной плашке был
     самым заметным «лишним центрированием» на телефоне.
*/

  /*
 --- 3.5 «Светофор прибыли» — компактный опросник ----------------------
     Было 2 505px: шесть карточек с рамкой, паддингом 24px и «таблетками»
     вразнобой. Стало: вопросы на волосяных линиях, варианты — сегментами
     в один ряд. Виджет остаётся тем же, экран — телефонным.
*/
  .svet{gap:var(--stack-md)}
  .svet__quiz{gap:0;border-top:var(--rule)}
  .svet__q{
    border:none;
    border-bottom:var(--rule);
    border-radius:0;
    background:transparent;
    padding:var(--sp-4) 0;
  }
  .svet__q::before{left:calc(-1 * var(--sp-3));top:var(--sp-4);bottom:var(--sp-4)}
  .svet__ql{
    gap:var(--sp-3);
    margin-bottom:var(--sp-3);
    font-size:var(--fs-sm);
    line-height:1.35;
    align-items:start;
  }
  .svet__ql i{width:24px;height:24px;font-size:11px;border-radius:6px;margin-top:-1px}
  .svet__opts{
    display:grid;
    grid-template-columns:repeat(3,minmax(0,1fr));
    gap:var(--sp-2);
    padding-left:0;
  }
  .svet__opt{
    justify-content:flex-start;
    align-items:center;
    gap:6px;
    padding:.45rem .5rem;
    border-radius:var(--r-sm);
    font-size:11.5px;
    line-height:1.25;
    text-align:left;
    min-height:46px;
    /*
 Ширина ячейки жёсткая: длинное слово («предложением») обязано
       переноситься, а не срезаться правым краем таблетки. break-word, а не
       anywhere: anywhere рвёт слово даже когда оно помещается («стабильны/й»).
*/
    overflow:visible;
    overflow-wrap:break-word;
  }
  .svet__opt::before{border-radius:inherit}
  .svet__opt::after{width:10px;height:10px;border-width:1.5px}
  .svet__opt[aria-pressed="true"]::after{box-shadow:inset 0 0 0 2px var(--c-accent)}
  .svet__panel{padding:var(--sp-5) var(--sp-4);border-radius:var(--r-lg);position:static}
  .svet__score{gap:var(--sp-4);margin-bottom:var(--sp-4)}
  .lamp{flex-direction:row;gap:6px;padding:7px 9px}
  .lamp__l{width:16px;height:16px}
  .svet__rows{margin-bottom:var(--sp-4)}
  .svet__row{padding-block:var(--sp-2);font-size:var(--fs-xs)}
  .svet__verdict{padding-top:var(--sp-4);font-size:var(--fs-xs);line-height:1.5}
  .svet__verdict b{font-size:1.0625rem;margin-bottom:var(--sp-2)}
  .svet__cta{margin-top:var(--sp-4)}

  /* --- 3.6 Сравнение ----------------------------------------------------- */
  .cmp{gap:var(--sp-4)}
  .cmp__col{padding:var(--sp-4);border-radius:var(--r-md)}
  .cmp__h{font-size:1.0625rem;gap:var(--sp-3);padding-bottom:var(--sp-3)}
  .cmp__ico{width:30px;height:30px}
  .cmp__li{font-size:var(--fs-xs);line-height:1.5;gap:var(--sp-3);padding-block:var(--sp-3)}

  /* --- 3.7 Кейсы --------------------------------------------------------- */
  .oc-root{gap:var(--sp-4)}
  .oc-nav{gap:var(--sp-3)}
  .ccard__top{padding:var(--sp-4)}
  .ccard__body{padding:var(--sp-4);gap:var(--sp-2)}
  .ccard__badge{margin-bottom:var(--sp-3)}
  .ccard__metrics{grid-template-rows:repeat(2,3.1rem);gap:var(--sp-3) var(--sp-4)}
  .ccard__t{font-size:1.0625rem}
  .ccard__d{font-size:var(--fs-xs);line-height:1.5}
  /*
 Другая экономика
     бизнеса.» рассыпался на шесть строк.
*/
  .arw{width:44px;height:44px}

  /* --- 3.8 Эксперт ------------------------------------------------------- */
  .exp{gap:var(--stack-md)}
  .exp__ph{aspect-ratio:4/3;max-height:none;object-position:center 22%}
  .exp__role{font-size:var(--fs-body);margin-bottom:var(--sp-4)}
  .exp__r{padding-block:var(--sp-4);gap:var(--sp-4);font-size:var(--fs-xs);line-height:1.5}
  .exp__r i{font-size:1.25rem;min-width:1.2em}
  .exp__quote{
    margin-top:var(--stack-md);
    padding-left:var(--sp-4);
    font-size:1rem;
    line-height:1.45;
  }

  /*
 --- 3.9 Контент ------------------------------------------------------
     Четыре карточки роликов шли столбиком и давали 1 320px — четверть всей
     прокрутки главной. На телефоне это плитка 2×2 с обложками: пропорция
     обложки 4/3 (вместо 16/9), чтобы заголовок на ней оставался читаемым
     в узкой колонке.
*/
  .cgrid{gap:var(--sp-4) var(--sp-3)}
  .vcard__top{aspect-ratio:4/3;padding:var(--sp-3)}
  .vcard__b{padding:var(--sp-3)}
  .vcard__t{font-size:.8125rem;line-height:1.2}
  .vcard__m{font-size:10px}
  .vcard__play{width:38px;height:38px}
  .vcard__badge{font-size:9px;padding:4px 8px;top:var(--sp-2);left:var(--sp-2)}
  .socials{margin-top:var(--stack-md)}
  .soc{min-height:52px;padding:var(--sp-2) 0;gap:var(--sp-3);font-size:var(--fs-sm)}
  .soc__ico{width:34px;height:34px}
  .acard{flex:0 0 min(68vw,260px)}
  .arts{margin-inline:calc(-1 * var(--gutter));padding-inline:var(--gutter);scroll-padding-inline:var(--gutter)}
}

/*
 Плитка роликов 2×2 живёт с 360px: ниже колонка сужается до 130px и
   заголовок на обложке рассыпается по одному слову в строку.
*/
@media (min-width:360px) and (max-width:559px){
  .cgrid{grid-template-columns:1fr 1fr}
  .cgrid .phone{grid-column:1 / -1}
}
@media (max-width:359px){
  /*
 320px. Одна колонка — обложка шире, значит и пропорция шире:
     4/3 на всю ширину давало полупустой кадр.
*/
  .vcard__top{aspect-ratio:16/9}
  .vcard__t{font-size:.9375rem}
  /*
 Кикер героя: «МАКСИМ ПОПЦОВ · PERFORMA» не помещался в одну строку,
     и `performa` улетала к правому краю отдельной строкой.
*/
  .hero__eyebrow{flex-wrap:wrap;row-gap:2px;letter-spacing:.1em}
  .hero__eyebrow::before{width:14px}
  /* колонка одна с ≤767px (см. выше) — здесь остаётся только кегль */
  .stat__n{font-size:1.1875rem}
}
@media (max-width:767px){

  /* --- 3.10 Форматы ------------------------------------------------------ */
  /*
 Здесь лежала раскладка ПРЕЖНЕГО, строчного варианта
     «Форматов»: две колонки, иконка слева, метка «По запросу» прижата
     вправо в первый ряд (`.fmt>span:nth-of-type(2)` — селектор весом
     0,2,1, он перебивал даже `.fmts--cards .fmt__tag`). Строчные правила сняты: на карточке они ломали сетку —
     заголовок вставал в колонку 76px и рвался посреди слова
     («Ивент-марке / тинг»), а метка вылезала за карточку и валила гейт
     горизонт-overflow на 320–375px.
     На телефоне карточки идут одной колонкой, поджатым кеглем.
*/
  .fmts--cards{gap:var(--sp-3)}
  .fmts--cards .fmt{padding:var(--sp-4);gap:var(--sp-2)}
  .fmts--cards .fmt__ico{width:38px;height:38px;margin-bottom:var(--sp-1)}
  .fmts--cards .fmt__t{font-size:1rem;margin-bottom:0}
  .fmts--cards .fmt__d{font-size:var(--fs-xs);line-height:1.45;max-width:none}
  .fmts--cards .fmt__tag{margin-top:var(--sp-2);font-size:10px}

  /* --- 3.11 FAQ ---------------------------------------------------------- */
  .faq__q{padding:var(--sp-4) 0;gap:var(--sp-4);font-size:.95rem;min-height:52px}
  .faq__mark{width:30px;height:30px}
  .faq__a p{font-size:var(--fs-xs);line-height:1.55;padding-bottom:var(--sp-5)}

  /* --- 3.12 Финальный CTA ------------------------------------------------ */
  .final__grid{gap:var(--stack-md);margin-bottom:var(--stack-md)}
  .final__box p{margin-bottom:var(--sp-4);max-width:none}
  .getlist{margin-bottom:var(--sp-5)}
  .getlist li{padding-block:var(--sp-3);font-size:var(--fs-xs);line-height:1.45;gap:var(--sp-3)}
  .bonus{padding:var(--sp-4);border-radius:var(--r-md)}
  .bonus__badge{margin-bottom:var(--sp-4)}
  .bonus__t{font-size:1.0625rem;margin-bottom:var(--sp-3)}
  .bonus__li{padding-block:var(--sp-3);font-size:var(--fs-xs);line-height:1.45;gap:var(--sp-3)}
  .contact{min-height:56px;padding:var(--sp-3) 0;gap:var(--sp-4)}
  .contact .v{font-size:var(--fs-sm)}
  .form input{min-height:46px;padding-block:.55rem}
  .form .btn{margin-top:var(--sp-3)}
}

/*
   4. «МОНЕТИЗАЦИЯ»
*/

.vsl,.vsl-facade{
  /*
 Обложка-графика бренда: диагональное ультрамариновое поле + расходящиеся
     кольца. Раньше это был ровный тёмный прямоугольник с кнопкой посередине —
     он и читался как «видео не загрузилось».
*/
  background:
    radial-gradient(46% 60% at 82% 12%, rgba(46,107,184,.34), transparent 62%),
    radial-gradient(58% 70% at 4% 100%, rgba(22,76,135,.30), transparent 66%),
    linear-gradient(152deg,#16293F 0%,#0B1524 62%);
}
.vsl::after{
  content:"";
  position:absolute;
  right:-6%;top:-38%;
  width:62%;aspect-ratio:1;
  border-radius:50%;
  border:1px solid rgba(255,255,255,.07);
  box-shadow:0 0 0 34px rgba(255,255,255,.028),0 0 0 68px rgba(255,255,255,.016);
  pointer-events:none;
  transform:none;
  background:none;
  z-index:0;
}
.vsl .vsl__play,.vsl .vsl__t,.vsl .vsl__cap,.vsl .vsl__len{z-index:1}

/*
 Обложка практикума — фирменное поле с кадром автора; поверх — скрим
   и оверлей.
*/
.vsl-facade{position:relative;overflow:hidden;align-items:stretch;justify-content:flex-end;flex-direction:column;padding:var(--sp-5)}
.vsl-facade__poster{
  position:absolute;
  inset:0;
  width:100%;height:100%;
  object-fit:cover;
  object-position:center center;
  z-index:0;
}
.vsl-facade::before{
  content:"";
  position:absolute;inset:0;
  z-index:1;
  pointer-events:none;
  background:linear-gradient(to top,
    rgba(6,8,22,.92) 0%, rgba(6,8,22,.62) 26%, rgba(6,8,22,0) 56%);
}
/*
 🔴 Не `.vsl-facade>*{position:relative}`: это правило перебивало
   position:absolute у чипа хронометража, и «22:45» падал из верхнего угла
   прямо на заголовок. Слои разводим z-index'ом, позицию не трогаем.
*/
.vsl-facade__cap{position:relative;z-index:2}
.vsl-facade .vsl__len{z-index:2}
.vsl-facade__play{z-index:2}
.vsl-facade__play{
  position:absolute;
  left:50%;top:50%;
  margin:0;
  transform:translate(-50%,-50%);
}
@media (hover:hover) and (pointer:fine){
  .vsl-facade:hover .vsl-facade__play{transform:translate(-50%,-50%) scale(1.08)}
}
.vsl-facade:active .vsl-facade__play{transform:translate(-50%,-50%) scale(.97)}
/*
 Оверлей: подписи рисуются из CSS — текстовыми узлами они попали бы
   в сверку слов с исходником как добавленный текст.
*/
.vsl__len--auto::before{content:"22:45"}
.vsl-facade__cap{
  display:block;
  font-size:var(--fs-sm);
  line-height:1.35;
  color:var(--c-on-dark);
  font-family:var(--font-display);
  font-weight:var(--fw-display);
  letter-spacing:var(--ls-tight);
  max-width:26ch;
}
.vsl-facade__cap::before{content:"VSL · Архитектура Оффера"}
.vsl-facade__cap::after{
  content:"Нажмите, чтобы посмотреть";
  display:block;
  margin-top:4px;
  font-family:var(--font-text);
  font-weight:var(--fw-regular);
  font-size:var(--fs-xs);
  letter-spacing:0;
  color:var(--c-on-dark-mut);
}

/*
   Заголовок и тип ролика переехали НА обложку. Пустого синего поля с одной
   кнопкой play на сайте больше нет ни в одном месте.
   🔴 flex:1 обязателен: в сетке карточки тянутся по высоте самой высокой
   в ряду, и обложка с фиксированной пропорцией оставляла под собой пустой
   тёмный прямоугольник.
*/
.vcard{justify-content:stretch}
.vcard__top{
  display:block;
  flex:1 1 auto;
  aspect-ratio:16/10;
  min-height:140px;
  padding:var(--sp-4);
}
.vcard__top::after{
  content:"";
  position:absolute;inset:0;
  pointer-events:none;
  background:linear-gradient(to top,
    rgba(6,8,22,.94) 0%, rgba(6,8,22,.72) 38%, rgba(6,8,22,.12) 72%, transparent 100%);
}
/*
 Play — в правом верхнем углу обложки, а не по центру: по центру он
   ложился ровно на заголовок, как только карточка становилась узкой.
*/
.vcard__play{
  position:absolute;
  top:var(--sp-3);right:var(--sp-3);
  z-index:2;
  width:40px;height:40px;
  background:rgba(5,7,15,.55);
  backdrop-filter:blur(6px);
  -webkit-backdrop-filter:blur(6px);
}
.vcard__b{
  position:absolute;
  left:0;right:0;bottom:0;
  z-index:1;
  padding:var(--sp-4);
  gap:4px;
}
.vcard__t{color:var(--c-on-dark)}
.vcard__m{color:var(--c-on-dark-mut);margin-top:0}
.vcard{border-color:transparent;background:var(--c-dark)}

/*
 Карточка «Видеоотзывы» — тот же язык обложки: бейдж сверху, play в углу,
   текст на скриме по нижней кромке. Ничего не пересекается ни на одной
   ширине, потому что все три слота разведены по углам, а не по центру.
*/

/*
   На телефоне окно НЕ схлопывается в плоскую карточку: остаётся экраном
   приложения. Боковое меню становится горизонтальной лентой вкладок под
   шапкой окна, содержимое — рабочей областью. Ровно так это устроено в
   мобильных версиях настоящих рабочих инструментов.
*/
@media (max-width:767px){
  .mock{border-radius:var(--r-md)}
  .mock__bar{padding:var(--sp-3) var(--sp-4);gap:var(--sp-3)}
  .mock__title{font-size:11px}
  .mock__body{grid-template-columns:1fr}
  .mock__side{
    display:flex;
    align-items:center;
    gap:var(--sp-2);
    padding:var(--sp-3) var(--sp-4);
    overflow-x:auto;
    overflow-y:hidden;
    overscroll-behavior-x:contain;
    scrollbar-width:none;
    background:rgba(255,255,255,.03);
    border-bottom:var(--rule-dark);
  }
  .mock__side::-webkit-scrollbar{display:none}
  /* Бренд-строка окна прячется: на телефоне её роль играет шапка окна. */
  .mock__brand{display:none}
  /* Группы — разделители ленты вкладок, пункты — вкладки. */
  .mock__grp{
    flex:none;
    margin:0;
    padding-right:var(--sp-2);
    border-right:var(--rule-dark);
    font-size:9px;
    white-space:nowrap;
    align-self:stretch;
    display:flex;
    align-items:center;
  }
  .mock__it{
    flex:none;
    padding:.35rem .6rem;
    border-radius:var(--r-pill);
    border:var(--rule-dark);
    font-size:11px;
    white-space:nowrap;
  }
  .mock__it.on{
    background:var(--c-accent);
    border-color:var(--c-accent);
    color:var(--c-accent-ink);
  }
  .mock__main{padding:var(--sp-4)}
  .mock__branch{font-size:11px;padding-bottom:var(--sp-3);margin-bottom:var(--sp-4)}
  .mock__flow{grid-template-columns:1fr 1fr;gap:var(--sp-2)}
  .mnode{padding:var(--sp-3);gap:2px}
  .mnode__k{font-size:9px}
  .mnode__t{font-size:11px}
  .mnode__d{font-size:9px;line-height:1.3}
  .mprev{gap:var(--sp-3)}
  .doc{padding:var(--sp-4)}
  .doc__r{font-size:11px;line-height:1.45;padding-block:var(--sp-2)}

  /* --- 4.4 Остальные секции «Монетизации» ------------------------------- */
  /*
     На телефоне поджимаем поля и кегль; раскладка та же — одна колонка.
*/
  .bridge{padding:var(--sp-5)}
  .bridge__h{font-size:.875rem;margin-bottom:var(--sp-4)}
  .bridge__p{font-size:var(--fs-sm);line-height:1.55;margin-bottom:var(--sp-4)}
  .bridge__list{gap:var(--sp-3)}
  .bridge__li{font-size:var(--fs-sm);line-height:1.55;gap:var(--sp-3)}
  .bridge__li::before{width:6px;height:6px;margin-top:.55em}
  .bridge__foot{font-size:var(--fs-sm);line-height:1.55;margin-top:var(--sp-5);padding-top:var(--sp-5)}
  .deliv li{padding-block:var(--sp-4);font-size:var(--fs-xs);line-height:1.5;gap:var(--sp-3)}
  .artcap{font-size:var(--fs-xs);line-height:1.5;margin-top:var(--stack-md)}
  .timeline{margin-bottom:var(--stack-md)}
  .tl{padding-block:var(--sp-4);gap:var(--sp-2)}
  .tl__k{font-size:1.0625rem}
  .tl__d{font-size:var(--fs-xs);line-height:1.5;max-width:none}
  .guar{border-radius:var(--r-lg)}
  .guar__badge{padding:var(--sp-4);font-size:1rem;gap:var(--sp-3)}
  .guar__shield{width:36px;height:36px}
  .guar__grid{padding:var(--sp-4)}
  .guar__i{padding-block:var(--sp-4);gap:var(--sp-2)}
  .guar__ico{width:34px;height:34px}
  .guar__t{font-size:1rem}
  .guar__d{font-size:var(--fs-xs);line-height:1.5}
  .guar__note{padding:var(--sp-4);font-size:11px;line-height:1.5}
  .rev{padding:var(--sp-4);gap:var(--sp-4);border-radius:var(--r-md)}
  .rev__q{font-size:1.0625rem;line-height:1.35}
  .rev__metrics{gap:var(--sp-2);padding-block:var(--sp-3)}
  .rev__m b{font-size:.95rem}
  .rev__m span{font-size:10px;line-height:1.25}
  .rev__by{padding-top:var(--sp-4);gap:var(--sp-3)}
  .rev__av{width:34px;height:34px}
}

/*
   5. «ПРАКТИКУМ»
*/
@media (max-width:767px){
  .hero--page{padding-top:calc(var(--hdr-h) + var(--sp-5));padding-bottom:var(--section-y-sm)}
  .hero--page h1,.hero--page .hero__h1{max-width:none;font-size:1.625rem;line-height:1.1}
  .hero--page .hero__sub,.hero--page .hero__subtitle{max-width:none}
  .hero--page .hero__pre-card{font-size:var(--fs-xs);line-height:1.5;margin-bottom:var(--sp-4)}
  .hero--page .hero__cols{gap:var(--stack-md)}
  .hero--page .hero__cols-b{gap:var(--sp-4)}
  .hero__notes{margin-top:var(--stack-md);padding-top:var(--stack-md);gap:var(--sp-4)}
  .hero__notes-col{gap:var(--sp-4)}
  /*
 Карточка методологии: стрелка остаётся справа от текста. В один
     столбец она падала под абзац и вставала у левого края.
*/
  .hero__sub-card{
    grid-template-columns:minmax(0,1fr) auto;
    padding:var(--sp-4);
    gap:var(--sp-4);
    border-radius:var(--r-md);
  }
  .hero__sub-card-text{font-size:var(--fs-xs);line-height:1.5}
  .hero__sub-card-arrow{width:38px;height:38px}
  .hero__diff{font-size:var(--fs-xs);line-height:1.5;padding-left:var(--sp-4);max-width:none}
  .vsl-warning{font-size:var(--fs-xs);line-height:1.5}
  /*
 styles.css).
     На телефоне бокс поджимается: щит мельче, поля уже, кегль — со шкалы.
*/
  .trust-box{font-size:var(--fs-sm);line-height:1.45;gap:var(--sp-3);padding:var(--sp-3) var(--sp-4)}
  .trust-box__ico{width:32px;height:32px}
  .cta-wrap{gap:var(--sp-4)}

  .aud-list{gap:var(--sp-3)}
  .audience-card{padding:var(--sp-4);gap:var(--sp-3);font-size:var(--fs-xs);line-height:1.5;border-radius:var(--r-sm)}
  .audience-card__mark{width:28px;height:28px}

  .big-idea__card{padding:var(--sp-5) var(--sp-4);border-radius:var(--r-lg)}
  .big-idea__lead{font-size:1.375rem;margin-bottom:var(--sp-4);max-width:none}
  .big-idea__body{font-size:var(--fs-sm);line-height:1.55;max-width:none}

  .case-headline{font-size:1.375rem;max-width:none;margin-bottom:var(--stack-md)}
  .case-stats{padding:var(--sp-5) var(--sp-4);margin-bottom:var(--stack-md);border-radius:var(--r-lg)}
  .case-stat{padding-block:var(--sp-4)}
  .case-stat__value{font-size:2rem;margin-bottom:var(--sp-2)}
  .case-stat__label{font-size:var(--fs-sm)}
  .case-stat__sub{font-size:var(--fs-xs)}
  .case-pair{gap:var(--sp-4);margin-bottom:var(--stack-md)}
  .case-block--before{padding:var(--sp-4) 0 var(--sp-4) var(--sp-4)}
  .case-block--after{padding:var(--sp-4);border-radius:var(--r-md)}
  .case-block--table{padding:var(--sp-4);border-radius:var(--r-md)}
  .case-text{font-size:var(--fs-xs);line-height:1.55;max-width:none}
  .case-label{margin-bottom:var(--sp-3)}
  .case-quote{padding:var(--sp-5) var(--sp-4);font-size:1.0625rem;line-height:1.35;border-radius:var(--r-lg)}
  .case-quote-author{margin-top:var(--sp-5);padding-top:var(--sp-4);font-size:var(--fs-xs)}
  .case-pair__go{width:38px;height:38px}

  .bio-wrap{gap:var(--stack-md)}
  .bio-photo__img{aspect-ratio:4/3;object-position:center 20%}
  .bio-card{padding-top:var(--sp-4);margin-top:var(--sp-4)}
  .bio-content{gap:var(--stack-md)}
  .bio-section{padding-top:var(--sp-5)}
  .bio-section__label{margin-bottom:var(--sp-3)}
  .bio-section__text{font-size:var(--fs-sm);line-height:1.55}
  .bio-companies li,.bio-list li{font-size:var(--fs-xs);line-height:1.5;padding-left:var(--sp-4)}
  .bio-logos{gap:var(--sp-5);margin-top:var(--sp-4);padding-top:var(--sp-4)}
  .bio-logo-img{height:26px}

  .guarantee__card{padding:var(--sp-5) var(--sp-4);gap:var(--sp-4);border-radius:var(--r-lg)}
  .guarantee__icon{width:48px;height:48px}
  .guarantee__title{font-size:1.25rem}
  .guarantee__body{font-size:var(--fs-sm);line-height:1.55;max-width:none}

  .final-cta__grid{gap:var(--stack-md)}
  .final-cta__h{font-size:1.5rem;max-width:none;margin-bottom:var(--sp-4)}
  .final-cta__sub{font-size:var(--fs-sm);max-width:none;margin-bottom:var(--sp-5)}
  .final-cta__trust{font-size:var(--fs-xs);line-height:1.5;margin-top:var(--sp-4)}
  .ps__text{font-size:var(--fs-xs);line-height:1.55}
}

/*
   6.   ----------------------------------------------------------------------------
   На телефоне подвал шёл одной колонкой: логотип, слоган, десять ссылок
   строками во всю ширину и правовая строка — 760px пустоватой ленты.
   Здесь он собран заново: бренд-блок, две колонки ссылок рядом, правовая
   строка в две строки по левому краю.
*/
@media (max-width:767px){
  footer,.footer{padding-block:var(--section-y-sm)}
  .foot__top{gap:var(--stack-md);padding-bottom:var(--stack-md)}
  .foot__logo{height:18px;margin-bottom:var(--sp-4)}
  .foot__brand{font-size:var(--fs-sm)}
  .foot__tag{font-size:var(--fs-xs);line-height:1.5;max-width:none;margin-top:var(--sp-2)}
  .foot__cols{grid-template-columns:1fr 1fr;gap:var(--sp-5) var(--sp-5)}
  .foot__col h3{margin-bottom:var(--sp-2);font-size:10px}
  .foot__col a{min-height:42px;font-size:var(--fs-xs);padding-block:var(--sp-1)}
  .foot__note{font-size:10px;line-height:1.4;margin-top:var(--sp-3)}
  .foot__legal{
    display:grid;
    grid-template-columns:1fr;
    justify-content:start;
    gap:var(--sp-2);
    padding-top:var(--sp-5);
    font-size:10px;
    line-height:1.5;
  }
}

/*
   7. МОДАЛКИ, ЛАЙТБОКС, ТЕЛЕФОН-ВИДЖЕТ
*/

/*
   🔴 Кнопка лежала впритык к рантам корпуса: прямые углы упирались в
   скругление 38px, и она читалась как приклеенная поверх телефона, шире
   рамки. Теперь у неё поле корпуса по бокам и радиус в тон экрану.
*/
.phone__sub{
  margin-top:0;
  padding:8px 6px 4px;
}
.phone__sub .btn{
  width:100%;
  border-radius:18px;
  min-height:50px;
  padding-inline:1.1rem;
  font-size:var(--fs-xs);
}

/*
   Ширина корпуса привязана к экрану, а высота ленты — к ширине корпуса:
   раньше высота была прибита к 580px независимо от того, сколько места
   реально есть, и виджет то растягивался, то резал текст.
*/
@media (max-width:767px){
  .phone{
    max-width:min(340px,100%);
    justify-self:center;
    border-radius:34px;
    padding:7px;
  }
  .tg{border-radius:27px}
  .feed__window{height:min(500px,64vw + 260px)}
  /*
 Пост длиннее экрана прокручивается внутри пузыря — текст не режется,
     а полный вариант по-прежнему открывается тапом в лайтбоксе.
*/
  .feed__track .post{overflow-y:auto;overscroll-behavior:contain}
  .post__t{font-size:12.5px}
  .post__d{font-size:12px}
  .post__q{font-size:11.5px}
}

/*
   Окно перестаёт быть «карточкой в центре с крестиком у верхней кромки»:
   на телефоне это лист снизу — большой палец достаёт до закрытия, контент
   прокручивается, за листом ничего не уезжает.
*/
@media (max-width:767px){
  .lb{padding:0;align-items:flex-end}
  .lb__panel{
    width:100%;
    max-height:88vh;
    max-height:88dvh;
    border-radius:var(--r-xl) var(--r-xl) 0 0;
    border-bottom:none;
    padding:var(--sp-6) var(--sp-4) calc(var(--sp-6) + env(safe-area-inset-bottom));
    transform:translateY(28px);
  }
  .lb.is-open .lb__panel{transform:none}
  /* Ручка листа — жест «потянуть вниз», а не декор. */
  .lb__panel::before{
    content:"";
    position:absolute;
    left:50%;top:10px;
    transform:translateX(-50%);
    width:38px;height:4px;
    border-radius:var(--r-pill);
    background:rgba(255,255,255,.22);
  }
  .lb__x{
    top:auto;bottom:calc(var(--sp-4) + env(safe-area-inset-bottom));
    right:var(--sp-4);
    width:52px;height:52px;
    background:var(--c-accent);
    color:var(--c-accent-ink);
    box-shadow:0 10px 30px -12px rgba(0,0,0,.7);
  }
  .lb__body{padding-right:0;padding-bottom:var(--sp-8);gap:var(--sp-4)}
  .lb .post__t{font-size:1.125rem}
  .lb .post__d,.lb .post__q{font-size:var(--fs-sm)}

  .modal-backdrop{padding:0;align-items:flex-end}
  .modal{
    width:100%;
    max-height:92vh;
    max-height:92dvh;
    overflow-y:auto;
    overscroll-behavior:contain;
    border-radius:var(--r-xl) var(--r-xl) 0 0;
    padding:var(--sp-6) var(--sp-4) calc(var(--sp-6) + env(safe-area-inset-bottom));
    margin-block:0;
    transform:translateY(28px);
  }
  .modal__close{
    top:var(--sp-3);right:var(--sp-3);
    width:44px;height:44px;
    background:rgba(255,255,255,.08);
  }
  .modal__title{font-size:1.125rem;padding-right:3.25rem}
  .modal__sub{font-size:var(--fs-xs);line-height:1.5}
  .form-consent span{font-size:11px;line-height:1.5}
}

.lb__yt{
  position:relative;
  aspect-ratio:16/9;
  width:100%;
  border-radius:var(--r-md);
  overflow:hidden;
  background:#000;
}
.lb__yt iframe{position:absolute;inset:0;width:100%;height:100%;border:0}

/*
   8. ПЛАНШЕТ 768–1023 — собственные раскладки
   Планшет получал десктопные сетки в узком окне: портрет героя ужимался до
   280px, подпись наезжала на лицо, «утечки» вставали тремя колонками по
   215px с рваными заголовками. Здесь у планшета своя логика: широкие
   горизонтальные объекты вместо узких колонок.
*/
@media (min-width:768px) and (max-width:1023px){

  /*
 --- 8.1 Герой главной ------------------------------------------------
     Две колонки остаются, но пропорция другая: портрет получал 0.7fr от
     768 — 280px, и подпись-оверлей с десктопными кеглями наезжала на лицо.
     Колонка портрета шире, оверлей — в планшетной шкале.
*/
  .hero{padding-top:calc(var(--hdr-h) + var(--sp-6))}
  .hero__grid{grid-template-columns:minmax(0,1fr) minmax(0,.86fr);gap:var(--sp-6)}
  .hero h1{max-width:none}
  .hero__sub{max-width:none}
  .hero__badge{max-width:none}
  .hero__cta-row .btn{width:auto}
  .hero__media{max-width:none;justify-self:stretch}
  .hero__img{aspect-ratio:3/4;object-position:top center}
  .hero__cred{padding:var(--sp-8) var(--sp-4) var(--sp-4);gap:2px}
  .hero__cred-name{font-size:1.125rem}
  .hero__cred-role{font-size:11.5px;line-height:1.35}
  .hero__creds{margin-top:var(--sp-3);padding-top:var(--sp-3);gap:6px}
  .hero__creds li{padding:.25rem .55rem;font-size:10.5px}
  /*
 Цифры остаются рядом из трёх, но кегль поджат — подписи перестали
     рваться на две строки и ряд снова читается как одна полка.
*/
  .stats{margin-top:var(--stack-md)}
  .stat{padding:var(--sp-4) var(--sp-5) var(--sp-4) 0}
  .stat__n{font-size:1.5rem;margin-bottom:var(--sp-2)}
  .stat__l{font-size:12px;line-height:1.35;max-width:none}

  /*
 --- 8.2 «Утечки»: две колонки, третья полосой ------------------------
     Три колонки по 215px рвали заголовки на три строки.
*/
  .leaks__list{grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:none}
  .leak,.leaks__list:has(.leak__k) .leak{grid-row:auto;grid-template-rows:none}
  .leaks__list>.leak:nth-child(3){
    grid-column:1 / -1;
    display:grid;
    grid-template-columns:auto minmax(0,1fr);
    column-gap:var(--sp-5);
    align-items:center;
  }
  .leaks__list>.leak:nth-child(3) .leak__ico{grid-row:1 / span 3;margin-bottom:0}
  .leaks__list>.leak:nth-child(3) .leak__meter{grid-column:2}

  /*
 --- 8.3 Эксперт: колонки почти поровну -------------------------------
     0.72fr от 768 давали портрет в 250px — «марка вместо кадра».
*/
  .exp{grid-template-columns:minmax(0,.95fr) minmax(0,1.05fr);gap:var(--sp-6)}
  .exp__ph{max-height:none}
  .exp__r{grid-template-columns:auto minmax(0,1fr);gap:var(--sp-4);padding-block:var(--sp-4)}
  .exp__r i{font-size:1.5rem}
  .exp__quote{font-size:1.0625rem;padding-left:var(--sp-5)}

  /*
 --- 8.4 «Разборы»: 2×2 ролика + телефон в своей колонке ---------------
     Телефон полосой во всю ширину под карточками съедал 700px пустоты по
     бокам. Раскладка Максима работает и здесь, если корпус поджать до 288px.
*/
  /*
 🔴 Колонка телефона рядом с карточками оставляла роликам по 186px:
     заголовок «Почему выручка растёт, а прибыль падает» вставал ПЯТЬЮ
     строками по восемь символов (mobile-audit: ЛЕСЕНКА @768). Это ровно
     тот случай, ради которого гейт и написан — «не вылезло за экран»
     здесь ничего не значит.
     Телефон уходит на свою строку и центрируется с шириной 300px (полосой
     во всю ширину он и правда съедал бы пустоту по бокам — оговорка выше
     верна), карточкам достаётся по 344px, и заголовок встаёт в две строки.
*/
  .cgrid{
    grid-template-columns:repeat(2,minmax(0,1fr));
    gap:var(--sp-4);
  }
  .cgrid .phone{grid-column:1 / -1;grid-row:auto;max-width:300px;justify-self:center}
  .feed__window{height:560px}
  .vcard__t{font-size:.9375rem}
  /* styles.css) */
  .socials{grid-template-columns:repeat(3,minmax(0,1fr));column-gap:var(--sp-5)}
  .soc{padding-inline:0 var(--sp-3);font-size:var(--fs-sm)}
  .arts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));overflow:visible;scroll-snap-type:none}
  .acard{flex:none}

  /* --- 8.5 Сравнение и кейсы -------------------------------------------- */
  /*
 Акцентный CTA-ряд: подпись слева, стрелка справа — на планшете она
     сваливалась под текст и вставала у левого края.
*/

  .cmp{gap:var(--sp-5)}
  .cmp__col{padding:var(--sp-5)}
  .cmp__h{font-size:1.125rem}
  .cmp__li{padding-block:var(--sp-2);font-size:var(--fs-xs);line-height:1.5}

  /*
 --- 8.6 Светофор: опросник в две колонки, панель полосой --------------
     Сами вопросы — в той же компактной подаче, что на телефоне: карточка
     с рамкой и «таблетками» вразнобой давала 1 727px и на планшете.
*/
  .svet{grid-template-columns:1fr;gap:var(--stack-md)}
  .svet__quiz{grid-template-columns:1fr 1fr;gap:0 var(--sp-6);border-top:var(--rule)}
  .svet__q{
    border:none;
    border-bottom:var(--rule);
    border-radius:0;
    background:transparent;
    padding:var(--sp-4) 0;
  }
  .svet__q::before{left:calc(-1 * var(--sp-3));top:var(--sp-4);bottom:var(--sp-4)}
  .svet__ql{gap:var(--sp-3);margin-bottom:var(--sp-3);font-size:var(--fs-sm);line-height:1.35;align-items:start}
  .svet__ql i{width:26px;height:26px;font-size:11px;border-radius:6px}
  .svet__opts{
    display:grid;
    grid-template-columns:repeat(3,minmax(0,1fr));
    gap:var(--sp-2);
    padding-left:0;
  }
  .svet__opt{
    justify-content:flex-start;
    gap:6px;
    padding:.4rem .5rem;
    border-radius:var(--r-sm);
    font-size:11px;
    line-height:1.25;
    text-align:left;
    min-height:46px;
    overflow:visible;
    overflow-wrap:break-word;
  }
  .svet__opt::before{border-radius:inherit}
  .svet__opt::after{width:10px;height:10px}
  .svet__panel{position:static;padding:var(--sp-5)}
  .svet__score{margin-bottom:var(--sp-5)}
  .svet__rows{display:grid;grid-template-columns:1fr 1fr;column-gap:var(--sp-6)}
  .feed__track .post{overflow-y:auto;overscroll-behavior:contain;scrollbar-width:none}
  .feed__track .post::-webkit-scrollbar{display:none}
  /*
 Корпус на планшете 300px — имя канала в шапке не обрезаем многоточием
     (гейт «обрезанного текста 0»), пускаем в две строки.
*/
  .tg__id .feed__name{white-space:normal;overflow:visible;text-overflow:clip;line-height:1.25}

  /* --- 8.7 Финальный CTA и подвал --------------------------------------- */
  .final__grid{grid-template-columns:1fr;gap:var(--stack-md)}
  .bonus{display:grid;grid-template-columns:1fr 1fr;column-gap:var(--sp-6)}
  .bonus__badge,.bonus__t{grid-column:1 / -1}
  .foot__cols{grid-template-columns:1fr 1fr;gap:var(--sp-6)}

  /* --- 8.8 Окно-приложение: узкая колонка меню, а не 230px --------------- */
  .mock__body{grid-template-columns:180px 1fr}
  .mock__it{font-size:11px}

  /* --- 8.9 Практикум ----------------------------------------------------- */
  .bio-wrap{grid-template-columns:minmax(0,.85fr) minmax(0,1.15fr);gap:var(--sp-6)}
  .aud-list{grid-template-columns:1fr 1fr;gap:var(--sp-3)}
  .audience-card{padding:var(--sp-4);font-size:var(--fs-xs);line-height:1.5}
  .case-pair{grid-template-columns:1fr;gap:var(--sp-5)}
  .case-pair__go{transform:rotate(90deg)}
  .guarantee__card{grid-template-columns:auto minmax(0,1fr);gap:var(--sp-5)}
  .guarantee__body{grid-column:1 / -1;padding-left:0;border-left:none}
  .final-cta__grid{grid-template-columns:1fr;gap:var(--stack-md)}
  /*
 Герой подстраниц: две колонки уже с планшета. В один столбец видео
     уезжало под копию и добавляло 400–500px пустого первого экрана
     («Монетизация» на 768 — 1 330px против 824 на 1024).
*/
  .hero--page .hero__cols{
    grid-template-columns:minmax(0,1.05fr) minmax(0,.95fr);
    gap:var(--sp-6);
    align-items:start;
  }
  .hero--page .vsl{padding:var(--sp-4)}
  .vsl__t{font-size:1rem;max-width:none}
  .vsl__cap{font-size:var(--fs-xs)}
  .vsl__play{width:52px;height:52px}
  .vsl-facade__cap{font-size:var(--fs-xs)}
  .cta-wrap .btn-cta,.hero--page .hero__cta{width:100%}
  /*
     одна колонка), правило column-gap снято вместе с колонками.
*/
  .bridge__li{font-size:var(--fs-sm);line-height:1.55}
  .timeline{column-gap:var(--sp-5)}
  .tl__d{font-size:var(--fs-xs);line-height:1.5}
  .deliv li{font-size:var(--fs-xs);line-height:1.5}
  .guar__d{font-size:var(--fs-xs);line-height:1.5}
  .rev{padding:var(--sp-5)}
}

/*
   9. ТАЧ-ЗОНЫ И БЕЗОПАСНЫЕ ПОЛЯ
*/
@media (pointer:coarse){
  /* Ряды-ссылки и пункты меню — зона ≥44px с запасом на округление. */
  .nav a,.burger,.arw,.svet__opt,.faq__q,.foot__col a{min-height:46px}
  .lb__x,.modal__close{min-width:46px}
}
/* Нижнее поле страницы под жестовой полосой iOS. */
@supports (padding:max(0px)){
  footer,.footer{padding-bottom:max(var(--section-y-sm), env(safe-area-inset-bottom))}
}

/* --- 10.1 Шапка: премиальное поведение при скролле ----------------------- */
.hdr.is-compact{box-shadow:0 10px 30px -26px rgba(11,27,58,.5)}

/*
 🔴 На 1024–1279 меню и CTA съедали строку, и имя бренда обрезалось
   многоточием («Максим Попцов · perf…»). Многоточие в шапке читается как
   поломка — поджимаем меню, а не имя.
*/
@media (min-width:1024px) and (max-width:1279px){
  .brand__desc{display:none}
  .nav{gap:var(--sp-4)}
  .nav a{font-size:var(--fs-xs)}
  .nav__cta{font-size:var(--fs-cap);padding-inline:1rem}
}

/* --- 10.2 Подпись на портрете читается на любой ширине ------------------- */
.hero__cred{
  /*
 Роль набрана приглушённым по светлому пиджаку — на 1024 строка почти
     пропадала. Скрим поднят выше и плотнее у нижней кромки.
*/
  background:linear-gradient(to top,
    rgba(10,12,32,.96) 0%, rgba(10,12,32,.9) 40%, rgba(10,12,32,.52) 74%, rgba(10,12,32,0) 100%);
}
.hero__cred-role{color:#B9C6D9}

/*
 --- 10.3 Корпус телефона: детали, а не «скруглённый прямоугольник» ------
 Боковые кнопки и внешний рант — то, чего не хватало виджету,
   чтобы читаться как устройство. Чистая графика, ничего не сдвигает.
*/
.phone{
  box-shadow:
    inset 0 0 0 1px rgba(255,255,255,.10),
    inset 0 1px 0 0 rgba(255,255,255,.16),
    var(--sh-lg);
}
.phone::before,
.phone::after{
  content:"";
  position:absolute;
  width:3px;
  border-radius:2px;
  background:linear-gradient(180deg,rgba(255,255,255,.22),rgba(255,255,255,.06));
  pointer-events:none;
}
/* качелька громкости — слева */
.phone::before{left:-2px;top:104px;height:56px}
/* кнопка блокировки — справа */
.phone::after{right:-2px;top:120px;height:74px}

/* --- 10.4 Ссылки-стрелки внутри карточек: стрелка не отрывается ---------- */
.ccard__more,.flag__more{white-space:nowrap}

/*
 --- 10.5 Классы из разметки, у которых не было ни одного правила --------
   Найдены сплошной сверкой «класс в HTML → правило в CSS». Каждый из них
   рисовался браузерными дефолтами — это и есть «мелочи криво/съехало».
*/

/*
 🔴 Метки звена лежат ВНУТРИ абзаца и без правила текли строкой сразу за
   точкой: «…перестаёт сравнивать по цене.↗ КОНВЕРСИЯ». Теперь это ряд
   меток на своей строке под описанием.
*/
.row__tags{
  display:flex;
  flex-wrap:wrap;
  gap:var(--sp-2) var(--sp-4);
  margin-top:var(--sp-3);
}

/* Точка в логотипе внутри окна-приложения — акцентная, как в подвале. */
.hi--dark{color:var(--c-accent-text)}

/*
 Иконка узла карты монетизации: без правила она наследовала кегль абзаца
   и висела над меткой случайным глифом.
*/
.mnode__ic{
  display:flex;
  width:22px;height:22px;
  align-items:center;
  justify-content:center;
  margin-bottom:var(--sp-2);
  color:var(--c-accent-text);
}
.mnode__ic .ico{width:14px;height:14px}
.mnode--core .mnode__ic{color:var(--c-accent-2)}

/* Кикер страницы 404 — тот же почерк, что у кикеров секций. */
.eyebrow{
  display:flex;
  align-items:center;
  gap:var(--sp-3);
  font-family:var(--font-display);
  font-weight:var(--fw-bold);
  font-size:var(--fs-cap);
  letter-spacing:var(--ls-caps);
  text-transform:uppercase;
  color:var(--c-muted);
  margin-bottom:var(--sp-4);
}
.eyebrow::before{content:"";width:24px;height:1px;flex:none;background:var(--c-accent)}

/* --- 10.6 🔴 КОРЕНЬ V6-№4: тач-правило разворачивало ссылки в столбик -----
   В styles.css §31 зона ≥44px на тач-устройствах делалась так:
     @media (pointer:coarse){ .alink,.foot__col a,… {display:flex;
                              flex-direction:column;justify-content:center} }
   Побочный эффект: у ссылки-стрелки текст и стрелка становились ДВУМЯ
   строками флекс-колонки и центрировались — ровно то, что владелец видел
   как «„Подробнее о проекте“ и → разорваны» и как «всё отцентрировано».
   Высоту зоны даёт min-height, направление возвращаем строкой. */
@media (pointer:coarse){
  .alink,.foot__col a,.foot__links a,.footer__legal a{
    flex-direction:row;
    align-items:center;
    justify-content:flex-start;
    text-align:left;
  }
  /* Пункты панели: подпись слева, стрелка у правого края. */
  .nav a{flex-direction:row;justify-content:space-between;text-align:left}
  /* Бренд остаётся столбиком: это две строки подписи, а не ссылка+иконка. */
  .brand{flex-direction:column;align-items:flex-start}
}

/*
 Подвал 404: одна колонка ссылок должна занимать всю ширину, а не половину
   сетки с пустотой справа. auto-fit схлопывает пустой трек.
*/
@media (max-width:767px){
  .foot__cols{grid-template-columns:repeat(auto-fit,minmax(140px,1fr))}
}

/*
 --- 10.7 Контакты на планшете: строки вместо трёх узких колонок ---------
   В трёх колонках по ~150px номер телефона переносился посреди цифр
   («+7 (923) 554-29-» / «77») — это читается как поломка.
*/
@media (min-width:768px) and (max-width:1023px){
  .contacts{grid-template-columns:1fr;column-gap:0}
  .contact{
    border-right:none;
    border-bottom:var(--rule-dark);
    padding-right:0;
    min-height:60px;
  }
  .contact:last-child{border-bottom:none}
}
.contact .v{white-space:nowrap}

/*
   1.
      Теперь это плитки со скруглением, как и всё остальное на сайте.
   2. Шапка-таблетка при открытой панели теряла скругление и
      превращалась в прямоугольную полосу — плашка обязана остаться
      плашкой в любом состоянии.
   3. Имя бренда в плашке переносилось на две строки и распирало её
      по высоте: дескриптор на этих ширинах уже скрыт, строка влезает.
*/
@media (max-width:1023px){
  .nav{
    padding:calc(var(--hdr-h) + var(--sp-6)) var(--sp-4) var(--sp-6);
    gap:var(--sp-2);
  }
  .nav a{
    border-bottom:0;
    padding:var(--sp-3) var(--sp-4);
    border-radius:var(--r-md);
    background:rgba(255,255,255,.05);
    min-height:52px;
  }
  .nav a:active{background:rgba(255,255,255,.10)}
  .nav>.nav__cta{margin-top:var(--sp-3)}

  
  body.nav-open .hdr__in{border-radius:var(--r-pill)}
}
@media (max-width:479px){
  .brand__name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.2}
}

/*
   ОТ ВЕРХНЕГО КРАЯ и наезжала на саму плашку. Чтобы бренд, кнопка
   и крест оставались доступны, их поднимали z-index'ом ПОВЕРХ панели —
   получалась каша: имя бренда обрезано панелью, кнопка и крест висят
   на тёмном листе, плашка просвечивает под ним.
   Теперь панель — отдельный лист, который открывается ПОД плашкой
   и не пересекается с ней. Плашка остаётся целой и светлой.

   `position:absolute` вместо `fixed` умышленно: .hdr__in несёт
   backdrop-filter и потому является containing block для fixed-потомков.
   Абсолют считается от него же — и никаких костылей с гашением фильтра.
*/
@media (max-width:1023px){
  .hdr__in{position:relative}
  .nav{
    position:absolute;
    top:calc(100% + var(--sp-3));
    right:0;
    left:auto;
    bottom:auto;
    width:min(340px, calc(100vw - 2 * var(--gutter)));
    max-height:calc(100dvh - var(--hdr-h) - var(--sp-8));
    border-radius:var(--r-xl);
    padding:var(--sp-3);
    box-shadow:0 26px 60px -28px rgba(0,0,0,.75);
    clip-path:inset(0 0 100% 0 round var(--r-xl));
    transition:clip-path var(--dur-slow) var(--ease-out);
  }
  .nav.is-open{clip-path:inset(0 0 0 0 round var(--r-xl))}
  .nav::before{border-radius:inherit}

  /*
 Плашка при открытой панели больше не перекрашивается и не теряет
     форму — правки этого блока отменяют прежние костыли.
*/
  body.nav-open .hdr{z-index:540;transform:none}
  body.nav-open .brand,body.nav-open .hdr__act{z-index:auto}
  body.nav-open .brand__name{color:var(--c-ink)}
}

/*
 Бренд в плашке на телефоне: имя обрезалось кнопкой и уезжало под неё.
   Колонка бренда сжимается первой и режется многоточием, кнопка и бургер
   держат свою ширину.
*/
@media (max-width:767px){
  .hdr__in{gap:var(--sp-2)}
  .brand{flex:1 1 0;min-width:0;overflow:hidden}
  .brand__name{
    display:block;
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
    font-size:var(--fs-xs);
  }
  .hdr__act{flex:0 0 auto}
  .nav__cta{padding-inline:.9rem;font-size:var(--fs-cap);white-space:nowrap}
}

@media (max-width:1023px){
  /*
 Плашка при открытой панели становится непрозрачной: сквозь стекло
     просвечивал затемнитель под ней и делал её грязно-серой.
*/
  body.nav-open .hdr__in{
    background:var(--c-surface);
    backdrop-filter:none;
    -webkit-backdrop-filter:none;
  }
  /*
 Пока панель открыта, кнопка из полосы прячется: в панели свои
     действия, а имя бренда наконец получает всю строку.
*/
  body.nav-open .hdr__act .nav__cta{display:none}
}

/*
   Числа с замера: у контакт-плитки на 390px было `padding:12px 0`
   (боковых полей НЕТ — иконка вплотную к кромке), на 768 —
   `16px 0 16px 24px` (справа ноль). Это остатки правил прежней
   СТРОЧНОЙ раскладки контактов на волосяных линейках: тогда нулевые
   боковые поля были верны, у плитки со скруглением — нет.
*/
@media (max-width:1023px){
  .contact{
    padding:var(--sp-4) var(--sp-5);
    min-height:72px;
    border-right:none;
    border-bottom:none;
    gap:var(--sp-4);
  }
  .contact:last-child{border-bottom:none}
  .contacts{grid-template-columns:1fr;gap:var(--sp-3)}
}

/*
 Старая мобильная карусель «Утечек» конфликтовала с общим
   модулем [data-mcar]: своя ширина карточки, свой padding у трека
   и свой scroll-padding. Общий модуль — единственный источник.
*/
@media (max-width:767px){
  .leaks{padding:var(--sp-5) 0}
  .leaks__list{padding-inline:var(--sp-5);scroll-padding-inline:var(--sp-5)}
  .leaks__list>.leak{flex:0 0 calc(100% - var(--sp-8))}
}

/* ── Правки по итогам сквозного аудита ─────────────── */
@media (max-width:1023px){
  /*
 Плитка цифры: поля были 0 слева и 24 справа — плашка со скруглением
     без боковых полей читается как ошибка вёрстки.
*/
  .stat{padding:var(--sp-4) var(--sp-5)}
  .stat__l{max-width:none}
  /* Вывод-цитата под «Утечками»: слева 24, справа 0. */
  .leaks__out{padding:var(--sp-4) var(--sp-5)}
}

/*
 Посты TG-ленты на 320–360: длинный пост не помещался в экран
   телефона-виджета и обрезался на 45–66px. Поджимаем кегль и поля.
*/
@media (max-width:360px){
  .post{padding:10px 11px 9px;gap:5px}
  .post__t{font-size:13px;line-height:1.25}
  .post__d,.post__q{font-size:11.5px;line-height:1.45}
  .post__meta{font-size:10px}
}

/* ── Аудит: текст, прижатый к кромке скруглённой плитки ─────────────── */
@media (max-width:767px){
  /*
 FAQ: мобильное правило обнуляло боковые поля кнопки — на плитке
     со скруглением вопрос упирался в левую кромку (замер l=0).
*/
  .faq__q{padding:var(--sp-4) var(--sp-5)}
  .faq__a{padding-inline:var(--sp-5)}
  .faq__a p{padding-bottom:var(--sp-5)}
}
/*
 Значение контакта: `white-space:nowrap` спасал телефон от переноса
   посреди цифр, но длинный e-mail из-за него вылезал за правую кромку
   плитки на 11–21px. Нерушимым остаётся только телефон.
*/
.contact .v{white-space:normal;overflow-wrap:anywhere}
.contact[href^="tel:"] .v{white-space:nowrap}

/* ── Аудит, узкие экраны (320–360) ───────────────────────────────────── */
@media (max-width:379px){
  /*
 Цифра над подписью — теперь общее правило телефона (см. блок ≤767px),
     здесь остаётся только более крупный кегль числа: на 320 карточка
     уже узкая, и мелкое число терялось.
*/
  .stat__n{font-size:1.5rem}
  .stat__l{font-size:var(--fs-xs)}
  /*
 Макет артефакта: содержимое шире окна на 12px и срезалось
     (`overflow:hidden`). Поджимаем внутренние поля и кегль.
*/
  .mock{font-size:11px}
  .mock__side,.mock__main{padding:var(--sp-3)}
  .doc__grid{gap:var(--sp-2)}
  .mock__title{font-size:10px}
}

/* ── Аудит: остаточные обрезания на 320 ─────────────────────────────── */
@media (max-width:360px){
  /*
 Экран телефона-виджета держит фиксированную высоту (иначе лента
     перестаёт клипаться и слайд ломается). На 320px самый длинный пост
     в неё не помещался и терял хвост на 29px. Кегль уже поджат выше —
     добавляем высоту ровно под самый длинный пост на этой ширине.
*/
  .feed__window{height:min(520px,74vw + 260px)}
}
@media (max-width:400px){
  /*
 Кнопка play в карточке VSL вылезала за нижнюю кромку на 24px:
     карточка держит соотношение сторон, а контент не сжимался.
*/
  .vsl{aspect-ratio:auto;min-height:240px}
  .vsl__play{width:48px;height:48px}
}
@media (max-width:767px){
  /*
 🔴 Заголовок окна артефакта («performa · Карта монетизации —
     итоговый артефакт проекта») уходил за правую кромку на 113px
     и срезался. Это подпись макета, а не контент: сокращаем
     многоточием, как это делает настоящее окно приложения.
     Прокрутку самого макета НЕ включаем — боковая лента вкладок
     (.mock__side) прокручивается сама, и второй скроллер поверх неё
     ловил бы жест раньше.
*/
  .mock__bar{min-width:0}
  .mock__title{
    min-width:0;
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
  }
}

/*
   ⬛ ШАПКА — ЕДИНСТВЕННЫЙ ИСТОЧНИК ПРАВДЫ. ЖИВЁТ ЗДЕСЬ ОСОЗНАННО.
   adaptive.css подключается ПОСЛЕ styles.css, поэтому правила шапки
   в styles.css при равной специфичности проигрывали здешним. Три
   захода на плотность плашки не давали эффекта именно поэтому:
   значение бралось отсюда, а правилось там.

   «навбар должен быть стеклянным и всегда светлым»). Переключатель
   `.hdr--dark` и все 55 правил под него удалены из JS и CSS, а не
   перекрыты сверху: именно наслоение отменённых решений и заставляло
   чинить этот блок четыре захода подряд.
*/
.hdr{
  position:fixed;
  top:var(--sp-3);
  left:0;
  right:0;
  margin-inline:auto;
  width:min(var(--container), calc(100% - 2 * var(--gutter)));
  z-index:500;
  padding:0;
  border:1px solid rgba(255,255,255,.62);
  border-radius:var(--r-pill);
  /*
 Стекло, а не заливка: сквозь плашку должно читаться полотно.
     Ниже 70% текст меню начинает конкурировать с контентом под ней,
     выше 85% стекло превращается в глухую панель. 78/90 — рабочая
     пара «видно, что под ней, но читать не мешает».
     Контраст держится в любом случае: чернила #101B2E на 78% белого
     поверх самой тёмной секции дают ≈9:1.
*/
  background:color-mix(in srgb, var(--c-surface) 78%, transparent);
  backdrop-filter:blur(24px) saturate(1.9);
  -webkit-backdrop-filter:blur(24px) saturate(1.9);
  box-shadow:0 10px 30px -14px rgba(11,27,58,.28);
  transform:none;
}
.hdr.is-compact{
  top:var(--sp-2);
  /*
 Со снятым вторым слоем 84% держит
     стекло и на прокрутке.
*/
  background:color-mix(in srgb, var(--c-surface) 84%, transparent);
  box-shadow:0 14px 36px -18px rgba(11,27,58,.36);
  border-bottom-color:rgba(255,255,255,.62);
}
/* Автоскрытия нет: «навбар не должен пропадать при скролле». */
.hdr.is-hidden{transform:none}
/* Тема по полотну под шапкой: «меняться в зависимости от фона тоже». */
/* Внутренняя строка — просто строка: стекло переехало на <header>. */
.hdr .hdr__in,
body.nav-open .hdr__in{
  max-width:none;
  width:100%;
  padding:var(--sp-2) var(--sp-2) var(--sp-2) var(--sp-5);
  background:none;
  backdrop-filter:none;
  -webkit-backdrop-filter:none;
  border:0;
  border-radius:inherit;
  box-shadow:none;
}
.hdr::before,.hdr::after{content:none}
.hdr__in>.brand{padding-left:0}
@media (max-width:600px){
  .hdr .hdr__in{padding-left:var(--sp-4)}
}

/*
 При открытой панели плашка сохраняет СВОЮ тему, а не красится
   в тёмное принудительно: старое правило §1.3 (`body.nav-open .hdr{
   background:var(--c-dark)}`) осталось от полосы во всю ширину —
   на светлой странице оно делало бренд тёмным по тёмному.
*/
body.nav-open .hdr{
  background:color-mix(in srgb, var(--c-surface) 97%, transparent);
  backdrop-filter:none;
  -webkit-backdrop-filter:none;
  border-color:var(--c-line);
  box-shadow:0 14px 36px -18px rgba(11,27,58,.36);
}
body.nav-open .brand__name{color:var(--c-ink)}
body.nav-open .brand__name b{color:var(--c-accent)}
body.nav-open .burger__i i{background:var(--c-ink)}
body.nav-open .burger{border-color:var(--c-line);background:color-mix(in srgb,var(--c-surface) 70%,transparent)}

/*
 Дескриптор бренда показываем только там, где для него есть место.
   На 1024–1359 меню занимает середину плашки, и строка «консалтинг
   для собственников малого бизнеса» обрезалась многоточием —
   гейт «обрезанного текста 0» краснел. Лучше не показать вовсе,
   чем показать огрызок.
*/
@media (max-width:1359px){
  .brand__desc{display:none}
}

/*
 Ниже — правки ровно по найденным местам.
*/

/*
 --- 1. КЕГЛЬ ЗАГОЛОВКОВ НА УЗКОМ ЭКРАНЕ (≤379) -----------------------
   Нижние границы clamp были рассчитаны от латиницы. Русские слова
   длиннее («коммерческая», «Telegram-ботов», «презентация»), и на 320px
   в строку влезало 8–12 символов: H1 «Монетизации» разваливался на
   ДЕСЯТЬ строк. Уменьшаем только дисплейные роли — телу текста
   мельчить нельзя, там читаемость важнее компактности.
*/
@media (max-width:379px){
  :root{
    --fs-display:     1.3125rem;   
    --fs-display-sub: 1.1875rem;   
    --fs-h1:          1.25rem;     
    --fs-h2:          1.25rem;     
    --fs-h3:          1.0625rem;   
    /* трекинг ослабляем: на мелком кегле минусовый трекинг слипает буквы */
    --ls-display:-0.02em;
    --ls-tight:-0.015em;
  }
}

/* --- 2. КОЛОНКИ, КОТОРЫЕ НА ТЕЛЕФОНЕ ДЕЛЯТЬ НЕЧЕГО --------------------- */
@media (max-width:379px){
  /*
 Метрики отзыва: три колонки по 77px — подпись под числом ломалась
     на три строки. В два ряда по две.
*/
  .rev__metrics{grid-template-columns:repeat(2,minmax(0,1fr))}
  /* Метрики флагмана: 119px на плитку, «Средний чек» в две строки. */
  .fchips{grid-template-columns:minmax(0,1fr)}
}

/*
 --- 3. ВИДЕО-КАРТОЧКИ КОНТЕНТА -----------------------------------------
   На 360–479 сетка .cgrid стояла в две колонки: на карточку приходилось
   ~160px, и «Почему выручка растёт, а прибыль падает» вставало пятью
   строками по одному слову. Ниже 480 — одна колонка.
*/
@media (max-width:479px){
  .cgrid{grid-template-columns:minmax(0,1fr)}
  .cgrid .phone{grid-column:auto}
}

/*
 --- 4. ПЛАНШЕТ: МЕРА СТРОКИ В ГЕРОЕ-ДОКУМЕНТЕ -------------------------
   `.hero--doc h1{max-width:22ch}` считался под десктоп, где 22ch — это
   ~640px. На 768 контейнер сам 704px, и 22ch давали 472px: заголовок
   практикума вставал девятью строками при половине пустого поля.
*/
@media (min-width:600px) and (max-width:1023px){
  .hero--doc h1,.hero--doc .hero__h1{max-width:none}
}

/*
 --- 5. ЗАГОЛОВКИ С ЖЁСТКИМ КЕГЛЕМ НА 320 ------------------------------
   Три места задают размер числом, минуя токены, поэтому правка §1
   их не достала: герой подстраниц, заголовок кейса практикума
   и первая карточка в «Статьях». На 320px они давали 8–10 строк
   по одному слову.
*/
@media (max-width:379px){
  .hero--page h1,.hero--page .hero__h1{font-size:1.3125rem;line-height:1.14}
  .case-headline{font-size:1.1875rem}
  .arts-grid>.art-card:first-child .art-card__t{font-size:1.0625rem}
}

/*
 --- 6. МОДАЛКА ПОД ПАЛЕЦ ----------------------------------------------
   Сама анкета на телефоне в порядке: поля крупные, чекбокс лежит внутри
   <label for>, поэтому тапается вся строка согласия. Мелкой оставалась
   одна цель — ссылка «политикой конфиденциальности» внутри абзаца:
   13px по высоте. Инлайновая ссылка в предложении освобождена от
   правила размера цели (WCAG 2.5.8), но пальцем в неё всё равно
   не попасть. Вертикальные поля растят зону нажатия, НЕ трогая
   строчный ритм: у инлайн-элемента padding-block не двигает line box.
*/
@media (pointer:coarse){
  .form-consent a,
  .form__note a,
  .modal p a{
    padding-block:.6em;
    margin-block:-.6em;
  }
}

/*
 --- 7. «СВЕТОФОР» НА 320 ----------------------------------------------
   Три варианта ответа в ряд дают на 320px по ~85px на плитку: «Запасным
   предложением» встаёт тремя строками впритык к кромке и к соседу.
   Формально ничего не срезано (qa.js и audit.js чисты) — но выбирать
   пальцем из трёх таких плиток нельзя. На узком экране варианты идут
   столбиком: строка целая, плитка во всю ширину.
*/
@media (max-width:379px){
  .svet__opts{grid-template-columns:minmax(0,1fr)}
}

/*
 --- 8. ШАПКА НА ТЕЛЕФОНЕ: ИМЯ КРУПНЕЕ И ПО ЦЕНТРУ ПЛАШКИ --------------

   🔴 Две отдельные причины, обе настоящие:

   1. ВЕРТИКАЛЬ. Тач-правило дало `.brand` `min-height:45px` и
      `justify-content:center` — но `.brand` это GRID, а в гриде
      justify-content правит ГОРИЗОНТАЛЬНУЮ ось. Вертикально имя
      осталось прижатым к верху 45-пиксельного бокса. За центрирование
      по блочной оси отвечает align-content.

   2. КЕГЛЬ. Имя ужимали до --fs-xs (12px) дважды и по разным поводам:
      чтобы не обрезалось кнопкой записи и чтобы влезало в 480.
      Кнопка с 600px уехала в панель, дескриптор скрыт — строка
      свободна, и держать 12px больше незачем.
*/
@media (max-width:600px){
  .brand{align-content:center}
  .brand__name{font-size:var(--fs-sm);letter-spacing:-.01em;line-height:1.25}
}
/*
 На 320–359 строка узкая, и любой читаемый кегль уводил имя
   в многоточие. Многоточие в шапке проект уже признал поломкой, поэтому здесь имя переносится
   на ДВЕ строки, а не обрезается. Плашка от этого не распухает:
   две строки по 13px укладываются в те же 45px тач-высоты.
*/
@media (max-width:359px){
  .brand__name{
    font-size:.8125rem;
    white-space:normal;
    overflow:visible;
    text-overflow:clip;
    line-height:1.2;
  }
}

/*
 --- 9. ТЕЛЕФОН-ВИДЖЕТ НЕ ГЛОТАЕТ ПРОКРУТКУ СТРАНИЦЫ -------------------

   🔴 Причина: `.post` объявлен `overflow-y:auto`, то есть КАЖДЫЙ пост —
   отдельный контейнер прокрутки. Палец, попавший на экран виджета,
   отдавал жест ему, а не странице. Проверено живым тач-жестом:
   свайп по виджету — scrollY не меняется, тот же свайп по соседнему
   тексту — страница едет.

   Лента листается САМА и вручную её крутить не нужно, поэтому внутренний
   скроллер снят совсем, а `touch-action` явно отдаёт вертикаль странице.
   `pinch-zoom` оставлен: запрещать пользователю масштаб нельзя.

   Замер показал, что при снятом скроллере текст нигде не режется, кроме
   320px — там самый длинный пост не влезал в окно на 5px. Окну добавлен
   запас, иначе снятие скроллера обрезало бы последнюю строку.
*/
.phone .post{overflow:hidden}
@media (pointer:coarse){
  .phone{touch-action:pan-y pinch-zoom}
  /*
 🔴 touch-action и снятие внутреннего скроллера жест НЕ вернули —
     проверено перебором в живой странице: помогло только исключение
     экрана из hit-теста. На тач-устройстве экран виджета становится
     НЕинтерактивным: это витрина, которая листает себя сама, и
     отбирать у неё палец читателя незачем. Кнопка «Подписаться на
     канал» лежит НИЖЕ .tg и работает как работала.
*/
  .phone .tg{pointer-events:none}
}
@media (max-width:359px){
  .feed__window{height:min(540px, 74vw + 285px)}
}

/*
 --- 10. КОНТАКТ-КАРТОЧКА НА УЗКОМ ЭКРАНЕ ------------------------------
   На 320 слот значения — 140px, а `info@maxperforma.ru` требует 195px:
   адрес уезжал на вторую строку и рвался посреди слова.
   Разрыв в осмысленной точке пришлось бы ставить тегом <wbr>, но он
   разрезает текстовый узел и роняет сверку текста с исходником —
   ослаблять гейт ради косметики нельзя. Поэтому возвращаем слоту ширину:
   плитка иконки, поля и промежутки поджаты, кегль значения на ступень
   ниже — адрес встаёт в одну строку без единой правки текста.
*/
@media (max-width:379px){
  .contact{padding-inline:var(--sp-4);gap:var(--sp-3);grid-template-columns:34px minmax(0,1fr) auto}
  .contact>.ico:first-child{width:34px;height:34px}
  .contact .v{font-size:var(--fs-sm)}
  .contact__go{width:16px;height:16px}
}
