/* ============================================================================
   ЧЕСТНЫЙ РАЗГОВОР · ГДЕ БРАТЬ ЗАКАЗЧИКОВ НА ФРИЛАНСЕ В 2026?
   Эфир 21.08.2026, 13:00 МСК — боевая сборка.

   Система: freelance-guarantee (ds-base) + бумажная фактура.
   Фон #f7f7f5 + зерно · чернила #1b0624 · тело #3b3340 · сноски #6f6b74
   акцент #e9a05a → #e4794e · Manrope 200..800 (единственный шрифт).

   ЕДИНАЯ СИСТЕМА БРЕЙКПОИНТОВ: 1199 / 959 / 639 / 374 + резина.
   Пара 1040/600 из исходного ds-base.css сведена сюда — иначе в полосе
   1000–1040px и 601–639px вёрстка попадала между двумя системами.

   ГЛОБАЛЬНОЕ ПРАВИЛО: декоративных линеек-полосок над h2 нет нигде.

   Оглавление:
     1  Токены
     2  Reset + бумажный холст
     3  Каркас секции (.sc) и общие детали
     4  Типографика, кикеры, бейджи, кнопки
     5  Карточки, иконки, чек-строки
     6  HERO
     7  Лид-магнит «лента на скрепке»
     8  Программа «рельса со sticky-заголовком»
     9  Спикеры «визитки с раскрытием»
     10 Разворот «кому стоит быть» + «кому не подойдёт»
     11 «Что ты получишь после эфира»
     12 «Варианты участия»
     13 Финальный CTA
     14 Глоссарий (автономный блок библиотеки)
     15 «Кто мы?» — zerocoder-about, переодетый
     16 Футер — zerocoder-footer (канон + тёплый слой)
     17 Попап регистрации GetCourse
     18 Reveal по скроллу
     19 Reduced motion
     20 Креативный слой — 3D-объекты и сцена финального CTA
   ========================================================================== */

/* ============================================================================
   1. ТОКЕНЫ
   ========================================================================== */
