/* ============================================================
   Раздел «Инструкции»: хаб (/help) и страницы гайдов.
   Токены берутся из cabinet.css — страницы подключают его первым.
   ============================================================ */

/* В cabinet.css .sr-only объявлен только внутри .constructor-form, поэтому
   для страниц раздела нужен свой: иначе служебная строка о копировании
   показалась бы прямо в тексте. */
.gd .sr-only {
  position: absolute;
  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;
}

.gd {
  position: relative;
  z-index: 1;
  width: 100%;
  max-width: 720px;
  margin: 0 auto;
  padding: 32px 18px 96px;
  display: flex;
  flex-direction: column;
  gap: 22px;
}

/* Страница со скриншотами: шире, потому что справа от текста стоит колонка
   с картинкой. Хаб и заглушки остаются узкими — там читается только текст. */
.gd-wide { max-width: 1000px; }
/* Списки инструкций (/help и раздел AmneziaVPN) — той же ширины, что экраны
   кабинета: .main там отдаёт под содержимое 816 px, и это 852 минус поля .gd.
   Класс существовал как метка без правила, и страницы оставались на 720 —
   рядом с /support это было заметно. Сами инструкции шире (gd-wide): им нужна
   боковая панель под снимки. */
.gd-index { max-width: 852px; }
/* Инструкция экраном кабинета: ширину и поля задаёт .gd — те же, что на
   публичной странице. Обёртка .main-guide свои обнуляет: пока она их давала,
   поля складывались с полями .gd, и кабинетный экран выходил на полтораста
   пикселей уже публичного (964 против 816 при окне 1440).

   Снизу на узком экране запас под фиксированное нижнее меню: у публичной
   страницы его нет, а тут последняя кнопка иначе окажется под панелью. */
.main-guide {
  max-width: none;
  padding: 0;
  margin-inline: 0;
}
@media (max-width: 820px) {
  .main-guide .gd { padding-bottom: calc(96px + env(safe-area-inset-bottom, 0px)); }
}

/* Кнопка, а не строчка текста: ссылкой без оформления она не читалась
   как кликабельная. */
.gd-back {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  align-self: flex-start;
  height: 40px;
  /* Ровные поля. Было 12 слева и 16 справа — похоже на оптическую поправку под
     стрелку, но нигде не записано, а на глаз содержимое уезжало левее центра.
     Сумма та же, ширина кнопки не изменилась. */
  padding: 0 14px;
  border: 1px solid var(--line-strong);
  border-radius: var(--r-btn);
  background: var(--bg-elev);
  color: var(--text);
  font-size: .9rem;
  font-weight: 500;
  text-decoration: none;
  transition: background .15s ease, border-color .15s ease;
}
.gd-back:hover { background: var(--surface); border-color: var(--text-3); }
.gd-back:focus-visible { outline: 2px solid var(--accent-text); outline-offset: 2px; }
.gd-back svg { display: block; flex: none; width: 16px; height: 16px; color: var(--text-2); }
.gd-back:hover svg { color: var(--accent-text); }

/* ---------- шапка ---------- */
.gd-head { display: flex; flex-direction: column; gap: 10px; }

.gd-title {
  margin: 0;
  font-size: clamp(1.5rem, 4.4vw, 2rem);
  font-weight: 560;
  line-height: 1.14;
  letter-spacing: -0.03em;
  color: var(--text);
}

.gd-lead {
  margin: 0;
  max-width: 640px;
  color: var(--text-2);
  font-size: .97rem;
  line-height: 1.6;
}

/* ---------- хаб: группы инструкций ----------
   Основной режим и запасной разведены: человек выбирает устройство, а протокол
   нужен редко и только при отладке. */
.gd-group { display: flex; flex-direction: column; gap: 12px; }
.gd-group-head { display: flex; flex-direction: column; gap: 3px; }
.gd-group-title {
  margin: 0;
  font-size: 1.02rem;
  font-weight: 560;
  letter-spacing: -0.02em;
  color: var(--text);
}
.gd-group-note { margin: 0; color: var(--text-3); font-size: .88rem; line-height: 1.45; }

