/* ==========================================================================
   Секция 3 — знакомство с продуктом

   Композиция: шапка во всю ширину сверху, робот по центру как герой экрана,
   по две карточки слева и справа, под роботом — вывод секции, на полку
   которого он встаёт нижним краем.

   Всё живёт в одной сетке .intro__layout, поэтому шапка, карточки, робот
   и вывод выровнены по общим вертикалям и читаются как один экран.

   Экран собран так, чтобы целиком помещаться в окно ноутбука (правка
   заказчика: «не влезает полностью в поле зрения»). Отсюда сжатые поля
   секции, плотный внутренний ритм карточек и вывод в одну строку.
   Высота проверяется линейкой: node tools/fit-intro.js — она показывает
   и итог, и все слагаемые, из которых он набирается. Линейка ищет .icon-badge
   и после объединения значка с заголовком печатает «значок null» — кружка
   в карточке больше нет, значок лежит в .intro__card-icon.
   ========================================================================== */

.intro {
  overflow: hidden;
  /* Поля секции общие: --section-y — единственная ручка межсекционной
     отбивки на весь сайт (tokens.css). Прежние 24-48 сверху добывали
     пиксели под «экран должен помещаться в окно ноутбука», но платили
     за это разнобоем стыков: 147px до экрана 4 против 121 у всех
     остальных пар. Хвост полки-постамента (.verdict--stage::after,
     148px от верхней кромки вывода) при 60px нижнего поля укладывается
     внутрь секции с большим запасом, чем при прежних 48. */
  /* Своего фона у секции нет. Раньше здесь лежала радиальная подсветка
     во всю ширину (58% 46% at 50% 50%): она дублировала свечение за
     роботом, но, в отличие от него, не была привязана к объекту — тон
     ровной полосой доходил до 82% высоты и там гас. На стыке с экраном 4
     это читалось сменой фона, а docs/visual-language.md требует прямо
     обратного: секции своего фона не имеют, подсветка допустима только
     когда работает на объект. Свечение за фигурой осталось — оно на
     .intro__visual::before и привязано к роботу. */
}

/* Бейдж свой не заводим: в макете он тут 18/48, но в base.css надзаголовок
   секции сведён к одному компоненту 15/46, и локальный размер снова разводил
   бы бейджи по странице (docs/audit-design.md — шесть высот и четыре кегля). */

/* ---------- Декор ----------
   Объект секции — робот, объект-силуэт, значит кольца ореолом по его оси
   (docs/visual-language.md, «Декор: два вопроса»). Кольца выведены из левого
   нижнего угла в центр ещё раньше — правило это подтверждает и оставляет
   как есть.

   Две точечные сетки по верхним углам сняты. Они не были привязаны ни
   к чему: стояли «чтобы полоса шапки не висела в пустоте», то есть ровно
   по тому вкусовому основанию, из-за которого приём и перестал читаться
   приёмом. Секция уже держит свой объект кольцами, второй мотив в ней
   не решает ничего. */

.intro__rings {
  width: min(52vw, 900px);
  aspect-ratio: 1;
  left: 50%;
  top: 22%;
  transform: translateX(-50%);
  /* Круг выше секции: при 22% сверху его нижняя четверть уходит на 100+px
     за нижнюю кромку, а на секции стоит overflow: hidden — на стыке
     с экраном 4 были видны два обрубленных конца дуг. Наращивать секцию
     ради декора нельзя (она обязана влезать в окно ноутбука), сдвигать
     круг вверх тоже: он работает ореолом за фигурой и должен стоять на
     её оси. Поэтому кольца гаснут маской и до кромки доходят с нулевой
     плотностью — обрываться нечему.

     Стоп 68% выбран по самой тесной ширине. Круг растёт от vw, а его верх
     отсчитывается долей от высоты секции, поэтому запас до стыка везде
     разный, и минимум приходится не на край диапазона, а на 1700: там
     растворение кончается за 37px до кромки, на 1920 — за 51, на 1440 —
     за 92, на 1280 — за 145. На 72% запас на 1700 схлопывался до одного
     пикселя, поэтому стоп именно 68. */
  -webkit-mask-image: linear-gradient(180deg, #000 46%, transparent 68%);
          mask-image: linear-gradient(180deg, #000 46%, transparent 68%);
}

/* ---------- Сетка ----------
   База — одна колонка: шапка, четыре карточки, робот, вывод. Порядок в разметке
   уже правильный, поэтому на узких экранах ничего переставлять не нужно,
   и робот в любом случае стоит ровно над выводом. */

.intro__layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--s-5);
}

