/* ==========================================================================
   Секция 7 — кейсы учеников
   Единственное место на лендинге, где кроме фиолетового есть красный и зелёный:
   блоки «Было» и «Стало». Насыщенность приглушённая (--bad-* / --good-*
   из tokens.css), цветом помечен только ярлык, текст остаётся тёмным —
   иначе два цветных пятна в карточке спорят с фиолетовой кнопкой.

   Фотографии кейсов сняты по правке заказчика («пока картинки не вставляй,
   я потом их отдельно скину в хорошем разрешении»). Куда их возвращать —
   в комментарии «Фото» ниже и в sections/07-cases.html.
   ========================================================================== */

.cases {
  overflow: hidden;
}

/* Бейджу секции ничего не переопределяем: перелив, брендовая кромка
   и свечение приходят из .badge в base.css. Локальная копия здесь стояла
   с чуть более сильным свечением (.14 против .12) — при прокрутке
   надзаголовок этой секции светился заметнее соседних, а это ровно тот
   разнобой, из-за которого материал бейджа и подняли в base.css. */

/* ---------- Декор ----------
   Декора у секции нет, и это решение, а не пропуск.

   Объекта на экране нет: кейсы — это лента одинаковых карточек с текстом
   и числами, ни фигуры, ни окна интерфейса. По правилу (docs/visual-language.md,
   «Декор: два вопроса») узор привязан к объекту, значит здесь его нет.

   Стояли оба мотива сразу, в пустом правом верхнем углу над карточками,
   и держались только на том, что угол пустой. Заодно они были единственным
   местом на сайте, где узор рисовался своей, поднятой плотностью
   (.08-.16 против базовых .04-.07): по этому экрану видно, какой она должна
   быть, — поднятые значения переехали в base.css и стали общими,
   а собственных значений у секции больше нет. */

/* ---------- Шапка секции ---------- */

/* Ширина под две строки, как в макете: «СМОТРИ, ЧТО ДЕЛАЮТ» / «НАШИ ПОСЛЕ ИНТЕНСИВА».
   Вертикальные интервалы шапки по макету: бейдж → заголовок 58, заголовок → лид 32,
   лид → первая карточка 60. */
.cases__title {
  margin-block: var(--s-7) var(--s-6);
  max-width: 24ch;
}

/* Отбивка шапки общая (--s-7 в .section__head): было --s-8, и шапка кейсов
   дышала шире, чем шапки соседних секций. Внутрисекционная отбивка обязана
   быть заметно меньше межсекционной, иначе группировки не видно. */

/* ---------- Список карточек ---------- */

/* Зазор между карточками: в макете 32 (низ карточки 1171, верх карточки 2 — 1203).
   grid-auto-rows: 1fr выравнивает высоту всех трёх карточек: без него они выходят
   разной длины по тексту, и кнопка «Смотреть кейс» стоит в каждой на своей
   высоте, тогда как в макете карточки одинаковые. */
.cases__list {
  display: grid;
  grid-auto-rows: 1fr;
  gap: var(--s-6);
  margin: 0;
  padding: 0;
  list-style: none;
}

/* ---------- Карточка ----------

   Две колонки: кейс | было/стало.

   В макете колонок было три, и первой стояла фотография 631×542 — она
   и задавала карточке высоту в 604px. Фото снято, и три колонки под
   оставшийся текст не набираются: пробная раскладка «результат | описание |
   было/стало» дала колонку результата в 380px, где на 543px высоты стояли
   только цифра и подпись, — ровно та дыра на месте картинки, которой быть
   не должно. Поэтому кейс собран в одну колонку (ниша → цифра → что
   внедрили → кнопка), и она уравновешивает пару блоков «было/стало»
   массой, а не шириной.

   Долей 1fr / 1fr достаточно: текста слева и справа примерно поровну,
   и обе колонки заканчиваются на одной линии — кнопка встаёт вровень
   с нижним краем блока «Стало».

   Зазор колонок вынесен в --cases-gap: от него считается вылет
   разделителя, и в медиазапросах их надо менять вместе, а не двумя
   независимыми числами.

   Карточка целиком — ссылка на страницу кейса (растянутая зона нажатия
   на .cases__link ниже), поэтому ей положен отклик: .card--interactive
   поднимает её на 4px и уводит тень в брендовую. Позиционирующий контекст
   для этой зоны даёт .card--edge (position: relative + overflow: hidden). */