:root{
  /* — поверхности — */
  --ds-linen:#f7f7f5;
  --ds-paper:#ffffff;
  --ds-bone:#edece7;

  /* — чернила — */
  --ds-ink:#1b0624;
  --ds-espresso:#160f0c;
  --ds-charcoal:#292421;
  --ds-graphite:#3b3340;
  --ds-stone:#6f6b74;

  /* — закатный ramp, сужен к тёплой части (решение стилистики) — */
  --ds-sun-1:#e9a05a;
  --ds-sun-2:#e4794e;
  --ds-sun-3:#d9713f;
  --ds-sun-4:#e9a05a;
  --ds-ramp:linear-gradient(90deg,#e9a05a,#e4794e 62%,#d9713f);
  /* ТЕКСТОВАЯ терракота: #e4794e на светлом даёт 2,74–2,94:1 и проваливает AA.
     Затемнённая ступень той же рампы: 4,98:1 на #fff, 4,64:1 на #f7f7f5.
     Правило: --ds-sun-2 — плашки, заливки, линии, точки; --ds-sun-text — текст. */
  --ds-sun-text:#b3542a;

  --ds-tint-1:rgba(233,160,90,.16);   --ds-tint-1-ink:#b06f24;
  --ds-tint-2:rgba(228,121,78,.14);   --ds-tint-2-ink:#c25a32;
  --ds-tint-3:rgba(217,113,63,.14);   --ds-tint-3-ink:#b3542a;
  --ds-tint-4:rgba(233,160,90,.16);   --ds-tint-4-ink:#b06f24;

  /* — хейрлайны — */
  --ds-line:rgba(27,6,36,.10);
  --ds-line-2:rgba(27,6,36,.06);
  --ds-line-dash:rgba(27,6,36,.14);
  --ds-line-dash-strong:rgba(27,6,36,.18);
  --ds-line-on-dark:rgba(255,255,255,.18);

  /* — глубина — */
  --ds-sh-card:0 10px 30px rgba(27,6,36,.07);
  --ds-sh-stage:0 26px 60px rgba(27,6,36,.10);
  --ds-sh-btn:0 10px 26px rgba(27,6,36,.18);
  --ds-sh-badge:0 6px 20px rgba(27,6,36,.16);
  --ds-sh-pop:0 40px 90px rgba(27,6,36,.35);
  --ds-inset-hairline:inset 0 0 0 1px rgba(255,255,255,.5);

  /* — скругления — */
  --ds-r-stage:34px;
  --ds-r-lg:20px;
  --ds-r-md:16px;
  --ds-r-sm:14px;
  --ds-r-xs:12px;
  --ds-r-pill:999px;
  --ds-r-btn:60px;

  /* — ритм — */
  --ds-sec-y:clamp(56px,5vw,84px);
  --ds-sec-x:48px;
  --ds-max:1464px;
  --ds-gap:12px;
  --ds-pad-card:clamp(22px,2vw,30px);
  --ds-pad-card-lg:clamp(26px,2.4vw,38px);

  /* — типографика — */
  --ds-font:'Manrope',system-ui,-apple-system,'Segoe UI',sans-serif;
  --ds-h1:600 clamp(34px,6.3vw,78px)/1.02 var(--ds-font);
  --ds-h2:600 clamp(30px,3.4vw,50px)/1.06 var(--ds-font);
  --ds-h3:600 clamp(17px,1.8vw,22px)/1.22 var(--ds-font);
  --ds-lead:400 clamp(16px,1.4vw,20px)/1.55 var(--ds-font);
  --ds-body:400 16px/1.55 var(--ds-font);
  --ds-small:400 15.5px/1.5 var(--ds-font);
  --ds-note:400 12px/1.55 var(--ds-font);
  --ds-kick:600 12px/1 var(--ds-font);
  --ds-btn-font:600 17px/1 var(--ds-font);
  --ds-ls-display:-.035em;
  --ds-ls-title:-.03em;
  --ds-ls-kick:.09em;

  /* — движение — */
  --ds-ease:cubic-bezier(.22,.61,.36,1);
  --ds-t-fast:.2s;
  --ds-t-hover:.28s;
  --ds-t-reveal:.65s;

  /* — плёночное зерно (inline SVG feTurbulence, внешних файлов нет) — */
  --ds-grain:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='pn'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.86' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23pn)' opacity='.6'/%3E%3C/svg%3E");

  /* — тиснение бумаги: feTurbulence + feDiffuseLighting, растра нет — */
  --pv-tooth:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='190' height='190'%3E%3Cfilter id='t' x='0' y='0' width='100%25' height='100%25'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.58' numOctaves='3' seed='9' stitchTiles='stitch'/%3E%3CfeDiffuseLighting lighting-color='%23ffffff' surfaceScale='1.7'%3E%3CfeDistantLight azimuth='228' elevation='58'/%3E%3C/feDiffuseLighting%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23t)'/%3E%3C/svg%3E");
}

/* ============================================================================
   2. RESET + БУМАЖНЫЙ ХОЛСТ
   ========================================================================== */
*{box-sizing:border-box}
html{scroll-behavior:smooth}
html,body{margin:0;padding:0}
/* НИКОГДА не ставить overflow-x на html/body: body становится скролл-
   контейнером и position:sticky в блоке «программа» умирает молча.
   Декор режем по секциям — overflow-x:clip на .sc. */
body{
  background:var(--ds-linen);
  font:var(--ds-body);
  color:var(--ds-ink);
  -webkit-font-smoothing:antialiased;
}
img,svg{display:block;max-width:100%}
a{text-decoration:none;color:inherit}
button{font-family:inherit;border:0;cursor:pointer}
ul,ol{list-style:none;margin:0;padding:0}
h1,h2,h3,p{margin:0}

/* плёнка поверх всей страницы: не скроллится как обои, читается как зерно */
.ds-grain{
  position:fixed;inset:0;z-index:9000;pointer-events:none;
  opacity:.34;mix-blend-mode:soft-light;
  background-image:var(--ds-grain);
}

/* ============================================================================
   3. КАРКАС СЕКЦИИ
   overflow-x:clip (НЕ hidden) — hidden делает секцию скролл-контейнером
   и убивает sticky; по вертикали свечение обязано выходить за границы,
   иначе на стыке секций появляется прямой срез.
   ========================================================================== */
/* ⚠️ ГРАДИЕНТЫ МЕЖДУ БЛОКАМИ НЕ РЕЗАТЬ.
   Две вещи обрывали закатные пятна прямой линией на стыке секций:
     1) overflow по вертикали — снят, клипим только горизонталь (см. ниже);
     2) непрозрачный фон секции + z-index:0. z-index:0 делал каждую секцию
        стек-контекстом, и следующая секция своей непрозрачной подложкой
        закрашивала свечение предыдущей ровно по шву.
   Лечение: фон линена живёт на body (раздел 2), секции прозрачные,
   z-index у .sc снят. Побочный плюс: .sc-in{z-index:3} теперь выигрывает
   у любого .sc-glow{z-index:0} по всей странице — свечение соседа больше
   не может лечь поверх текста. Текстуры (.sc-tooth multiply / .sc-grain
   soft-light) смешиваются с тем же линеном body — тон бумаги не меняется. */
.sc{position:relative;overflow-x:clip;overflow-y:visible;
  background:transparent;color:var(--ds-ink);
  font-family:var(--ds-font);-webkit-font-smoothing:antialiased;
  padding:clamp(44px,4.8vw,88px) clamp(18px,3.4vw,56px)}
/* SAFE-AREA. viewport-fit=cover в <head> пускает контент под чёлку, поэтому
   боковые поля берут максимум из «поля секции» и выреза. Одно и то же
   выражение обязано стоять у .sc, .hv и .footer — иначе разъедутся края.
   env() не поддержан → строка невалидна и отбрасывается, работает padding выше. */
.sc{padding-left:max(clamp(18px,3.4vw,56px),env(safe-area-inset-left));
    padding-right:max(clamp(18px,3.4vw,56px),env(safe-area-inset-right))}
.sc-in{position:relative;z-index:3;max-width:var(--ds-max);margin:0 auto}
.sc p,.sc ul,.sc ol,.sc dl,.sc dd,.sc figure,.sc figcaption{margin:0}
.sc summary{list-style:none;cursor:pointer}
.sc summary::-webkit-details-marker{display:none}

.sc-glow{position:absolute;inset:-150px -8%;z-index:0;pointer-events:none;filter:blur(78px);
  background:
    radial-gradient(38% 42% at 12% 30%,rgba(250,214,150,.55) 0%,rgba(250,214,150,0) 72%),
    radial-gradient(44% 48% at 80% 66%,rgba(240,157,110,.32) 0%,rgba(240,157,110,0) 74%),
    radial-gradient(30% 34% at 94% 8%,rgba(228,166,196,.13) 0%,rgba(228,166,196,0) 76%)}
.sc-tooth{position:absolute;inset:0;z-index:5;pointer-events:none;
  background-image:var(--pv-tooth);background-size:190px 190px;opacity:.17;mix-blend-mode:multiply}
.sc-grain{position:absolute;inset:0;z-index:6;pointer-events:none;
  background-image:var(--ds-grain);opacity:.30;mix-blend-mode:soft-light}

/* — слот портрета: пропорцию задаёт контейнер, содержимое только заполняет,
     поэтому высота карточки не зависит от самой картинки. — */
.slot{position:relative;overflow:hidden;display:grid;place-items:center;
  background:linear-gradient(158deg,#f1eee8 0%,#e6e2da 100%);
  border:1px solid var(--ds-line);border-radius:6px;color:var(--ds-ink)}
.slot-34{aspect-ratio:3/4}

/* фото в слоте */
.slot--photo{background:#e6e2da}
.slot picture{display:block;width:100%;height:100%}
.slot img{display:block;width:100%;height:100%;object-fit:cover}

/* — скрепка — */
.clip{position:absolute;z-index:6;width:38px;height:auto;
  filter:drop-shadow(0 3px 5px rgba(27,6,36,.22));pointer-events:none}

.nw{white-space:nowrap}

/* ============================================================================
   4. ТИПОГРАФИКА, КИКЕРЫ, БЕЙДЖИ, КНОПКИ
   ========================================================================== */
/* единственный стиль заголовка секции на всю страницу: голый h2,
   без линеек, кикеров и плашек. Кегль — токен --ds-h2 системы. */
.sc-h2{margin:0;font:var(--ds-h2);letter-spacing:var(--ds-ls-display);
  color:var(--ds-ink);text-wrap:balance;max-width:24ch}
.ds-lead{margin-top:16px;font:var(--ds-lead);color:var(--ds-graphite);max-width:62ch}
.ds-footnote{margin-top:30px;font:var(--ds-note);color:var(--ds-stone);max-width:44em}

.ds-kicker{display:flex;align-items:center;gap:8px;font:var(--ds-kick);
  letter-spacing:var(--ds-ls-kick);text-transform:uppercase;color:var(--ds-sun-text);margin-bottom:26px}
.ds-kicker::before{content:"";flex:none;width:7px;height:7px;border-radius:50%;background:currentColor}

.ds-badge{display:inline-flex;align-items:center;gap:10px;border:0;background:var(--ds-ink);
  border-radius:var(--ds-r-pill);padding:12px 22px;
  font:500 15px/1.3 var(--ds-font);color:rgba(255,255,255,.72);
  margin-bottom:26px;box-shadow:var(--ds-sh-badge)}
.ds-badge b{font-weight:700;color:#fff}
.ds-badge i{flex:none;width:8px;height:8px;border-radius:50%;background:var(--ds-sun-1);font-style:normal;
  box-shadow:0 0 0 4px rgba(233,160,90,.25)}

.ds-btn{display:inline-flex;align-items:center;justify-content:center;gap:10px;
  background:var(--ds-espresso);color:#fff;border:0;border-radius:var(--ds-r-btn);
  padding:22px 42px;font:var(--ds-btn-font);letter-spacing:0;cursor:pointer;
  box-shadow:var(--ds-sh-btn);
  transition:background var(--ds-t-fast),transform var(--ds-t-fast),box-shadow var(--ds-t-fast)}
/* часть CTA — ссылки-якоря на #tariffs, а не кнопки: подчёркивание снимаем */
a.ds-btn{text-decoration:none}
/* прокрутка к тарифам не должна упирать заголовок в самый край экрана */
#tariffs{scroll-margin-top:clamp(12px,3vh,40px)}
.ds-btn:hover{background:#241812;transform:translateY(-1px)}
.ds-btn:active{transform:translateY(0);box-shadow:0 6px 16px rgba(27,6,36,.18)}
.ds-btn:focus-visible{outline:2px solid var(--ds-sun-2);outline-offset:3px}
.ds-cta{margin-top:32px;display:flex;gap:18px;align-items:center;flex-wrap:wrap}
/* капс кнопок страницы — скобки из ТЗ сняты, остался только разряд */
.pg-cta{letter-spacing:.05em;text-transform:uppercase}

/* ============================================================================
   5. КАРТОЧКИ, ИКОНКИ, ЧЕК-СТРОКИ
   ========================================================================== */
/* overflow:hidden несущий — ватермарки и градиентные промывки рисуются
   за краем карточки и должны обрезаться ею, а не страницей */
.ds-card{position:relative;overflow:hidden;background:var(--ds-paper);border:1px solid var(--ds-line);
  border-radius:var(--ds-r-md);padding:var(--ds-pad-card);
  transition:transform var(--ds-t-hover) var(--ds-ease)}
.ds-card:hover{transform:translateY(-3px)}
.ds-card-lg{border-radius:var(--ds-r-lg);padding:var(--ds-pad-card-lg)}
/* 3px закатная линейка по верхней кромке — «шапка документа» */
.ds-card-topline::before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:var(--ds-ramp)}

/* тёмная карточка: чернильная плоскость, пунктирная рамка, закатное свечение */
.ds-card-dark{position:relative;overflow:hidden;background:var(--ds-ink);border-color:transparent;
  color:#f2efe9;display:flex;flex-direction:column;padding:clamp(28px,2.6vw,40px)}
.ds-card-dark::after{content:"";position:absolute;inset:0;pointer-events:none;filter:blur(60px);opacity:.55;
  background:radial-gradient(60% 70% at 85% 100%,rgba(233,160,90,.6) 0%,transparent 70%),
             radial-gradient(50% 60% at 10% 110%,rgba(217,113,63,.45) 0%,transparent 70%)}
.ds-card-dark::before{content:"";position:absolute;inset:12px;border:1px dashed var(--ds-line-on-dark);
  border-radius:10px;pointer-events:none;z-index:1}
.ds-card-dark > *{position:relative;z-index:2}
.ds-card-dark b{color:#fff}

/* плитка иконки 52px, тонированная под акцент */
.ds-ico{width:52px;height:52px;border-radius:var(--ds-r-sm);display:grid;place-items:center;flex:none}
.ds-ico svg{width:26px;height:26px}
.ds-ico-1{background:var(--ds-tint-1);color:var(--ds-tint-1-ink)}
.ds-ico-2{background:var(--ds-tint-2);color:var(--ds-tint-2-ink)}
.ds-ico-3{background:var(--ds-tint-3);color:var(--ds-tint-3-ink)}
.ds-ico-4{background:var(--ds-tint-4);color:var(--ds-tint-4-ink)}

/* ватермарк: увеличенный контурный глиф, вываливающийся за угол карточки */
.ds-wm{position:absolute;z-index:1;right:-18px;bottom:-18px;width:132px;height:132px;
  opacity:.07;transform:rotate(-8deg);color:var(--ds-ink);pointer-events:none;line-height:0}
.ds-wm svg{width:100%;height:100%}

/* галочка */
.ds-chk{flex:none;position:relative;width:22px;height:22px;border-radius:50%;
  background:var(--ds-sun-2);margin-top:1px}
.ds-chk::after{content:"";position:absolute;left:7.5px;top:5px;width:5px;height:9px;
  border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}
.ds-chk-sm{width:18px;height:18px}
.ds-chk-sm::after{left:6px;top:3.5px;width:4px;height:8px}

/* ============================================================================
   6. HERO — раскладка Лиды: слева смысл, справа две реплики
   (светлая карточка + чернильная), утверждено 06.08

   ПРАВКА 07.08 (заказчик): первый и последний экраны поменялись фоном и
   креативами, тексты остались каждый на своём месте. Сюда приехали тёмная
   плашка .ds-card-dark со светом за курсором и полароидная пара портретов;
   отсюда на финальный блок ушли закатное свечение фона и квадраты 1:1.
   ========================================================================== */
/* Оси overflow разведены, хотя своего свечения у hero больше нет: соседний
   лид-магнит и финальный блок светят через швы, а overflow:clip по обеим
   осям обрезал бы их прямой линией. Фон прозрачный по той же причине
   (линен лежит на body). */
.hv{position:relative;overflow-x:clip;overflow-y:visible;
  background:transparent;color:var(--ds-ink);
  font-family:var(--ds-font);-webkit-font-smoothing:antialiased;
  padding:clamp(40px,7vw,112px) clamp(18px,3.4vw,56px)}
.hv{padding-left:max(clamp(18px,3.4vw,56px),env(safe-area-inset-left));
    padding-right:max(clamp(18px,3.4vw,56px),env(safe-area-inset-right))}
/* контейнер один на всю страницу: --ds-max + поля секции. Прежние 1280px
   давали hero узкую колонку и разъезд краёв с соседями от ~1350px.
   Сетка 07.08 переехала на .hv-card: контейнер теперь только держит меру,
   а две колонки живёт внутри тёмной плашки. */
.hv-in{position:relative;z-index:3;max-width:var(--ds-max);margin:0 auto}
.hv figure,.hv figcaption,.hv blockquote{margin:0}
.hv-tooth{position:absolute;inset:0;z-index:5;pointer-events:none;
  background-image:var(--pv-tooth);background-size:190px 190px;opacity:.17;mix-blend-mode:multiply}
.hv-grain{position:absolute;inset:0;z-index:6;pointer-events:none;
  background-image:var(--ds-grain);opacity:.30;mix-blend-mode:soft-light}

/* — тёмная плашка первого экрана (правка 07.08) ---------------------------
   Приехала с финального CTA целиком: та же сетка «текст / креатив», тот же
   тёплый рассвет фоном и тот же свет за курсором (.ds-spot, раздел 20.5).
   Сетка живёт здесь, а не на .hv-in, иначе плашка обняла бы только одну
   колонку. Пропорции колонок и зазор оставлены прежними, hero-шные. */
.hv-card{display:grid;grid-template-columns:minmax(0,1fr) auto;
  gap:clamp(26px,3.4vw,62px);padding:clamp(30px,3.4vw,60px);align-items:center;
  background-image:
    radial-gradient(64% 88% at 90% -12%,rgba(233,160,90,.22) 0%,rgba(233,160,90,0) 62%)}
.hv-card > *{min-width:0}
/* плашка на первом экране не подпрыгивает: .ds-card:hover поднимает карточку
   на 3px, и на объекте в пол-экрана это читается как дёрганье страницы */
.hv-card:hover{transform:none}

.hv-txt{min-width:0}
.hv .ds-badge{margin-bottom:26px;background:rgba(255,255,255,.10);box-shadow:none;
  border:1px solid rgba(255,255,255,.18);color:rgba(255,255,255,.78)}
.hv .ds-kicker{text-transform:uppercase;margin-bottom:18px;color:var(--ds-sun-1)}
/* строчными, как в записи Лиды: заголовок не капсовый */
/* ЖЁСТКАЯ РАЗБИВКА В ДВЕ СТРОКИ (правка заказчика 07.08):
     Где брать заказчиков / на фрилансе в 2026?
   ⚠️ text-wrap:balance спорит с <br>: он переразбивает первую строку, даже
   когда она целиком влезает в колонку, — на 1440 заголовок упрямо вставал
   в три строки. Поэтому там, где перенос включён, баланс снят; ниже порога
   он возвращается и раскладывает строку сам.
   ПОРОГ 420px ВЫВЕДЕН ЗАМЕРОМ (см. таблицу ниже, колонка «запас»). Ниже него
   «Где брать заказчиков» влезает в колонку с запасом меньше 25px, а шрифт-
   фолбэк до загрузки Manrope шире на 3–8% и рвал бы строку на третью. */
.hv-h1{margin:0;font:700 clamp(30px,4.45vw,66px)/1.06 var(--ds-font);letter-spacing:-.03em;
  color:#fff;max-width:none;text-wrap:balance}
.hv-br{display:none}
@media (min-width:420px){
  .hv-br{display:inline}
  .hv-h1{text-wrap:normal}
}
.hv-lead{margin-top:26px;max-width:47ch;color:rgba(255,255,255,.78)}
.hv .ds-footnote{margin-top:18px;color:rgba(255,255,255,.50);max-width:52ch}
.hv .ds-cta{margin-top:32px}
/* кнопка на тёмном — белая пилюля, как была на финальном блоке */
.hv .ds-btn{background:#fff;color:var(--ds-ink);box-shadow:0 14px 34px rgba(0,0,0,.3)}
.hv .ds-btn:hover{background:#f4ece3}

/* — 6.1 СКРАПБУК-ПАРА ПОЛАРОИДОВ (правка 07.08) --------------------------
   Приехала с финального CTA целиком. Подача 1:1 из email-баннера «Мы в эфире»
   (banners/html-email/_banner-email.css, блок .pt-pair): полароиды с закатной
   кромкой, наклоны −2,1° и +1,7°, карточка Мили смещена вниз, скрепка на её
   правом верхнем углу. Пропорции пересчитаны с холста баннера 2160px на
   ширину плашки: фото 296→176px, кегль подписи 25→16px, скрепка 56→34px.
   Классы без префикса блока: пара уже один раз переезжала между экранами. */
.hv-pt{display:flex;justify-content:flex-end}
.pt-pair{display:flex;align-items:flex-start;gap:clamp(11px,1.1vw,18px);
  padding-top:clamp(14px,1.4vw,24px)}
/* overflow НЕ hidden: скрепка обязана выходить за угол карточки */
/* Фото укрупнено 176 → 268px (правка заказчика): под именем теперь стоит
   реплика спикера, и на прежней ширине строка выходила в 18 знаков. */
.pt{--pt-w:clamp(150px,16vw,252px);position:relative;flex:none;
  background:var(--ds-paper);border:1px solid var(--ds-line);border-radius:16px;
  padding:clamp(7px,.68vw,10px) clamp(7px,.68vw,10px) 0;
  box-shadow:0 26px 60px rgba(0,0,0,.42)}
/* Закатная кромка. Полоса 3px не может нести радиус 15px (браузер ужимает
   радиусы до высоты), поэтому элемент высотой 16px со скруглением, а сам
   закат нарисован фоном в 3px и обрезан этим скруглением — как в баннере. */
.pt::before{content:"";position:absolute;top:0;left:0;right:0;height:16px;
  background-image:var(--ds-ramp);background-size:100% 3px;background-repeat:no-repeat;
  background-position:left top;border-radius:15px 15px 0 0;pointer-events:none}
/* кропы 3:4 готовы — пропорция слота совпадает, лица не режутся */
.pt-ph{width:var(--pt-w);aspect-ratio:3/4;border-radius:8px;overflow:hidden;background:#e6e2da}
.pt-ph picture{display:block;width:100%;height:100%}
.pt-ph img{width:100%;height:100%;object-fit:cover;object-position:50% 50%}
/* ⚠️ width обязателен. Без него подпись сайзится по max-content, и на узких
   ширинах «Кирилл Пшинник» распирал карточку шире фото: пара переставала
   влезать в поле плашки и overflow:hidden срезал скрепку. Теперь ширину
   карточки задаёт только фото, а подпись при нехватке места переносится
   на две строки (это происходит от 374px и ниже).
   ⚠️ Селектор с .hv обязателен и здесь, и ниже: сбросы «.hv figure{margin:0}»
   и «.hv figcaption{margin:0}» (0,1,1) сильнее голого класса. */
.hv .pt figcaption{width:var(--pt-w);
  padding:clamp(9px,.85vw,13px) 2px clamp(12px,1.1vw,18px)}
/* имя по центру — конвенция полароида; реплика под ним по левому краю:
   в столбце 268px центрированный абзац в 7 строк читается рваным.
   Разделитель повторяет линейку между шапкой и цитатой в карточках финала. */
/* ⚠️ селектор из двух простых обязателен: имя набрано <b>, а у плашки есть
   «.ds-card-dark b{color:#fff}» (0,1,1) — оно сильнее голого .pt-name и
   красило имя белым по белой рамке полароида. */
.hv .pt-name{display:block;text-align:center;
  font:600 clamp(13px,1.08vw,16.5px)/1.25 var(--ds-font);
  letter-spacing:-.02em;color:var(--ds-ink)}
.pt-quote{display:block;margin-top:clamp(8px,.7vw,11px);
  padding-top:clamp(8px,.7vw,11px);border-top:1px solid var(--ds-line-2);
  font:400 clamp(11.5px,.95vw,14.5px)/1.5 var(--ds-font);
  letter-spacing:0;color:var(--ds-graphite);text-align:left}
.pt--a{transform:rotate(-2.1deg)}
.hv .pt--b{transform:rotate(1.7deg);margin-top:clamp(16px,2.4vw,38px)}
.pt-clip{position:absolute;z-index:6;width:clamp(24px,2.3vw,34px);height:auto;
  top:clamp(-24px,-1.6vw,-15px);right:-5px;
  transform:rotate(9deg) scaleX(-1);
  filter:drop-shadow(0 4px 6px rgba(27,6,36,.24));pointer-events:none}

/* появление сцены — CSS, без JS.
   Считаем колонки внутри плашки, а не детей .hv-in: там теперь один ребёнок.
   .ds-spot из анимации исключён — иначе свет всплывал бы вместе с текстом. */
@keyframes hv-in{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
.js .hv-card > .hv-txt,
.js .hv-card > .hv-pt{animation:hv-in .6s cubic-bezier(.22,.61,.36,1) both}
.js .hv-card > .hv-pt{animation-delay:.08s}

@media (max-width:1199px){
  .hv-card{gap:clamp(22px,2.6vw,36px)}
  .hv-h1{font-size:clamp(30px,4.35vw,56px)}
  .hv-lead{margin-top:18px;max-width:42ch}
}
/* ноутбучные окна: hero не должен резаться по высоте */
@media (min-width:960px) and (max-height:820px){
  .hv{padding-top:clamp(30px,3.4vw,54px);padding-bottom:clamp(30px,3.4vw,54px)}
  .hv-card{padding:clamp(26px,2.6vw,44px)}
  .hv-h1{font-size:clamp(29px,3.4vw,50px)}
  .hv .ds-cta{margin-top:22px}
}
@media (min-width:960px) and (max-height:700px){
  .hv .ds-badge{margin-bottom:16px}
  .hv .ds-kicker{margin-bottom:12px}
  .hv-h1{font-size:clamp(28px,3.1vw,44px)}
  .pt{--pt-w:clamp(112px,9.6vw,144px)}
}
@media (max-width:959px){
  /* пара полароидов уходит под текстовый блок и получает всю его ширину */
  .hv-card{grid-template-columns:1fr;gap:clamp(26px,3.4vw,38px);align-items:start}
  .hv-h1{font-size:clamp(30px,5.4vw,52px)}
  .hv-lead{max-width:56ch}
  .hv-pt{justify-content:flex-start}
  .pt{--pt-w:clamp(160px,30vw,300px)}
}
/* Ниже 640px пара встаёт в столбец. Рядом карточки тут не живут: на 390px
   на каждую остаётся 152px, реплика ложится в 22 знака и кегль уходит под
   12px. В столбце карточка забирает всю ширину, реплика читается 14px.
   Наклоны в столбце сняты: повёрнутая карточка во всю ширину вылезает
   за поле плашки на ~19px и даёт горизонтальную прокрутку. */
@media (max-width:639px){
  .hv-card{gap:24px;padding:clamp(20px,4.4vw,28px)}
  .hv-h1{font-size:clamp(27px,7vw,40px)}
  .hv-lead{margin-top:15px;font-size:16.5px;max-width:none}
  .hv .ds-footnote{max-width:none}
  .hv .ds-cta{margin-top:22px}
  .hv .ds-btn{width:100%}
  .hv-pt{display:block}
  .pt-pair{flex-direction:column;align-items:stretch;gap:20px;padding-top:0}
  .pt{--pt-w:100%}
  .pt--a{transform:none}
  .hv .pt--b{transform:none;margin-top:0}
  .pt-quote{font-size:14px}
}
@media (max-width:374px){
  /* поля НЕ переопределяем: 16px здесь давал hero сдвиг на 2px
     относительно всех остальных секций (у них clamp даёт 18px) */
  .hv-h1{font-size:27px}
  .pt{border-radius:13px}
  .pt::before{border-radius:12px 12px 0 0}
  .pt-clip{width:24px;right:-2px;top:-14px}
}

/* ============================================================================
   7. ЛИД-МАГНИТ — «лента на скрепке» (вариант C)
   Первая позиция — без кнопки, вторая — с «НЕ ПРОПУЩУ».
   Правка Лиды: слева от заголовка стоит контурная иконка подарка
   на тёплой плитке (рисуем кодом, растровых иконок не тянем).
   ========================================================================== */
/* ПРИЖАТИЕ К БЛОКУ СВЕРХУ (правка Лиды).
   Лид-магнит — приписка к предыдущему блоку, а не самостоятельная секция:
   верхнее поле секции снято в ноль, нижнее поле соседа сверху срезано с
   88/112px до 24–44px. Снизу ритм секции не трогаем — иначе слипнется
   со следующим блоком. Зазор считать вместе с .lm-c__wrap{padding-top:46px}:
   это запас под скрепку, и она теперь физически заходит на блок сверху.
   Соседи сверху: #hero → #lead-magnet-1, #result → #lead-magnet-2. */
#lead-magnet-1,#lead-magnet-2{padding-top:0}
#hero,#result{padding-bottom:clamp(24px,2.4vw,44px)}

.lm-ttl{font:600 clamp(19px,1.9vw,27px)/1.25 var(--ds-font);letter-spacing:-.024em;color:var(--ds-ink)}
/* колонка заголовка ужата .78fr → .58fr: после укрупнения бонусов до 18,5px
   вариант с кнопкой рвал пункты на 4 строки с висячим «формулировок».
   Правим базовое значение, а не добавляем правило с :not() — оно было бы
   специфичнее (0,2,0) медиазапросов ниже и протекло бы в планшет.
   .lm-c--plain держит свою пару колонок сразу следом. */
.lm-c{position:relative;display:grid;
  grid-template-columns:minmax(0,.58fr) minmax(0,1fr) auto;
  align-items:center;gap:clamp(18px,2.4vw,40px);
  background:var(--ds-paper);border:1px solid var(--ds-line);border-radius:var(--ds-r-md);
  padding:clamp(22px,2.2vw,32px) clamp(22px,2.4vw,38px);
  transform:rotate(-.5deg);box-shadow:0 18px 40px rgba(27,6,36,.09)}
/* без кнопки колонок две, лента становится ниже */
.lm-c--plain{grid-template-columns:minmax(0,.78fr) minmax(0,1fr)}
/* запас сверху под скрепку: она торчит выше карточки на ~56px */
.lm-c__wrap{padding:46px 0 14px}
/* скрепка заходит в карточку на ~30px и стоит выше плитки подарка */
.lm-c .clip{top:-56px;left:22px;transform:rotate(-9deg)}
.lm-c__hd{display:flex;align-items:center;gap:clamp(13px,1.2vw,18px);min-width:0}
/* иконка подарка: та же плитка 52px, что у блока «что получишь» */
.lm-ico{flex:none;width:52px;height:52px;border-radius:var(--ds-r-sm);display:grid;place-items:center;
  background:var(--ds-tint-1);color:var(--ds-tint-1-ink)}
.lm-ico svg{width:27px;height:27px}
.lm-c__items{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:clamp(16px,1.8vw,28px)}
/* Правка Лиды 06.08: бонусы читались мелкой припиской рядом с 27px заголовком.
   Кегль поднят 14,7 → 18,5px на 1440 (+26%), галочка выросла вслед за строкой. */
.lm-c__items > li{display:flex;gap:12px;align-items:flex-start;min-width:0;
  font:400 clamp(16px,1.3vw,18.5px)/1.5 var(--ds-font);color:var(--ds-graphite)}
.lm-c__items > li + li{padding-left:clamp(16px,1.8vw,28px);border-left:1px dashed var(--ds-line-dash)}
/* галочка не .ds-chk-sm из DS, а её локальная версия: 18px кружок против
   строки 18,5/1,5 читался мелко. Класс используется только здесь (2×), но
   правим точечно, чтобы не сдвинуть токен DS. */
.lm-c__items > li .ds-chk{width:21px;height:21px;margin-top:3px}
.lm-c__items > li .ds-chk::after{left:7.5px;top:4.5px;width:4.5px;height:9px}
@media (max-width:1199px){
  .lm-c{grid-template-columns:minmax(0,1fr) auto;row-gap:22px}
  .lm-c--plain{grid-template-columns:minmax(0,1fr)}
  .lm-c__items{grid-column:1/-1;order:3}
}
@media (max-width:959px){
  .lm-c,.lm-c--plain{grid-template-columns:1fr;transform:rotate(-.3deg)}
  .lm-c__items{order:0}
}
@media (max-width:639px){
  .lm-c{transform:none;padding:24px 20px}
  .lm-c__wrap{padding-top:40px}
  .lm-c__items{grid-template-columns:1fr;gap:14px}
  .lm-c__items > li + li{padding-left:0;border-left:0;padding-top:14px;border-top:1px dashed var(--ds-line-dash)}
  .lm-c .ds-btn{width:100%}
  .lm-c .clip{left:18px;width:30px;top:-46px}
  .lm-ico{width:46px;height:46px}
  .lm-ico svg{width:24px;height:24px}
}
@media (max-width:374px){
  .lm-c{padding:22px 16px}
  .lm-c__hd{gap:12px}
}

/* ⚠️ НАКЛОН vs REVEAL. У .lm-c и .rv (раздел 18) одинаковая специфичность
   (0,1,0), .rv лежит ниже по файлу и выигрывает — карточка теряла rotate,
   а скрепка над ней остаётся повёрнутой на −9°, приём разваливался.
   Лечится парой .lm-c.rv (0,2,0): наклон живёт внутри reveal-состояний.
   Правила ниже дублируют шкалу наклона выше — правишь одну, правь обе.
   Без JS класс .rv не появляется и работают базовые правила. */
.lm-c.rv{transform:translateY(16px) rotate(-.5deg)}
.lm-c.rv.is-in{transform:rotate(-.5deg)}
@media (max-width:959px){
  .lm-c.rv{transform:translateY(16px) rotate(-.3deg)}
  .lm-c.rv.is-in{transform:rotate(-.3deg)}
}
@media (max-width:639px){
  .lm-c.rv{transform:translateY(16px)}
  .lm-c.rv.is-in{transform:none}
}

/* ============================================================================
   8. ПРОГРАММА — «рельса со sticky-заголовком» (вариант A)
   sticky держится только пока ни один предок не скролл-контейнер:
   на .sc стоит overflow-x:clip (не hidden), на html/body — ничего.
   ========================================================================== */
.pr-q{font:600 clamp(17px,1.65vw,23px)/1.28 var(--ds-font);letter-spacing:-.026em;color:var(--ds-ink)}
.pr-a-txt{font:400 clamp(15.5px,1.18vw,17.5px)/1.58 var(--ds-font);color:var(--ds-graphite)}
.pr-a{display:grid;grid-template-columns:minmax(0,.38fr) minmax(0,1fr);gap:clamp(26px,3.6vw,64px);
  align-items:start}
.pr-a > *{min-width:0}
.pr-a__side{position:sticky;top:24px}
.pr-a__side .ds-cta{margin-top:28px}
.pr-a__list{display:grid}
.pr-a__it{display:grid;grid-template-columns:26px minmax(0,1fr);gap:0 clamp(16px,1.6vw,26px);
  padding-bottom:clamp(20px,2vw,30px)}
.pr-a__it:last-child{padding-bottom:0}
.pr-a__rail{position:relative;display:flex;justify-content:center}
.pr-a__rail i{position:relative;z-index:1;width:13px;height:13px;border-radius:50%;
  background:var(--ds-sun-2);margin-top:9px;box-shadow:0 0 0 5px rgba(228,121,78,.16)}
.pr-a__it:not(:last-child) .pr-a__rail::after{content:"";position:absolute;top:26px;bottom:-4px;left:50%;
  transform:translateX(-50%);width:2px;border-radius:1px;
  background:linear-gradient(180deg,rgba(228,121,78,.42),rgba(228,121,78,.1))}
.pr-a__card{position:relative;overflow:hidden;background:var(--ds-paper);border:1px solid var(--ds-line);
  border-radius:var(--ds-r-md);padding:clamp(20px,1.9vw,28px);
  transition:transform var(--ds-t-hover) var(--ds-ease)}
.pr-a__card:hover{transform:translateY(-3px)}
.pr-a__n{font:700 12px/1 var(--ds-font);letter-spacing:.14em;color:var(--ds-sun-text);
  display:block;margin-bottom:11px}
.pr-a__card .pr-a-txt{margin-top:10px}
@media (max-width:959px){
  .pr-a{grid-template-columns:1fr;gap:28px}
  .pr-a__side{position:static}
}
@media (max-width:639px){
  .pr-a__it{grid-template-columns:20px minmax(0,1fr);gap:0 14px}
  .pr-a__rail i{width:11px;height:11px;box-shadow:0 0 0 4px rgba(228,121,78,.16)}
  .pr-a__side .ds-cta .ds-btn{width:100%}
}

/* ============================================================================
   9. СПИКЕРЫ — «визитки с раскрытием» (вариант C)
   Правка Лиды: закатная линейка по верхней кромке карточки, как в варианте A.
   ========================================================================== */
.sp-name{font:600 clamp(19px,1.8vw,26px)/1.16 var(--ds-font);letter-spacing:-.028em;color:var(--ds-ink)}
.sp-role{margin-top:6px;font:600 11px/1 var(--ds-font);letter-spacing:.12em;text-transform:uppercase;
  color:var(--ds-sun-text)}
.sp-li{display:grid;gap:9px}
.sp-li li{position:relative;padding-left:16px;
  font:400 clamp(15.5px,1.15vw,17px)/1.5 var(--ds-font);color:var(--ds-graphite)}
.sp-li li::before{content:"";position:absolute;left:0;top:.62em;width:6px;height:1.5px;
  background:var(--ds-sun-2);opacity:.8}
.sp-grp{font:600 11px/1 var(--ds-font);letter-spacing:.11em;text-transform:uppercase;
  color:var(--ds-stone);margin-bottom:11px}
.sp-c{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin-top:clamp(24px,2.6vw,40px);
  align-items:start}
.sp-c > *{min-width:0}
/* ВЫРАВНИВАНИЕ КАРТОЧЕК (правка Лиды 06.08).
   Регалии у спикеров разной длины, поэтому «Ещё регалии» стояли на разной
   высоте (расхождение ~35px на 1440). Лечим subgrid, а не подгонкой текста:
   у обеих карточек три строки — шапка, список, раскрывашка. Каждая строка
   берёт высоту по максимуму из двух карточек, поэтому <summary> обеих
   стартует с одного y.
   Почему subgrid, а не flex + margin-top:auto — при раскрытии одной карточки
   flex прижал бы summary соседки к низу растянутой карточки и она бы уехала.
   В subgrid раскрытая панель растит ТРЕТЬЮ строку, а summary стоит в её
   начале — соседка остаётся на месте.
   Без поддержки subgrid работает базовое align-items:start (как было). */
@supports (grid-template-rows:subgrid){
  @media (min-width:960px){
    .sp-c{align-items:stretch;grid-template-rows:auto auto auto}
    .sp-c__card{display:grid;grid-row:span 3;grid-template-rows:subgrid;align-content:start}
  }
}
/* линейка сверху — приём варианта A; overflow:hidden держит её в скруглении */
.sp-c__card{position:relative;overflow:hidden;background:var(--ds-paper);border:1px solid var(--ds-line);
  border-radius:var(--ds-r-md);padding:clamp(22px,2.2vw,32px)}
.sp-c__card::before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:var(--ds-ramp)}
.sp-c__hd{display:flex;gap:clamp(14px,1.6vw,22px);align-items:center}
/* Правка Лиды 06.08: портрет 99×132 не давал прочитать лицо.
   146×195 на 1440 — ориентир по крупности с sites.zerocoder.ru/ai-business. */
.sp-c__hd .slot-34{width:clamp(110px,10.2vw,146px);flex:none;border-radius:12px}
/* align-content:start обязателен внутри subgrid: строка списка тянется до
   высоты соседней карточки, и грид-строки самого <ul> растягивались следом —
   отбивки между пунктами разъезжались на 15px. Прижимаем список к верху. */
.sp-c__card .sp-li{margin-top:clamp(16px,1.6vw,22px);align-content:start}
.sp-c__more{margin-top:16px;border-top:1px dashed var(--ds-line-dash);padding-top:2px}
/* min-height 44px — это единственный способ раскрыть регалии Кирилла,
   голая строка 12px давала мишень 116×13. Кегль и цвет не тронуты,
   отбивки сверху/снизу срезаны на ту же величину, что добавила мишень. */
.sp-c__sum{display:inline-flex;align-items:center;gap:9px;min-height:44px;
  font:600 12px/1 var(--ds-font);letter-spacing:.09em;text-transform:uppercase;color:var(--ds-sun-text)}
.sp-c__sum svg{width:13px;height:13px;transition:transform var(--ds-t-fast) var(--ds-ease)}
.sp-c__sum:focus-visible{outline:2px solid var(--ds-sun-text);outline-offset:1px;border-radius:6px}
.sp-c__more[open] .sp-c__sum svg{transform:rotate(180deg)}
.sp-c__pan{margin-top:6px;display:grid;gap:16px}
@media (max-width:959px){.sp-c{grid-template-columns:1fr}}
@media (max-width:639px){.sp-c__card{padding:22px 20px}}

/* ============================================================================
   10. РАЗВОРОТ «КОМУ ТОЧНО СТОИТ БЫТЬ?» + «КОМУ ЭФИР НЕ ПОДОЙДЕТ?»
   1:1 приём боевого freelance-guarantee: ряд белых карточек, сразу под ними
   тёмная плашка отсева той же ширины. Обе части — один разворот.
   ========================================================================== */
.fw-grid{display:grid;grid-template-columns:repeat(4,1fr);
  gap:var(--ds-gap);margin-top:clamp(28px,3vw,44px)}
.fw-grid > *{min-width:0}
.fw-card{display:flex;flex-direction:column;height:100%;padding:clamp(20px,1.9vw,30px)}
.fw-tag{display:block;font:600 11px/1 var(--ds-font);letter-spacing:.1em;
  color:var(--ds-sun-text);margin-bottom:13px}
.fw-card b{display:block;font:600 clamp(16px,1.32vw,19px)/1.3 var(--ds-font);
  letter-spacing:-.025em;color:var(--ds-ink);text-wrap:pretty}
.fw-card p{margin-top:10px;font:400 clamp(15.5px,1.12vw,17px)/1.55 var(--ds-font);
  color:var(--ds-graphite)}

.fw-no{margin-top:14px;border-radius:var(--ds-r-md)}
.fw-no > b{display:block;font:600 clamp(18px,1.75vw,24px)/1.18 var(--ds-font);
  letter-spacing:-.03em;margin-bottom:clamp(18px,1.7vw,24px)}
/* читаемость на тёмном решается вёрсткой, а не отказом от плашки:
   две колонки, крупный интерлиньяж, тезис белым, продолжение на полтона тише */
.fw-no ul{list-style:none;margin:0;padding:0;display:grid;
  grid-template-columns:repeat(2,1fr);gap:clamp(16px,1.6vw,22px) clamp(30px,3.6vw,56px)}
.fw-no li{display:flex;gap:12px;min-width:0}
.fw-no li > i{flex:none;font-style:normal;line-height:1.45;font-size:16px;color:var(--ds-sun-1)}
.fw-no li > span{min-width:0;font:400 clamp(15.5px,1.12vw,17px)/1.62 var(--ds-font);
  color:rgba(242,239,233,.74);max-width:52ch}
.fw-no li > span b{color:#fff;font-weight:600}

/* ============================================================================
   11. «ЧТО ТЫ ПОЛУЧИШЬ ПОСЛЕ ЭФИРА?» — деление экрана пополам
   ========================================================================== */
.rs-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin-top:clamp(28px,3vw,44px)}
.rs-grid > *{min-width:0}
.rs-card{display:flex;flex-direction:column}
/* :not(.ds-wm) обязателен — position:relative вернул бы ватермарк в поток */
.rs-card > *:not(.ds-wm){position:relative;z-index:1}
.rs-card .ds-ico{margin-bottom:20px}
.rs-card b{display:block;font:600 clamp(17px,1.5vw,21px)/1.3 var(--ds-font);
  letter-spacing:-.02em;color:var(--ds-ink);margin-bottom:10px}
.rs-card p{font:400 clamp(15.5px,1.18vw,18px)/1.6 var(--ds-font);color:var(--ds-graphite);max-width:58ch}
/* закатная промывка — на карточке про деньги: единственный смысловой пик блока */
.rs-card--grad{border-color:transparent;
  background:linear-gradient(115deg,#fff 44%,rgba(251,223,178,.5) 82%,rgba(249,207,144,.55) 100%)}

/* — адаптив блоков 10–11 — */
@media (max-width:1199px){
  .fw-grid{grid-template-columns:repeat(2,1fr)}
  .fw-card b{font-size:clamp(17px,1.7vw,20px)}
  .fw-card p{font-size:16.5px}
  .rs-grid{gap:12px}
}
@media (max-width:959px){
  .rs-card p{max-width:none}
  /* две колонки на 900px дают 34 знака в строке — рвём в одну, но меру держим */
  .fw-no ul{grid-template-columns:1fr;gap:15px}
  .fw-no li > span{max-width:62ch}
}
@media (max-width:639px){
  .fw-grid,.rs-grid{grid-template-columns:1fr}
  .fw-card{padding:22px}
  .fw-no{padding:24px 22px}
  .fw-no li > span{max-width:none}
  .rs-card{padding:22px}
  .rs-card .ds-ico{width:46px;height:46px;margin-bottom:16px}
  .rs-card .ds-ico svg{width:23px;height:23px}
}
@media (max-width:374px){
  .fw-card,.rs-card{padding:18px}
  .fw-no{padding:20px 18px}
  .fw-no::before{inset:8px}
  .ds-wm{width:104px;height:104px;right:-14px;bottom:-14px}
}

/* ============================================================================
   12. «ВАРИАНТЫ УЧАСТИЯ» — две плиты 50/50 с зазором, БИЗНЕС на градиенте
   Текст на градиенте — чернилами: белый на оранжевом даёт 2,2–2,9:1.
   ========================================================================== */
.tf{
  /* один шаг шкалы на оба зазора вокруг линейки: над ней и под ней */
  --tf-rule-gap:clamp(16px,1.8vw,24px);
  --tf-grad-b:linear-gradient(134deg,#e9a05a 0%,#e4794e 64%,#d2688b 100%);
  --tf-on-grad:#1b0624;              /* основной текст  — от 5,6:1 */
  --tf-on-grad-2:rgba(27,6,36,.86);  /* вторичный текст */
  --tf-on-grad-3:rgba(27,6,36,.55);  /* маркеры, рамки — декор */
}
.tf-head{margin-bottom:clamp(26px,3.2vw,50px)}
.tf-col{display:flex;flex-direction:column;height:100%;width:100%}
.tf-name{font:700 clamp(19px,1.7vw,27px)/1 var(--ds-font);letter-spacing:.03em;
  text-transform:uppercase;color:var(--ds-ink)}
.tf-rule{margin:var(--tf-rule-gap) 0 0;border:0;border-top:1px solid rgba(27,6,36,.12)}
/* селекторы с .sc — иначе сброс «.sc p,.sc ul{margin:0}» перебивает отступы */
.sc .tf-inc{margin-top:var(--tf-rule-gap);
  font:500 clamp(15px,1.1vw,17px)/1.45 var(--ds-font);color:var(--ds-graphite)}
.sc .tf-list{flex:1 1 auto;align-content:start;display:grid;gap:clamp(10px,1vw,14px);
  margin-top:var(--tf-rule-gap)}
/* «Все, что входит…» — самостоятельный абзац; кружок с «+» снят по правке Лиды */
.sc .tf-inc + .tf-list{margin-top:clamp(20px,2.2vw,30px)}
.tf-list li{display:grid;grid-template-columns:auto minmax(0,1fr);gap:0 12px;
  font:400 clamp(15.5px,1.18vw,18px)/1.55 var(--ds-font);color:var(--ds-graphite);max-width:44ch}
.tf-dash{color:var(--ds-sun-2);font-weight:700}
.tf-btn{margin-top:clamp(26px,2.8vw,44px);width:100%;min-height:64px;
  display:inline-flex;align-items:center;justify-content:center;text-align:center;
  border-radius:var(--ds-r-btn);cursor:pointer;
  font:600 clamp(13.5px,1.06vw,16.5px)/1.25 var(--ds-font);letter-spacing:.01em;
  padding:18px 26px;transition:transform var(--ds-t-fast),background var(--ds-t-fast),
  border-color var(--ds-t-fast),color var(--ds-t-fast),box-shadow var(--ds-t-fast)}
.tf-btn:hover{transform:translateY(-1px)}
.tf-btn:focus-visible{outline:2px solid var(--ds-ink);outline-offset:3px}
.tf-btn--ghost{background:transparent;color:var(--ds-ink);border:1px solid rgba(27,6,36,.28)}
.tf-btn--ghost:hover{border-color:var(--ds-ink);background:rgba(27,6,36,.03)}
.tf-btn--solid{background:var(--ds-espresso);color:#fff;border:1px solid transparent;
  box-shadow:0 12px 30px rgba(27,6,36,.26)}
.tf-btn--solid:hover{background:#241812}

/* половина БИЗНЕС: всё, что на градиенте, перекрашивается в чернила */
.tf-biz{position:relative;color:var(--tf-on-grad)}
.tf-biz > *{position:relative;z-index:2}
.tf-biz .tf-name{color:var(--tf-on-grad)}
.sc .tf-biz .tf-inc{color:var(--tf-on-grad-2)}
.tf-biz .tf-list li{color:var(--tf-on-grad)}
.tf-biz .tf-dash{color:var(--tf-on-grad-3)}
.tf-biz .tf-rule{border-top-color:rgba(27,6,36,.22)}
/* локальное зерно поверх заливки — градиент не выглядит «пластиковым» */
.tf-biz-grain{position:absolute;inset:0;z-index:1;pointer-events:none;
  background-image:var(--ds-grain);opacity:.34;mix-blend-mode:overlay}

/* две отдельные плиты: половины равны, между ними воздух, шва нет */
.tfb-wrap{position:relative;--tfb-gap:32px}
.tfb-wrap::before{content:"";position:absolute;z-index:0;pointer-events:none;
  left:48%;right:-3%;top:8%;bottom:-9%;filter:blur(58px);opacity:.62;
  background:radial-gradient(58% 62% at 46% 52%,rgba(228,121,78,.72) 0%,rgba(228,121,78,0) 72%),
             radial-gradient(48% 54% at 92% 76%,rgba(210,104,139,.5) 0%,rgba(210,104,139,0) 74%)}
.tfb-plate{position:relative;z-index:1;display:grid;grid-template-columns:1fr 1fr;
  gap:var(--tfb-gap);align-items:stretch}
.tfb-plate > *{min-width:0}
/* overflow:clip — локальное зерно не вылезает за скруглённые углы */
.tfb-half{display:flex;padding:clamp(28px,3vw,50px) clamp(22px,2.6vw,44px);
  border-radius:var(--ds-r-lg);overflow:clip}
.tfb-free{background:var(--ds-paper);border:1px solid var(--ds-line);box-shadow:var(--ds-sh-card)}
.tfb-biz{background:var(--tf-grad-b);border:1px solid transparent;
  box-shadow:0 22px 54px rgba(228,121,78,.28)}

@media (max-width:1199px){
  .tf-list li{max-width:52ch}
  /* поля плит сжались — зазор идёт на шаг вниз по шкале, 32 → 24 */
  .tfb-wrap{--tfb-gap:24px}
}
@media (max-width:959px){
  .tfb-plate{grid-template-columns:1fr;gap:24px}
  .tfb-half{border-radius:var(--ds-r-md)}
  .tfb-biz{background:linear-gradient(163deg,#e9a05a 0%,#e4794e 62%,#d2688b 100%);
    box-shadow:0 18px 42px rgba(228,121,78,.24)}
  .tfb-wrap::before{left:-4%;right:-4%;top:46%;bottom:-8%;filter:blur(52px);opacity:.5}
}
@media (max-width:639px){
  .tf-list li{max-width:none;font-size:16.5px}
  /* «ЗАРЕГИСТРИРОВАТЬСЯ БЕСПЛАТНО» — 28 знаков капсом: на 375px влезает
     в одну строку только при 14px; ниже 375 строка рвётся — это нормально */
  .tf-btn{font-size:14px;letter-spacing:0;min-height:58px;padding:16px 14px}
  .tfb-half{padding-inline:20px}
}
@media (max-width:374px){
  .tfb-half{padding-inline:16px}
  .tf-name{font-size:18px}
  .tf-btn{font-size:13px;padding:15px 10px}
}

/* ============================================================================
   13. ФИНАЛЬНЫЙ CTA — «тёмная точка страницы»

   Композиция 07.08 (правка Лиды). Было: заголовок слева, лид и кнопка
   отдельной колонкой справа — правая половина сверху пустовала.
   Стало: весь текст одной колонкой слева (дата → кикер → заголовок → лид →
   кнопка), справа скрапбук-пара портретов, перенесённая 1:1 из email-баннера
   «Мы в эфире» (banners/html-email/_banner-email.css, блок .pt-pair).

   ЗАГОЛОВОК. При старом max-width:20ch он ломался на 4 строки. Меру сняли,
   ширину задаёт сама колонка, кегль опущен с 50 до 44px на 1440 — выходит
   3 сбалансированные строки (text-wrap:balance наследуется от .sc-h2).

   ПОЛАРОИДЫ. Пропорции пересчитаны с холста баннера 2160px на ширину
   карточки: фото 296→176px, кегль подписи 25→16px, скрепка 56→34px.
   Наклоны −2,1°/+1,7° и сдвиг второй карточки вниз оставлены как в баннере.
   ========================================================================== */
/* ПРАВКА 07.08 (заказчик): плашка, свет за курсором и пара полароидов уехали
   на первый экран, сюда пришли закатное свечение фона и карточки-реплики
   с цитатами. Тексты не тронуты, разбивка заголовка и её порог 520px тоже. */
.fcd-in{display:grid;grid-template-columns:minmax(0,1.08fr) minmax(0,.92fr);
  gap:clamp(26px,3.6vw,58px);align-items:center}
.fcd-in > *{min-width:0}
/* закатные пятна — тот же креатив, что стоял фоном первого экрана.
   inset по вертикали отрицательный, свет обязан переходить через швы:
   у .sc разведены оси overflow именно ради этого. */
.fcd-glow{position:absolute;inset:-150px -8%;z-index:0;pointer-events:none;filter:blur(78px);
  background:
    radial-gradient(38% 42% at 12% 30%,rgba(250,214,150,.55) 0%,rgba(250,214,150,0) 72%),
    radial-gradient(44% 48% at 80% 66%,rgba(240,157,110,.32) 0%,rgba(240,157,110,0) 74%),
    radial-gradient(30% 34% at 94% 8%,rgba(228,166,196,.13) 0%,rgba(228,166,196,0) 76%)}
/* меру снимаем — ширину строки держит колонка грида */
.fcd-h2{color:var(--ds-ink);max-width:none;font-size:clamp(27px,2.9vw,44px)}
/* ЖЁСТКАЯ РАЗБИВКА ЗАГОЛОВКА (правка Лиды 07.08):
     Первые клиенты на фрилансе. / Откуда их берут те, / у кого получается?
   Переносы включены только там, где самая длинная строка («Первые клиенты
   на фрилансе.») влезает в колонку целиком.
   ПОРОГ 520px ВЫВЕДЕН ЗАМЕРОМ. Ниже 931px кегль фиксируется на 27px, и эта
   строка всегда 376px. Колонка: 520 → 426px (запас 50px), 480 → 382px
   (запас 6px — мало, шрифт-фолбэк съел бы его и строка порвалась), 414 →
   316px (не влезает). Отсюда 520 с запасом на замену шрифта.
   Ниже порога <br> выключены: 430–519px текст сам ложится ровно в те же три
   строки балансом, на 414 и уже — в четыре, на 320 — в пять.
   (text-wrap:balance наследуется от .sc-h2) */
.fcd-br{display:none}
@media (min-width:520px){.fcd-br{display:inline}}
/* селектор с .sc обязателен: сброс «.sc p{margin:0}» перебил бы отступ */
.sc .fcd-lead{margin-top:clamp(16px,1.5vw,22px);max-width:52ch;
  font:400 clamp(15px,1.15vw,18px)/1.6 var(--ds-font);color:var(--ds-graphite)}
/* класс держит только отступ и ширину на мобильном: цвета кнопка берёт
   базовые (чёрная пилюля), белая версия уехала на первый экран */
.fcd-btn{margin-top:clamp(22px,2.4vw,34px)}

/* — карточки-реплики (креатив с первого экрана, правка 07.08) —
   Портрет в той же полароидной рамке, что и пара на первом экране, имя рядом,
   цитата под фото. Скрепки здесь нет: она ушла к паре полароидов.
   Пара «светлая + чернильная» вернулась на светлый фон в исходном виде. */
.fcd-r{min-width:0}
.fcd-reps{min-width:0;display:grid;gap:14px}
/* Имя и реплика стоят колонкой справа от портрета, а не под ним во всю
   ширину карточки (правка заказчика 07.08): при реплике снизу справа от
   фото оставалось пустое поле в полкарточки, а сама карточка вырастала
   почти вдвое. Портрет и колонка выровнены по верху — так текстовый блок
   начинается на одной линии с кадром. */
.rep{position:relative;min-width:0;border-radius:var(--ds-r-lg);padding:clamp(18px,1.7vw,26px);
  display:flex;align-items:flex-start;gap:clamp(14px,1.4vw,20px)}
.rep-body{min-width:0;flex:1 1 auto}
.rep-name{display:block;font:600 clamp(16px,1.3vw,19px)/1.25 var(--ds-font);
  letter-spacing:-.015em;color:var(--ds-ink);
  padding-bottom:clamp(9px,.8vw,12px);border-bottom:1px solid var(--ds-line-2)}
/* реплика набрана кавычками-ёлочками прямо в тексте, не псевдоэлементом —
   кавычки копируются вместе с репликой */
.rep-text{margin:0;font:400 clamp(15px,1.1vw,17px)/1.5 var(--ds-font);color:var(--ds-graphite)}
/* селектор из двух классов обязателен: сброс «.sc p{margin:0}» (0,1,1)
   сильнее голого .rep-text и обнулил бы отступ реплики от имени */
.rep .rep-text{margin-top:clamp(9px,.8vw,12px)}
.rep--1{background:var(--ds-paper);border:1px solid var(--ds-line);box-shadow:var(--ds-sh-card)}
.rep--2{background:var(--ds-ink);border:1px solid transparent;overflow:hidden;
  box-shadow:0 20px 46px rgba(27,6,36,.20)}
/* тёплый отсвет из-под нижнего края тёмной карточки — глубина, не декор */
.rep--2::after{content:"";position:absolute;inset:0;pointer-events:none;filter:blur(60px);opacity:.5;
  background:radial-gradient(60% 70% at 86% 104%,rgba(233,160,90,.55) 0%,transparent 70%)}
/* .rep-name/.rep-text перечислены отдельно: на мобильном .rep-body
   становится display:contents и «> *» до них уже не достаёт, а ::after
   с отсветом рисуется поверх непозиционированных детей */
.rep--2 > *,.rep--2 .rep-name,.rep--2 .rep-text{position:relative;z-index:1}
.rep--2 .rep-name{color:#fff;border-bottom-color:rgba(255,255,255,.18)}
.rep--2 .rep-text{color:rgba(255,255,255,.84)}

/* полароидная рамка портрета внутри карточки — та же подача, что у пары на
   первом экране, пропорции пересчитаны под ширину карточки. Ширина 132px,
   а не 176 как в паре: портрет теперь задаёт высоту всей карточки, и при 176
   она вырастала до 235px без всякой на то нужды. */
.rep-pt{--rep-pw:clamp(92px,9.2vw,132px);position:relative;flex:none;
  background:var(--ds-paper);border:1px solid var(--ds-line);border-radius:14px;
  padding:clamp(6px,.6vw,9px);box-shadow:0 14px 32px rgba(27,6,36,.16)}
/* закатная кромка: полоса 3px не несёт радиус 14px (браузер ужимает радиусы
   до высоты), поэтому элемент высотой 14px со скруглением, а сам закат
   нарисован фоном в 3px и обрезан этим скруглением */
.rep-pt::before{content:"";position:absolute;top:0;left:0;right:0;height:14px;
  background-image:var(--ds-ramp);background-size:100% 3px;background-repeat:no-repeat;
  background-position:left top;border-radius:13px 13px 0 0;pointer-events:none}
.rep-ph{width:var(--rep-pw);aspect-ratio:3/4;border-radius:8px;overflow:hidden;background:#e6e2da}
.rep-ph picture{display:block;width:100%;height:100%}
.rep-ph img{width:100%;height:100%;object-fit:cover;object-position:50% 50%}
.rep-pt--a{transform:rotate(-2.1deg)}
/* селектор с .sc обязателен: сброс «.sc figure{margin:0}» (0,1,1) сильнее
   голого класса и обнулил бы поворот */
.sc .rep-pt--b{transform:rotate(1.7deg)}

@media (max-width:959px){
  /* карточки уходят под текстовый блок */
  .fcd-in{grid-template-columns:1fr;align-items:start;gap:clamp(26px,3.4vw,40px)}
  .fcd-reps{max-width:760px}
}
@media (max-width:639px){
  .fcd-btn{width:100%}
  /* На узком экране колонка рядом с фото сжимается до ~174px и реплика
     ложится в семь строк. Возвращаем ей всю ширину карточки: имя остаётся
     рядом с портретом, реплика уходит под них. display:contents поднимает
     детей .rep-body в грид карточки, лишняя обёртка бы этому мешала. */
  .rep-pt{--rep-pw:clamp(84px,24vw,110px)}
  .rep{padding:18px;display:grid;grid-template-columns:auto minmax(0,1fr);
    column-gap:14px;row-gap:12px;align-items:center}
  .rep-body{display:contents}
  .rep-name{grid-column:2;padding-bottom:clamp(8px,2vw,11px)}
  .rep-text{grid-column:1 / -1;font-size:15.5px}
  .rep .rep-text{margin-top:0}
}
@media (max-width:374px){
  .rep-pt{--rep-pw:76px}
  .rep-name{font-size:16px}
  .rep{padding:15px;gap:11px}
}

/* ============================================================================
   14. ГЛОССАРИЙ — АВТОНОМНЫЙ БЛОК ДЛЯ shared/blocks
   Ниже — единственный кусок CSS, который нужен блоку. Он не знает
   ни про систему страницы, ни про соседей: все значения живут в --zgl-*.
   ПЕРЕИСПОЛЬЗОВАНИЕ:
     1. скопировать этот раздел и разметку <section class="zgl-sec">;
     2. перекрасить, переопределив --zgl-* на .zgl-sec (или на :root);
     3. список терминов — плоский набор <p class="zgl-entry"><b>Термин</b> — …</p>
        внутри .zgl-list: меняется и сортируется без правки CSS;
     4. JS не нужен: раскрытие на нативном <details>.
   ========================================================================== */
.zgl-sec{
  --zgl-font:'Manrope',system-ui,-apple-system,'Segoe UI',sans-serif;
  --zgl-paper:#ffffff;
  --zgl-ink:#1b0624;
  --zgl-body:#3b3340;
  --zgl-accent:#e4794e;
  --zgl-line:rgba(27,6,36,.10);
  --zgl-line-2:rgba(27,6,36,.06);
  --zgl-radius:16px;
  --zgl-pad:clamp(20px,2vw,26px);
  --zgl-ease:cubic-bezier(.22,.61,.36,1);
  font-family:var(--zgl-font);-webkit-font-smoothing:antialiased;
}
.zgl{background:var(--zgl-paper);border:1px solid var(--zgl-line);
  border-radius:var(--zgl-radius);overflow:hidden}
.zgl-head{display:flex;align-items:center;gap:20px;
  padding:clamp(20px,2vw,24px) var(--zgl-pad);cursor:pointer;
  list-style:none;-webkit-tap-highlight-color:transparent}
.zgl-head::-webkit-details-marker{display:none}
.zgl-head:focus-visible{outline:2px solid var(--zgl-accent);outline-offset:-2px}
.zgl-title{flex:1;min-width:0;font:600 clamp(16px,1.7vw,21px)/1.25 var(--zgl-font);
  letter-spacing:-.025em;color:var(--zgl-ink)}
.zgl-chev{flex:none;width:26px;height:26px;border-radius:50%;border:1px solid var(--zgl-line);
  display:grid;place-items:center;transition:transform .25s var(--zgl-ease),background .25s var(--zgl-ease)}
.zgl-chev svg{width:12px;height:8px;display:block}
.zgl-head:hover .zgl-chev{background:rgba(228,121,78,.12)}
.zgl[open] .zgl-chev{transform:rotate(180deg)}
.zgl-body{padding:0 var(--zgl-pad) var(--zgl-pad)}
.zgl-list{border-top:1px solid var(--zgl-line-2);padding-top:18px}
/* селектор из двух классов намеренно: у хоста может стоять сброс вида
   `section p{margin:0}` — с одним классом он перебил бы отбивку абзацев */
.zgl-list .zgl-entry{margin:0 0 13px;font:400 clamp(15px,1.12vw,16.5px)/1.62 var(--zgl-font);
  color:var(--zgl-body);max-width:92ch;break-inside:avoid}
.zgl-list .zgl-entry:last-child{margin-bottom:0}
.zgl-entry b{font-weight:600;color:var(--zgl-ink)}
/* от 960px список идёт в две колонки: одна колонка на 12 терминов — лишние
   700px высоты у служебного блока */
@media (min-width:960px){
  .zgl-list{column-count:2;column-gap:clamp(30px,3.4vw,60px);
    column-rule:1px solid var(--zgl-line-2)}
  .zgl-list .zgl-entry{max-width:none}
}
/* мягкое раскрытие без JS. ::details-content есть не везде — под @supports,
   в остальных браузерах details просто открывается мгновенно */
@supports selector(::details-content){
  .zgl{interpolate-size:allow-keywords}
  .zgl::details-content{block-size:0;overflow:hidden;
    transition:block-size .42s var(--zgl-ease),content-visibility .42s allow-discrete;
    content-visibility:hidden}
  .zgl[open]::details-content{block-size:auto;content-visibility:visible}
}
@media (max-width:639px){
  .zgl-head{gap:14px}
  .zgl-entry{max-width:none}
}
@media (prefers-reduced-motion:reduce){
  .zgl-chev{transition:none}
  @supports selector(::details-content){
    .zgl::details-content{transition:none}
  }
}

/* ============================================================================
   15. «КТО МЫ?» — блок с боевого ленда freelance-guarantee
   Источник: landings/freelance-guarantee/src/index-unified.html,
   секция <section class="tsec zabout" id="about">, строки 1707–1833.
   Разметка и тексты перенесены 1:1, структура не тронута.

   ЧТО ПЕРЕОДЕТО ПОД НАШУ СИСТЕМУ:
     · шрифт → var(--ds-font) (Manrope), палитра → --ds-* (бумага #f7f7f5,
       чернила #1b0624, тёплый акцент #e9a05a/#e4794e — hex совпали 1:1);
     · радиусы 24/18/12/10 → шкала --ds-r-lg/md/sm/xs;
     · контейнер — общий .sc + .sc-in, отдельного .container больше нет;
     · брейкпоинты чужой системы 1040/600 → наши 1199/959/639/374.

   ЧТО СНЯТО ИЗ ЧУЖОЙ СИСТЕМЫ (осознанно):
     · .zabout-glow с liquid-блобами — это язык «жидкого стекла» того ленда,
       у нас бумага с тиснением; вместо блобов — наш .sc-glow (закатные
       радиальные пятна) + .sc-tooth/.sc-grain, как у всех соседних секций;
     · закатная растяжка фона .zabout (переход из hero того ленда: linen →
       янтарь → linen на первых 40% высоты) — у нас hero стоит на linen,
       и такая растяжка посреди страницы читалась бы как чужой шов.
   ========================================================================== */
#about{--ab-gap:16px}
/* сброса вида «#about div{margin:0}» здесь быть не должно: он перебивает
   .sc-in{margin:0 auto} по специфичности и сажает секцию к левому краю.
   Обнуление p/ul/h уже сделано глобально в разделах 2 и 3. */
#about img{max-width:100%;display:block;border:0}
#about strong{font-weight:600;color:var(--ds-ink)}
/* заголовки блока — тот же .sc-h2, что на всей странице; мера чуть шире:
   «Мы создаём фундаментальное образование…» на 24ch ломается на 4 строки */
#about .ab-h2{max-width:30ch}
#about .ab-h2--sub{margin-top:clamp(52px,5.4vw,84px)}

/* — верх: янтарная плита рейтинга + две карточки цифр — */
#about .ab-top{display:grid;grid-template-columns:1fr 1fr;gap:var(--ab-gap);
  margin-top:clamp(28px,3vw,40px);align-items:stretch}
#about .ab-top > *,#about .ab-bottom > *,#about .gov-grid > *{min-width:0}
#about .ab-sr{background:var(--ds-sun-1);border-radius:var(--ds-r-lg);
  padding:clamp(20px,1.9vw,26px);color:var(--ds-ink);overflow:hidden;
  box-shadow:0 16px 40px rgba(228,121,78,.22)}
#about .ab-sr-label{font:600 clamp(17px,1.5vw,21px)/1.3 var(--ds-font);
  letter-spacing:-.02em;margin-bottom:16px}
#about .ab-sr img{width:100%;border-radius:var(--ds-r-xs)}
#about .ab-stats{display:flex;flex-direction:column;gap:var(--ab-gap)}
#about .ab-stat{flex:1;display:flex;align-items:center;gap:clamp(16px,1.6vw,22px);
  background:var(--ds-paper);border:1px solid var(--ds-line);border-radius:var(--ds-r-lg);
  padding:clamp(20px,1.9vw,26px)}
#about .ab-ico{flex:none;width:60px;height:60px;border-radius:var(--ds-r-sm);
  display:grid;place-items:center;background:var(--ds-tint-2);color:var(--ds-tint-2-ink)}
#about .ab-ico svg{width:28px;height:28px}
#about .ab-stat p{font:600 clamp(16px,1.4vw,20px)/1.4 var(--ds-font);
  letter-spacing:-.015em;color:var(--ds-ink);max-width:430px}

/* — низ: вузы + лицензия и Сколково — */
#about .ab-bottom{display:grid;grid-template-columns:1fr 1fr;gap:var(--ab-gap);margin-top:var(--ab-gap)}
#about .ab-card{background:var(--ds-paper);border:1px solid var(--ds-line);
  border-radius:var(--ds-r-lg);padding:clamp(20px,1.9vw,26px)}
#about .ab-label{display:block;font:600 clamp(15px,1.3vw,18px)/1.35 var(--ds-font);
  letter-spacing:-.02em;color:var(--ds-ink);margin-bottom:18px}
#about .ab-row{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-bottom:18px}
#about .ab-row .ab-label{margin:0}
#about .ab-row img{flex:none;height:52px;width:auto;border-radius:8px}
#about .ab-logos{display:grid;grid-template-columns:1fr 1fr;gap:12px}
#about .ab-logo{min-height:96px;overflow:hidden;display:flex;align-items:center;justify-content:center;
  background:var(--ds-paper);border:1px solid var(--ds-line-2);border-radius:var(--ds-r-xs)}
#about .ab-logo img{width:100%;height:100%;object-fit:cover}
#about .ab-lic{display:grid;grid-template-columns:1fr 1fr;gap:10px}
/* лицензии кликабельны — открываются лайтбоксом из script.js: в исходнике
   этого нет, но 300-пиксельный скан документа нечитаем */
#about .ab-lic img{width:100%;border-radius:10px;border:1px solid var(--ds-line);cursor:zoom-in}

/* — исследование: фото слева, текст справа — */
#about .research{display:flex;align-items:stretch;overflow:hidden;
  background:var(--ds-paper);border:1px solid var(--ds-line);border-radius:var(--ds-r-lg);
  margin-top:clamp(24px,2.6vw,32px)}
#about .research-photo{flex:none;width:46%;min-width:420px;overflow:hidden}
#about .research-photo img{width:100%;height:100%;object-fit:cover}
#about .research-content{flex:1;min-width:0;padding:clamp(24px,2.8vw,36px)}
#about .research-content h3{font:600 clamp(16px,1.4vw,19px)/1.35 var(--ds-font);
  letter-spacing:-.02em;color:var(--ds-ink);margin-bottom:14px}
#about .research-content p{font:400 15px/1.72 var(--ds-font);color:var(--ds-graphite)}

/* — логотипы бизнеса — */
#about .clients-grid{display:grid;grid-template-columns:repeat(8,1fr);gap:12px;
  margin-top:clamp(24px,2.6vw,32px)}
#about .client-card,#about .media-card{min-height:84px;overflow:hidden;
  display:flex;align-items:center;justify-content:center;
  background:var(--ds-paper);border:1px solid var(--ds-line);border-radius:var(--ds-r-xs)}
#about .client-card img{width:100%;height:74px;object-fit:cover}

/* — госслужащие: две текстовые карточки + слайдер фото — */
#about .gov-grid{display:grid;grid-template-columns:1.1fr .9fr;gap:var(--ab-gap);
  align-items:stretch;margin-top:clamp(24px,2.6vw,32px)}
#about .gov-left{display:flex;flex-direction:column;gap:var(--ab-gap)}
#about .gov-text-card{background:var(--ds-paper);border:1px solid var(--ds-line);
  border-radius:var(--ds-r-lg);padding:clamp(22px,2.2vw,28px) clamp(22px,2.5vw,32px)}
#about .gov-icon{width:36px;height:36px;border-radius:50%;background:var(--ds-sun-2);color:#fff;
  display:grid;place-items:center;font:800 16px/1 var(--ds-font);margin-bottom:18px}
#about .gov-text-card h3{font:600 clamp(15px,1.25vw,17px)/1.4 var(--ds-font);
  letter-spacing:-.02em;color:var(--ds-ink);margin-bottom:12px}