/* ---------- хаб: список инструкций ---------- */
.gd-cards {
  margin: 0;
  padding: 0;
  list-style: none;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(300px, 100%), 1fr));
  gap: 10px;
}

.gd-card {
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  padding: 16px 18px;
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  background: var(--bg-elev);
  text-decoration: none;
  transition: background .15s ease, border-color .15s ease;
}

/* Карточка с пояснением: значок к названию, а не к середине блока. По центру
   он оказывался ниже заголовка и читался как часть пояснения, а не как знак
   самого раздела. Там, где пояснения нет, текст в одну строку и центр верен. */
.gd-card:has(.gd-card-text) { align-items: flex-start; }
.gd-card:has(.gd-card-text) .gd-card-arrow { align-self: center; }
.gd-card:hover { background: var(--surface); border-color: var(--line-strong); }
.gd-card:focus-visible { outline: 2px solid var(--accent-text); outline-offset: 2px; }

/* Слот значка повторяет плашки-иконки в кабинете (карточки подписок, строки
   характеристик): квадрат со скруглением, приглушённая рамка, значок цветом
   вторичного текста. */
.gd-card-ico {
  flex: none;
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: 11px;
  border: 1px solid var(--line);
  background: rgba(255,255,255,.04);
  color: var(--text-2);
}
.gd-card-ico svg { width: 20px; height: 20px; }
/* Марки платформ используют общий 20px slot; optical inset централизован в
   icon-system.css, поэтому Apple и Android сохраняют прежнюю видимую массу. */
/* Логотип приложения занимает плашку целиком, без рамки и подложки: у него
   своя форма и свой фон, и наша рамка вокруг давала вторую рамку поверх
   первой. Штриховым значкам плашка нужна, логотипу — нет. */
.gd-card-ico:has(img) { border: 0; background: none; }
.gd-card-ico img {
  display: block;
  width: calc(40px * var(--gl-app-brand-scale, 1));
  height: calc(40px * var(--gl-app-brand-scale, 1));
  object-fit: contain;
  border-radius: 10px;
}
.gd-card:hover .gd-card-ico { color: var(--accent-text); border-color: var(--accent-line); }
/* flex: 1 вместо распорки: детей стало трое (значок, текст, стрелка), и
   space-between развёл бы их по краям, оторвав значок от названия. */
.gd-card-main { flex: 1; display: flex; flex-direction: column; gap: 5px; min-width: 0; }

.gd-card-title {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 6px 8px;
  min-width: 0;
  color: var(--text);
  font-size: 1rem;
  font-weight: 560;
  letter-spacing: -0.01em;
}

/* Подпись мельче названия заметно, а не на волосок: на .88rem она спорила с
   ним по весу. Тот же размер, что у подписей в карточках поддержки. */
.gd-card-text { color: var(--text-2); font-size: .83rem; line-height: 1.4; overflow-wrap: anywhere; }

/* «готовим» — честная метка вместо ссылки в пустоту */
.gd-card-badge {
  flex: none;
  padding: 2px 8px;
  border-radius: var(--r-pill);
  background: var(--surface-2);
  color: var(--text-3);
  font-size: .72rem;
  font-weight: 500;
  letter-spacing: 0;
}

.gd-card-arrow { flex: none; width: 16px; height: 16px; color: var(--text-3); }
.gd-card:hover .gd-card-arrow { color: var(--accent-text); }
.gd-card-soon .gd-card-title { color: var(--text-2); }

/* ---------- справка под шагами ----------
   Не карточка шага и не предупреждение: плоская врезка на приглушённом фоне,
   без тени и без жёлтого. Жёлтый читался как «внимание, важно», хотя это
   редкий случай, который большинству не понадобится. */