/* Список карточек — один <ul>, но раскладывает их общая сетка секции:
   display: contents убирает коробку списка, а <li> становятся её элементами.
   Так карточки можно расставить вокруг робота, не разрезая список на два. */
.intro__cards {
  display: contents;
  list-style: none;
}

/* ---------- Шапка ---------- */

/* Шапка по центру, а не слева, как в остальных секциях: композиция ниже
   симметричная и строится вокруг центральной оси робота — заголовок слева
   спорил бы с ней и снова разваливал бы экран на куски. */
.intro__head {
  display: flex;
  flex-direction: column;
  align-items: center;
  margin-bottom: var(--s-2);
  text-align: center;
}

/* Заголовок набран заголовочным шрифтом проекта (.display → Oswald, caps):
   один заголовочный шрифт на весь сайт, см. docs/visual-language.md. В макете
   этот экран был в основном гротеске, но прототип в этом месте непоследователен.
   Ни font-family, ни трекинга, ни интерлиньяжа здесь нет: всё берётся из
   .display, иначе шрифт снова разъедется с первым и вторым экранами.

   Кегль общий — --fz-h2. Был свой (63.4 против 55.4 на 1440) ради длины
   строки в центрованной композиции; заголовок раздела не имеет права звучать
   громче соседних только потому, что так лучше ложится строка. */
.intro__title {
  margin-block: var(--s-3) var(--s-2);
  font-size: var(--fz-h2);
  text-wrap: balance;
}

/* Кегль, интерлиньяж и мера приезжают из .lead: подзаголовок секции звучит
   одинаково на всех экранах. Было 18.7px при мере 91 знак на 1440 —
   самая длинная строка сайта, глаз терял начало следующей. */

/* ---------- Карточки ----------
   Раньше карточка была 250px шириной: текст рвался на 5-6 строк по два-три
   слова. Теперь 627px на 1920 и 445 на 1440 — самый длинный текст («Новый
   продукт») укладывается на десктопе в две строки вместо шести.
   Ширина здесь не роскошь, а высота: две строки вместо трёх снимают с экрана
   45px, а вместе с ними столько же с робота — он ростом с колонку карточек.
   Поэтому средняя колонка под робота нарочно узкая (см. блок 1280+).
   align-self: stretch равняет карточки ряда по высоте, чтобы плашки
   заголовков и описания под ними стояли на одних линиях. */

.intro__card {
  align-self: stretch;
  /* Вертикальные поля 24, а не 32: ряд карточек задаёт высоту всей средней
     части экрана (две карточки + робот ростом с колонку), поэтому каждый
     срезанный пиксель внутри карточки убирает из экрана два. */
  padding: var(--s-5) clamp(var(--s-5), 1.7vw, var(--s-6));
  border-radius: var(--r-lg);
  background: var(--surface);
  box-shadow: var(--sh-card);
  list-style: none;
}