#about .gov-desc{font:400 14.5px/1.68 var(--ds-font);color:var(--ds-graphite);margin-bottom:14px}
#about .gov-desc--lead{margin-bottom:16px}
#about .gov-regions{display:flex;flex-direction:column;gap:5px;
  font:400 14px/1.5 var(--ds-font);color:var(--ds-graphite)}
#about .gov-regions li::before{content:"—\00a0";color:var(--ds-sun-2)}
#about .gov-regions-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px 40px;
  font:400 14px/1.5 var(--ds-font);color:var(--ds-graphite)}
#about .gov-photo{min-height:420px;overflow:hidden;
  background:var(--ds-paper);border:1px solid var(--ds-line);border-radius:var(--ds-r-lg)}
#about .corp-slider{position:relative;height:100%;min-height:420px}
#about .corp-slide{position:absolute;inset:0;opacity:0;transition:opacity .5s var(--ds-ease)}
#about .corp-slide.active{opacity:1}
/* <picture> — инлайновая обёртка: без display:block/height:100% процентная
   высота у img потеряет базу и слайд схлопнется в натуральный размер */
#about .corp-slide picture{display:block;width:100%;height:100%}
#about .corp-slide img{width:100%;height:100%;object-fit:cover}
/* мишень 44×44 — минимум для пальца; было 40 (36 на 320) */
#about .corp-btn{position:absolute;top:50%;transform:translateY(-50%);z-index:2;
  width:44px;height:44px;border-radius:50%;border:0;padding:0;cursor:pointer;
  background:rgba(255,255,255,.88);color:var(--ds-ink);font:400 17px/1 var(--ds-font);
  box-shadow:0 6px 18px rgba(27,6,36,.24);
  transition:background var(--ds-t-fast),transform var(--ds-t-fast) var(--ds-ease)}