.cases__card {
  --cases-gap: var(--s-7);

  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: var(--cases-gap);
  align-items: stretch;
  padding: var(--s-6);
}

/* ---------- Фото ----------

   Блок удалён вместе с <img> по правке заказчика: «пока картинки
   не вставляй, я потом их отдельно скину в хорошем разрешении».

   Что тут стояло и что вернуть, когда файлы придут:

     .cases__media   обёртка кадра: position: relative; width: 100%;
                     aspect-ratio: 631 / 542; border-radius: var(--r-md);
                     overflow: hidden; background: var(--brand-soft).
                     width: 100% обязателен — колонка растянута по высоте
                     карточки, и без явной ширины aspect-ratio начинает
                     считать ШИРИНУ от высоты, фото вылезает на соседнюю
                     колонку.
     .cases__media::after   волосяная кромка поверх кадра:
                     inset: 0; border-radius: inherit; z-index: 1;
                     box-shadow: inset 0 0 0 1px rgba(27, 22, 51, .08).
                     Inset-тень самой обёртки картинка перекрыла бы.
     .cases__photo   position: absolute; inset: 0; width/height: 100%;
                     object-fit: cover; плюс scale(1.03) на :hover/:focus-within
                     карточки. Переход брать --t-fast: наезд кадра — отклик
                     на курсор (правило в base.css, раздел «Движение»).
                     Здесь до удаления стояло 700ms — свод прямо говорит,
                     что свыше 500 мс раздражает, а «медленный кинематографичный
                     зум» и есть тот эффект ради эффекта, который свод относит
                     к портфолио студии, а не к продуктовому лендингу.
                     Отдельный сброс в prefers-reduced-motion не нужен:
                     общий блок в base.css сводит длительность к нулю.
     @media (max-width: 640px)  .cases__media { aspect-ratio: 16 / 10 }

   Почему прежние файлы выглядели сломанными: это были кропы из макета
   со вклеенными скруглёнными углами и каймой фона, шириной 1091px.
   Требования к новым — в комментарии в sections/07-cases.html. */

/* ---------- Колонка кейса ---------- */

.cases__body {
  display: flex;
  flex-direction: column;
}

/* Кегли сняты с макета при вьюпорте 1920:
     заголовок кейса   38 (межстрочный 47 → 1.24)
     «Что внедрили»    27
     описание          27 (межстрочный 42)
   Верхние границы clamp — ровно замер, ниже кегль едет по вьюпорту. */
.cases__name {
  font-size: var(--fz-h3);
  line-height: var(--lh-heading);
}

/* ---------- Результат ----------

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

   Место — сразу под нишей, а не в конце карточки: заказчик просил, чтобы
   результат читался раньше описания. Раньше он читался позже всех —
   числа стояли внутри абзаца «Стало» тем же кеглем, что и остальной текст. */
.cases__metric {
  position: relative;
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--s-2) var(--s-4);
  margin-top: var(--s-6);
  padding-bottom: var(--s-6);
}

/* На телефоне подпись результата не помещается в строку с числом
   и переносится под него — блок и без внешних отбивок занимает две строки.
   Ступень вниз с обеих сторон: 24 сверху и 24 снизу вместо 32.
   Черта под строкой при этом остаётся на том же расстоянии от подписи,
   что и «Что внедрили» под чертой, — симметрия отбивки вокруг линии
   держится, просто вся пара стала на ступень плотнее. */
@media (max-width: 640px) {
  .cases__metric {
    margin-top: var(--s-5);
    padding-bottom: var(--s-5);
  }
}

