/* ==========================================================================
   Единый гайд блока и типографики academperevod.ru
   --------------------------------------------------------------------------
   Подключается ПОСЛЕ стилей эталона и правил реального устройства и
   перекрывает их там, где прототип был недоделан. Каждое отклонение от
   эталона здесь намеренное - см. ГАЙД_БЛОКА.md, раздел «Расхождения
   с прототипом».

   Полный свод правил - в ГАЙД_БЛОКА.md. Этот файл - его исполнение.
   ========================================================================== */

:root {
  /* Ширина содержимого */
  --page-max: var(--shirina-sajta, 1172px);  /* контейнер .wrap, значение - shapka.css р. 27 */
  --page-pad: 16px;        /* боковые поля контейнера */
  --text-col: 832px;       /* колонка сплошного текста (52rem) */

  /* Сетки карточек */
  --grid-gap: var(--card-gap);
  --grid-max-cols: 4;      /* больше четырёх в ряд не ставим */
}

body.mob {
  --page-pad: 12.8px;
}

/* --------------------------------------------------------------------------
   1. Колонка сплошного текста: одна ширина во всех разделах.
   Прежде 832 px применялись выборочно: подзаголовки и примечания были
   ограничены и центрированы, ответы FAQ и абзацы «о качестве» тянулись
   на все 1120 px. Теперь колонка одна и та же и стоит по центру блока.
   -------------------------------------------------------------------------- */
.blk .sub,
.blk .long,
.pnotes,
.galp .sub,
#faq .q,
.blk > .demo-note {
  width: min(100%, var(--text-col));
  max-width: var(--text-col);
  margin-inline: auto;
}

/* Внутри колонки: подзаголовок раздела по центру, сплошной текст - по левому
   краю. Это единственное различие, и оно смысловое: подзаголовок - подпись
   к центрированному заголовку, а абзац читается слева. */
.blk .sub,
.galp .sub { text-align: center; }
.blk .long,
.pnotes p,
#faq .q p { text-align: left; }
#faq .q p { max-width: none; margin-inline: 0; }

/* --------------------------------------------------------------------------
   2. Заголовки разделов - одно правило: по центру блока.
   Подписи «Частным клиентам» и «Компаниям» внутри карусели аудитории
   дословно повторяют переключатель прямо над ними, поэтому убраны
   ИЗ ВИДА, но оставлены в разметке: поисковик их читает, экранный
   диктор озвучивает (приём visually-hidden, не display:none).
   -------------------------------------------------------------------------- */
.blk > h2,
.galp > h2,
.tarh { text-align: center; }