#about .corp-btn:hover{background:#fff;transform:translateY(-50%) scale(1.06)}
#about .corp-btn:focus-visible{outline:2px solid var(--ds-sun-2);outline-offset:2px}
#about .corp-prev{left:12px}
#about .corp-next{right:12px}
/* точки: визуально те же 8px, но кликается вся клетка 44×44.
   Мишени идут встык (gap:0) — так они не перекрывают друг друга:
   при прежнем шаге 14px зоны соседей накладывались бы и попасть
   в первые точки было бы невозможно. Ряд из пяти = 220px, влезает
   даже в слайдер на 320px (284px). */
#about .corp-dots{position:absolute;left:50%;bottom:0;transform:translateX(-50%);
  display:flex;gap:0;z-index:2}
#about .corp-dot{position:relative;width:44px;height:44px;border:0;padding:0;cursor:pointer;
  background:transparent;-webkit-tap-highlight-color:transparent}
#about .corp-dot::after{content:"";position:absolute;left:50%;top:50%;width:8px;height:8px;
  margin:-4px 0 0 -4px;border-radius:50%;background:rgba(255,255,255,.55);
  transition:background var(--ds-t-fast)}
#about .corp-dot.active::after{background:#fff}
#about .corp-dot:focus-visible{outline:2px solid #fff;outline-offset:-14px;border-radius:50%}