/* ---------- Заголовок карточки: плашка со значком ----------

   Правка заказчика: «коробочка, справа от неё написано „Новый продукт“,
   и всё это в фиолетовом фоне вписано». Значок перестал быть отдельным
   кружком над заголовком — значок и заголовок стоят одной строкой внутри
   общей плашки, описание идёт под ней. Прежний вариант (кружок 56px,
   заголовок, фиолетовая чёрточка) целиком лежит в
   sections/_backup/03-intro.html и css/sections/_backup/03-intro.css.

   Чтобы плашка не стала коробкой внутри коробки:
   — ширина по содержимому (width: fit-content), а не во всю карточку:
     четыре плашки разной длины не выстраиваются в четыре одинаковых
     прямоугольника, и карточка не выглядит разделённой пополам;
   — скругление на ступень мельче карточного (--r-sm против --r-lg):
     вложенная форма всегда острее внешней, иначе они спорят;
   — тени нет вовсе. Объём набирается тем же материалом, что у надзаголовков
     и кружков под значки: перелив --grad-soft вместо плоской заливки,
     волосяная кромка и светлая линия по верхнему ребру. Это ровно те
     «микродеталь вместо украшения» и «перелив вместо заливки», на которых
     стоит docs/visual-language.md;
   — display: flex, а не inline-flex: инлайновый бокс добавил бы под плашкой
     пустоту строчного интерлиньяжа, и зазор до описания оказался бы больше
     заданного.

   Фиолетовая чёрточка под заголовком снята: её работу — акцент у заголовка —
   теперь делает сама плашка, а два акцентных приёма в одном блоке заказчик
   уже снимал на других экранах. */
.intro__card-head {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  width: fit-content;
  max-width: 100%;
  padding: var(--s-3) var(--s-4) var(--s-3) var(--s-3);
  border-radius: var(--r-sm);
  background: var(--grad-soft);
  border: 1px solid rgba(124, 59, 246, .16);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .85);
}

/* Значок внутри плашки — голая иконка, без собственного кружка: кружок
   в плашке в карточке — три вложенные формы подряд. Кегль значка чуть
   крупнее строчных заголовка (18-22 против 15-19), как у значка в .badge:
   так значок читается меткой, а не буквой. */
.intro__card-icon {
  width: clamp(18px, 1.25vw, 22px);
  height: clamp(18px, 1.25vw, 22px);
  color: var(--brand);
}

/* Кегль подобран так, чтобы все четыре заголовка были однострочными на любой
   ширине: двухстрочный заголовок растит плашку и ломает ряд. */
.intro__card-title {
  font-size: var(--fz-small);
  font-weight: 700;
  line-height: var(--lh-heading);
  letter-spacing: var(--ls-caps-sm);
  text-transform: uppercase;
  /* Капс не переносится: свод, «Переносы». */
  -webkit-hyphens: none;
  hyphens: none;
}

/* Нижняя граница 15px, а не 13.5: 13.5 — уже за порогом читаемости на 375.
   Отступ от плашки 32, а не 8: плашка теперь тяжелее прежнего заголовка
   (заливка, кромка, значок внутри), и на восьми пикселях описание к ней
   прилипало. Заодно это те пиксели, которые карточка отдала на объединении
   значка с заголовком, — без них ряд карточек проседает почти на полсотни,
   а вместе с ним укорачивается робот: он ростом с колонку карточек. */
.intro__card-text {
  margin-top: var(--s-6);
  color: var(--muted);
  font-size: var(--fz-small);
  line-height: var(--lh-body);
}

/* ---------- Робот ---------- */

.intro__visual {
  position: relative;
  z-index: 0;
  margin: 0;
  /* Нижний край картинки — жёсткий срез вырезки. Отрицательный отступ уводит
     его за верхнюю кромку вывода, где срез перекрывает непрозрачная верхушка
     полки-постамента (.verdict--stage), и его не видно ни на одной ширине.
     Считается так: первое слагаемое гасит row-gap сетки, второе (--s-8) —
     сам нахлёст. row-gap теперь --s-5 на всех ширинах, поэтому и здесь --s-5:
     нахлёст остаётся ровно 64px, как было. Уменьшать вторую часть нельзя —
     срез вылезет наружу; менять первую можно только вместе с row-gap. */
  margin-bottom: calc(-1 * (var(--s-5) + var(--s-8)));
}

