/* =========================================================================
   Витрина web-prosto.ru — разделы страницы
   Система снята с b2b.yandex.ru/adv/metrika и приведена к нашему
   содержанию. Четыре правила, из которых собрано всё остальное:

   1. Тёмное поле страницы, светлые плиты лежат на нём как отдельные
      прямоугольники со скруглением 40 — между ними видно поле.
   2. Ни одной тени и ни одного градиента. Плоскость и чистый цвет.
   3. Крупный жирный гротеск с тесным интерлиньяжем; в карточке
      заголовок вверху, пояснение прижато к низу.
   4. Три радиуса: 40 у плиты, 24 у карточки, 12 у кнопки и поля.
   ========================================================================= */

.lp-wrap{ max-width: 1240px; margin: 0 auto; padding: 0 24px; }
.lp-section{ padding: clamp(48px, 5.4vw, 84px) 0; }
.lp-section--top{ padding-top: clamp(40px, 4.6vw, 72px); }

/* =========================================================================
   ПЛИТЫ
   Светлый блок — не фон секции, а самостоятельный прямоугольник на тёмном
   поле. Отсюда скруглённые углы во всю ширину экрана и тёмный шов между
   соседними плитами.
   ========================================================================= */
.slab{ border-radius: var(--r-slab); position: relative; }
.slab + .slab{ margin-top: 12px; }
.slab--paper{ background: var(--paper); color: var(--text); }
.slab--lav{   background: var(--lav);   color: var(--text); }
.slab--last{  margin-bottom: 12px; }
.slab .lp-section:first-child{ padding-top: clamp(48px, 5vw, 80px); }
.slab .lp-section:last-child{  padding-bottom: clamp(48px, 5vw, 80px); }

/* =========================================================================
   Знак и логотип
   ========================================================================= */