/* — публикации — */
#about .media-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:12px;
  margin-top:clamp(24px,2.6vw,32px)}
#about .media-card img{width:100%;object-fit:cover}

/* лайтбокс лицензий — элемент создаёт script.js */
#about .lightbox{
  position:fixed;inset:0;z-index:1300;background:rgba(27,6,36,.84);
  display:none;align-items:center;justify-content:center;padding:30px;cursor:zoom-out;
}
#about .lightbox.on{display:flex}
#about .lightbox img{max-height:92vh;max-width:92vw;border-radius:var(--ds-r-xs)}

@media (max-width:1199px){
  #about .clients-grid{grid-template-columns:repeat(6,1fr)}
  #about .research-photo{width:42%;min-width:330px}
  #about .gov-grid{grid-template-columns:1fr 1fr}
  #about .gov-regions-grid{gap:6px 24px}
}
@media (max-width:959px){
  #about .ab-top,#about .ab-bottom,#about .gov-grid{grid-template-columns:1fr}
  #about .research{flex-direction:column}
  #about .research-photo{width:100%;min-width:0;height:auto;min-height:240px}
  #about .research-photo img{max-height:340px}
  #about .clients-grid{grid-template-columns:repeat(4,1fr)}
  #about .media-grid{grid-template-columns:repeat(3,1fr)}
  #about .gov-photo,#about .corp-slider{min-height:340px}
  #about .gov-regions-grid{gap:6px 40px}
}
@media (max-width:639px){
  #about .clients-grid,#about .media-grid{grid-template-columns:repeat(2,1fr)}
  #about .ab-row{flex-direction:column;align-items:flex-start;gap:12px}
  #about .gov-regions-grid{grid-template-columns:1fr;gap:6px}
  #about .gov-photo,#about .corp-slider{min-height:260px}
  #about .ab-logo{min-height:78px}
  #about .research-photo{min-height:200px}
  #about .research-photo img{max-height:260px}
}
@media (max-width:374px){
  #about .ab-logos{gap:10px}
  #about .ab-lic{gap:8px}
  #about .ab-ico{width:52px;height:52px}
  #about .ab-ico svg{width:25px;height:25px}
  /* стрелки НЕ ужимаем до 36px: мишень пальца не зависит от ширины экрана */
}
@media (hover:hover) and (prefers-reduced-motion:no-preference){
  #about .ab-stat,#about .ab-card,#about .gov-text-card{
    transition:transform var(--ds-t-hover) var(--ds-ease),border-color var(--ds-t-hover) var(--ds-ease);
  }
  #about .ab-stat:hover,#about .ab-card:hover,#about .gov-text-card:hover{
    transform:translateY(-3px);border-color:rgba(27,6,36,.18);
  }
  #about .ab-logo img,#about .client-card img,#about .media-card img{
    transition:transform .5s var(--ds-ease);
  }
  #about .ab-logo:hover img,#about .client-card:hover img,#about .media-card:hover img{
    transform:scale(1.05);
  }
}