/* Свечение из макета — за фигурой, а не запечённое в картинку */
.intro__visual::before {
  content: '';
  position: absolute;
  left: 50%;
  bottom: 8%;
  width: min(112%, 760px);
  aspect-ratio: 1;
  transform: translateX(-50%);
  border-radius: 50%;
  background: radial-gradient(circle, rgba(124, 59, 246, .18) 0%, transparent 64%);
}

.intro__robot {
  position: relative;
  width: min(100%, 340px);
  margin-inline: auto;
}

/* ---------- Вывод секции ----------

   Плашки больше нет: вывод — фраза прямо на общем фоне страницы, её держит
   полка света (.verdict в base.css). Здесь единственное на сайте место
   с модификатором --stage: на полку встаёт робот, поэтому её верхушка
   непрозрачна и перекрывает жёсткий срез вырезки — ровно ту работу, что
   раньше делала плашка с тенью.

   Всё оформление — кегль, начертание, поля, кромка, омут, постамент —
   приходит из base.css и здесь не перебивается: шесть выводов сайта обязаны
   звучать одинаково громко. У секции остаётся одна ручка --verdict-measure,
   она меняет только число строк.

   20em: на узких экранах фраза ложится в две сбалансированные строки.
   Мера в em, а не в px и не в ch — тогда она масштабируется вместе с кеглем
   и число строк не плывёт. Порог замерен: до 18em фраза ломается на три
   строки, дальше — на две. С 1280 ограничение снимается совсем (см. блок
   1280+), и фраза идёт в одну строку. */
.intro__callout {
  --verdict-measure: 20em;
}

/* ---------- 640+ : карточки в два столбца ---------- */

@media (min-width: 640px) {
  .intro__layout {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    column-gap: var(--s-5);
  }

  .intro__head,
  .intro__visual,
  .intro__callout { grid-column: 1 / -1; }

  .intro__robot { width: min(100%, 400px); }
}

/* ---------- 900+ : карточки шире, робот крупнее ---------- */

@media (min-width: 900px) {
  .intro__layout { column-gap: var(--s-6); row-gap: var(--s-5); }

  /* 460, а не 520. Ограничение не композиционное, а инженерное: срез вырезки
     по низу картинки перекрывает непрозрачная верхушка полки-постамента,
     а она шириной ровно 486px (760px блока, из которых боковая маска
     растворяет по 18% с каждой стороны). Робот в 520px вылезал за эти 486,
     и на 900-1279 сквозь полупрозрачные края постамента просвечивал его
     обрубленный рукав — видно на снимке 1024. 460 оставляет по 13px запаса
     с каждой стороны. Ниже 900 фигура и так 340-400px, выше 1280 её ширину
     задаёт высота колонки карточек (359-395px) — там запас есть везде. */
  .intro__robot { width: min(100%, 460px); }
}