.lp-logo{
  display:inline-flex; align-items:center; gap: 11px; min-height: 44px;
  font-family: var(--font-heading); font-weight: 600; font-size: 20px;
  letter-spacing:-.025em; color: #fff;
}
.lp-logo:hover{ color: #fff; }
.lp-logo__mark{ width: 34px; height: 34px; flex-shrink: 0; display:block; }

/* =========================================================================
   Шапка. Тёмная на всю длину страницы: первый экран тёмный, и панель,
   которая перекрашивается на середине прокрутки, читалась бы как сбой.
   Состояния: обычная и при прокрутке.
   ========================================================================= */
.lp-header{
  position: sticky; top: 0; z-index: 50;
  background: var(--ink);
  transition: background-color .2s ease, box-shadow .2s ease;
}
.lp-header.is-stuck{
  background: rgba(22,31,49,.86);
  -webkit-backdrop-filter: saturate(140%) blur(14px);
          backdrop-filter: saturate(140%) blur(14px);
  box-shadow: 0 1px 0 var(--ink-line);
}
.lp-header__in{
  max-width: 1240px; margin: 0 auto; padding: 14px 24px;
  display:flex; align-items:center; gap: 18px; min-height: 76px;
}
.lp-nav{ display:none; align-items:center; gap: 2px; margin-left: 28px; }
@media (min-width: 1240px){ .lp-nav{ display:flex; } }
.lp-nav a{
  display:inline-flex; align-items:center; min-height: var(--tap); white-space: nowrap;
  padding: 10px 14px; border-radius: var(--r-sm);
  font-size: 15.5px; font-weight: 500; color: var(--on-dark-2);
  transition: background-color .18s ease, color .18s ease;
}
.lp-nav a:hover{ background: rgba(255,255,255,.08); color: #fff; }
.lp-header__right{ display:flex; align-items:center; gap: 10px; margin-left:auto; }
.lp-tel{
  display:none; font-size: 15.5px; font-weight: 600; color: #fff; white-space: nowrap;
  font-variant-numeric: tabular-nums; padding: 0 6px;
}
@media (min-width: 1240px){ .lp-tel{ display:inline-flex; align-items:center; min-height: var(--tap); } }
/* Значки видны на всех ширинах. На узких это единственный способ
   позвонить или написать, не открывая меню: номер текстом туда
   не влезает, а до подвала надо доскроллить всю страницу. */
.lp-round{
  width: var(--tap); height: var(--tap); min-width: var(--tap); border-radius: var(--r-sm);
  display:grid; place-items:center; background: rgba(255,255,255,.10); color: #fff;
  transition: background-color .2s ease;
}
/* Кроме телефона: с 1240 рядом стоит сам номер, и значок был бы
   вторым способом сделать то же самое в двух сантиметрах друг от друга */
@media (min-width: 1240px){ .lp-round--tel{ display:none; } }
.lp-round:hover{ background: rgba(255,255,255,.18); color: #fff; }

/* Фирменный знак MAX подложен маской, а не картинкой. Файл белый
   на прозрачном, и картинкой он был бы всегда белым — а кнопка
   светлеет при наведении и живёт на двух фонах. Маска красит знак
   в currentColor, поэтому он ведёт себя как нарисованный рядом
   Telegram, но остаётся ровно тем, что дал правообладатель.

   Знак встроен прямо в правило как data-URI, а не ссылкой на файл.
   Причина не в экономии запроса: маску с file:// браузер не берёт
   из соображений безопасности, и у страницы, открытой двойным щелчком,
   кнопка оставалась пустым квадратом. Через http всё работало —
   поэтому и не бросалось в глаза. Исходник знака лежит в
   img/max-mark.png: если его меняют, надо пересобрать и эту строку. */
.mark-max{
  display: block; width: 19px; height: 19px; background: currentColor;
  -webkit-mask: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAABLCAYAAAA4TnrqAAAEOUlEQVR42u2c0XHiQAyGf3nyfr4K4lQQUsFBBSEVxKnguAqACiAVJKngLhXgVACpwE4F8VWge4jIeYxNjK1dLzaaYSYzMWb9IWklrQShJWFmH8AAQADgEoAvfxdJAiAF8AZgA2BDRKntNZNlOGMAPwAM94CpKht5PQOI2oCnDoiZJ8y8YvPywMzDY4QUMPOCmd/ZvsTMHB4LpBW7IW5CE3NbsJsSM/PYFVDjlsytjk/zW9kN5YMXAMIjcqcJgBERJXXe7NX1TQDWRwYKEq7EzDyxAku257VCnNSmLJh5ato/3XK3ZGoK1JS7KdOTRhkARhVADcRHdV1CInqqDUt2vdWRO/OqkkpYsakLK+4JqGwcdlVWwfD2OfSegdrGYdODNEvML0Z/ZUREUVVYbZhfIsW8rAn48rJdp4qIaFQlTAgtbdfv24JdlQRXrltKFcGGhFVgxRYgzZpUAOQLNb3OuG2tWok/1AqWJ4bLQ2FbWjUzWJ01te5VG1o1M+mNpVK7NrT2YVGcdW3oWeZEZBSWBJEj2U21ZVykyiZk2cJZQGxgQ/KzmmUijkkAzGzCEg27Ub6tj4+T809Y14bML7UdeksiPDdhiiTq+y4E7UbABs1R0jWtZ0qI6MKTepWvrVVtJnai0feaCTYz+56BHDApSkJbkGUuz2wqA8+Ac793ANRWu561YZ1rZ+wOlVo01xJ4yv4q3VeW7QIsTZ/14lIFT47ptfzWuTYsl7TqU9u1glNPeWGJg7DU1tQHWHAVVurgM/onWAfsYpqw0q6ajeSIavlhp2FpZyddh6VZeno9adaBZvjmojNV8FehdsDtKcdGgUNapd0CqQ7Ld0SrtDuANkSUesr53KUDoALoH5RstrthZ8xQ4qqVgVs/A/8PLLRajFIi+t4irDXk2EozK9k+k5dVMw2fJQcg1jXKECgA+JPPDV9djZor+ihToADgKQ8rshE1S/NJqAjqJ8yOxuyeVIkaa4pftJ1n/r9uMqIrXYBrNi9h2QI0J1AXuS/i975p0yoNbgJoanG2cafz7yybKCr6mwkzQ/LOyZ5gNQDwIDASCWPyocxArrMd8O6cqlP2mzMUoxyjJER0UVSiyUap6YkTgI/GOJTCkuPuzYkT5mVjwfka/MvJ/MpbOvOwoj6DKjO/HQefcfTajW3HIldf9Wl4ZeWInsmvKg0tRbBeewZqTkTLKhcWwYp6BmpW9eKzHpvhHRE9HvKGsnnDLjv5BMBNnaa7sl6HrkbyEb4YGq8DK+kYpFR2vNo/2rMPVtOD13uHgEcSQy2b3sgzsLg7IpoAuEK7bd5bk2ukTV8KMz/W/AW0YcG9ArY317ydlh1a+0oOHNSsNPNseK551XTuuimwtQakgvsORXObgItlcn+iOXNdK87KagOA20zMlUg6FGnM5+R+BTeQz/mWu+yv7GaJBMxJWz/g+g9T9psmrRj9HAAAAABJRU5ErkJggg==") center / contain no-repeat;
          mask: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAABLCAYAAAA4TnrqAAAEOUlEQVR42u2c0XHiQAyGf3nyfr4K4lQQUsFBBSEVxKnguAqACiAVJKngLhXgVACpwE4F8VWge4jIeYxNjK1dLzaaYSYzMWb9IWklrQShJWFmH8AAQADgEoAvfxdJAiAF8AZgA2BDRKntNZNlOGMAPwAM94CpKht5PQOI2oCnDoiZJ8y8YvPywMzDY4QUMPOCmd/ZvsTMHB4LpBW7IW5CE3NbsJsSM/PYFVDjlsytjk/zW9kN5YMXAMIjcqcJgBERJXXe7NX1TQDWRwYKEq7EzDyxAku257VCnNSmLJh5ato/3XK3ZGoK1JS7KdOTRhkARhVADcRHdV1CInqqDUt2vdWRO/OqkkpYsakLK+4JqGwcdlVWwfD2OfSegdrGYdODNEvML0Z/ZUREUVVYbZhfIsW8rAn48rJdp4qIaFQlTAgtbdfv24JdlQRXrltKFcGGhFVgxRYgzZpUAOQLNb3OuG2tWok/1AqWJ4bLQ2FbWjUzWJ01te5VG1o1M+mNpVK7NrT2YVGcdW3oWeZEZBSWBJEj2U21ZVykyiZk2cJZQGxgQ/KzmmUijkkAzGzCEg27Ub6tj4+T809Y14bML7UdeksiPDdhiiTq+y4E7UbABs1R0jWtZ0qI6MKTepWvrVVtJnai0feaCTYz+56BHDApSkJbkGUuz2wqA8+Ac793ANRWu561YZ1rZ+wOlVo01xJ4yv4q3VeW7QIsTZ/14lIFT47ptfzWuTYsl7TqU9u1glNPeWGJg7DU1tQHWHAVVurgM/onWAfsYpqw0q6ajeSIavlhp2FpZyddh6VZeno9adaBZvjmojNV8FehdsDtKcdGgUNapd0CqQ7Ld0SrtDuANkSUesr53KUDoALoH5RstrthZ8xQ4qqVgVs/A/8PLLRajFIi+t4irDXk2EozK9k+k5dVMw2fJQcg1jXKECgA+JPPDV9djZor+ihToADgKQ8rshE1S/NJqAjqJ8yOxuyeVIkaa4pftJ1n/r9uMqIrXYBrNi9h2QI0J1AXuS/i975p0yoNbgJoanG2cafz7yybKCr6mwkzQ/LOyZ5gNQDwIDASCWPyocxArrMd8O6cqlP2mzMUoxyjJER0UVSiyUap6YkTgI/GOJTCkuPuzYkT5mVjwfka/MvJ/MpbOvOwoj6DKjO/HQefcfTajW3HIldf9Wl4ZeWInsmvKg0tRbBeewZqTkTLKhcWwYp6BmpW9eKzHpvhHRE9HvKGsnnDLjv5BMBNnaa7sl6HrkbyEb4YGq8DK+kYpFR2vNo/2rMPVtOD13uHgEcSQy2b3sgzsLg7IpoAuEK7bd5bk2ukTV8KMz/W/AW0YcG9ArY317ydlh1a+0oOHNSsNPNseK551XTuuimwtQakgvsORXObgItlcn+iOXNdK87KagOA20zMlUg6FGnM5+R+BTeQz/mWu+yv7GaJBMxJWz/g+g9T9psmrRj9HAAAAABJRU5ErkJggg==") center / contain no-repeat;
}
.lp-header .btn{ min-height: 48px; padding: 13px 22px; font-size: 15.5px; }
.lp-header .btn--primary{ padding: 12px 18px; font-size: 15px; }
@media (min-width: 700px){ .lp-header .btn--primary{ padding: 13px 22px; font-size: 15.5px; } }
.lp-burger{ display:grid; }
@media (min-width: 1240px){ .lp-burger{ display:none; } }

/* Крестик собирается из тех же трёх полосок: средняя гаснет, крайние
   съезжаются в середину и поворачиваются. Считаем от центра — полоски
   стоят на 50% с одинаковым отступом вверх и вниз, поэтому у поворота
   не нужен свой transform-origin и крестик не уползает.

   Состояние берём из aria-expanded, который скрипт и так ставит:
   отдельный класс был бы вторым источником правды о том же самом,
   и они рано или поздно разошлись бы. */
.lp-burger__box{
  position: relative; display: block;
  width: 22px; height: 16px; color: inherit;
}
.lp-burger__box i{
  position: absolute; left: 0; top: 50%;
  width: 100%; height: 2px; border-radius: 1px;
  background: currentColor;
  transition: transform .26s cubic-bezier(.3,.7,.3,1), opacity .16s ease;
}
.lp-burger__box i:nth-child(1){ transform: translateY(-7px); }
.lp-burger__box i:nth-child(2){ transform: translateY(-1px); }
.lp-burger__box i:nth-child(3){ transform: translateY(5px); }

.lp-burger[aria-expanded="true"] .lp-burger__box i:nth-child(1){ transform: translateY(-1px) rotate(45deg); }
.lp-burger[aria-expanded="true"] .lp-burger__box i:nth-child(2){ opacity: 0; }
.lp-burger[aria-expanded="true"] .lp-burger__box i:nth-child(3){ transform: translateY(-1px) rotate(-45deg); }

@media (prefers-reduced-motion: reduce){
  .lp-burger__box i{ transition: none; }
}
.lp-menu{ background: var(--ink); padding: 4px 24px 20px; border-top: 1px solid var(--ink-line); }
.lp-menu a{
  display:flex; align-items:center; min-height: var(--tap); padding: 13px 2px;
  font-size: 16.5px; font-weight: 500; color: var(--on-dark-2);
  border-bottom: 1px solid var(--ink-line);
}
.lp-menu a:hover{ color: #fff; }
.lp-menu a:last-child{ border-bottom: none; }

/* =========================================================================
   ПЕРВЫЙ ЭКРАН
   Тёмный, во всю ширину поля, без панели-подложки: заголовок лежит прямо
   на тёмном, как в референсе. Три реализации правой части переключаются
   служебной панелью — решение не принято.
   ========================================================================= */
.hero-section{ padding: clamp(28px, 4vw, 64px) 0 clamp(36px, 4.6vw, 72px); }
.hero{
  position: relative; overflow: hidden; isolation: isolate;
  display:flex; align-items:center; min-height: clamp(420px, 52vw, 560px);
}
.hero__content{ max-width: 900px; position: relative; z-index: 2; }

/* ---- свечение за курсором ----
   ВТОРОЕ ОСОЗНАННОЕ ИСКЛЮЧЕНИЕ из правила «ни одной тени и ни одного
   градиента» (первое — объёмные плашки со знаками). Свет по-другому
   не нарисовать: у пятна нет края, а всё, что есть в палитре, — края.

   Живёт только на первом экране и только там, где есть настоящая мышь.
   Ниже начинаются светлые плиты, на них свечения быть не может,
   а на тёмных кусках в середине страницы оно стало бы случайным бликом.

   Два слоя. Неподвижная обойма решает, ГДЕ свету вообще позволено
   быть, движущееся пятно — где он сейчас.

   Обойма стоит выше вуали (z-index 2 против 1). Ниже её класть нельзя:
   вуаль по левой половине залита сплошным --ink и закрашивает пятно
   целиком — на этом первая версия и погасла. Текст (z-index 2, но
   в разметке позже) остаётся сверху.

   Маска обоймы повторяет вуаль наоборот: свет во всю силу на чистом
   тёмном поле и сходит на нет там, где начинаются макеты. Синий налёт
   на фотографиях сайтов читался бы как брак печати.

   Пятно одно и с готовым фоном; двигает его скрипт через transform.
   Градиент, переписываемый каждый кадр, заставлял бы браузер
   перерисовывать слой целиком. */
.hero__glow-wrap{
  position: absolute; inset: 0; z-index: 2;
  pointer-events: none; overflow: hidden;
  opacity: 0; transition: opacity .45s ease;
}
.hero.is-glow .hero__glow-wrap{ opacity: 1; }

/* Маска в два слоя, по одному на ось — тот же приём, что у макетов.
   Поперёк: свет гаснет там, где начинаются макеты. Вдоль: гаснет
   у кромок самой обоймы. Без второго слоя пятно резалось бы краем
   блока — прямая линия посреди сплошного тёмного поля, а у света
   прямых линий не бывает. Особенно заметно в варианте В: там первый
   экран ниже пятна, и рез приходился бы прямо на текст. */
@supports (mask-composite: intersect) or (-webkit-mask-composite: source-in){
  .hero__glow-wrap{
    -webkit-mask-image:
      linear-gradient(96deg, transparent 0, #000 7%, #000 44%,
        rgba(0,0,0,.45) 58%, transparent 72%),
      linear-gradient(to bottom, transparent 0, #000 15%, #000 85%, transparent 100%);
            mask-image:
      linear-gradient(96deg, transparent 0, #000 7%, #000 44%,
        rgba(0,0,0,.45) 58%, transparent 72%),
      linear-gradient(to bottom, transparent 0, #000 15%, #000 85%, transparent 100%);
    -webkit-mask-composite: source-in;
            mask-composite: intersect;
  }

  /* Вариант В: ни вуали, ни макетов — гасить справа нечего,
     свет лежит на всю ширину и гаснет только у кромок. */
  .hero--type .hero__glow-wrap{
    -webkit-mask-image:
      linear-gradient(to right, transparent 0, #000 9%, #000 91%, transparent 100%),
      linear-gradient(to bottom, transparent 0, #000 15%, #000 85%, transparent 100%);
            mask-image:
      linear-gradient(to right, transparent 0, #000 9%, #000 91%, transparent 100%),
      linear-gradient(to bottom, transparent 0, #000 15%, #000 85%, transparent 100%);
  }
}

.hero__glow{
  position: absolute; left: 0; top: 0;
  width: 680px; height: 680px; margin: -340px 0 0 -340px;
  pointer-events: none;
  border-radius: 50%;
  /* Много ступеней, и последняя ровно на кромке. Спад в три ступени,
     обрывавшийся на 76%, давал видимый край круга: у прямого спада на
     конце излом, и глаз ловит его как линию, даже когда там уже нечего
     видеть. Кривая гасит свет всё медленнее и доходит до нуля сама. */
  background: radial-gradient(closest-side,
    rgba(50,135,255,.30) 0%,
    rgba(50,135,255,.255) 17%,
    rgba(50,135,255,.185) 33%,
    rgba(50,135,255,.120) 48%,
    rgba(50,135,255,.068) 62%,
    rgba(50,135,255,.034) 74%,
    rgba(50,135,255,.014) 84%,
    rgba(50,135,255,.004) 93%,
    rgba(50,135,255,0) 100%);
  will-change: transform;
}

/* Мыши нет — пятна нет: на тачскрине оно просто застыло бы в углу */
@media (hover: none), (pointer: coarse){ .hero__glow-wrap{ display: none; } }
@media (prefers-reduced-motion: reduce){ .hero__glow-wrap{ display: none; } }

.badge{
  display:inline-flex; align-items:center; gap: 8px;
  background: rgba(255,255,255,.10); color: #fff;
  padding: 9px 16px; border-radius: var(--r-sm);
  font-size: 14.5px; font-weight: 600; margin-bottom: 30px;
}

.hero__title{
  font-family: var(--font-heading);
  font-size: clamp(34px, 5.4vw, 68px);
  line-height: 1.02; font-weight: 600; letter-spacing:-.035em;
  color: #fff; margin: 0 0 26px; text-wrap: balance;
}
.hero__title .accent{ display:block; color: var(--blue); }
.hero__text{
  font-size: clamp(16.5px, 1.5vw, 19px); line-height: 1.5;
  color: var(--on-dark-2); margin: 0 0 36px; max-width: 560px;
}
.hero__text b{ color: #fff; font-weight: 600; }
.hero__actions{ display:flex; gap: 12px; flex-wrap: wrap; }
.hero__actions .btn{ white-space: normal; text-align: center; }
.hero__fine{ margin-top: 22px; font-size: 14.5px; color: var(--on-dark-3); }

/* Вуаль: текст лежит на чистом поле, графика уходит вправо */
.hero__veil{
  position:absolute; inset:0; z-index: 1; pointer-events:none;
  background: linear-gradient(96deg,
    var(--ink) 0 46%,
    color-mix(in oklab, var(--ink) 74%, transparent) 60%,
    color-mix(in oklab, var(--ink) 0%, transparent) 76%);
}
@media (max-width: 1023px){ .hero__veil{ display:none; } }

/* -------- Вариант А: наклонные окна как самостоятельный приём --------
   Карточки стали плоскими: тени сняты, «фотографии» — чистые заливки
   из той же тройки акцентов, что и вся страница. Колонки гаснут в
   тёмное поле, а не обрываются краем. */
.hero__mockups{
  position:absolute; top: -90px; right: -40px;
  width: 470px; height: 1080px;
  transform: rotate(14deg);
  display:flex; gap: 16px; overflow:hidden; z-index: 0; pointer-events: none;
  -webkit-mask-image: linear-gradient(to bottom, transparent 0, #000 10%, #000 76%, transparent 96%);
          mask-image: linear-gradient(to bottom, transparent 0, #000 10%, #000 76%, transparent 96%);
}
/* Правый край: без растворения колонки резались вертикальной линией
   посреди карточки — рамки у них нет, и срез читался как ошибка.
   Второй слой маски гасит их в тёмное поле. */
@supports (mask-composite: intersect) or (-webkit-mask-composite: source-in){
  .hero__mockups{
    -webkit-mask-image:
      linear-gradient(to bottom, transparent 0, #000 10%, #000 76%, transparent 96%),
      linear-gradient(to right, #000 0, #000 62%, transparent 99%);
            mask-image:
      linear-gradient(to bottom, transparent 0, #000 10%, #000 76%, transparent 96%),
      linear-gradient(to right, #000 0, #000 62%, transparent 99%);
    -webkit-mask-composite: source-in;
            mask-composite: intersect;
  }
}
@media (max-width: 1023px){ .hero__mockups{ display:none; } }
.mockup-col{ flex: 1; overflow:hidden; }
.mockup-track{ display:flex; flex-direction:column; gap: 16px; }
.mockup-track--up{ animation: lpUp 46s linear infinite; }
.mockup-track--down{ animation: lpDown 52s linear infinite; }
@keyframes lpUp{ from{ transform: translateY(0);} to{ transform: translateY(-50%);} }
@keyframes lpDown{ from{ transform: translateY(-50%);} to{ transform: translateY(0);} }

.mockup-card{
  width: 100%; height: 300px; background: #fff; border-radius: 16px;
  padding: 9px; display:flex; flex-direction:column; gap: 7px; overflow:hidden;
}
/* Шапка окна: наша синяя точка и две нейтральные */
.mockup-card::before{
  content:""; display:block; flex-shrink:0; height: 12px;
  background-image:
    radial-gradient(circle 3px at 7px 6px,  #3287FF 3px, transparent 3px),
    radial-gradient(circle 3px at 18px 6px, #CED7E6 3px, transparent 3px),
    radial-gradient(circle 3px at 29px 6px, #E4E9F2 3px, transparent 3px);
  background-repeat: no-repeat;
}
/* Снимок занимает всё, что осталось под шапкой, и показывает верх
   страницы: в колонке шириной чуть больше двухсот пикселей середина
   макета всё равно не прочиталась бы. */
.mockup-card__shot{
  flex: 1; min-height: 0; display: block;
  border-radius: 9px; overflow: hidden; background: var(--lav);
}
.mockup-card__shot img{
  display: block; width: 100%; height: 100%;
  object-fit: cover; object-position: top center;
}

/* Честная подпись: работ у нас пока нет, и мы говорим это сами */
.hero__disclaimer{
  position: absolute; right: 0; bottom: 0; z-index: 3;
  display:inline-flex; align-items:center; gap: 8px;
  padding: 9px 16px; border-radius: var(--r-sm);
  background: rgba(22,31,49,.88);
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  font-size: 13px; font-weight: 500; color: var(--on-dark-2);
}
.hero__disclaimer svg{ color: var(--on-dark-3); flex-shrink:0; }
/* На узком подпись стоит в потоке под графикой: подложка там не нужна,
   она читается как обрубленная плашка на пустом поле */
@media (max-width: 1023px){
  .hero__disclaimer{
    position: static; margin-top: 20px; padding: 0;
    background: none; -webkit-backdrop-filter: none; backdrop-filter: none;
    align-items: flex-start;
  }
  .hero__disclaimer svg{ margin-top: 2px; }
}

/* Телефон и планшет: карточка целиком в поле, не обрублена краем */
/* ---- «Что нужно от вас»: рисунок в пустой полосе первого экрана ----
   Полоса между кнопками и низом экрана оставалась пустой: макеты
   справа до неё не достают, а текст закончился. Ставить туда ещё одну
   цифру было нельзя — цена, срок и «первый экран бесплатно» уже сказаны
   заголовком, подписью и бегущей строкой. Здесь единственное, чего
   на первом экране не было: сколько усилий нужно от человека.

   Три шага соединены линией — тот же приём, что рельс в «как это
   устроено», только положенный набок. Линия рисуется псевдоэлементом
   у каждого пункта, кроме первого, поэтому число шагов можно менять,
   ничего не пересчитывая.

   Объёмных плашек под знаками нет: объём на этой странице — приём
   раздела «что входит», и повторять его здесь значило бы разбавить
   то, что там работает. Знак лежит в простом тёмном квадрате. */
.hero__need{
  display: none;                    /* показываем там, где полоса есть */
  list-style: none; margin: 34px 0 0; padding: 0;
}
/* Порог 1240, а не 900. Ниже макеты справа подъезжают ближе, и третий
   шаг ложился текстом прямо на карточку — проверено на 1100. На 1240
   до ближайшей карточки остаётся 50 пикселей. Тот же порог, что
   у настольной шапки: полоса существует ровно там, где широкая
   раскладка. */
@media (min-width: 1240px){
  .hero__need{ display: flex; align-items: center; flex-wrap: nowrap; }
}
.hero__need-item{
  display: flex; align-items: center; gap: 11px;
  flex: 0 0 auto; min-width: 0;
}
/* Линия между шагами. Сжимается первой, если места мало: сами шаги
   ужимать некуда, а соединителю можно */
.hero__need-item + .hero__need-item::before{
  content: ""; flex: 0 1 34px; width: 34px; min-width: 12px;
  height: 1px; margin: 0 22px; background: var(--ink-line);
}
.hero__need-mark{
  display: grid; place-items: center; flex-shrink: 0;
  width: 38px; height: 38px; border-radius: var(--r-sm);
  background: var(--ink-2); color: var(--blue);
}
.hero__need-text{
  font-size: 14px; line-height: 1.35; color: var(--on-dark-2);
  white-space: nowrap;
}

/* Карточка-превью с первого экрана убрана: на телефоне она стоила
   пол-экрана до кнопки, а показывала чужой сайт — до того, как человек
   прочитал, о чём этот. На широких её и не было: там работает лента
   наклонных макетов справа. */
@media (max-width: 1023px){
  .hero{ display: grid; grid-template-columns: minmax(0,1fr); align-items: center; }
}

/* ---------------- Вариант Б: процесс вместо результата ----------------
   Карточки тёмные на тёмном: отделяются тоном, а не рамкой и не тенью. */
.hero__flow{
  position: relative; z-index: 2;
  display:flex; flex-direction: column; gap: 8px;
  width: 360px; flex-shrink: 0;
}
@media (max-width: 1023px){ .hero__flow{ width: 100%; max-width: 440px; margin-top: 32px; } }
.flow-card{ background: var(--ink-2); border-radius: var(--r-card); padding: 18px 20px; }
.flow-card__label{
  font-size: 12px; font-weight: 600; letter-spacing:.06em; text-transform: uppercase;
  color: var(--on-dark-3); margin-bottom: 12px;
}
.flow-card__link{
  display:flex; align-items:center; gap: 10px;
  background: rgba(255,255,255,.07); border-radius: 10px; padding: 10px 14px;
  font-size: 14px; color: #fff; font-weight: 500;
}
.flow-card__link svg{ color: var(--blue); flex-shrink: 0; }
.flow-rows{ display:flex; flex-direction: column; gap: 9px; }
.flow-row{ display:flex; align-items:center; gap: 10px; font-size: 14px; color: var(--on-dark-2); }
.flow-row__tick{ color: var(--blue); flex-shrink: 0; }
.flow-row__val{ margin-left:auto; color: var(--on-dark-3); font-size: 13px; }
.flow-arrow{ display:grid; place-items:center; color: var(--on-dark-3); height: 20px; }
.flow-screen{ padding: 0; overflow: hidden; background: var(--blue); }
.flow-screen__bar{ height: 28px; background: rgba(0,0,0,.16); display:flex; align-items:center; gap: 5px; padding: 0 14px; }
.flow-screen__bar i{ width: 7px; height: 7px; border-radius: 50%; background: rgba(255,255,255,.35); }
.flow-screen__bar i:first-child{ background: #fff; }
.flow-screen__body{ padding: 18px 20px 20px; }
.flow-screen__title{ font-family: var(--font-heading); font-weight: 600; font-size: 17px; letter-spacing:-.02em; margin-bottom: 7px; color:#fff; }
.flow-screen__sub{ font-size: 13.5px; color: rgba(255,255,255,.82); margin-bottom: 14px; line-height: 1.45; }
.flow-screen__btn{ display:inline-flex; background: #fff; color: var(--blue-ink); font-size: 13px; font-weight: 600; padding: 9px 16px; border-radius: 10px; }

/* -------------- Вариант В: типографика, без графики вовсе ------------- */
.hero--type{ min-height: 0; }
.hero--type .hero__content{ max-width: 1000px; }
.hero--type .hero__title{ font-size: clamp(36px, 6.4vw, 82px); }
.hero__pillars{
  display:flex; flex-wrap: wrap; gap: 12px; margin-top: 44px;
  padding-top: 36px; border-top: 1px solid var(--ink-line);
}
.hero-pillar{ flex: 1 1 200px; min-width: 0; }
.hero-pillar__n{
  font-family: var(--font-heading); font-size: clamp(30px, 4vw, 46px); font-weight: 600;
  letter-spacing:-.04em; line-height: 1; color: #fff; font-variant-numeric: tabular-nums;
}
.hero-pillar__n em{ font-style: normal; font-size: .42em; color: var(--blue); margin-left: 6px; vertical-align: .8em; }
.hero-pillar__t{ margin-top: 12px; font-size: 15px; color: var(--on-dark-2); line-height: 1.4; }

/* =========================================================================
   Бегущая строка
   Ни подложки, ни рамок: строка идёт прямо по тёмному полю страницы во
   всю её ширину и обрезается краями экрана, а не краями карточки.
   Синяя плашка забирала на себя внимание, которого лента не стоит, —
   это фон, а не сообщение. Осталась одна типографика, приглушённая
   до уровня подписи.
   ========================================================================= */
.ticker-clip{ overflow: hidden; width: 100%; }
.ticker{
  background: none; border-radius: 0; overflow: hidden;
  padding: clamp(4px, 1vw, 12px) 0 clamp(28px, 3.4vw, 52px);
}
.ticker__track{
  display:flex; align-items:center; gap: 22px; white-space: nowrap;
  width: max-content; animation: lpTicker 52s linear infinite;
}
@keyframes lpTicker{ from{ transform: translateX(0);} to{ transform: translateX(-50%);} }
.ticker__item{
  font-family: var(--font-heading); font-size: 14.5px; font-weight: 600;
  text-transform: uppercase; letter-spacing:.06em; color: var(--on-dark-2);
}
.ticker__dot{ color: var(--on-dark-3); font-size: 11px; }

/* ------------------------- заголовок раздела -------------------------- */
.section-head{
  display:flex; justify-content: space-between; align-items: flex-end;
  flex-wrap: wrap; gap: 24px; margin-bottom: clamp(28px, 3.2vw, 44px);
}
.eyebrow{
  font-size: 14px; font-weight: 600; color: var(--blue);
  text-transform: uppercase; letter-spacing:.07em; margin-bottom: 14px;
}
.h2, .section-head .h2{
  font-family: var(--font-heading); font-size: clamp(28px, 3.8vw, 48px);
  font-weight: 600; letter-spacing:-.035em; line-height: 1.04; text-wrap: balance;
  margin: 0; color: var(--text);
}
.on-dark .h2, .on-color .h2{ color: #fff; }
.section-head > *:first-child{ flex: 1 1 460px; min-width: 0; }
.section-head__text{ flex: 0 1 360px; font-size: 16.5px; color: var(--text-2); margin: 0; }
@media (min-width: 1000px){ .section-head__text{ text-align: right; } }

/* =========================================================================
   О СЕРВИСЕ — один раздел вместо трёх
   Порядок внутри — повествование: числа, кто приходит, почему сервис
   появился, чем он отличается. Отсюда четыре разных приёма подряд и
   ни одного повтора: цветные плитки, строки с верхней линейкой, проза
   рядом с тёмной плиткой, лавандовые карточки. Если набрать всё
   карточками, раздел прочитается как один длинный список.
   ========================================================================= */

/* ---- с чем приходят: не карточки, а строки под общей линейкой ----
   Четыре коротких случая не тянут на карточки: в каждом одна строка,
   и рамка вокруг неё была бы тяжелее содержимого. */
.srv-who{ display:grid; grid-template-columns: 1fr; gap: 20px 32px; }
@media (min-width: 560px){ .srv-who{ grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 960px){ .srv-who{ grid-template-columns: repeat(4, 1fr); } }
.srv-who__item{ border-top: 2px solid var(--lav-2); padding-top: 16px; }
.srv-who__label{
  display:block; font-family: var(--font-heading); font-size: 17px;
  font-weight: 600; letter-spacing:-.025em; color: var(--text); margin-bottom: 6px;
}
.srv-who__line{ display:block; font-size: 15px; line-height: 1.45; color: var(--text-2); }

/* ---- история: проза слева, студия справа ----
   Слева намеренно голый текст без подложки: это рассказ, а не пункт
   списка, и карточка вокруг него сделала бы из него объявление. */
.srv-story{ display:grid; grid-template-columns: 1fr; gap: 12px; margin-top: clamp(36px, 4vw, 56px); }
@media (min-width: 940px){ .srv-story{ grid-template-columns: 1.12fr .88fr; gap: 40px; align-items: start; } }

/* Рассказ длинный, врезка короткая: если оставить её приклеенной
   к верху, под ней остаётся полколонки пустоты. Липкая — идёт рядом
   с текстом и оказывается на виду ровно тогда, когда человек дочитал
   до места, где студия и появляется. Отступ сверху — высота шапки. */
@media (min-width: 940px){
  .srv-abeta{ position: sticky; top: 96px; }
}
@media (prefers-reduced-motion: reduce){
  .srv-abeta{ position: static; }
}

.srv-story__text p{
  font-size: clamp(16.5px, 1.5vw, 18px); line-height: 1.62; color: var(--text-2);
  margin: 0 0 18px; max-width: 62ch;
}
.srv-story__text p:last-child{ margin-bottom: 0; }

.srv-abeta{
  background: var(--ink); color: #fff;
  border-radius: var(--r-card); padding: clamp(26px, 3vw, 38px);
  display:flex; flex-direction: column;
}
.srv-abeta__label{
  font-size: 13px; font-weight: 600; letter-spacing:.07em; text-transform: uppercase;
  color: var(--blue); margin: 0 0 18px;
}
.srv-abeta__lockup{ display:flex; flex-direction: column; gap: 8px; margin-bottom: 24px; }
.srv-abeta__name{
  font-family: var(--font-heading); font-size: clamp(30px, 3.4vw, 42px);
  font-weight: 600; letter-spacing:-.04em; line-height: 1; color: #fff;
}
.srv-abeta__since{ font-size: 15px; color: var(--on-dark-3); }
.srv-abeta p{ font-size: 16px; line-height: 1.55; color: var(--on-dark-2); margin: 0 0 16px; }
.srv-abeta__note{
  margin-top: auto; padding-top: 20px; border-top: 1px solid var(--ink-line);
  margin-bottom: 20px !important;
}
.srv-abeta__btn{ align-self: flex-start; }
.srv-abeta__note a{
  color: #fff; font-weight: 600;
  text-decoration: underline; text-underline-offset: 3px;
  text-decoration-color: rgba(255,255,255,.4);
}
.srv-abeta__note a:hover{ text-decoration-color: #fff; }

/* ---- чем отличается: три лавандовые карточки ---- */
.srv-adv{ display:grid; grid-template-columns: 1fr; gap: 12px; margin-top: 12px; }
@media (min-width: 1000px){ .srv-adv{ grid-template-columns: repeat(3, 1fr); } }
.srv-adv__card{
  background: var(--lav); border-radius: var(--r-card);
  padding: clamp(24px, 2.6vw, 32px); display:flex; flex-direction: column;
}
.srv-adv__n{
  font-family: var(--font-heading); font-size: 14px; font-weight: 700;
  color: var(--blue); margin-bottom: 18px;
}
.srv-adv__title{
  font-family: var(--font-heading); font-size: clamp(18px, 1.9vw, 21px);
  font-weight: 600; letter-spacing:-.03em; line-height: 1.18;
  margin: 0 0 10px; color: var(--text);
}
.srv-adv__text{ font-size: 15.5px; line-height: 1.5; color: var(--text-2); margin: 0; }

/* =========================================================================
   Таймлайн процесса
   Семь шагов вертикальной лентой: процесс линейный, порядок важнее
   набора. Рельс слева, номер шага сидит на рельсе и перекрывает его.
   Заливкой выделен один шаг — бесплатный.
   ========================================================================= */
.tl{ position: relative; list-style: none; margin: 0; padding: 0; }
/* Рельс прочерчивается по мере прокрутки: --tl-p двигает GSAP
   (js/anim.js). Переменной нет — рельс нарисован целиком, поэтому без
   скрипта и при «уменьшить движение» всё выглядит как раньше. */
.tl::before{
  content:""; position: absolute; z-index: 0;
  left: 23px; top: 24px; bottom: 24px; width: 2px; background: var(--lav-2);
  transform: scaleY(var(--tl-p, 1)); transform-origin: top center;
}
.slab--lav .tl::before{ background: var(--lav-3); }

.tl__step{
  position: relative;
  display: grid; grid-template-columns: 48px minmax(0, 1fr);
  gap: 20px; padding-bottom: 12px;
}
.tl__step:last-child{ padding-bottom: 0; }

/* Номера шагов собраны так же, как знаки в «что входит»: белая плашка,
   один источник света слева сверху, наклон в семь градусов и цифра,
   развёрнутая обратно. Иначе две сетки на одной странице выглядели бы
   из разных наборов. Плашка непрозрачная — рельс проходит за ней
   и не просвечивает сквозь номер. */
.tl__node{
  position: relative; z-index: 1;
  width: 48px; height: 48px; border-radius: 16px;
  background: linear-gradient(148deg, #ffffff 0%, #fbfcfe 30%, #eaeef7 68%, #dae1f0 100%);
  display: grid; place-items: center;
  font-family: var(--font-heading); font-size: 18px; font-weight: 600;
  color: color-mix(in oklab, var(--blue) 52%, var(--indigo));
  font-variant-numeric: tabular-nums;
  transform: rotate(-7deg);
  box-shadow:
    inset 0 2px 2px rgba(255,255,255,.95),
    inset -3px -4px 9px rgba(134,150,190,.26),
    inset 0 -5px 9px rgba(134,150,190,.22),
    6px 12px 20px -7px rgba(80,98,144,.34),
    2px 4px 8px rgba(80,98,144,.14);
}
.tl__node b, .tl__node svg{ transform: rotate(7deg); display: block; font-weight: inherit; }

/* Бесплатный шаг — единственный крашеный: та же плашка, только залита.
   Свет и наклон те же, поэтому она остаётся из того же набора. */
.tl__node--accent{
  background: linear-gradient(148deg, #6FAAFF 0%, #3287FF 44%, #2A4FD6 100%);
  color: #fff;
  box-shadow:
    inset 0 1.5px 0 rgba(255,255,255,.5),
    inset 0 -6px 11px rgba(18,36,102,.28),
    6px 12px 20px -7px rgba(42,79,214,.5),
    2px 4px 8px rgba(18,36,102,.16);
}
/* Развилка отличается не заливкой, а знаком вместо цифры */

.tl__card{
  background: var(--lav); border-radius: var(--r-card);
  padding: clamp(22px, 2.6vw, 32px); position: relative;
}
/* Картинка встаёт рядом с текстом только там, где ей хватает ширины.
   На узком она скрыта: семь шагов и без неё занимают три экрана,
   а смысла в ней ровно столько, сколько в оформлении. */
.tl__body{ min-width: 0; }
.tl__art{ display: none; }
@media (min-width: 900px){
  .tl__card{
    display: grid; grid-template-columns: minmax(0, 1fr) 208px;
    gap: 32px; align-items: center;
  }
  .tl__art{ display: block; width: 100%; height: auto; }
}
/* Раньше здесь были нарисованные SVG-скелеты в четыре заливки. Теперь
   объёмные иллюстрации заказчика — 480×360, по одной на шаг. Углы
   у них прозрачные, и лавандовая карточка просвечивает насквозь,
   поэтому отдельного скругления картинке не нужно.

   На узком картинки скрыты, как и прежде: семь шагов и без них
   занимают три экрана. `loading="lazy"` и точные width/height стоят
   не для красоты — без размеров карточки прыгали бы при загрузке. */
.tl__card--accent{ background: var(--blue); color: #fff; }
.tl__card--accent .tl__desc{ color: rgba(255,255,255,.82); }
.tl__card--accent .meta-label{ color: rgba(255,255,255,.55); }

.tl__title{
  font-family: var(--font-heading); font-size: clamp(19px, 2vw, 24px);
  font-weight: 600; letter-spacing:-.03em; line-height: 1.15; margin: 0 0 10px;
}
.tl__desc{ font-size: 16px; line-height: 1.5; color: var(--text-2); margin: 0; }
.tl__meta{ display:flex; gap: 32px; flex-wrap: wrap; margin-top: 22px; }
.meta-label{ display:block; font-size: 12.5px; color: var(--text-3); margin-bottom: 3px; }
.meta-value{ display:block; font-size: 15.5px; font-weight: 600; }

/* Условие возврата — отбито линией и набрано тише самого шага. Это
   не то, что происходит на шаге, а то, что можно сделать вместо него:
   набранное вровень с описанием, оно читалось бы как часть процесса.
   Раньше здесь была развилка с отдельной веткой — она обещала полный
   возврат и оказалась неверной; условие вернулось строкой. */
.tl__note{
  margin: 20px 0 0; padding-top: 16px;
  border-top: 1px solid var(--lav-2);
  font-size: 14.5px; line-height: 1.5; color: var(--text-3);
  max-width: 62ch;
}

/* В потоке, а не в правом верхнем углу: там теперь картинка */
.tl__flag{
  display: inline-flex; margin-bottom: 14px;
  background: #fff; color: var(--blue-ink);
  font-size: 13px; font-weight: 600; padding: 7px 14px; border-radius: 10px;
}


/* =========================================================================
   ЧТО ВХОДИТ — девять плиток
   Раньше состав был списком строк рядом со вторым списком. Теперь у
   каждого пункта свой заголовок, и раздел читается глазами по
   диагонали, а не построчно сверху вниз.

   Иконки одного набора: сетка 24, штрих 1.75, скруглённые концы.
   Каждая сидит в объёмной плашке одного размера, поэтому строки
   заголовков во всех плитках начинаются на одной высоте, как бы ни
   отличались сами рисунки.
   ========================================================================= */
.inc-grid{ display:grid; grid-template-columns: 1fr; gap: 12px; }
@media (min-width: 620px){  .inc-grid{ grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1000px){ .inc-grid{ grid-template-columns: repeat(3, 1fr); } }

.inc-card{
  background: #fff; border-radius: var(--r-card);
  padding: clamp(24px, 2.6vw, 32px);
  display:flex; flex-direction: column;
}
/* Единственная объёмная вещь на плоской странице — и это осознанно.
   В референсе тоже всё плоское, кроме иллюстраций: объём там отдан
   только предметам, а интерфейс вокруг остаётся без теней.

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

   Собрана из пяти слоёв. Диагональная заливка задаёт саму форму,
   белая линия сверху — фаску, две внутренние тени снизу и справа —
   толщину, мягкая внешняя тень отрывает плашку от карточки. Знак
   развёрнут обратно на те же семь градусов и стоит прямо. */
.inc-card__icon{
  position: relative;
  width: 64px; height: 64px; border-radius: 21px;
  background: linear-gradient(148deg, #ffffff 0%, #fbfcfe 30%, #eaeef7 68%, #dae1f0 100%);
  /* Знак глубже обоих соседних тонов: на почти белом фоне азур
     выцветает, а чистый индиго уводит в фиолетовое */
  color: color-mix(in oklab, var(--blue) 52%, var(--indigo));
  display:grid; place-items:center; flex-shrink: 0;
  margin: 2px 0 26px;
  transform: rotate(-7deg);
  box-shadow:
    inset 0 2px 2px rgba(255,255,255,.95),
    inset -4px -5px 11px rgba(134,150,190,.26),
    inset 0 -6px 11px rgba(134,150,190,.22),
    8px 15px 26px -7px rgba(80,98,144,.36),
    2px 5px 10px rgba(80,98,144,.14);
}
/* Контр-поворот держит знак прямо, а оптический центр — на месте */
.inc-card__icon svg{ transform: rotate(7deg); display: block; }

.inc-card__title{
  font-family: var(--font-heading); font-size: clamp(18px, 1.9vw, 21px);
  font-weight: 600; letter-spacing:-.03em; line-height: 1.18;
  margin: 0 0 10px; color: var(--text);
}
.inc-card__text{ font-size: 15.5px; line-height: 1.5; color: var(--text-2); margin: 0; }

/* Правки плиткой не стали: цифра уже названа в четырёх числах и в цене,
   третье повторение читалось бы как оговорка */
.inc-note{
  margin: 18px 0 0; padding-left: 2px;
  font-size: 15px; color: var(--text-3);
}

/* =========================================================================
   ДОПОЛНИТЕЛЬНЫЕ УСЛУГИ
   Индиговая плита во всю ширину — приём, который раньше держала
   гарантия. После того как раздел гарантии убрали, он освободился,
   и платные услуги единственное, что его заслуживает: это второй
   по важности денежный разговор после самой цены.

   Карточки полупрозрачные поверх индиго, без собственной заливки:
   плотный белый прямоугольник на цветном поле выглядел бы как
   наклейка. Цена отбита от текста линейкой и прижата к низу, поэтому
   суммы во всех трёх карточках стоят на одной высоте, как бы ни
   отличались описания.
   ========================================================================= */
.extra{
  background: var(--ink); border-radius: var(--r-slab);
  padding: clamp(30px, 4.4vw, 72px) clamp(26px, 4vw, 64px);
  color: #fff;
}
.extra__head{ margin-bottom: clamp(30px, 3.6vw, 48px); max-width: 780px; }
.extra__head .h2{ font-size: clamp(28px, 4.2vw, 48px); color: #fff; margin: 0 0 18px; }

/* :not(.eyebrow) обязательно. Надпись над заголовком — тоже <p>, и
   правило `.extra__head p` било по ней специфичностью: она набиралась
   19 пикселями вместо 14 и теряла отступ до заголовка. Заметно это
   было только рядом с другими разделами — внутри плиты выглядело как
   замысел. */
.extra__head p:not(.eyebrow){
  font-size: clamp(16.5px, 1.7vw, 19px); line-height: 1.5;
  color: var(--on-dark-2); max-width: 58ch; margin: 0;
}

.extra__grid{ display:grid; grid-template-columns: 1fr; gap: 12px; }
/* На средней ширине то же самое, только ряд по две: четыре колонки,
   карточка берёт две. Если карточек нечётное число, последняя берёт
   все четыре и дотягивает ряд — `:last-child:nth-child(odd)` верно
   при любом нечётном количестве, пересчитывать не надо. */
@media (min-width: 620px) and (max-width: 999px){
  .extra__grid{ grid-template-columns: repeat(4, 1fr); }
  .extra-card{ grid-column: span 2; }
  .extra-card:last-child:nth-child(odd){ grid-column: span 4; }
}

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

   Условие `:nth-child(4):nth-last-child(2)` читается как «карточек
   ровно пять»: четвёртая от начала и вторая от конца — это одна и та
   же карточка только при пяти. Появится шестая — правило перестанет
   срабатывать само, и ряды снова станут по три. Считать карточки
   руками при каждой правке не придётся. */
@media (min-width: 1000px){
  .extra__grid{ grid-template-columns: repeat(6, 1fr); }
  .extra-card{ grid-column: span 2; }
  .extra-card:nth-child(4):nth-last-child(2),
  .extra-card:nth-child(4):nth-last-child(2) ~ .extra-card{ grid-column: span 3; }
}

.extra-card{
  background: var(--ink-2); border-radius: var(--r-card);
  padding: clamp(24px, 2.6vw, 32px); display:flex; flex-direction: column;
}
.extra-card__icon{
  width: 52px; height: 52px; border-radius: var(--r-sm);
  background: var(--ink-3); color: #fff;
  display:grid; place-items:center; flex-shrink: 0; margin-bottom: 22px;
}
.extra-card__title{
  font-family: var(--font-heading); font-size: clamp(18px, 1.9vw, 21px);
  font-weight: 600; letter-spacing:-.03em; line-height: 1.18;
  margin: 0 0 10px; color: #fff;
}
.extra-card__text{ font-size: 15.5px; line-height: 1.5; color: var(--on-dark-2); margin: 0 0 24px; }

/* Прижата к низу: описания разной длины, а суммы должны стоять
   на одной линии — иначе взгляд не сравнивает их, а ищет */
.extra-card__price{
  margin-top: auto; padding-top: 20px;
  border-top: 1px solid var(--ink-line);
  display:flex; flex-direction: column; gap: 10px;
}
.extra-card__row{ display:flex; flex-direction: column; gap: 2px; }
.extra-card__sum{
  font-family: var(--font-heading); font-size: 21px; font-weight: 600;
  letter-spacing:-.03em; color: #fff; font-variant-numeric: tabular-nums;
}
.extra-card__for{ font-size: 14px; color: var(--on-dark-3); line-height: 1.35; }

/* То, что тоже стоит денег, но услугой не является */
.extra__note{
  margin: clamp(24px, 2.6vw, 34px) 0 0; padding-top: 24px;
  border-top: 1px solid var(--ink-line);
  font-size: 15px; line-height: 1.55; color: var(--on-dark-2);
  max-width: 90ch;
}

/* =========================================================================
   ЧЕГО МЫ НЕ ДЕЛАЕМ
   Отдельный раздел, а не колонка рядом с составом. Тёмная плита: это
   граница, а не предложение, и продавать её нечем. Крестики нейтральные
   и тихие — смысловой красный здесь означал бы ошибку, а это не ошибка.
   ========================================================================= */
.lp-section--tight{ padding-top: 0; }

/* Контакты отбиты сверху от плиты с вопросами и придвинуты к форме
   снизу: телефон и кнопка «Начать» — один разговор, между ними
   лишний воздух читается как разрыв. */
.lp-section--contacts{ padding: clamp(56px, 6vw, 96px) 0 0; }

/* Раздел и его призыв стоят парой: между ними шов, а не пауза между
   разделами. Кнопка принадлежит тому блоку, который её заслужил, —
   процессу, составу, рассказу о студии, — и отрывать её на полный
   межразделный отступ значит превращать в самостоятельный блок. */
.lp-section--pair{ padding-bottom: clamp(24px, 2.6vw, 38px); }
.lp-section--paired{ padding-top: 0; }

/* =========================================================================
   ЕСЛИ ЗАДАЧА БОЛЬШЕ (#more)
   Раньше здесь был тёмный блок «чего мы не делаем» со списком через
   крестики. Он честно предупреждал, но читался как отказ: тёмная плита
   среди светлых, пять строк с «×» — человек уходил с ощущением, что
   ему отказали, ещё не спросив.

   Смысл тот же, роль другая: не граница, а адрес. Тот же список стоит
   как перечень задач, с которыми идут в студию, а не как перечень
   отказов. Отсюда и оформление: белая плита вместо тёмной, бледно-синяя
   панель вместо крестиков, кнопка вместо ссылки в конце абзаца.

   Ограничение при этом не спрятано. Оно осталось строкой под кнопкой:
   отдельный проект, отдельная цена. Сказать это надо — но тихо и один
   раз, а не пятью строками с крестиками.
   ========================================================================= */
.more{
  background: #fff; border-radius: var(--r-slab);
  padding: clamp(28px, 3.6vw, 52px);
  display:grid; gap: 26px 48px;
}

/* На узком порядок другой, чем на широком: сначала объяснение, потом
   список задач и только потом кнопка. Человек должен увидеть, что
   студия делает, до того как ему предложат написать — иначе кнопка
   стоит раньше повода на неё нажать. На широком список виден сразу,
   поэтому кнопка возвращается к тексту. */
@media (min-width: 900px){
  .more{
    grid-template-columns: 1.05fr .95fr;
    grid-template-areas: "intro panel" "act panel";
    grid-template-rows: auto auto;
    align-items: start; gap: 26px 56px;
  }
  .more__intro{ grid-area: intro; }
  .more__act{ grid-area: act; }
  .more__panel{ grid-area: panel; align-self: center; }
}

.more__title{
  font-size: clamp(24px, 2.8vw, 34px); margin: 0 0 14px;
}
.more__lead{
  font-size: 16px; line-height: 1.55; color: var(--text-2); margin: 0 0 12px;
}
.more__lead b{ color: var(--text); font-weight: 600; }
.more__lead:last-child{ margin-bottom: 0; }

/* Оговорка про цену — самым тихим цветом и мелким кеглем: она нужна,
   но не она здесь главная мысль */
.more__note{
  margin: 14px 0 0; font-size: 14.5px; line-height: 1.45; color: var(--text-3);
}

/* Панель со списком. Бледно-синяя, а не серая: серое читалось бы как
   «неактивно», а синее на этой странице — цвет действия */
.more__panel{
  background: var(--blue-pale); border-radius: var(--r-card);
  padding: clamp(20px, 2.4vw, 28px);
}
.more__panel-title{
  font-family: var(--font-heading); font-size: 15px; font-weight: 700;
  letter-spacing: .02em; text-transform: uppercase;
  color: var(--blue-ink); margin: 0 0 4px;
}

/* Ни крестиков, ни галочек. Крестик читается как отказ, галочка — как
   обещание, что это входит в цену; здесь неверно и то и другое.
   Строки разделены линией — это просто перечень */
.more__list{ display:grid; }
.more__list li{
  padding: 13px 0; font-size: 15.5px; line-height: 1.45; color: var(--text);
  border-top: 1px solid rgba(28,106,224,.16);
}
.more__list li:first-child{ border-top: 0; }


/* =========================================================================
   РЕКВИЗИТЫ ПОД КНОПКОЙ
   Их ищут редко, но целенаправленно: чтобы скопировать в договор или
   платёжку. Разворачивать их постоянно значит отдавать половину блока
   контактов таблице, которая нужна одному из ста, — и заслонять ею
   телефон, который нужен всем. Кнопка, а не отдельная страница:
   уходить со страницы ради строчки со счётом незачем.

   Числа набраны моноширинным и с интервалом между знаками: счёт
   переписывают вручную, и «0» с «О» здесь не должны быть похожи.
   ========================================================================= */
.req{ margin-top: 28px; }
.req__head{
  display: inline-flex; align-items: center; gap: 9px;
  min-height: 48px; padding: 12px 20px;
  border-radius: var(--r-sm); cursor: pointer;
  font-family: var(--font-heading); font-size: 15.5px; font-weight: 600;
  color: #fff; box-shadow: inset 0 0 0 1px var(--ink-line);
  transition: background .16s ease;
  list-style: none;
}
.req__head::-webkit-details-marker{ display: none; }
.req__head:hover{ background: var(--ink-2); }
.req__chev{ transition: transform .24s var(--ease-out); }
.req[open] .req__chev{ transform: rotate(180deg); }

/* Высоту ведёт скрипт, поэтому обрезка на самой обёртке, а поля —
   на внутреннем блоке: при нулевой высоте поля продолжали бы
   занимать место */
.req__body{ overflow: hidden; }
.req__inner{
  display: grid; gap: 12px; padding-top: 12px;
}
@media (min-width: 760px){ .req__inner{ grid-template-columns: 1fr 1fr; } }

.req__group{
  background: var(--ink-2); border-radius: var(--r-card);
  padding: clamp(20px, 2.4vw, 28px);
}
.req__group-title{
  font-family: var(--font-heading); font-size: 13px; font-weight: 700;
  letter-spacing: .07em; text-transform: uppercase;
  color: var(--blue); margin: 0 0 16px;
}
.req__list{ margin: 0; display: grid; gap: 14px; }
.req__row{ display: grid; gap: 3px; }
.req__row dt{ font-size: 13.5px; color: var(--on-dark-3); }
.req__row dd{ margin: 0; font-size: 15.5px; line-height: 1.45; color: #fff; }
.req__num{
  font-variant-numeric: tabular-nums; letter-spacing: .03em;
  overflow-wrap: anywhere;
}

/* =========================================================================
   НАВЕДЕНИЕ НА КАРТОЧКИ — процесс, что входит, дополнительно

   ГЛАВНОЕ ПРАВИЛО: карточка под курсором не меняет своих размеров
   и не двигается. Первая версия поднимала её на два пикселя — и она
   дёргалась. Причина не в тормозах: карточка уезжала из-под курсора,
   курсор оказывался снаружи, наведение снималось, карточка падала
   обратно под курсор — и так по кругу. У кромок и в зазорах между
   карточками это повторялось несколько раз в секунду.

   Поэтому у самой карточки меняется только заливка и кант — то, что
   рисуется, но не занимает места. Двигаться разрешено лишь тому, что
   лежит внутри и не задаёт её границ: знак в плашке. Его поворот
   на область наведения не влияет.

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

   Всё под `hover: hover` и `pointer: fine`. На тачскрине наведения
   нет, а состояние после касания залипает.
   ========================================================================= */
@media (hover: hover) and (pointer: fine) {

  .tl__card, .inc-card, .extra-card{
    transition: background-color .2s ease, box-shadow .2s ease;
  }

  /* ---- процесс: карточка светлеет до белого ----
     Наведение ловим на всей строке шага, а не на карточке: в строку
     входит и номер на рельсе, так что подвести курсор можно к любой
     её части. Карточка светлеет, кант не даёт ей слиться с плитой.

     Номер на рельсе пробовали подсвечивать синим — не прижилось:
     он и так набран сине-фиолетовым, разница получалась на грани
     различимости. Полумера хуже, чем её отсутствие. */
  .tl__step:hover .tl__card{
    background: #fff; box-shadow: inset 0 0 0 1px var(--lav-2);
  }

  /* Бесплатный шаг залит синим — светлеть ему некуда, поэтому он
     наоборот углубляется. Тот же жест, обратное направление. */
  .tl__step:hover .tl__card--accent{
    background: var(--blue-ink); box-shadow: none;
  }

  /* ---- что входит: знак разворачивается лицом ----
     Плашка стоит под углом в семь градусов. При наведении угол уходит
     в ноль — предмет как будто поворачивается к вам. Двигается только
     плашка: размеров карточки она не задаёт, и область наведения
     остаётся на месте. Приём достался бесплатно — поворот уже был
     в разметке. */
  .inc-card:hover{ box-shadow: inset 0 0 0 2px var(--blue); }
  .inc-card__icon,
  .inc-card__icon svg{ transition: transform .3s var(--ease-out); }
  .inc-card:hover .inc-card__icon{ transform: rotate(0deg); }
  .inc-card:hover .inc-card__icon svg{ transform: rotate(0deg); }

  /* ---- дополнительно: знак загорается синим ----
     Фон здесь уже тёмный, поэтому карточка идёт на шаг вверх по той же
     лестнице тонов: --ink-2 → --ink-3. А квадрат со знаком заливается
     синим — единственное цветное пятно на всей плите, и появляется оно
     ровно там, куда смотрят. */
  .extra-card:hover{ background: var(--ink-3); }
  .extra-card__icon{ transition: background-color .2s ease, color .2s ease; }
  .extra-card:hover .extra-card__icon{ background: var(--blue); color: #fff; }
}

/* «Уменьшить движение» — про перемещения, а не про подсветку: цвет
   и кант остаются, поворот плашки снимается. */
@media (prefers-reduced-motion: reduce){
  .inc-card:hover .inc-card__icon{ transform: rotate(-7deg); }
  .inc-card:hover .inc-card__icon svg{ transform: rotate(7deg); }
}

/* =========================================================================
   Вопросы — состояния свёрнут, раскрыт, фокус
   ========================================================================= */
.faq-list{ display:flex; flex-direction: column; border-top: 1px solid var(--lav-2); max-width: 960px; }
.faq-item{ border-bottom: 1px solid var(--lav-2); }
.faq-item__q{
  display:flex; align-items:center; justify-content: space-between; gap: 24px;
  min-height: var(--tap); padding: 26px 4px;
  font-family: var(--font-heading); font-size: clamp(17px, 1.8vw, 21px);
  font-weight: 700; letter-spacing:-.02em; color: var(--text);
  cursor: pointer; list-style: none; transition: color .2s ease;
}
.faq-item__q::-webkit-details-marker{ display:none; }
.faq-item__q:hover{ color: var(--blue); }
.faq-item__q:focus-visible{ outline: 2px solid var(--blue); outline-offset: -2px; border-radius: 10px; }
.faq-item__chevron{ flex-shrink:0; color: var(--text-3); transition: transform .3s var(--ease-out), color .2s ease; }
.faq-item[open] > .faq-item__q{ color: var(--blue); }
.faq-item[open] > .faq-item__q .faq-item__chevron{ transform: rotate(180deg); color: var(--blue); }
/* Поля живут на внутренней обёртке, а не здесь: анимируется высота
   самого .faq-item__a, и оставь поля на нём — при нулевой высоте они
   продолжали бы занимать место, а в конце ответ дёргался бы. */
.faq-item__a{ overflow: hidden; }
.faq-item__inner{ padding: 0 40px 26px 4px; font-size: 16.5px; line-height: 1.55; color: var(--text-2); max-width: 760px; }

/* =========================================================================
   Место под портфолио
   Раздел заложен, но скрыт: сайтов ещё не сдано, чужих работ не будет.
   ========================================================================= */
.works-grid{ display:grid; gap: 12px; }
@media (min-width: 760px){ .works-grid{ grid-template-columns: repeat(3, 1fr); } }
.work-card{ border-radius: var(--r-card); background: var(--lav); overflow: hidden; }
.work-card__shot{ aspect-ratio: 4 / 3; background: var(--lav-2); }
.work-card__body{ padding: 22px 24px 26px; }
.work-card__title{ font-family: var(--font-heading); font-size: 18px; font-weight: 600; letter-spacing:-.02em; margin-bottom: 6px; }
.work-card__meta{ font-size: 14.5px; color: var(--text-2); }

/* =========================================================================
   МАКЕТЫ — лента, которая едет вбок
   Слева выровнена по колонке текста, справа уезжает за край экрана.
   Обрез на краю — единственный честный способ сказать «здесь есть ещё»,
   не рисуя ни стрелок, ни точек: человек видит начатую карточку и
   тянет. Отступы считаются от той же сетки, что и .lp-wrap, поэтому
   первый макет стоит ровно под заголовком раздела.
   ========================================================================= */
/* =========================================================================
   ЛЕНТА МАКЕТОВ — Swiper
   Двухслойно: без скрипта .shots остаётся обычной прокруткой вбок
   (как было), со скриптом Swiper перехватывает её и добавляет
   перетаскивание, стрелки, клавиатуру и полосу. Класс is-swiper ставит
   скрипт — до него ни одно правило Swiper не должно ничего ломать.

   Лента идёт во всю ширину окна, а не внутри колонки: обрезанная
   карточка у края и есть приглашение тянуть. Отступ до первой карточки
   считает скрипт (slidesOffsetBefore) — чтобы она вставала ровно под
   заголовком, а не под краем экрана.
   ========================================================================= */
.shots{
  padding: 4px 0 20px;
}
/* Пока Swiper не поднялся — родная прокрутка. Перебиваем overflow
   из swiper-bundle.css: его правило идёт раньше в порядке подключения */
.shots:not(.is-swiper){
  overflow-x: auto; overscroll-behavior-x: contain;
  scroll-snap-type: x proximity;
  padding-left: max(24px, calc((100% - 1192px) / 2));
  padding-right: max(24px, calc((100% - 1192px) / 2));
  scroll-padding-left: max(24px, calc((100% - 1192px) / 2));
  scrollbar-width: thin; scrollbar-color: var(--lav-3) transparent;
}
.shots:not(.is-swiper) .swiper-wrapper{ display: flex; gap: 12px; }
.shots:focus-visible{ outline: 2px solid var(--blue); outline-offset: -2px; border-radius: 8px; }

.shot{
  position: relative; flex: 0 0 auto; margin: 0;
  width: clamp(230px, 24vw, 300px);
  height: auto;                       /* swiper-slide тянется по высоте */
  background: #fff; border-radius: 18px; overflow: hidden;
  scroll-snap-align: start;
  /* Тонкий кант: у части макетов светлый верх, и без канта такая
     карточка растворялась бы в белой плите */
  box-shadow: inset 0 0 0 1px var(--lav-2);
}
/* Шапка окна: та же синяя точка и две нейтральные, что у макетов
   первого экрана — карточки из одного набора */
.shot__bar{
  display: flex; align-items: center; gap: 5px;
  height: 28px; padding: 0 12px; background: var(--lav);
}
.shot__bar i{ width: 7px; height: 7px; border-radius: 50%; background: var(--lav-3); }
.shot__bar i:first-child{ background: var(--blue); }

.shot img{
  display: block; width: 100%; height: auto;
  aspect-ratio: 320 / 480; object-fit: cover; object-position: top center;
}
/* Низ уходит в размытие: карточка не скриншот целиком, а обещание,
   что за ним есть продолжение */
.shot::after{
  content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 84px;
  background: linear-gradient(180deg, rgba(255,255,255,0), #fff 88%);
  pointer-events: none;
}

/* ---- стрелки: в шапке раздела, справа от заголовка ----
   Не поверх ленты: накладка закрыла бы макет, ради которого раздел
   и сделан, а на узком экране ей просто негде стоять. */
.shots__nav{ display: flex; gap: 8px; flex: 0 0 auto; align-self: flex-end; }
.shots__arrow{
  width: 48px; height: 48px; flex-shrink: 0;
  display: grid; place-items: center;
  border: none; border-radius: var(--r-sm); cursor: pointer;
  background: var(--lav); color: var(--text);
  transition: background-color .16s ease, color .16s ease, opacity .16s ease;
}
.shots__arrow:hover{ background: var(--lav-2); }
.shots__arrow:active{ background: var(--lav-3); }
/* Класс ставит сам Swiper, когда дальше листать некуда. Кнопка гаснет,
   но остаётся на месте: исчезни она — соседняя прыгнула бы вбок. */
.shots__arrow.swiper-button-disabled{ opacity: .32; pointer-events: none; }

/* На узком стрелок нет: там листают пальцем, а две кнопки под
   заголовком занимают целую строку ради того, что и так делается
   касанием. Клавиатура не страдает — точки тоже кнопки, и по ним
   можно пройти табом. */
@media (max-width: 620px){ .shots__nav{ display: none; } }

/* ---- точки ----
   Полосу прокрутки заменили точками: полоса показывает, сколько
   осталось, а точка — где ты. Для десяти макетов важнее второе.
   dynamicBullets ужимает дальние точки к краям, поэтому ряд не растёт
   в орнамент из десяти одинаковых кружков.

   Кнопки, а не div: по ним кликают и до них добираются с клавиатуры. */
/* Ряд лежит под лентой и центрируется сам. Правила Swiper тут не
   работают: они написаны для точек внутри .swiper, а наши снаружи —
   иначе они ездили бы вместе с лентой. Поэтому и позиционирование,
   и центровка свои. */
.shots__dots.swiper-pagination{
  position: relative; left: auto; top: auto; bottom: auto;
  width: auto; margin: 18px 0 0;
  text-align: center; line-height: 1;
  display: none;                      /* появляются вместе со Swiper */
}
.is-swiper ~ .shots__dots.swiper-pagination{ display: block; }

.shots__dots .swiper-pagination-bullet{
  display: inline-block; vertical-align: middle;
  width: 9px; height: 9px; margin: 0 5px; padding: 0; border: none;
  background: var(--lav-3); opacity: 1;
  border-radius: 50%; cursor: pointer;
  transition: background-color .2s ease;
}
.shots__dots .swiper-pagination-bullet:hover{ background: var(--text-3); }
.shots__dots .swiper-pagination-bullet-active{ background: var(--blue); }
.shots__dots .swiper-pagination-bullet:focus-visible{
  outline: 2px solid var(--blue); outline-offset: 3px;
}

@media (max-width: 900px){
  .shots:not(.is-swiper){
    padding-left: max(16px, calc((100% - 1192px) / 2));
    padding-right: max(16px, calc((100% - 1192px) / 2));
    scroll-padding-left: 16px;
  }
  .shot{ width: clamp(200px, 62vw, 260px); }
}

/* =========================================================================
   ПРИЗЫВЫ НА ПУТИ
   Три штуки по ходу страницы плюс форма в конце. Они намеренно не
   одинаковые: одинаковые повторяются в глазах как реклама, и человек
   перестаёт их замечать уже на втором.

   Разное всё: композиция, подложка и довод. После процесса — синяя
   плита с крупным набором и обещанием показать. После состава — тихая
   белая строка про цену: ниже идёт индиговая плита платных услуг,
   и второй цветной блок подряд перебил бы её. После рассказа о студии —
   тёмная плита по центру, единственный призыв, набранный по оси.
   ========================================================================= */
.cta{ border-radius: var(--r-slab); }
.cta__title{ margin: 0 0 14px; }
.cta__text{ margin: 0 0 28px; font-size: clamp(16.5px, 1.7vw, 19px); line-height: 1.5; }

/* --- промо: тот же сайт дешевле, если подождать ---
   Единственный на странице блок, который что-то предлагает взамен,
   а не просто зовёт, — поэтому и выглядит иначе. Фиолетовый не занят
   больше нигде, так что цвет сам по себе говорит «это другое».
   Цена вынесена в белую карточку и набрана крупно: внутри абзаца
   цифру проматывают, отдельно — читают. */
/* =========================================================================
   ПРОМО: СКИДКА ЗА СРОК
   Стоит не внутри плиты, а в шве между двумя — на тёмном фоне самой
   страницы, во всю ширину. Раньше это была фиолетовая плитка среди
   светлых разделов: цвет отличался, а среда была та же, и блок читался
   как ещё один раздел. Здесь он читается как пауза — единственное
   место в середине страницы, где светлые плиты расступаются.

   Плиты по краям скруглены, шов между ними тёмный: полоса просто
   расширяет этот шов и потому не выглядит вставкой.
   ========================================================================= */
.promo-band{
  background: var(--ink); color: #fff;
  padding: clamp(52px, 6.4vw, 96px) 0;
}
.promo{ display: grid; gap: 28px; }
@media (min-width: 900px){
  .promo{ grid-template-columns: 1.12fr .88fr; gap: 56px; align-items: center; }
}

/* Фиолетовый на странице больше нигде не встречается. На плите он был
   фоном, здесь — плашкой и цифрой: на тёмном достаточно двух пятен,
   залить им всю полосу значило бы перебить и первый экран, и подвал */
.promo__badge{
  display: inline-flex; align-items: center;
  background: var(--violet); color: #fff;
  font-size: 14px; font-weight: 700; letter-spacing: -.01em;
  padding: 8px 14px; border-radius: var(--r-sm); margin-bottom: 20px;
}
.promo__title{ font-size: clamp(28px, 3.8vw, 46px); color: #fff; margin: 0 0 14px; }
.promo__lead{
  font-size: clamp(16.5px, 1.7vw, 19px); line-height: 1.5;
  color: var(--on-dark-2); margin: 0 0 30px; max-width: 46ch;
}

/* Цена вынесена из текста в отдельную карточку: внутри абзаца цифру
   проматывают, отдельной карточкой — читают */
.promo__price{
  background: #fff; color: var(--text);
  border-radius: var(--r-card);
  padding: clamp(26px, 3vw, 40px) clamp(20px, 2.4vw, 32px);
  text-align: center;
}
.promo__old{ margin: 0 0 10px; font-size: 16px; color: var(--text-3); }
.promo__old s{ text-decoration-thickness: 2px; }
.promo__new{
  margin: 0; font-family: var(--font-heading);
  font-size: clamp(44px, 6vw, 72px); font-weight: 800;
  letter-spacing: -.045em; line-height: 1; color: var(--violet);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.promo__new em{ font-style: normal; font-size: .36em; margin-left: 8px; vertical-align: .95em; }
.promo__term{ margin: 14px 0 0; font-size: 16px; color: var(--text-2); }

/* --- белая строка --- */
/* Три части в строку: заголовок, довод, кнопка. Довод стоит ровно
   между ними — так его читают по дороге к кнопке, а не после того,
   как решение уже принято. */
.cta--strip{
  background: #fff; border-radius: var(--r-card);
  padding: clamp(22px, 2.6vw, 32px) clamp(24px, 3vw, 40px);
  display:flex; align-items:center; justify-content: space-between;
  gap: 16px 28px; flex-wrap: wrap;
}
.cta__strip-main{ flex: 1 1 260px; min-width: 0; }
.cta--strip .btn{ flex-shrink: 0; }
.cta__strip-title{
  font-family: var(--font-heading); font-size: clamp(19px, 2.1vw, 24px);
  font-weight: 800; letter-spacing:-.03em; line-height: 1.2; color: var(--text);
  margin: 0 0 6px;
}
.cta__strip-text{ margin: 0; font-size: 15.5px; color: var(--text-2); }

/* Довод, ради которого нажимают, стоит последним перед кнопкой и набран
   плашкой: третья серая строка подряд слилась бы с двумя верхними
   и потерялась именно там, где нужна сильнее всего. */
.cta__strip-free{
  display:inline-flex; align-items:center; gap: 8px;
  /* Сжиматься можно, исчезать нельзя: на 360 плашка не помещалась
     в строку целиком и распирала страницу вбок */
  margin: 0; padding: 10px 16px; flex: 0 1 auto; min-width: 0;
  background: var(--blue-pale); color: var(--blue-ink);
  border-radius: 10px; font-size: 15px; font-weight: 600; line-height: 1.3;
}
.cta__strip-free svg{ flex-shrink: 0; }

/* --- тёмная плита по центру --- */
.cta--dark{
  background: var(--ink); color: #fff;
  padding: clamp(34px, 4.8vw, 72px) clamp(26px, 4vw, 56px);
  text-align: center;
}
.cta--dark .cta__title{ font-size: clamp(26px, 3.4vw, 40px); color: #fff; max-width: 22ch; margin-inline: auto; }
.cta--dark .cta__text{ color: var(--on-dark-2); max-width: 52ch; margin-inline: auto; margin-bottom: 30px; }

@media (max-width: 560px){
  .cta--strip{ align-items: stretch; }
  .cta__strip-free{ width: 100%; justify-content: flex-start; }
  .cta--strip .btn, .promo .btn, .cta--dark .btn{ width: 100%; }
}

/* =========================================================================
   КОНТАКТЫ
   Над формой, а не в подвале: подвал читают единицы, а человек, который
   дошёл сюда и не хочет заполнять форму, должен найти телефон за один
   взгляд. Карточки тёмные на тёмном — отделяются тоном, как и всё
   остальное на этой странице.
   ========================================================================= */
.ct__head{ margin-bottom: clamp(24px, 2.8vw, 36px); }
.ct__head .h2{ color: #fff; font-size: clamp(24px, 3vw, 36px); }

.ct__grid{ display:grid; grid-template-columns: 1fr; gap: 12px; }
@media (min-width: 720px){ .ct__grid{ grid-template-columns: repeat(3, 1fr); } }

.ct__card{
  background: var(--ink-2); border-radius: var(--r-card);
  padding: clamp(22px, 2.4vw, 30px);
  display:flex; flex-direction: column; gap: 12px;
  color: #fff; transition: background-color .18s ease;
}
a.ct__card:hover{ background: var(--ink-3); color: #fff; }
.ct__label{
  display:flex; align-items:center; gap: 8px;
  font-size: 14px; color: var(--on-dark-3);
}
.ct__value{
  font-family: var(--font-heading); font-size: clamp(20px, 2.1vw, 25px);
  font-weight: 800; letter-spacing:-.03em; color: #fff;
  font-variant-numeric: tabular-nums;
}
/* Адрес почты длиннее телефона и в узкую карточку не влезал */
.ct__value--mail{ font-size: clamp(17px, 1.8vw, 21px); letter-spacing:-.02em; word-break: break-word; }

.ct__msgs{ display:flex; flex-wrap: wrap; gap: 8px; }
.ct__msg{
  display:inline-flex; align-items:center; justify-content:center;
  min-height: 44px; padding: 10px 20px;
  background: rgba(255,255,255,.10); color: #fff;
  border-radius: var(--r-sm); font-size: 15.5px; font-weight: 600;
  transition: background-color .18s ease;
}
.ct__msg:hover{ background: rgba(255,255,255,.18); color: #fff; }
/* У MAX вместо слова знак: слово «MAX» набором не отличается
   от «Telegram», а знак читается за долю секунды. Название остаётся
   в разметке для чтения с экрана. */
.ct__msg--max{ padding: 10px 18px; }
.ct__msg--max .mark-max{ width: 21px; height: 21px; }

/* ---- график работы ----
   Стоит рядом с контактами, а не в подвале: человек смотрит на телефон
   и тут же должен понять, дозвонится ли сейчас. */
.ct__hours{
  display: flex; align-items: flex-start; gap: 12px;
  margin-top: clamp(20px, 2.2vw, 28px);
  padding: clamp(16px, 1.8vw, 20px) clamp(18px, 2vw, 22px);
  background: var(--ink-2); border-radius: var(--r-card);
}
.ct__hours svg{ flex-shrink: 0; color: var(--blue); margin-top: 1px; }
.ct__hours p{
  margin: 0; font-size: 15.5px; line-height: 1.5; color: var(--on-dark-2);
  max-width: 76ch;
}
.ct__hours b{ color: #fff; font-weight: 600; }

.ct__legal{
  margin: clamp(22px, 2.4vw, 30px) 0 0;
  font-size: 14.5px; color: var(--on-dark-3);
}
.ct__legal span{ margin: 0 8px; color: rgba(255,255,255,.25); }

/* =========================================================================
   Первый шаг
   Синяя плита на тёмном поле — последний цветной блок страницы и самый
   яркий. Состояния поля: пустое, набирается, ошибка, отправка, принято.
   ========================================================================= */
.lp-section--start{ padding: clamp(22px, 2.4vw, 34px) 0 clamp(56px, 6vw, 96px); }
.contact{
  background: var(--blue); border-radius: var(--r-slab);
  padding: clamp(30px, 4vw, 64px);
  display:grid; gap: 36px; position: relative; overflow: hidden; color:#fff;
}
@media (min-width: 940px){ .contact{ grid-template-columns: 1.05fr .95fr; gap: 56px; align-items: start; } }
.contact__blob{ display: none; }
.contact__info .eyebrow{ color: rgba(255,255,255,.62); }
.contact__info .h2{ font-size: clamp(27px, 3.4vw, 42px); color:#fff; margin: 0 0 18px; }
.contact__desc{ font-size: 17px; color: rgba(255,255,255,.8); line-height: 1.5; margin: 0 0 32px; max-width: 44ch; }
.contact__steps{ display:flex; flex-direction:column; gap: 14px; margin: 0; }
.contact__steps li{ display:flex; align-items:flex-start; gap: 14px; font-size: 16px; color:#fff; line-height: 1.4; }
.contact__step-num{
  flex-shrink:0; width: 30px; height: 30px; border-radius: 9px;
  background: rgba(255,255,255,.18); color:#fff; font-weight:600; font-size: 14px;
  display:flex; align-items:center; justify-content:center;
}
.contact-card{
  background: #fff; color: var(--text); border-radius: var(--r-card);
  padding: clamp(24px, 3vw, 36px); align-self: start;
}
.contact-card__label{ font-size: 15px; font-weight: 500; color: var(--text-2); margin-bottom: 12px; display:block; }
.contact-card__form{ display:flex; flex-direction: column; gap: 12px; }
.contact-card__form input{
  width: 100%; min-height: 56px; padding: 16px 18px;
  border: 2px solid var(--lav-2); border-radius: var(--r-sm);
  font-size: 16px;                 /* не меньше 16px, иначе телефон зумит форму */
  background: #fff; color: var(--text);
  transition: border-color .18s ease, background-color .18s ease;
}
.contact-card__form input:hover{ border-color: var(--lav-3); }
.contact-card__form input:focus{ outline:none; border-color: var(--blue); }
.contact-card__form input:focus-visible{ outline: none; }
.contact-card__form.is-filled input{ border-color: var(--lav-3); }
.contact-card__form.is-error input{ border-color: var(--red); background: var(--red-soft); }
.contact-card__error{
  display:none; align-items:flex-start; gap: 8px;
  font-size: 14px; color: var(--red); line-height: 1.4;
}
.contact-card__form.is-error .contact-card__error{ display:flex; }
.contact-card__alt{ margin-top: 18px; font-size: 15px; color: var(--text-2); line-height: 1.5; }
.contact-card__alt a{ font-weight: 600; color: var(--blue-ink); }
.contact-card__alt a:hover{ color: var(--text); }

/* Подтверждение вместо обрыва */
.contact-card__done{ text-align: left; }
.contact-card__done-mark{
  width: 56px; height: 56px; border-radius: var(--r-sm);
  background: var(--blue); color: #fff;
  display:grid; place-items:center; margin-bottom: 20px;
}
.contact-card__done-title{ font-family: var(--font-heading); font-size: 22px; font-weight: 600; letter-spacing:-.03em; margin-bottom: 12px; }
.contact-card__echo{
  background: var(--lav); border-radius: var(--r-sm);
  padding: 15px 18px; font-size: 16px; color: var(--text);
  margin-bottom: 16px; word-break: break-word;
}
.contact-card__done-text{ font-size: 15.5px; color: var(--text-2); line-height: 1.5; margin-bottom: 22px; }

/* =========================================================================
   Подвал — на тёмном поле страницы, без отдельной подложки
   ========================================================================= */
.footer{ border-top: 1px solid var(--ink-line); padding: clamp(44px, 5vw, 72px) 0 36px; }
.footer__top{ display:grid; gap: 36px; padding-bottom: 44px; }
@media (min-width: 820px){ .footer__top{ grid-template-columns: 1.6fr repeat(2, 1fr); } }
.footer__tagline{ font-size: 15px; line-height: 1.5; color: var(--on-dark-2); margin: 16px 0 0; max-width: 340px; }
.footer__tagline b{ color: #fff; font-weight: 600; }
.footer__col{ display:flex; flex-direction: column; gap: 2px; }
.footer__col-title{ font-family: var(--font-heading); font-weight: 600; font-size: 13px; letter-spacing:.07em; text-transform: uppercase; color: var(--on-dark-3); margin-bottom: 10px; }
.footer__col a{ display:inline-flex; align-items:center; min-height: var(--tap); font-size: 15px; color: var(--on-dark-2); width: fit-content; }
.footer__col a:hover{ color: #fff; }
/* В подвале кнопки мессенджеров те же, что в шапке, — только там они
   спрятаны до 1200 пикселей, а здесь нужны на любой ширине */
.footer__msgs{ display: flex; gap: 8px; margin-top: 10px; }
.footer__msgs .lp-round{ display: grid; }
.footer__hours{ margin: 14px 0 0; font-size: 14.5px; color: var(--on-dark-3); }

/* Последняя колонка прижата к правому краю контейнера: иначе она
   заканчивалась за 175 пикселей до него, и подвал справа обрывался
   в пустоту, хотя сетка туда доходила. Только от 820 — ниже колонки
   складываются в одну, и правый край там был бы просто ошибкой. */
@media (min-width: 820px){
  .footer__col--end{ align-items: flex-end; text-align: right; }
  .footer__col--end .footer__msgs{ justify-content: flex-end; }
}
.footer__bottom{ display:flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 14px; padding-top: 26px; border-top: 1px solid var(--ink-line); }
.footer__copy{ font-size: 14px; color: var(--on-dark-3); line-height: 1.6; }
.footer__legal{ display:flex; gap: 22px; flex-wrap: wrap; align-items:center; }
.footer__legal a{ display:inline-flex; align-items:center; min-height: var(--tap); font-size: 14px; color: var(--on-dark-3); }
.footer__legal a:hover{ color: #fff; }
.footer__legal span{ font-size: 14px; color: var(--on-dark-3); }

/* Липкая шапка не должна накрывать якорь */
section[id]{ scroll-margin-top: 92px; }
html{ scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce){
  html{ scroll-behavior: auto; }
  .ticker__track, .mockup-track--up, .mockup-track--down{ animation: none; }
}

/* Тупик в конце списка вопросов. Лаванда, а не белое: на белой плите
   раздела блок должен читаться как отдельная реплика, иначе он сольётся
   с последним ответом и его пролистают вместе с ним. */
.faq-cta{
  margin-top: clamp(28px, 3.2vw, 44px);
  padding: clamp(24px, 3vw, 36px);
  background: var(--lav); border-radius: var(--r-card);
  display: grid; justify-items: center; text-align: center; gap: 18px;
}
.faq-cta__text{
  margin: 0; max-width: 34ch;
  font-family: var(--font-heading); font-weight: 600;
  font-size: clamp(19px, 2.2vw, 24px); line-height: 1.3;
  letter-spacing: -.02em; color: var(--text);
}
/* Вторая кнопка белая, а не .btn--secondary: у той фон — та же
   лаванда, что у самой врезки, и на ней кнопка пропадала начисто,
   оставляя на экране голую надпись. */
.faq-cta__btns{ display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; }
.faq-cta__btns .btn--white{ box-shadow: inset 0 0 0 1px var(--lav-3); }
.faq-cta__hours{ margin: 0; font-size: 14.5px; color: var(--text-3); }

@media (max-width: 560px){
  /* Кнопки в столбик и во всю ширину: рядом они дают по 150 пикселей
     на «Спросить в Telegram», и подпись ломается посреди слова. */
  .faq-cta__btns{ display: grid; width: 100%; gap: 8px; }
  .faq-cta__btns .btn{ width: 100%; }
  .faq-cta__btns .btn__arrow{ display: none; }
}

/* =========================================================================
   Адаптив. Опорные ширины 360, 768, 1440. Мобильный основной.
   ========================================================================= */
@media (max-width: 900px){
  :root{ --r-slab: 28px; --r-card: 20px; }
  .lp-wrap, .ticker-clip{ padding: 0 16px; }
  .slab{ border-radius: var(--r-slab); }

  /* Заголовки дышат. На широком экране заголовок занимает одну-две
     строки, и плотный интерлиньяж 1.02 работает как приём. На узком
     тот же заголовок разваливается на четыре-пять строк, и строки
     начинают липнуть друг к другу — читать становится тяжело именно
     там, где читают с телефона в руке. */
  .hero__title, .h2, .section-head .h2{ line-height: 1.2; }

  .hero-section{ padding: 24px 0 32px; }
  .hero{ min-height: 0; }
  .hero__title{ font-size: 32px; letter-spacing:-.03em; margin-bottom: 18px; }
  .hero__text{ font-size: 16px; margin-bottom: 28px; }
  .badge{ margin-bottom: 22px; font-size: 14px; padding: 8px 14px; }
  .hero__pillars{ margin-top: 30px; padding-top: 26px; gap: 22px 12px; }

  .ticker__item{ font-size: 12.5px; letter-spacing:.05em; }


  .section-head{ margin-bottom: 28px; }
  .extra, .contact{ padding: 28px 22px; border-radius: var(--r-slab); }
  .extra__head{ margin-bottom: 28px; }
  .srv-abeta{ padding: 24px 22px; }
  .tl__card{ padding: 22px; }
  .faq-item__q{ font-size: 17px; padding: 20px 2px; }
  .faq-item__inner{ padding: 0 8px 20px 2px; font-size: 16px; }

  /* --- блок выгоды: цена в одну строку ---
     Карточка из трёх этажей съедала пол-экрана ради одного числа.
     В строку: зачёркнутая старая цена, новая и срок. Числа читаются
     подряд, как их и произносят вслух, а блок становится короче
     примерно на треть. */
  .promo__price{
    display: flex; align-items: baseline; justify-content: center;
    flex-wrap: wrap; gap: 4px 12px;
    padding: 18px 20px; text-align: left;
  }
  .promo__old{ margin: 0; font-size: 15px; }
  .promo__new{ font-size: clamp(32px, 9vw, 44px); }
  .promo__new em{ font-size: .4em; margin-left: 5px; vertical-align: .8em; }
  .promo__term{ margin: 0; font-size: 14.5px; flex-basis: 100%; text-align: center; }

  /* --- «о сервисе»: плитки 01–03 перед блоком Абета ---
     Плитки объясняют, почему это не конструктор и откуда цена, —
     то есть отвечают на возражение, которое возникает ровно после
     рассказа о сервисе. Блок Абета — уже про другое, про запасной
     выход к студии, и стоять он должен последним.

     Перестановка чистая, без дублей в разметке: .srv-story на узких
     перестаёт быть коробкой (display:contents), её текст и врезка
     Абета становятся соседями .srv-adv в общей колонке, и порядок
     задаётся order. Копия плиток вторым куском разметки разошлась бы
     с оригиналом при первой же правке текста. */
  #about > .lp-wrap{ display: flex; flex-direction: column; }
  #about .srv-story{ display: contents; }
  #about .section-head{ order: 1; }
  #about .srv-who{ order: 2; }
  #about .srv-story__text{ order: 3; margin-top: clamp(28px, 4vw, 40px); }
  #about .srv-adv{ order: 4; margin-top: 20px; }
  #about .srv-abeta{ order: 5; margin-top: 12px; }
}

@media (max-width: 560px){
  /* На 360 логотип, кнопка и бургер не помещались в строку шапки.
     С появлением трёх значков связи стало тесно ещё на 430: пять
     предметов в строке при 328 пикселях свободного места. Ужимаем
     всё, кроме размеров самих кнопок — 44 пикселя это пределы
     пальца, и отнимать у них нельзя. */
  .lp-header__in{ padding: 10px 16px; gap: 8px; min-height: 66px; }
  .lp-header__right{ gap: 5px; }
  /* Знак ростом с кнопки связи: в строке шапки он теперь один из
     пяти предметов подряд, и меньший размер читался бы как случайность,
     а не как иерархия. Ширину строки это не трогает — на самых узких
     слово рядом всё равно спрятано. */
  .lp-header .lp-logo{ font-size: 17px; gap: 9px; }
  .lp-header .lp-logo__mark{ width: var(--tap); height: var(--tap); border-radius: var(--r-sm); }
  .lp-header .btn--primary{ padding: 12px 14px; font-size: 14.5px; min-height: var(--tap); }
  /* Стрелка в кнопке шапки — украшение: рядом с ней и так всё нажимается */
  .lp-header .btn--primary .btn__arrow{ display: none; }
  .lp-menu{ padding: 4px 16px 18px; }

  .hero__actions{ flex-direction: column; align-items: stretch; }
  .hero__actions .btn{ width: 100%; }
  /* Длинная подпись переносится на три строки — стрелка сбоку от
     трёхстрочного текста выглядит как опечатка, на узком убираем */
  .hero__actions .btn__arrow{ display: none; }
  .hero-pillar{ flex: 1 1 100%; }

  /* Рельс и номера ужимаются, чтобы карточке осталась ширина */
  .tl::before{ left: 19px; top: 20px; bottom: 20px; }
  .tl__step{ grid-template-columns: 40px minmax(0, 1fr); gap: 14px; }
  .tl__node{ width: 42px; height: 42px; font-size: 16px; border-radius: 14px; }

}

/* Самые узкие: у логотипа остаётся один знак.
   Слово «Веб Просто» стоит 94 пикселя — ровно столько не хватает,
   чтобы значки связи, кнопка и бургер встали в строку. Знак
   узнаваем и один, а название повторено в первом же заголовке
   на сантиметр ниже. Ссылка при этом остаётся подписанной
   через aria-label, так что вслух её читают целиком. */
@media (max-width: 440px){
  .lp-header .lp-logo__text{ display: none; }
  /* Отступ убираем только в шапке. Без этой оговорки правило
     доставалось и подвалу, где слово никуда не пряталось, —
     и там «Веб Просто» прилипало к знаку вплотную. */
  .lp-header .lp-logo{ gap: 0; }
}

/* Планшет: правая часть первого экрана встаёт рядом с текстом */
@media (min-width: 640px) and (max-width: 1023px){
  /* Вторую колонку отводим только тем вариантам, у которых справа
     что-то есть. Раньше правило висело на .hero вообще, и после
     удаления превью вариант А получил бы пустые 300 пикселей. */
  .hero:has(.hero__flow){ grid-template-columns: minmax(0,1fr) 300px; gap: 36px; }
  .hero__content{ max-width: none; }
  .hero__flow{ width: 300px; margin-top: 0; }
  .hero__text{ max-width: none; }
}

/* =========================================================================
   КУРСОР
   Появляется только там, где есть настоящая мышь: `hover: hover` плюс
   `pointer: fine` отсекают телефоны, планшеты и гибриды в режиме
   касания. Включается скриптом — без него класса на <html> не будет,
   родной курсор останется на месте и ничего не сломается.

   Кольцо отстаёт от точки на несколько кадров: точка говорит, где
   курсор сейчас, кольцо — откуда он пришёл.

   Страница чередует белые, лавандовые, синие, фиолетовые и почти
   чёрные плиты, и одного цвета, видного на всех, не существует.
   Режим наложения difference эту задачу решает, но на цветных плитах
   выдаёт дополнительный цвет: на фиолетовой кольцо становится
   салатовым, на синей — оранжевым. Поэтому взято двухтональное
   кольцо: белая линия плюс тёмный ореол в пиксель. На тёмном видно
   белое, на светлом — тёмное, и ни на чём не появляется цвет,
   которого нет в палитре.

   В полях ввода родной курсор возвращается: текстовая балка показывает
   место вставки, и подменять её кольцом — терять смысл.
   ========================================================================= */
@media (hover: hover) and (pointer: fine){
  html.has-cursor, html.has-cursor *{ cursor: none; }
  html.has-cursor input, html.has-cursor textarea{ cursor: text; }
}
.cursor, .cursor__dot{
  position: fixed; top: 0; left: 0; z-index: 999;
  pointer-events: none; border-radius: 50%;
  opacity: 0; transition: opacity .2s ease;
}
html.has-cursor .cursor, html.has-cursor .cursor__dot{ opacity: 1; }
html.has-cursor.is-cursor-out .cursor,
html.has-cursor.is-cursor-out .cursor__dot{ opacity: 0; }

.cursor{
  width: 34px; height: 34px; margin: -17px 0 0 -17px;
  border: 1.5px solid rgba(255,255,255,.92);
  box-shadow: 0 0 0 1.5px rgba(22,31,49,.32), inset 0 0 0 1px rgba(22,31,49,.20);
  transition: width .22s var(--ease-out), height .22s var(--ease-out),
              margin .22s var(--ease-out), background-color .22s ease,
              opacity .2s ease;
}
.cursor__dot{
  width: 5px; height: 5px; margin: -2.5px 0 0 -2.5px;
  background: #fff; box-shadow: 0 0 0 1.5px rgba(22,31,49,.38);
}

/* Над всем, что нажимается, кольцо раскрывается и наливается */
html.is-cursor-hot .cursor{
  width: 56px; height: 56px; margin: -28px 0 0 -28px;
  background: rgba(255,255,255,.18);
}
/* Нажатие: кольцо садится, отклик виден до того, как страница ответит */
html.is-cursor-down .cursor{ width: 26px; height: 26px; margin: -13px 0 0 -13px; }

@media (prefers-reduced-motion: reduce){
  .cursor, .cursor__dot{ display: none; }
}