/* Волосяная черта под строкой результата — единственная линия в карточке.
   Она отбивает результат от описания и заодно даёт колонке структуру,
   которую раньше давала граница фотографии. Гаснет вправо, а не упирается
   в край колонки тупым концом: обрубленная линия читается как рамка,
   растворяющаяся — как свет на ребре (тот же приём, что кромка .card--edge). */
.cases__metric::after {
  content: '';
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 1px;
  pointer-events: none;
  background: linear-gradient(90deg,
    rgba(27, 22, 51, .13) 0%,
    rgba(27, 22, 51, .09) 52%,
    rgba(27, 22, 51, 0)   100%);
}

/* Значок остался тот же duotone #chart-up, что был на снятой плашке,
   но вырос вместе с цифрой: на плашке он стоял рядом с числом в 36px,
   здесь число доходит до 64px, и прежние 29px читались чужой мелкой
   меткой сбоку. 40px — это высота заглавных у цифры, значок и число
   встают одной строкой.
   По базовой линии значок не садится (у SVG её нет), поэтому
   центрируется по высоте строки. */
.cases__metric-icon {
  align-self: center;
  width: clamp(24px, 2.1vw, 40px);
  height: clamp(24px, 2.1vw, 40px);
  flex: none;
  color: var(--brand);
}

/* Кегль на ступень ниже показателей платформы (там clamp(38px, 3.55vw, 68px)):
   тех три на блок во всю ширину, здесь три числа в колонках карточек.
   Верхняя граница 64px сознательно ниже заголовка секции (74px на 1920) —
   цифра кейса не может звучать громче названия экрана.
   Цвет --ink, не брендовый: в карточке уже есть красный и зелёный ярлыки
   и фиолетовая кнопка, четвёртое цветное пятно ломает иерархию. Первой
   цифра читается размером и позицией, а не цветом.
   Собственный контекст наложения (z-index: 0) нужен свечению ниже: без него
   ::before с отрицательным z-index ушёл бы под белую подложку карточки. */
.cases__metric-value {
  position: relative;
  z-index: 0;
  font-family: var(--font-base);
  font-size: var(--fz-num);
  font-weight: 700;
  line-height: 1.05;
  letter-spacing: var(--ls-num);
  font-variant-numeric: tabular-nums;
  font-feature-settings: 'tnum' 1;
}

/* Свечение под самой цифрой, а не под всей строкой: коробка равна тексту,
   поэтому у «×3» ореол компактный, у «$250 000» широкий — свет привязан
   к объекту, а не к колонке.
   Радиусы 58%/74% при последнем стопе 72%: заливка доходит до нуля на 42%
   от центра по горизонтали, то есть внутри своей коробки. Коробка выступает
   за цифру, но на её кромке альфа уже нулевая — overflow: hidden карточки
   резать нечего даже у первой цифры, прижатой к полю карточки. */
.cases__metric-value::before {
  content: '';
  position: absolute;
  z-index: -1;
  inset: -38% -16%;
  pointer-events: none;
  background: radial-gradient(58% 74% at 50% 50%,
    rgba(124, 59, 246, .18) 0%,
    rgba(124, 59, 246, .07) 42%,
    rgba(124, 59, 246, 0)   72%);
}

.cases__metric-label {
  color: var(--muted);
  font-size: var(--fz-small);
  line-height: 1.35;
}

/* «Что внедрили» — служебная подпись к абзацу, а не содержание, и держать её
   тем же кеглем, что и сам абзац, незачем: два одинаковых по весу блока
   подряд читаются как один сплошной текст. Заодно снят брендовый цвет —
   в карточке акцент положен действию (кнопке) и цифре результата,
   а третий фиолетовый элемент отбирал внимание у обоих. */