/* ---------- 1280+ : композиция экрана ----------
   Три колонки: карточки — робот — карточки. Средняя задана не долей, а clamp:
   доля тянется вместе с экраном, а картинке нужна вполне конкретная ширина —
   робот ростом с колонку карточек, то есть примерно 0.8 её высоты в ширину.
   При долях средняя колонка на 1280-1440 выходила уже картинки (робот лез
   на карточки), а на 1920 шире неё на 180px (блоки распадались).

   Границы clamp пересчитаны дважды. Первый раз — когда экран сжимали под окно
   ноутбука. Второй — когда значок и заголовок карточки съехались в одну плашку:
   карточка потеряла полсотни пикселей высоты, а вместе с ней укоротился робот
   (он ростом с колонку карточек) и стал 359-395px шириной вместо прежних 405-425.
   Колонка в 400-480 после этого оказалась шире фигуры на 50-100px, и по бокам
   от робота повисала пустота — линейка показывала промежуток до карточки
   в 71px на 1440 и 98 на 1920 при потолке в 90. Отсюда 380-400: колонка снова
   впритык к фигуре, а освободившаяся ширина ушла карточкам (445 против 419
   на 1440, 627 против 587 на 1920) — тексту в них стало просторнее.

   Почему вообще clamp, а не доля: доля тянется вместе с экраном, а картинке
   нужна вполне конкретная ширина. При долях средняя колонка на 1280-1440
   выходила уже картинки (робот лез на карточки), а на 1920 шире неё на 180px
   (блоки распадались). Робот же почти постоянной ширины, поэтому и колонка
   под него почти постоянная.

   Нижняя граница 380: на 1280 фигура просит 377, то есть упирается в колонку
   ровно, и промежуток до карточки выходит минимально допустимый — 33px.
   Ниже опускать нельзя: включится max-width, картинка сожмётся по ширине,
   и макушка опустится ниже кромки карточек. Срез по низу закрыт в любом
   случае: object-position прижимает картинку к низу.

   Проверяется линейкой (node tools/fit-intro.js): промежуток между карточкой
   и фигурой нигде не меньше 32px и не больше 90px (сейчас 33-58), нахлёст
   на вывод везде ровно 64px.

   Порог 1280, а не 1200: ниже карточка становится уже 300px и текст в ней
   снова рвётся на короткие строки — там работает раскладка в два столбца.
   Карточек четыре: две слева, две справа, робот между ними, вывод под всем. */

@media (min-width: 1280px) {
  .intro__layout {
    grid-template-columns: minmax(0, 1fr) clamp(380px, 26vw, 400px) minmax(0, 1fr);
    column-gap: clamp(var(--s-6), 2.4vw, var(--s-7));
    row-gap: var(--s-5);
  }

  /* Своего отступа у шапки нет: её от карточек уже отделяет row-gap сетки,
     а margin-bottom складывался с ним и давал 56px пустоты. */
  .intro__head { grid-column: 1 / -1; grid-row: 1; margin-bottom: 0; }

  /* Вывод в одну строку, а не в две. Мера в 20em заведена ради узких экранов,
     где фраза иначе рвётся на три строки; на десктопе она укладывается
     в одну и снимает с экрана целую строку (41px на 1440 — самая крупная
     одиночная экономия на этом экране). Ширину блока по-прежнему задаёт
     сама фраза: у .verdict стоит width: fit-content, поэтому 100% — это
     не «во всю ширину», а «сколько попросит строка».
     Если на какой-то ширине строка всё же не влезет, text-wrap: balance
     разложит её на две ровные, как было. */
  .intro__callout {
    grid-column: 1 / -1;
    grid-row: 4;
    --verdict-measure: 100%;
  }

  /* Мера подзаголовка общая на всех ширинах: --measure задан в ch и на
     десктопе уже контейнера, а на узком экране до него не достаёт. */

  .intro__card:nth-child(1) { grid-column: 1; grid-row: 2; }
  .intro__card:nth-child(2) { grid-column: 1; grid-row: 3; }
  .intro__card:nth-child(3) { grid-column: 3; grid-row: 2; }
  .intro__card:nth-child(4) { grid-column: 3; grid-row: 3; }

  /* Фигура растянута на оба ряда карточек, поэтому робот ровно такой высоты,
     как колонка карточек, и его макушка встаёт на одну линию с их верхним
     краем — везде, кроме 1280-1310, где колонка у́же пропорций картинки
     (об этом в шапке блока).
     Картинка внутри — абсолютом: с height: 100% в потоке её собственные
     1252px попали бы в расчёт высоты рядов и растянули бы всю сетку. */
  .intro__visual {
    grid-column: 2;
    grid-row: 2 / span 2;
    align-self: stretch;
  }

  /* object-position: bottom прижимает картинку к низу фигуры даже там, где
     колонка уже её пропорций и включается max-width. Поэтому нижний край
     картинки всегда ровно на 64px за верхней кромкой вывода — независимо
     от того, сколько строк набралось в карточках и какой высоты вышел ряд.
     Именно это и держит срез вырезки закрытым на всех ширинах.
     max-width: 100% — за пределы колонки картинка не выходит, промежуток
     до карточек не съедается. */
  .intro__robot {
    position: absolute;
    left: 50%;
    bottom: 0;
    width: auto;
    height: 100%;
    max-width: 100%;
    margin-inline: 0;
    transform: translateX(-50%);
    object-fit: contain;
    object-position: bottom center;
  }
}