.gd-note {
  padding: 18px 20px;
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  background: var(--surface);
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.gd-note-head { display: flex; align-items: center; gap: 9px; }

/* Зелёная плашка, как у номеров шагов в кабинете: сноска относится к делу, а
   не предупреждает об опасности — жёлтый или красный читались бы тревожнее,
   чем есть. Заливка мягкая, поэтому знак не спорит с заголовком рядом. */
.gd-note-ico {
  flex: none;
  display: grid;
  place-items: center;
  width: 24px;
  height: 24px;
  border-radius: 50%;
  border: 1px solid var(--accent-line);
  background: var(--accent-soft);
  color: var(--accent-text);
}
.gd-note-ico svg { display: block; width: 16px; height: 16px; }

.gd-note-title { margin: 0; font-size: .98rem; font-weight: 560; color: var(--text); }
.gd-note p { margin: 0; color: var(--text-2); font-size: .92rem; line-height: 1.55; }

.gd-list {
  margin: 0;
  padding-left: 20px;
  display: flex;
  flex-direction: column;
  gap: 6px;
  color: var(--text-2);
  font-size: .92rem;
  line-height: 1.5;
}

/* Что делать, если условие не выполняется: подпункт внутри предупреждения. */
.gd-subnote { display: flex; flex-direction: column; gap: 4px; }
.gd-subnote-title { color: var(--text); font-size: .92rem; font-weight: 560; }

/* ---------- выбор приложения ----------
   Incy и Happ настраиваются одинаково, поэтому шаги общие, а переключатель
   меняет только название и кнопки установки. Без JS видно оба блока подряд. */
.gd-apps { display: flex; flex-direction: column; gap: 10px; }

.gd-apps-label {
  color: var(--text-3);
  font-size: .8rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: .04em;
}

.gd-apps-row { display: flex; flex-wrap: wrap; gap: 8px; }

/* Строение то же, что у выбора приложения в кабинете и на странице подписки:
   значок, название, равные доли. Ширина по тексту делала «Incy» заметно уже
   «AmneziaVPN», и ряд выглядел случайным. */
.gd-app {
  display: flex;
  align-items: center;
  gap: 9px;
  flex: 1 1 0;
  min-width: 0;
  height: 48px;
  padding: 0 16px;
  border: 1px solid var(--line);
  border-radius: var(--r-btn);
  background: rgba(255,255,255,.02);
  color: var(--text-2);
  font: inherit;
  font-size: .95rem;
  font-weight: 500;
  text-align: left;
  cursor: pointer;
  transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.gd-app:hover { background: rgba(255,255,255,.05); border-color: var(--line-strong); color: var(--text); }
.gd-app:focus-visible { outline: 2px solid var(--accent-text); outline-offset: 2px; }
.gd-app.is-active,
.gd-app.is-active:hover {
  border-color: var(--accent-line);
  background: linear-gradient(90deg, var(--accent-soft) 0%, rgba(52,209,126,.03) 100%);
  color: var(--text);
}
.gd-app.is-active .gd-app-name { font-weight: 560; color: var(--accent-text); }
/* Слот квадратный, contain вписывает любую пропорцию: у Happ знак не
   квадратный, у Incy — готовая плашка. */
/* Размер с поправкой из реестра приложений: знаки нарисованы по-разному, и в
   одинаковой рамке выглядят разного размера. У Incy готовая плитка с полями
   внутри, у Happ голый символ во всю высоту. */
.gd-app-ico {
  flex: none;
  display: block;
  width: calc(28px * var(--gl-app-brand-scale, 1));
  height: calc(28px * var(--gl-app-brand-scale, 1));
  object-fit: contain;
}
.gd-app-name { flex: none; white-space: nowrap; }

.gd-app-pane { display: flex; flex-direction: column; gap: 10px; }
.gd-app-pane.is-hidden { display: none; }
.gd-app-note { margin: 0; color: var(--text-2); font-size: .93rem; line-height: 1.55; }

.gd-app-links { display: flex; flex-wrap: wrap; gap: 8px; }
.gd-app-link {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: 0 18px;
  border-radius: var(--r-btn);
  border: 1px solid transparent;
  background: linear-gradient(180deg, #46d98c, var(--accent));
  color: #052012;
  font-size: .93rem;
  font-weight: 560;
  text-decoration: none;
  transition: background .15s ease, border-color .15s ease;
}
.gd-app-link:hover { background: linear-gradient(180deg, #54e29a, #3bd585); }

/* Запасная ссылка и подсказка тише главной кнопки: цветом и рамкой,
   а не уменьшенным ростом. */
.gd-app-link.is-secondary,
.gd-app-link.is-help {
  background: transparent;
  border-color: var(--line-strong);
  color: var(--text);
  font-weight: 500;
}
.gd-app-link.is-help { gap: 5px; color: var(--text-2); }
.gd-app-link.is-help svg { flex: none; width: 16px; height: 16px; }
.gd-app-link.is-secondary:hover,
.gd-app-link.is-help:hover { background: var(--surface); border-color: var(--text-3); color: var(--text); }
.gd-app-link:focus-visible { outline: 2px solid var(--accent-text); outline-offset: 2px; }

@media (max-width: 640px) {
  /* По двое в ряд, как в кабинете: столбик широких полос читался как список
     кнопок, а не как выбор из двух вариантов. */
  .gd-app { flex: 1 1 calc(50% - 4px); padding: 0 12px; }
  .gd-app-link { width: 100%; justify-content: center; }
}

/* ---------- шаги ----------
   Каждый шаг — самостоятельная карточка: слева текст, справа скриншот в своей
   панели. Так шаг читается целиком, а картинка не висит в воздухе рядом со
   сплошным списком. Шаг без скриншота занимает всю ширину карточки. */
.gd-steps {
  margin: 0;
  padding: 0;
  list-style: none;
  display: grid;
  gap: 18px;
}

.gd-step {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(240px, 340px);
  overflow: hidden;
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  background: var(--bg-elev);
  box-shadow: var(--shadow-card);
}

.gd-step-solo { grid-template-columns: minmax(0, 1fr); }

.gd-step-copy {
  display: grid;
  align-content: start;
  gap: 8px;
  min-width: 0;
  padding: clamp(20px, 3vw, 30px);
}

.gd-step-kicker {
  color: var(--accent-text);
  font-size: .76rem;
  font-weight: 560;
  text-transform: uppercase;
  letter-spacing: .06em;
}

.gd-step-title {
  margin: 0;
  font-size: 1.08rem;
  font-weight: 560;
  letter-spacing: -0.02em;
  color: var(--text);
}

/* Два способа сделать одно и то же. Равны по весу — ни один не примечание:
   первый срабатывает не всегда, и спрятать второй значило бы оставить часть
   людей без рабочего пути. Между ними «или», чтобы не читались как
   последовательность: пронумеруй их — и человек проделает оба. */
/* Ширина задана явно: у шага без боковой панели текст занимал примерно
   половину карточки, а справа оставалась пустота. Что именно его ужимало,
   по стилям не нашлось, поэтому не ищем причину, а фиксируем результат. */
.gd-ways { display: flex; flex-direction: column; gap: 14px; margin-top: 14px; width: 100%; }
.gd-way { display: flex; flex-direction: column; gap: 6px; width: 100%; }
.gd-way-title { color: var(--text); font-size: .95rem; font-weight: 540; }
.gd-way p { margin: 0; color: var(--text-2); font-size: .93rem; line-height: 1.55; }
/* Разделитель с надписью посередине: линии по бокам растягиваются сами. */
.gd-ways-or {
  display: flex;
  align-items: center;
  gap: 12px;
  color: var(--text-3);
  font-size: .78rem;
  font-weight: 560;
  letter-spacing: .08em;
}
.gd-ways-or::before,
.gd-ways-or::after {
  content: "";
  flex: 1;
  height: 1px;
  background: var(--line);
}

.gd-way-shot {
  display: block;
  width: auto;
  max-width: min(100%, 320px);
  height: auto;
  margin-top: 4px;
  border-radius: 14px;
}

.gd-step-text { margin: 0; color: var(--text-2); font-size: .94rem; line-height: 1.6; }

/* Готовые значения адреса: строка целиком — кнопка копирования. Перепечатывать
   индекс и телефон с экрана телефона неудобно, а ошибка роняет весь шаг. */
.gd-fields {
  margin: 4px 0 0;
  padding: 0;
  list-style: none;
  display: grid;
  gap: 6px;
}

.gd-field {
  width: 100%;
  display: grid;
  grid-template-columns: 128px minmax(0, 1fr) 16px;
  align-items: center;
  gap: 10px;
  padding: 9px 12px;
  border: 1px solid var(--line);
  border-radius: var(--r-btn);
  background: var(--surface);
  font-family: inherit;
  text-align: left;
  cursor: pointer;
  transition: background .15s ease, border-color .15s ease;
}

.gd-field:hover { background: var(--surface-2); border-color: var(--line-strong); }
.gd-field:focus-visible { outline: 2px solid var(--accent-text); outline-offset: 2px; }

.gd-field.is-copied {
  border-color: var(--accent-line);
  background: var(--accent-soft);
}

.gd-field-label { color: var(--text-3); font-size: .82rem; }
.gd-field-value {
  color: var(--text);
  font-size: .92rem;
  font-weight: 500;
  overflow-wrap: anywhere;
}
.gd-field-ico { display: block; width: 16px; height: 16px; color: var(--text-3); }
.gd-field:hover .gd-field-ico,
.gd-field.is-copied .gd-field-ico { color: var(--accent-text); }

/* Панель со скриншотом отделена от текста своим фоном, как полка под экраном. */
.gd-media {
  display: grid;
  place-items: center;
  min-height: 100%;
  margin: 0;
  padding: 24px;
  background: var(--surface);
  border-left: 1px solid var(--line);
}

.gd-shot {
  display: block;
  width: auto;
  max-width: min(100%, var(--shot-max, 290px));
  height: auto;
  border-radius: 16px;
}

/* Квадратный логотип визуально тяжелее обычного скриншота, поэтому не должен
   занимать всю ширину медиа-колонки. Широкому экрану приложения, наоборот,
   нужна дополнительная ширина, иначе элементы интерфейса становятся мелкими. */
.gd-shot.gd-shot-compact { --shot-max: 160px; }
.gd-shot-wide { width: 100%; --shot-max: 100%; }

/* Пара снимков в правой панели. Равняем по ВЫСОТЕ, а не по ширине: исходники
   у кадров чуть разной ширины, и при равных по ширине боксах телефоны на них
   выходили разного размера — один заметно мельче другого. Общая высота даёт
   одинаковый масштаб, а ширину каждый берёт по своей пропорции.
   Потолок высоты держит карточку шага соразмерной: без него два вертикальных
   кадра растягивали её вдвое выше текста.
   Колонка та же, что у остальных шагов, поэтому каждому снимку достаётся
   меньше половины обычной ширины — это цена за то, что перегородка между
   текстом и картинками стоит на одной линии во всём списке. */
/* Пара снимков стоит в ряд в обычной боковой панели — структура шага такая же,
   как у соседей. Ширина панели делится на два, поэтому кадры здесь мельче
   одиночных: это потолок, дальше растить можно только обрезкой самих кадров.

   Расширять панель под такие шаги пробовали: граница между текстом и
   картинками уезжала влево, и шаг переставал быть похож на остальные. Не
   возвращать. */
.gd-media-pair {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 14px;
  padding-inline: 12px;
}
.gd-media-pair .gd-shot {
  flex: 0 1 auto;
  width: auto;
  height: auto;
  max-width: calc(50% - 7px);
  max-height: 520px;
  border-radius: 12px;
}

/* Выход к поддержке в середине инструкции. Тише текста шага: это не действие
   из последовательности, а запасная дверь для того, у кого не вышло. */
.gd-step-help {
  margin: 14px 0 0;
  color: var(--text-3);
  font-size: .84rem;
  line-height: 1.5;
}
.gd-step-help a {
  color: var(--accent-text);
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* Альбомный кадр во всю ширину шага: телевизор и телефон рядом в узкой боковой
   панели превращались в нечитаемую полоску. Такой шаг раскладывается в одну
   колонку, а снимок идёт под текстом. */
.gd-shot-banner { max-width: 100%; margin-top: 14px; border-radius: 14px; }
/* Снимок способа — тоже альбомный, потолок в 320 рассчитан на вертикальные. */
.gd-way-shot { max-width: min(100%, 720px); }

@media (min-width: 1100px) {
  .gd-step { grid-template-columns: minmax(0, 1fr) minmax(300px, 380px); }
  /* Обязательно следом за .gd-step: правило выше объявляет колонки заново, а
     сила селекторов одинаковая. Без этой строки на широком экране шаг без
     боковой панели снова становился двухколоночным — текст жался в первую
     колонку, вторая оставалась пустой. */
  .gd-step-solo { grid-template-columns: minmax(0, 1fr); }
  .gd-shot { --shot-max: 320px; }
  .gd-step-wide { grid-template-columns: minmax(0, 1fr) minmax(420px, 480px); }
  .gd-step-wide .gd-media { padding-inline: 20px; }
}

/* ---------- финал ---------- */
.gd-finish {
  padding: 20px;
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  background: var(--bg-elev);
  box-shadow: var(--shadow-card);
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.gd-finish-title { margin: 0; font-size: 1.02rem; font-weight: 560; color: var(--text); }
.gd-finish p { margin: 0; color: var(--text-2); font-size: .92rem; line-height: 1.55; }

.gd-actions { display: flex; flex-wrap: wrap; gap: 10px; }
.gd-actions .btn { height: 44px; }


/* ---------- узкий экран ---------- */
@media (max-width: 900px) {
  /* Карточка складывается в одну колонку, панель картинки сливается с ней:
     отдельный фон на узком экране резал бы шаг пополам. */
  .gd-step { grid-template-columns: minmax(0, 1fr); }
  .gd-media {
    min-height: auto;
    padding: 0 clamp(20px, 3vw, 30px) clamp(20px, 3vw, 30px);
    background: transparent;
    border-left: 0;
    justify-items: start;
  }
  .gd-shot { --shot-max: 320px; }
  /* Логотип приложения на шаге установки прячем: на компьютере он сидит сбоку
     и места не занимает, а в столбик ложится отдельным блоком между текстом
     шага и кнопками установки — раздвигает первый экран, ничего не объясняя.
     Какое приложение ставим, и так написано в заголовке шага и на кнопках. */
  .gd-step-compact .gd-media { display: none; }
  /* На узком экране пара ложится столбиком: рядом два кадра здесь превратились
     бы в нечитаемые полоски. Равняем по левому краю, как остальные снимки,
     потолок высоты снимаем — ширины и так мало. */
  .gd-media-pair { display: grid; gap: 14px; justify-items: start; }
  .gd-media-pair .gd-shot { max-width: min(100%, 320px); max-height: none; }
}

@media (max-width: 640px) {
  .gd { padding: 24px 14px 72px; gap: 18px; }
  .gd-field { grid-template-columns: 100px minmax(0, 1fr) 16px; gap: 8px; }

  .gd-actions { display: grid; }
}

@media (max-width: 380px) {
  /* Подпись и значение перестают помещаться в одну строку: раскладываем
     столбиком, иконку копирования оставляем справа от обоих. */
  .gd-field {
    grid-template-columns: minmax(0, 1fr) 16px;
    align-items: center;
  }
  .gd-field-label { grid-column: 1; }
  .gd-field-value { grid-column: 1; }
  .gd-field-ico { grid-column: 2; grid-row: 1 / span 2; }
  .gd-note, .gd-finish { padding: 16px; }
  .gd-card { padding: 14px 16px; }
  .gd-shot { --shot-max: 100%; }
  .gd-actions .btn { width: 100%; }
}