/* ============================================================================
   16. ФУТЕР — zerocoder-footer
   Ниже стоит КАНОНИЧЕСКАЯ версия пакета: тёмно-синий #1a2438 + лайм #97e017.

   ⚙ ПЕРЕКЛЮЧЕНИЕ НА ТЁПЛУЮ ВЕРСИЮ (чернила страницы + янтарь):
     добавь атрибут data-ftr="warm" тегу <html> в index.html:
        <html lang="ru" data-ftr="warm">
     Слой [data-ftr="warm"] лежит в конце этого раздела; убрать атрибут —
     вернётся канон. Разметка в обоих случаях одна и та же.
   ========================================================================== */
.footer{
  --zc-space-3:12px; --zc-space-4:16px; --zc-space-5:24px; --zc-space-6:32px;
  --zc-space-7:48px; --zc-space-8:64px; --zc-space-9:96px;
  --zc-accent:#97e017;
  --zc-easing:cubic-bezier(.22,1,.36,1);
  position:relative;
  background:#1a2438;color:rgba(255,255,255,.7);
  /* поля секции — те же, что у .sc: контейнер обязан совпасть с остальной
     страницей по левому и правому краю. Канон пакета (1200px + 24px)
     давал футеру собственную, более узкую сетку */
  padding:var(--zc-space-9) clamp(18px,3.4vw,56px) var(--zc-space-6);
  font-size:15px;font-family:'Manrope',Arial,sans-serif;
  overflow-x:clip;overflow-y:visible;
}
/* safe-area: те же боковые поля, что у .sc/.hv, плюс нижняя полоса жеста */
.footer{padding-left:max(clamp(18px,3.4vw,56px),env(safe-area-inset-left));
        padding-right:max(clamp(18px,3.4vw,56px),env(safe-area-inset-right));
        padding-bottom:max(var(--zc-space-6),env(safe-area-inset-bottom))}