/* ---------- Мелочи адаптива ---------- */

/* Раскладка «карточки | робот | карточки» собирается только с 1280.
   На 900-1279 карточки уже стоят столбцом, робот уехал в самый низ секции
   (его центр — 70.4-71.0% высоты на всём диапазоне), а кольца оставались
   на десктопных 22% и висели над шапкой отдельным пятном: до фигуры
   им было 350-390px. Ореол, оторванный от объекта, — ровно то, что
   правило убирает, и своей секции оно тоже касается.
   Круг целиком внутри секции — маска, гасившая вылет вниз, не нужна. */
@media (min-width: 900px) and (max-width: 1279px) {
  .intro__rings {
    --rings-size: min(88vw, 560px);
    width: var(--rings-size);
    top: calc(70.5% - var(--rings-size) / 2);
    -webkit-mask-image: none;
            mask-image: none;
  }
}

/* На узких экранах робот уходит вниз секции — кольца едут за ним */
@media (max-width: 899px) {
  /* Круг прижат к низу секции и целиком в неё помещается — гасить нечего,
     маска только съела бы нижнюю половину ореола. */
  .intro__rings {
    width: min(88vw, 560px);
    top: auto;
    bottom: 6%;
    -webkit-mask-image: none;
            mask-image: none;
  }
}

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

/* ---------- Мобильная шапка ----------

   Отбивка «заголовок → лид». Было 8px (--s-2) при 24 в девяти секциях,
   32 в кейсах и вопросах, 48 в проблеме. Заголовок здесь — две строки
   капса 28px, то есть межстрочное расстояние ВНУТРИ него 34px: на восьми
   пикселях лид читался четвёртой строкой заголовка, а не подзаголовком.
   Закон близости при этом переворачивался — расстояние внутри группы
   оказывалось больше, чем до соседнего элемента.

   24 (--s-5) — та же ступень, что даёт base.css отбивке «бейдж → заголовок»
   на этих же ширинах: шапка секции набирается одним шагом сверху донизу.

   Только до 999: от 1000 начинается принятый десктоп, там 8px оправданы
   требованием «экран целиком в окне ноутбука» и композицией в три колонки. */
@media (max-width: 999px) {
  .intro__title { margin-bottom: var(--s-5); }
}

/* ---------- Карточка на телефоне ----------

   ДВЕ КОЛОНКИ ЗДЕСЬ НЕ ДЕЛАЮТСЯ, И ЭТО ПРОВЕРЯЕМОЕ ЧИСЛО, А НЕ ВКУС.
   docs/mobile-plan.md предлагает разложить карточки в два столбца до 430
   («замерено −252 px»). Арифметика против: на 375 контейнер 327,
   две колонки с зазором 24 дают по 151, минус поля карточки 2×24 —
   103px под строку. При основном кегле это 12-13 кириллических знаков.
   Тот же план в пункте С6 сам пишет, что на 375 физический потолок —
   39 знаков и уменьшать кегль ради «влезет больше» бессмысленно; колонка
   в четверть этого потолка превращает описание в столбик из восьми обрывков.
   На 430 лучше ненамного: 179 − 48 = 131px, 16 знаков.
   Плюс плашка заголовка («БЕЗ IT-ГОЛОВНЯКА» — 150px с значком и полями)
   в 151px колонку не встаёт и ломается на две строки, а её однострочность
   держит весь ритм ряда (см. .intro__card-title).
   Экономия в 252px не стоит четырёх нечитаемых карточек. Два столбца
   включаются там, где на них есть ширина, — с 640 (блок выше).

   ЧТО ДЕЛАЕТСЯ ВМЕСТО. Две правки внутри карточки.

   1. Отбивка «плашка → описание» 32 → 16. Тридцать два поставлены ради
      десктопа: там плашка стоит в ряду карточек, у которого своя высота,
      и восьми пикселей было мало (разбор над .intro__card-text). На телефоне
      карточка одна в строке, ряда нет, и 32px между заголовком и его же
      описанием переворачивают закон близости: до соседней карточки 24,
      внутри карточки 32. 16 возвращает порядок и снимает по 16px с каждой
      из четырёх.

   2. Кегль описания 15 → 16. По всей остальной странице основной текст
      набран 16, а здесь и в историях стояло 15 — разница в один пиксель
      не читается приёмом, читается недосмотром (docs/mobile-plan.md, С6).
      Четыре строки вместо трёх это стоит только в самой длинной карточке;
      размен в пользу кегля, потому что ширина строки на телефоне и так
      на пределе, и мельчить основной текст — единственное, чего в этой
      ситуации делать точно нельзя.

   Порог 639, а не 767: с 640 карточки уже стоят в два столбца, там своя
   ширина колонки и свой ритм. */