.cases__label {
  margin-top: var(--s-5);
  color: var(--muted-2);
  font-size: var(--fz-caption);
  font-weight: 600;
  letter-spacing: var(--ls-caps-sm);
  text-transform: uppercase;
  /* Капс не переносится: свод, «Переносы». */
  -webkit-hyphens: none;
  hyphens: none;
}

.cases__what {
  margin-top: var(--s-4);
  color: var(--muted);
  font-size: var(--fz-body);
  line-height: var(--lh-body);
}

/* Кнопка прижата к низу колонки: так она встаёт на одну линию с нижним
   краем блока «Стало» в соседней колонке — обе колонки заканчиваются вместе,
   и остаток высоты собирается одним промежутком, а не рассыпается
   по карточке.
   Регистр обычный, не капс: это второстепенное действие внутри карточки,
   кричать ему незачем — так и в макете.
   Замер кнопки по макету: 306×73 при вьюпорте 1920 */
.cases__link {
  align-self: flex-start;
  margin-top: auto;
  min-height: clamp(46px, 3.8vw, 73px);
  padding-inline: var(--s-6);
  gap: var(--s-4);
  text-transform: none;
  letter-spacing: 0;
  font-size: var(--fz-body);
  font-weight: 600;
}

.cases__link .icon { width: 26px; height: 26px; }

/* Зона нажатия растянута на всю карточку: кейс — это одна ссылка, и попадать
   в неё мышью надо всей карточкой, а не кнопкой 306×73. Позиционирующий
   контекст даёт .cases__card (position: relative приходит из .card--edge),
   поэтому inset: 0 — это габарит карточки, а не кнопки.
   z-index выше свечения под цифрой и черты под строкой результата: иначе
   зона нажатия обрывалась бы на их границах. */
.cases__link::after {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 3;
}

/* Наведение на любую точку карточки — это наведение на кнопку:
   иначе главный элемент карточки остаётся единственным, что не отзывается.
   Медиазапрос — общее правило сайта, разбор в base.css. */
@media (hover: hover) {
  .cases__card:hover .cases__link { box-shadow: 0 14px 34px rgba(124, 59, 246, .36); }
}

/* ---------- Было / Стало ----------

   Раскрытие на телефоне. Замер до правки (375×812): секция 2857px — три
   с половиной экрана, из них 379 на карточку приходится на пару «было/стало»,
   то есть 47% её высоты. Главное в карточке стоит выше: ниша, цифра
   результата и что внедрили. Пара «было/стало» — подробность, которая
   объясняет цифру, и на телефоне ей место под раскрытием.

   Приём тот же, что в историях партнёров (11-stories.css): нативный
   <details> с open в разметке, скрипт закрывает его только там, где сводка
   нарисована. От 641px, где карточка снова двухколоночная, <details>
   объявлен display: contents и из раскладки исчезает — правая колонка
   остаётся тем же элементом сетки, что и была.

   height: 100% — по той же причине, что в историях: display: contents
   убирает коробку <details>, но не коробку ::details-content, и без
   процента «было» и «стало» перестают доставать до низа карточки. */

.cases__fold { display: contents; }
.cases__fold-summary { display: none; }

.cases__result {
  height: 100%;
  display: flex;
  flex-direction: column;
  gap: var(--s-6);   /* макет: между плашками 30 */
  margin: 0;
  padding: 0;
  list-style: none;
}

/* Блоки делят высоту колонки поровну — так вторая колонка держит карточку
   так же, как в макете, и под ними не остаётся пустого места.
   Текст внутри отцентрован, иначе в высоком блоке он висит вверху. */
.cases__state {
  display: flex;
  flex-direction: column;
  justify-content: center;
  flex: 1 1 0;
  padding: var(--s-6);   /* макет: текст отступает от края плашки на 40 */
  border-radius: var(--r-md);
}

/* Подложка — перелив, а не плоская заливка: два ровных прямоугольника цвета
   рядом с белой карточкой были самым дешёвым местом секции. Перелив уходит
   в белый (--surface), поэтому новых цветов не заводится, а волосяная кромка
   в тон плашки отделяет её от карточки без рамки-обводки. */