.footer *{box-sizing:border-box}
.footer__container{position:relative;z-index:1;max-width:var(--ds-max);margin:0 auto;padding:0}
.footer__top{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:var(--zc-space-8);
  padding-bottom:var(--zc-space-7);border-bottom:1px solid rgba(255,255,255,.08)}
.footer__top > *{min-width:0}
.footer__brand{display:flex;flex-direction:column;gap:var(--zc-space-5)}
.footer__logo{display:inline-flex;align-items:center;text-decoration:none}
.footer__logo-img{display:block;height:36px;width:auto;max-width:220px}
.footer__address{display:block;font-size:13px;line-height:1.45;color:rgba(255,255,255,.55)}
.footer__badges{display:inline-flex;align-items:center;gap:12px;padding:10px 14px;
  background:rgba(255,255,255,.05);border-radius:14px;width:fit-content}
.footer__badge-img{display:block;height:44px;width:auto}
.footer__badge-img--rk{height:48px}
.footer__badge-img--sk{height:36px}
.footer__col{font-size:15px}
.footer__col h4{font-size:13px;color:rgba(255,255,255,.45);margin:0 0 var(--zc-space-4);
  font-weight:500;letter-spacing:0;text-transform:none}
.footer__col ul{list-style:none;padding:0;margin:0;display:grid;gap:var(--zc-space-3)}
.footer__col a{color:#fff;text-decoration:none;transition:color .2s var(--zc-easing)}
.footer__col a:hover{color:var(--zc-accent)}
.footer__col--contacts{display:flex;flex-direction:column;gap:var(--zc-space-5)}
.footer__contact-block h4{margin-bottom:4px}
.footer__contact-value{display:inline-block;font-size:24px;font-weight:700;color:#fff;
  letter-spacing:-.01em;text-decoration:none;transition:color .2s}
.footer__contact-value:hover{color:var(--zc-accent)}
.footer__socials{display:flex;gap:12px;margin-top:6px;flex-wrap:wrap}
.footer__social{width:44px;height:44px;border-radius:50%;display:grid;place-items:center;
  transition:transform .2s var(--zc-easing),box-shadow .2s}
.footer__social--tg{background:#2aabee}
.footer__social--wa{background:#25d366}
.footer__social--yt{background:#ff0000}
/* MAX — готовый брендовый бейдж (svg с вшитым градиентом), скругляем под круг */
.footer__social--max{overflow:hidden}
.footer__social picture{display:block;width:100%;height:100%}
.footer__social-img{width:100%;height:100%;object-fit:cover;border-radius:50%}
.footer__social:hover{transform:translateY(-2px) scale(1.06);box-shadow:0 8px 20px -6px rgba(0,0,0,.5)}
.footer__social svg{width:22px;height:22px}
.footer__bottom{position:relative;z-index:1;padding-top:var(--zc-space-6);display:flex;
  justify-content:space-between;gap:var(--zc-space-5);flex-wrap:wrap;
  font-size:13px;color:rgba(255,255,255,.45)}
.footer__copy{letter-spacing:.01em}
.footer__legal{display:flex;gap:var(--zc-space-7);flex-wrap:wrap}
/* ⚠️ 1199, а НЕ 959 (канон пакета). Четвёртая колонка держит почту:
   care@zerocoder.ru при 24px/700 занимает 217px, а колонка контактов
   в четырёхколоннике проваливается ниже этого уже на 1140px — на 960–990px
   почта уезжала за край экрана и физически срезалась (overflow-x:clip).
   Порог 1200 даёт колонку 231px — запас 15px. Заодно телефон перестал
   рваться на две строки (это начиналось с 1110px). */
@media (max-width:1199px){
  .footer__top{grid-template-columns:1fr 1fr;gap:var(--zc-space-6)}
}
@media (max-width:639px){
  .footer__top{grid-template-columns:1fr}
  .footer{padding-top:var(--zc-space-8)}
}
@media (max-width:374px){
  /* поля не трогаем — clamp секции уже даёт 18px, как у всех блоков */
  .footer__contact-value{font-size:21px}
  .footer__legal{gap:var(--zc-space-5)}
}

/* ---- ТЁПЛАЯ ВЕРСИЯ (включается атрибутом data-ftr="warm" на <html>) ----
   Меняются только цвета, радиусы соц-кнопок и закатное свечение снизу.
   Сетка, кегли, отступы, разметка — те же. */
[data-ftr="warm"] .footer{
  --zc-accent:var(--ds-sun-1);
  background:var(--ds-ink);color:rgba(255,255,255,.68);
}
[data-ftr="warm"] .footer::before{
  content:"";position:absolute;inset:0;z-index:0;pointer-events:none;filter:blur(70px);opacity:.5;
  background:
    radial-gradient(46% 55% at 82% 108%,rgba(233,160,90,.55) 0%,transparent 70%),
    radial-gradient(40% 50% at 12% 116%,rgba(217,113,63,.38) 0%,transparent 72%);
}
[data-ftr="warm"] .footer__top{border-bottom-color:rgba(255,255,255,.10)}
[data-ftr="warm"] .footer__address{color:rgba(255,255,255,.5)}
[data-ftr="warm"] .footer__badges{background:rgba(255,255,255,.055);border:1px solid rgba(255,255,255,.10)}
[data-ftr="warm"] .footer__col h4{color:rgba(255,255,255,.42)}
[data-ftr="warm"] .footer__col a{color:rgba(255,255,255,.86)}
[data-ftr="warm"] .footer__bottom{color:rgba(255,255,255,.38)}
[data-ftr="warm"] .footer__social{border-radius:var(--ds-r-sm)}
[data-ftr="warm"] .footer__social-img{border-radius:var(--ds-r-sm)}
[data-ftr="warm"] .footer__social:hover{box-shadow:0 10px 22px -8px rgba(0,0,0,.6)}

/* ============================================================================
   17. ПОПАП РЕГИСТРАЦИИ (GetCourse)
   Скрытие через visibility/opacity, а НЕ display: iframe виджета обязан
   грузиться с реальной шириной, иначе форма приходит свёрнутой.
   ========================================================================== */
.gcp{position:fixed;inset:0;z-index:9500;
  visibility:hidden;opacity:0;pointer-events:none;
  display:flex;align-items:center;justify-content:center;padding:clamp(12px,3vw,40px);
  transition:opacity .28s var(--ds-ease),visibility 0s linear .28s}
/* попап лежит поверх всего и обязан учитывать вырез и нижнюю полосу */
.gcp{padding:max(clamp(12px,3vw,40px),env(safe-area-inset-top))
            max(clamp(12px,3vw,40px),env(safe-area-inset-right))
            max(clamp(12px,3vw,40px),env(safe-area-inset-bottom))
            max(clamp(12px,3vw,40px),env(safe-area-inset-left))}
.gcp.is-open{visibility:visible;opacity:1;pointer-events:auto;transition-delay:0s}
.gcp-back{position:absolute;inset:0;background:rgba(27,6,36,.62);
  -webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}
.gcp-card{position:relative;z-index:1;width:min(680px,100%);max-height:min(88vh,860px);
  display:flex;flex-direction:column;
  background:var(--ds-paper);border-radius:var(--ds-r-lg);box-shadow:var(--ds-sh-pop);
  transform:translateY(14px);transition:transform .32s var(--ds-ease)}
.gcp.is-open .gcp-card{transform:none}
.gcp-x{position:absolute;top:10px;right:10px;z-index:2;width:40px;height:40px;border-radius:50%;
  background:rgba(27,6,36,.06);color:var(--ds-ink);font:400 22px/1 var(--ds-font);
  display:grid;place-items:center;transition:background var(--ds-t-fast)}
.gcp-x:hover{background:rgba(27,6,36,.12)}
.gcp-x:focus-visible{outline:2px solid var(--ds-sun-2);outline-offset:2px}
.gcp-body{flex:1 1 auto;min-height:0;overflow:auto;-webkit-overflow-scrolling:touch;
  border-radius:var(--ds-r-lg)}
.gcp-body iframe{display:block;width:100%;min-height:520px;border:0}
/* обёртки виджетов GC: оба скрипта грузятся на загрузке страницы, показывается
   тот, чей тариф выбрали. height/overflow этим обёрткам проставляет лоадер GC —
   свои значения сюда не писать, затрёт форму. */
.gcp-w{display:none;width:100%}
.gcp-w.is-on{display:block}
/* заглушка до вставки кода виджета — на боевом коде не показывается */
.gcp-stub{padding:clamp(30px,4vw,52px);text-align:center}
.gcp-stub b{display:block;font:600 clamp(18px,1.8vw,23px)/1.25 var(--ds-font);
  letter-spacing:-.025em;color:var(--ds-ink);margin-bottom:12px}
.gcp-stub p{font:400 15px/1.6 var(--ds-font);color:var(--ds-stone);max-width:46ch;margin:0 auto}
.gcp-stub code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;color:var(--ds-sun-2)}
@media (max-width:639px){
  .gcp{padding:0;align-items:flex-end}
  .gcp-card{width:100%;max-height:92vh;border-radius:var(--ds-r-lg) var(--ds-r-lg) 0 0}
  /* шторка прижата к низу: поле под жестовую полосу вешаем на саму карточку,
     иначе между шторкой и краем экрана появится щель */
  .gcp-card{padding-bottom:env(safe-area-inset-bottom)}
}

/* ============================================================================
   18. REVEAL ПО СКРОЛЛУ
   Классы навешивает script.js: scroll + rAF, НЕ IntersectionObserver
   (у IO при быстрой прокрутке коллбэк отрабатывает не для всех элементов).
   Без JS контент виден: .rv появляется только вместе со скриптом.
   ========================================================================== */
.rv{opacity:0;transform:translateY(16px);
  transition:opacity var(--ds-t-reveal) var(--ds-ease),transform var(--ds-t-reveal) var(--ds-ease)}
.rv.is-in{opacity:1;transform:none}

/* ============================================================================
   19. REDUCED MOTION
   ========================================================================== */
@media (prefers-reduced-motion:reduce){
  .rv{opacity:1;transform:none;transition:none}
  .ds-card:hover,.ds-btn:hover,.tf-btn:hover,.pr-a__card:hover,.sp-c__card:hover{transform:none}
  .ds-grain{opacity:.26}
  .hv-grain{opacity:.24}
  .sp-c__sum svg,.gcp,.gcp-card{transition:none}
  .js .hv-in > *{animation:none}
}

/* ============================================================================
   20. КРЕАТИВНЫЙ СЛОЙ — 3D-объекты и сцена финального CTA
   Добавлено поверх утверждённой сборки. Раздел самодостаточный: удали его
   целиком вместе с блоком 5 в script.js и тремя кусками разметки — страница
   вернётся к состоянию index.pre-creative.html без побочных эффектов.

   Что здесь:
     20.2  монеты  → карточка «Честную картину дохода по этапам» (#result)
     20.3  мегафон → липкая колонка «Что будет в эфире?» (#program)
     20.4  тёплое пятно за парой портретов в финальном CTA (#final-cta)

   ⚠️ ПОРЯДОК В ФАЙЛЕ. Раздел обязан стоять последним: он перебивает
   .rs-card > *:not(.ds-wm){position:relative} и .ds-card-dark > * {z-index:2}
   селекторами той же/большей специфичности. Перенесёшь выше — декор
   вернётся в поток и разломает сетку карточек.
   ========================================================================== */

/* — 20.1 общий каркас 3D-объекта ------------------------------------------
   .fx3d          — внешняя коробка, на неё пишет transform параллакс/float
   .fx3d__tilt    — внутренняя, на неё пишет наклон к курсору (два transform
                    на одном узле подрались бы)
   .fx3d__glint   — блик: белая диагональная полоса, замаскированная силуэтом
                    самой картинки, поэтому светится ровно по объекту.       */
.fx3d{position:relative;line-height:0;pointer-events:none;
  -webkit-user-select:none;user-select:none}
.fx3d__tilt{position:relative;display:block;line-height:0;
  transition:transform .55s var(--ds-ease)}
.fx3d picture{display:block}
.fx3d img{display:block;width:100%;height:auto}

/* без поддержки масок полоса легла бы прямоугольником поверх картинки —
   в таком браузере блика просто нет */
.fx3d__glint{display:none}
@supports ((-webkit-mask-image:url("#m")) or (mask-image:url("#m"))){
  .fx3d__glint{display:block;position:absolute;inset:0;pointer-events:none;opacity:0;
    background:linear-gradient(112deg,
      rgba(255,255,255,0) 41%,rgba(255,255,255,.92) 50%,rgba(255,255,255,0) 59%);
    background-size:300% 100%;background-position:140% 0;background-repeat:no-repeat;
    -webkit-mask-image:var(--fx3d-mask);mask-image:var(--fx3d-mask);
    -webkit-mask-size:100% 100%;mask-size:100% 100%;
    -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
    mix-blend-mode:screen}
}
.fx3d.is-glint .fx3d__glint{animation:fx3d-glint 1.15s var(--ds-ease) 1}
@keyframes fx3d-glint{
  0%  {opacity:0;  background-position:140% 0}
  16% {opacity:.95}
  84% {opacity:.95}
  100%{opacity:0;  background-position:-40% 0}
}
@keyframes fx3d-float{
  0%,100%{transform:translate3d(0,0,0)}
  50%    {transform:translate3d(0,-10px,0)}
}

/* — 20.2 МОНЕТЫ на карточке про доход --------------------------------------
   Смысловой пик блока — единственная карточка про деньги, у неё уже стоит
   закатная промывка. Монеты стоят в правом верхнем углу ЦЕЛИКОМ, с отбивкой
   от кромок: overflow:hidden карточки резал крайнюю монету пополам, и это
   читалось браком, а не приёмом. Глубину даёт drop-shadow, а не срез.
   Селектор с тремя классами — чтобы не спорить с .rs-card > *:not(.ds-wm). */
/* РАЗМЕР ВЫВЕРЕН ЗАМЕРОМ, НЕ НА ГЛАЗ. Верхний правый карман карточки живёт
   между её кромкой и первой строкой <b>, а та едет по ширине: на 1440 у нас
   ~180px запаса, на 760 (две узкие колонки) — вдвое меньше. Ступени ниже
   держат зазор ≥8px до набора на всех ширинах с учётом хода параллакса
   (±14px десктоп / ±7px мобилка). Увеличишь монеты — перепроверь зазор. */
.rs-card .fx3d--coins.fx3d{position:absolute;z-index:1;
  top:clamp(6px,.75vw,13px);right:clamp(6px,.75vw,13px);
  width:clamp(92px,7.2vw,106px);aspect-ratio:309/340;
  --fx3d-mask:url("assets/coins-3d.webp");
  filter:drop-shadow(0 16px 26px rgba(176,84,36,.30));
  will-change:transform}
/* ватермарк-график живёт в противоположном углу и на 7% прозрачности —
   пересечения с монетами нет, обе метки не спорят */
@media (hover:hover) and (pointer:fine){
  .rs-card--grad:hover .fx3d--coins .fx3d__tilt{transform:rotate(-6deg) scale(1.05)}
}
/* 640–1023: сетка ещё двухколоночная, а карточка уже узкая (348–441px) —
   заголовок ломается и поднимается под самую кромку. Самый тесный участок */
@media (max-width:1023px){
  .rs-card .fx3d--coins.fx3d{width:66px;top:8px;right:8px}
}
/* от 639 карточки становятся одноколоночными и снова широкими,
   но заголовок тянется почти во всю ширину — запас всё равно небольшой */
@media (max-width:639px){
  .rs-card .fx3d--coins.fx3d{width:60px;top:6px}
}
@media (max-width:374px){
  .rs-card .fx3d--coins.fx3d{width:56px;top:6px;right:6px}
}

/* — 20.3 МЕГАФОН в липкой колонке программы --------------------------------
   Колонка «Что будет в эфире?» липкая и короткая (193px), а рельса рядом —
   926px: под кнопкой полколонки пустоты на всю прокрутку блока. Мегафон
   = «эфир», по смыслу стоит ровно там, где смотрят.
   Ниже 960px колонка перестаёт быть липкой и просто отодвигает список —
   объект скрываем целиком. */
.pr-a__mega{display:none}
@media (min-width:960px){
  .pr-a__mega{display:block;width:clamp(156px,13.4vw,204px);
    margin-top:clamp(26px,3vw,42px);
    --fx3d-mask:url("assets/megaphone-3d.webp");
    filter:drop-shadow(0 24px 34px rgba(176,84,36,.24));
    animation:fx3d-float 7.5s ease-in-out infinite;
    will-change:transform}
  .pr-a__mega .fx3d__tilt{transform-origin:44% 58%}
}

/* — 20.4 тёплый рассвет за парой портретов -------------------------------
   У .ds-card-dark::after свечение идёт только снизу, из-за чего верх плашки
   читался мёртвым, а белые полароиды стояли на глухом чернильном фоне.
   Пятно повторяет логику .bn-glow из email-баннера: тёплый свет сверху
   справа, ровно за карточками.
   Контраст проверен расчётом композита: под лидом пятно набирает .05 альфы,
   лид (#fff 74%) даёт 10,1:1 против 10,5:1 на чистой плашке. Ограничение
   здесь не доступность, а вкус — выше .28 угол желтит.

   ПРАВКА 07.08: плашка переехала на первый экран, поэтому пятно объявлено
   вместе с .hv-card в разделе 6. Здесь оставлен только разбор, почему оно
   именно такое. */

/* — 20.5 СВЕТ ПО КУРСОРУ на тёмной плашке ---------------------------------
   Приём и константы — как в боевом freelance-guarantee: JS пишет на плашку
   --mx/--my (0…1) с инерцией (lerp .075), всё остальное делает CSS.

   ПОЧЕМУ НИЧЕГО НЕ ЗАСВЕЧИВАЕТ. Слой лежит на z-index:1, а у .ds-card-dark
   каждый прямой ребёнок (текстовая колонка и колонка портретов) поднят на
   z-index:2. Свет физически ниже и текста, и белых полароидов: портреты он
   не трогает вовсе, под текстом только подсвечивает фон.
   Пик .26 выбран по контрасту (считал композит, не на глаз). Над текстом,
   то есть в левой половине, где углового пятна нет: кикер #e9a05a 5,4:1,
   лид (#fff 74%) 7,2:1, белый заголовок 11,8:1. Даже если бы оба пятна
   сошлись в одной точке — 4,1 / 5,7 / 8,9:1. Выше .30 кикер уходит под 4,5:1.

   БЕЗ КУРСОРА (тач, reduced motion, до первого движения мыши) работают
   значения по умолчанию .72/.30 — мягкая статичная подсветка за портретами,
   плашка не выглядит мёртвой и ничего не анимируется. */
/* селектор привязан к .ds-card-dark, а не к конкретному блоку: плашка уже
   один раз переехала между экранами, второй переезд не должен ломать свет */
.ds-card-dark .ds-spot{position:absolute;inset:0;z-index:1;pointer-events:none;
  border-radius:inherit;opacity:.62;
  transition:opacity .5s var(--ds-ease);
  background:radial-gradient(42% 66% at calc(var(--mx,.72) * 100%) calc(var(--my,.30) * 100%),
    rgba(233,160,90,.26) 0%,rgba(228,121,78,.12) 44%,rgba(233,160,90,0) 72%)}
.ds-card-dark:hover .ds-spot{opacity:1}

/* — 20.6 reduced motion: объекты остаются, движение снимается — */
@media (prefers-reduced-motion:reduce){
  .pr-a__mega{animation:none}
  .fx3d__tilt{transition:none}
  .fx3d.is-glint .fx3d__glint{animation:none}
  .rs-card--grad:hover .fx3d--coins .fx3d__tilt{transform:none}
  /* свет остаётся, но перестаёт ездить: JS не подключается, значения
     --mx/--my держатся дефолтными, гаснуть/разгораться тоже нечему */
  .ds-card-dark .ds-spot{transition:none;opacity:.72}
  .ds-card-dark:hover .ds-spot{opacity:.72}
}