@media (max-width: 639px) {
  /* 3. Поля карточки 24 → 16. Это не «резать отступы», а починка закона
        близости: зазор МЕЖДУ карточками тоже 24 (row-gap сетки), то есть
        расстояние внутри группы равнялось расстоянию до соседней группы,
        и четыре карточки читались одной сплошной полосой. 16 внутри
        против 24 снаружи возвращает разницу. На десктопе инверсии нет:
        там между карточками 24-32 при поле 24-32 и рядом стоит робот,
        который сам разделяет колонки.
        Горизонтальное поле уходит вместе с вертикальным: строка получает
        295px вместо 279 — это как раз тот запас, который забрал переход
        на 16px кегля. */
  .intro__card { padding: var(--s-4); }

  .intro__card-text {
    margin-top: var(--s-4);
    font-size: var(--fz-body);
  }
}

/* ---------- Ландшафт телефона (844×390 и 932×430) ----------

   Фигура здесь не переезжает и не меняет колонку — не может: нижний край
   картинки это жёсткий срез вырезки, и закрывает его непрозрачная верхушка
   полки-постамента, а полка стоит по центру (.verdict, width: fit-content).
   Сдвинуть робота вбок — значит вывести срез из-под постамента и показать
   его на всех ландшафтных ширинах. Поэтому правится не место, а размер.

   Замер до правки: робот 400×501 при вьюпорте высотой 390 — фигура выше
   экрана, в кадр она целиком не помещается ни в одном положении прокрутки,
   и секция при этом 1337px (3,4 экрана). 300px ширины дают 376 высоты:
   фигура влезает в поворот целиком, а секция теряет 125px.

   Постамент это переживает с запасом: его непрозрачная верхушка 486px,
   робот 300 — перекрытие полное на обеих ширинах диапазона.

   Отбивки шапки идут на ступень вниз, как в ландшафтных блоках экранов 2,
   4 и 9. Центровку шапки не трогаем: композиция симметрична относительно
   оси фигуры, и в повороте это не меняется.

   max-width: 999px обязателен: без него правило поймало бы десктоп
   в низком окне. */
@media (orientation: landscape) and (max-height: 500px) and (max-width: 999px) {
  .intro__layout { gap: var(--s-4); }
  .intro__title { margin-block: var(--s-3) var(--s-4); }
  .intro__robot { width: min(100%, 300px); }

  /* Нахлёст на полку обязан остаться ровно 64px: первое слагаемое гасит
     row-gap сетки, а он здесь --s-4, а не --s-5. Без этой строки нахлёст
     вырос бы до 72 — не поломка, но число, которое никто не считал. */
  .intro__visual { margin-bottom: calc(-1 * (var(--s-4) + var(--s-8))); }
}