.cases__state--bad {
  background: linear-gradient(145deg, var(--bad-bg) 0%, var(--surface) 130%);
  box-shadow: inset 0 0 0 1px rgba(176, 58, 80, .12);
}

.cases__state--good {
  background: linear-gradient(145deg, var(--good-bg) 0%, var(--surface) 130%);
  box-shadow: inset 0 0 0 1px rgba(30, 122, 70, .12);
}

.cases__state-title {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  margin-bottom: var(--s-5);
  font-size: var(--fz-body);
  font-weight: 600;
}

/* Значок «было/стало» — тот же duotone, что у иконок проекта, только слой
   заливки здесь рисует CSS, а не сам SVG: круг из семантического цвета
   на 14% прозрачности плюс контурный глиф поверх. Голые контурные ✕ и ✓
   выглядели значками из бесплатного набора — ровно то, что заказчик
   отметил по иконкам. */
.cases__state-mark {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: clamp(26px, 2.1vw, 40px);
  height: clamp(26px, 2.1vw, 40px);
  border-radius: var(--r-pill);
}

.cases__state-mark .icon {
  width: clamp(14px, 1.1vw, 21px);
  height: clamp(14px, 1.1vw, 21px);
  stroke-width: 2.6;
}

.cases__state--bad  .cases__state-mark { background: rgba(176, 58, 80, .14); }
.cases__state--good .cases__state-mark { background: rgba(30, 122, 70, .14); }

.cases__state--bad  .cases__state-title { color: var(--bad-ink); }
.cases__state--good .cases__state-title { color: var(--good-ink); }

.cases__state-text {
  color: var(--ink-2);
  font-size: var(--fz-body);
  line-height: var(--lh-body);
}

/* Второе по важности число внутри «Стало». Главное стоит строкой результата,
   поэтому здесь не цвет, а вес: цветное выделение в абзаце заставило бы
   плашку спорить с цифрой.
   Из текстов «Стало» при этом убран повтор главной цифры: раньше
   «$250 000 выручки за 9 месяцев» стояло и на плашке поверх фото, и в абзаце,
   но фотография их разводила. Без фотографии повтор оказался в одной строке
   взгляда, поэтому в абзаце осталось только то, чего нет в строке результата. */
.cases__hi { color: var(--ink); font-weight: 700; }

/* ---------- Адаптив ---------- */

/* Колонки те же, ужимается только зазор: две колонки текста держатся
   до 640px, ниже которых в проекте колонок не бывает вовсе. */
@media (max-width: 1080px) {
  .cases__card { --cases-gap: var(--s-5); }

  .cases__state { padding: var(--s-5); }
}