.vhidden {
  position: absolute !important;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* --------------------------------------------------------------------------
   3. Сетка карточек подстраивается под количество.
   Число колонок задаётся атрибутом data-n (сколько карточек в разделе):
   берём наибольшее число колонок до четырёх, которое делит количество
   нацело; если нацело не делится - то, при котором в последнем ряду
   меньше всего пустых мест. Висящих хвостов из одной карточки больше нет.
   -------------------------------------------------------------------------- */
.cards3,
.cards4,
.cardgrid {
  display: grid;
  gap: var(--grid-gap);
  align-items: stretch;           /* правило 4: одна высота в ряду */
  grid-template-columns: repeat(3, minmax(0, 1fr));
}

.cards3[data-n="1"], .cards4[data-n="1"], .cardgrid[data-n="1"] {
  grid-template-columns: minmax(0, 1fr);
}
.cards3[data-n="2"], .cards4[data-n="2"], .cardgrid[data-n="2"],
.cards3[data-n="10"], .cards4[data-n="10"], .cardgrid[data-n="10"] {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}
.cards3[data-n="3"], .cards4[data-n="3"], .cardgrid[data-n="3"],
.cards3[data-n="5"], .cards4[data-n="5"], .cardgrid[data-n="5"],
.cards3[data-n="6"], .cards4[data-n="6"], .cardgrid[data-n="6"],
.cards3[data-n="9"], .cards4[data-n="9"], .cardgrid[data-n="9"] {
  grid-template-columns: repeat(3, minmax(0, 1fr));
}
.cards3[data-n="4"], .cards4[data-n="4"], .cardgrid[data-n="4"],
.cards3[data-n="7"], .cards4[data-n="7"], .cardgrid[data-n="7"],
.cards3[data-n="8"], .cards4[data-n="8"], .cardgrid[data-n="8"],
.cards3[data-n="11"], .cards4[data-n="11"], .cardgrid[data-n="11"],
.cards3[data-n="12"], .cards4[data-n="12"], .cardgrid[data-n="12"] {
  grid-template-columns: repeat(4, minmax(0, 1fr));
}

/* Те же правила для остальных сеток пилота. */
.tarify,
.strip.anketi,
.buls { align-items: stretch; }

/* --------------------------------------------------------------------------
   4. Карточки в ряду одной высоты. Прямое указание Павла: лучше пустое
   место внизу карточки, чем «лесенка» из 121 / 142 / 164 px.
   -------------------------------------------------------------------------- */
.cards3 > .card3,
.cards4 > .card3,
.cardgrid > .card3,
.tarify > .card3,
.strip.anketi > .card3 {
  height: 100%;
  display: flex;
  flex-direction: column;
}

.cards3 > .card3 > .foldb,
.cards4 > .card3 > .foldb,
.cardgrid > .card3 > .foldb,
.tarify > .card3 > .foldb { flex: 1 1 auto; }

/* Ссылка «Подробнее» прижимается к низу карточки - ряд читается ровно. */
.card3 .foldb .go { margin-top: auto; display: inline-block; }
.card3 .foldb { display: flex; flex-direction: column; }
.card3 .foldb > p:last-of-type { margin-bottom: var(--sp-2); }

/* --------------------------------------------------------------------------
   5. Промежуточная ширина (планшет и небольшой ноутбук).
   Эталон знал только компьютер и телефон; между 641 и 1024 px сетка
   из четырёх колонок становилась нечитаемой.
   -------------------------------------------------------------------------- */
@media (min-width: 641px) and (max-width: 1024px) {
  .cards3, .cards4, .cardgrid,
  .strip.anketi { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; }
  .tarify { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .buls { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .hero { grid-template-columns: minmax(0, 1fr); gap: var(--sp-5); }
  .hright { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/* Телефон: две колонки, как в эталоне, но с одинаковой высотой карточек. */
body.mob .cards3,
body.mob .cards4,
body.mob .cardgrid {
  grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
}
body.mob .cards3[data-n="1"],
body.mob .cards4[data-n="1"],
body.mob .cardgrid[data-n="1"] {
  grid-template-columns: minmax(0, 1fr) !important;
}
/* Раскрытая карточка занимает всю ширину - поведение эталона сохранено. */
body.mob .card3.open { grid-column: 1 / -1; }

/* --------------------------------------------------------------------------
   6. Картинки: место под изображение резервируется всегда.
   Правило гайда: у каждого <img> обязательны width и height (или
   aspect-ratio), иначе страница «прыгает» при загрузке.
   -------------------------------------------------------------------------- */
img, picture, svg, video {
  max-width: 100%;
  height: auto;
}

.card3 img,
.blk img {
  display: block;
  width: 100%;
  border-radius: var(--rad);
  background: var(--soft);
  object-fit: cover;
}

.ratio-16-9 { aspect-ratio: 16 / 9; }
.ratio-4-3  { aspect-ratio: 4 / 3; }
.ratio-1-1  { aspect-ratio: 1 / 1; }

/* 6.1. Картинка карточки раздела.
   На действующем сайте это значки 128-314 точек, а не фотографии. Растянуть
   такой значок на всю ширину карточки нельзя: он станет мыльным, а карточка
   при двух колонках вырастет с 138 до 478 точек. Поэтому высота задана
   одна на все карточки, ширина - по пропорции, значок стоит по центру.
   Высота общая, значит правило 4 гайда (карточки в ряду одной высоты)
   продолжает выполняться. */
.card3 .cardimg {
  width: auto;
  max-width: 100%;
  height: 96px;
  object-fit: contain;
  background: none;
  margin: 0 auto var(--sp-3);
}

/* 6.2. Логотип площадки отзывов: высота одна, ширина по пропорции.
   Без этого общее правило .blk img { width: 100% } растягивало бы
   узкий логотип на всю карточку. */
.blk .strip .plat .platlogo {
  width: auto;
  max-width: 100%;
  height: 32px;
  object-fit: contain;
  background: none;
  border-radius: 0;
  margin-bottom: var(--sp-2);
}

/* 6.3. Фото переводчика в анкете: одна высота во всех анкетах, кадр
   подрезается по центру - лица на исходниках разной пропорции. */
.strip.anketi .anketa .anketaimg {
  width: 100%;
  height: 180px;
  object-fit: cover;
  margin-bottom: var(--sp-3);
}

/* 6.4. Скан рекомендательного письма.
   В карточке стоит уменьшенная производная фиксированной высоты, полный
   размер открывается по клику. Пропорции скана (примерно 1 к 1,4) при
   этом не искажаются: object-fit: contain. */
.case .caseshot {
  display: block;
  margin-bottom: var(--sp-3);
  text-decoration: none;
}
.case .caseimg {
  width: auto;
  max-width: 100%;
  height: 180px;
  object-fit: contain;
  background: var(--soft);
  margin-inline: auto;
}

/* --------------------------------------------------------------------------
   7. Межблочные расстояния: один шаг между крупными разделами.
   -------------------------------------------------------------------------- */
.blk { margin-block: var(--sp-block); }
.galwrap { margin-block: var(--sp-block); }
.blk + .blk { margin-top: var(--sp-block); }

/* --------------------------------------------------------------------------
   8. Таблица цен с направлениями «с языка» / «на язык».
   У каждого тарифа две подколонки, шапка в два яруса: верхний - название
   тарифа на две ячейки, нижний - направления. Ширина колонки «Язык»
   остаётся прежней (25 %), остальные 75 % делятся между подколонками
   поровну: шесть подколонок по 12,5 %. Ширину задаёт первый ярус шапки
   (table-layout: fixed), поэтому отдельных правил на подколонки не нужно.
   -------------------------------------------------------------------------- */
.ptable[data-b].naprav th[data-b].lang,
.ptable[data-b].naprav td[data-b].lang { width: 25%; vertical-align: middle; }

/* Верхний ярус: название тарифа над своими направлениями. Линия под ним
   тоньше основной - она делит шапку, а не отделяет шапку от данных. */
.ptable[data-b].naprav thead[data-b] th[data-b].tarif {
  border-bottom: 1px solid var(--line);
}

/* Нижний ярус: подписи направлений. Мельче и без полужирного - это
   подчинённый уровень, а не второй заголовок. */
.ptable[data-b].naprav thead[data-b] th[data-b].napr {
  font-weight: 400;
  color: var(--muted);
  white-space: nowrap;
}

/* Первая ячейка нижнего яруса стоит справа от колонки «Язык», которая
   занимает оба ряда: без этого правила вертикальной линии слева не будет. */
.ptable[data-b].naprav thead[data-b] tr[data-b] + tr[data-b] th[data-b]:first-child {
  border-left: 1px solid var(--line);
}

/* Телефон: работает тот же переключатель тарифов, что и раньше
   (кнопки .tswitch и атрибут data-tarif). Видимыми остаются обе
   подколонки выбранного тарифа - второго переключателя не заводим. */
body.mob .ptable[data-b].naprav th[data-b].napr { font-size: var(--fs-tab); }