@media (max-width: 640px) {
  /* Выравнивание высот снимается вместе с колонками.

     grid-auto-rows: 1fr на десктопе делает дело: три карточки стоят
     в ленте одинаковой высоты, и кнопка «Смотреть кейс» в каждой на одной
     линии. На телефоне карточки идут столбиком, сравнивать их не с чем,
     а плата за выравнивание есть, и она не в тексте — в раскрывашке.

     Замер на 375 при всех трёх открытых кейсах: сами по себе карточки
     446 / 446 / 443, то есть выравнивание по тексту стоит три пикселя
     и никого не волнует. Но стоит раскрыть «Было и стало» у одного кейса,
     как его строка вырастает до 793 — И ВМЕСТЕ С НЕЙ ДВЕ ОСТАЛЬНЫЕ:
     446 / 446 / 443 → 793 / 793 / 793, секция 2117 → 2814. Человек нажал
     на одну строку, а получил 697px пустоты в двух чужих карточках,
     которые при этом даже не видны на экране одновременно с той,
     которую он открыл.

     Зазор между карточками заодно уходит с 32 на 24: это список одинаковых
     карточек, а не группа групп — группировать 32 пикселями нечего. */
  .cases__list {
    grid-auto-rows: auto;
    gap: var(--s-5);
  }

  .cases__card {
    --cases-gap: var(--s-5);
    grid-template-columns: minmax(0, 1fr);
    padding: var(--s-4);
  }

  /* Кнопка больше не должна прижиматься к низу: колонок нет, прижимать
     её не к чему, а margin-top: auto в столбике отрывал бы её от текста.
     Высота 48 вместо 46 — общий размер вторичной кнопки на узких экранах
     (в цене и «показать ещё» главная стоит 56). Три высоты на одну роль
     на десктопе не видно, потому что кнопки разнесены по экранам;
     на телефоне «Смотреть кейс» и «Показать ещё» попадают в один экран. */
  .cases__link {
    margin-top: var(--s-5);
    width: auto;
    min-height: 48px;
    padding-inline: var(--s-5);
  }

  /* Зона нажатия сжимается до самой кнопки.

     На десктопе растянутая на всю карточку зона — это правильно: попадать
     мышью в кнопку 306×73 посреди карточки в 604px высотой неудобно,
     и вся карточка работает одной ссылкой.

     На телефоне тот же приём работает против человека. Ссылка ведёт
     на внешний сайт (nextbot.ru), то есть промах уводит с лендинга —
     ровно та беда, которую в историях партнёров лечат разведением кнопок.
     А промахнуться тут легко: внутри карточки есть вторая цель, строка
     «Было и стало», и вокруг неё 460px чужой зоны нажатия. Плюс палец
     на телефоне уже попадает в кнопку без всякой помощи: она 295×48,
     то есть почти во всю ширину карточки.

     Оставляем ссылкой то, что ссылкой выглядит. Наведения на телефоне нет,
     поэтому подсветка кнопки от карточки (@media hover) тоже не работает —
     терять нечего. */
  .cases__link::after { display: none; }

  .cases__result { gap: var(--s-4); }

  /* Поля плашек и карточки на узком экране — по мобильной шкале, а не по десктопному замеру */
  .cases__state-title { margin-bottom: var(--s-3); gap: var(--s-2); }

  /* ---------- Строка-раскрытие ---------- */

  .cases__fold { display: block; }

  /* Та же строка, что у историй партнёров: один приём на две секции,
     иначе на странице появятся два разных раскрытия. Отличается только
     подпись — она собрана из ярлыков, которые в карточке уже стоят. */
  .cases__fold-summary {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--s-3);
    min-height: 48px;
    padding: var(--s-2) var(--s-4);
    border-radius: var(--r-md);
    border: 1px solid var(--line);
    background: var(--bg-tint);
    color: var(--ink);
    font-size: var(--fz-small);
    font-weight: 700;
    line-height: 1.3;
    cursor: pointer;
    list-style: none;
    -webkit-hyphens: none;
    hyphens: none;
    /* Зона нажатия .cases__link::after растянута на всю карточку и стоит
       на z-index: 3 — без собственного контекста строка раскрытия оказалась бы
       под ней и не нажималась бы вовсе. Ступень выше отдаёт строке ровно её
       прямоугольник, вся остальная карточка по-прежнему ведёт на кейс. */
    position: relative;
    z-index: 4;
  }

  .cases__fold-summary::-webkit-details-marker { display: none; }

  .cases__fold-icon {
    width: 20px;
    height: 20px;
    flex: none;
    color: var(--brand);
    transform: rotate(90deg);
    transition: transform var(--t-fast);
  }

  .cases__fold[open] .cases__fold-icon { transform: rotate(-90deg); }

  .cases__fold[open] .cases__result { margin-top: var(--s-3); }

  /* Плашки на телефоне не делят высоту колонки: колонки нет, делить нечего,
     а flex: 1 1 0 растягивал бы короткую «Стало» до высоты длинной «Было».
     Текст при этом прижимается к верху — центровка нужна была там, где блок
     заведомо выше своего содержимого. */
  .cases__state {
    flex: 0 0 auto;
    justify-content: flex-start;
    padding: var(--s-4);
  }
}

/* ---------- Показать ещё ----------

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

   Отбивка и цвет — как у историй: 64 от ленты, ghost, потому что акцентная
   заливка на этом экране закреплена за «Смотреть кейс» внутри карточек.
   Прилипания к низу экрана здесь нет намеренно: нажатие ровно одно, после
   него блок получает hidden и исчезает вовсе — прилипать нечему. */
.cases__more {
  display: flex;
  justify-content: center;
  margin-top: var(--s-8);
}

/* Отбивка до кнопки на узком экране на ступень ниже: 64 задавали, когда
   между лентой и кнопкой стоял десктопный воздух в 96 между секциями.
   На телефоне межсекционный стык 96, внутренние зазоры 24 — 48 перед
   кнопкой остаётся заметно больше зазора между карточками и заметно
   меньше стыка, то есть иерархия отбивок сохраняется. */
@media (max-width: 640px) {
  .cases__more { margin-top: var(--s-7); }
}

.cases__more-icon { transform: rotate(90deg); }

/* ---------- Ландшафт телефона ----------

   852×393. Замер до правки: шапка секции занимает 71% первого экрана,
   до верха первой карточки 280px при высоте окна 393 — то есть человек,
   повернувший телефон, видит бейдж, заголовок, подпись и полоску карточки.

   Ширины при этом вдоволь: лид «Реальные ниши, реальные внедрения
   и реальные результаты — без воды» встаёт в ОДНУ строку и занимает
   половину полосы, вторая половина пустая. Складываем шапку в две колонки —
   тот же приём, что уже стоит в 09-selling.css: бейдж и заголовок слева,
   лид справа по центру пары. Вертикальные отбивки идут ступенью ниже.

   max-width: 999px обязателен по той же причине, что и там: без него
   правило поймало бы десктоп в низком окне, а десктоп принят. */
@media (orientation: landscape) and (max-height: 500px) and (max-width: 999px) {
  /* Доли 1.45/1, а не поровну: заголовок набран капсом узким Oswald и рвётся
     по слову, лид — обычным текстом и рвётся где угодно. При равных колонках
     заголовок вставал в три строки («СМОТРИ,» / «ЧТО ДЕЛАЮТ НАШИ» /
     «ПОСЛЕ ИНТЕНСИВА») и задавал шапке высоту, а лид дочитывался в две.
     При 1.45 заголовку хватает на две строки, лид уходит в три,
     и шапка садится: секция 1460 → 1417 при равных долях → 1373. */
  .cases__head {
    display: grid;
    grid-template-columns: minmax(0, 1.45fr) minmax(0, 1fr);
    align-items: start;
    column-gap: var(--s-6);
    margin-bottom: var(--s-6);
  }

  /* justify-self обязателен: бейдж — блочный <p>, в ячейке сетки он
     растянулся бы таблеткой во всю колонку. */
  .cases__head > .badge { grid-column: 1; grid-row: 1; justify-self: start; }

  /* Селектор с потомком, а не голый класс: сквозную отбивку «бейдж →
     заголовок» base.css задаёт правилом `.badge + :is(h1,h2,h3,.display)`
     с весом 0,2,0, и одиночный .cases__title (0,1,0) её не перебивает.
     Через .cases__head веса равны, а этот файл подключён позже. */
  .cases__head > .cases__title {
    grid-column: 1;
    grid-row: 2;
    margin-block: var(--s-3) 0;
    max-width: none;
  }

  .cases__lead {
    grid-column: 2;
    grid-row: 1 / span 2;
    align-self: center;
    margin-top: 0;
  }
}

/* Появление добавленного кейса — та же ступень и та же лесенка, что
   у историй партнёров (11-stories.css). Анимируются transform и opacity. */
.cases__card--enter {
  animation: cases-card-in var(--t-base) both;
  animation-delay: var(--d, 0ms);
}

@keyframes cases-card-in {
  from { opacity: 0; transform: translateY(10px); }
}
