/* ============================================================
   Vulnify landing — общие стили всех страниц.
   Палитра и шкала взяты из тёмной темы приложения
   (backend/static/style.css, [data-theme="dark"]).
   Страница намеренно однотемная: тёмная, как просил заказчик.
   ============================================================ */

/* ---------- Шрифты: свои файлы, без внешних запросов ----------
   Латиница и кириллица отдельными подмножествами: браузер качает только
   то, что есть на странице. У Archivo нет кириллицы — русские заголовки
   набираются Inter, поэтому у Inter вся ось насыщенности. Лицензия — OFL,
   тексты рядом со шрифтами в assets/fonts/. */
@font-face{font-family:'Inter';font-style:normal;font-weight:100 900;font-display:swap;
  src:url(fonts/inter-latin.woff2) format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Inter';font-style:normal;font-weight:100 900;font-display:swap;
  src:url(fonts/inter-cyrillic.woff2) format('woff2');
  unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'Archivo';font-style:normal;font-weight:100 900;font-display:swap;
  src:url(fonts/archivo-latin.woff2) format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:100 800;font-display:swap;
  src:url(fonts/jetbrains-mono-latin.woff2) format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:100 800;font-display:swap;
  src:url(fonts/jetbrains-mono-cyrillic.woff2) format('woff2');
  unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}

:root{
  color-scheme: dark;

  /* Ground / surfaces */
  --ground:#0b111d;
  --ground-2:#0d1320;
  --surface:#141d2e;
  --surface-2:#171f31;
  --surface-3:#1e2740;

  /* Ink. --ink-3 и --ink-4 подняты до контраста AA (4.5:1) для мелкого
     текста на самой светлой поверхности карточек (--surface-3). */
  --ink:#e5edf9;
  --ink-2:rgba(229,237,249,.78);
  --ink-3:rgba(229,237,249,.64);
  --ink-4:rgba(229,237,249,.54);

  /* Brand */
  --indigo:#818cf8;
  --indigo-deep:#6366f1;
  --cyan:#2fb7f0;
  --violet:#c084fc;

  /* Semantic severity */
  --crit:#ff6b6b;
  --high:#fb923c;
  --med:#fbbf24;
  --low:#4ade80;

  /* Lines */
  --line:rgba(129,140,248,.16);
  --line-2:rgba(129,140,248,.28);

  --shadow:0 24px 52px rgba(0,0,0,.38);
  --shadow-lg:0 34px 78px rgba(0,0,0,.5);
  --scrim:rgba(11,17,29,.72); /* подложка контактного диалога — тот же --ground */
  --menu-bg:var(--ground); /* раскрытое меню на узком экране: непрозрачное, текст страницы не просвечивает */

  --r-sm:8px; --r-md:12px; --r-lg:18px; --r-xl:24px;

  --maxw:1180px;
  --sec-pad:clamp(72px,9vw,120px);

  --f-display:'Archivo','Inter',system-ui,-apple-system,'Segoe UI',sans-serif;
  --f-body:'Inter',system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;
  --f-mono:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
}

*,*::before,*::after{box-sizing:border-box}

html{scroll-behavior:smooth;scroll-padding-top:80px}

body{
  margin:0;
  font-family:var(--f-body);
  font-size:16px;
  line-height:1.62;
  color:var(--ink);
  background:var(--ground);
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}

/* ---------- Ambient background: два радиальных пятна + сетка.
     Без filter:blur() — мягкость даёт сам градиент, поэтому
     анимация трансформа не пересчитывает размытие каждый кадр. ---------- */
.amb{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden}
.amb i{
  position:absolute;display:block;width:70vmax;height:70vmax;border-radius:50%;
  will-change:transform;
}
.amb i:nth-child(1){
  top:-32vmax;left:-22vmax;
  background:radial-gradient(circle at center,rgba(99,102,241,.34) 0%,rgba(99,102,241,.10) 38%,transparent 66%);
  animation:drift-a 32s ease-in-out infinite;
}
.amb i:nth-child(2){
  bottom:-38vmax;right:-24vmax;
  background:radial-gradient(circle at center,rgba(47,183,240,.24) 0%,rgba(47,183,240,.07) 40%,transparent 68%);
  animation:drift-b 38s ease-in-out infinite;
}
.amb u{
  position:absolute;inset:-10%;display:block;
  background-image:
    linear-gradient(90deg,rgba(229,237,249,.045) 1px,transparent 1px),
    linear-gradient(0deg,rgba(229,237,249,.045) 1px,transparent 1px);
  background-size:104px 104px;
  -webkit-mask-image:radial-gradient(ellipse 90% 60% at 50% 0%,#000 0%,transparent 78%);
          mask-image:radial-gradient(ellipse 90% 60% at 50% 0%,#000 0%,transparent 78%);
}
@keyframes drift-a{0%,100%{transform:translate3d(0,0,0) scale(1)}50%{transform:translate3d(7vw,5vh,0) scale(1.12)}}
@keyframes drift-b{0%,100%{transform:translate3d(0,0,0) scale(1.06)}50%{transform:translate3d(-6vw,-4vh,0) scale(1)}}

.page{position:relative;z-index:1}

/* ---------- Типографика ---------- */
h1,h2,h3{font-family:var(--f-display);margin:0;text-wrap:balance;letter-spacing:-.03em;line-height:1.06}
h1{font-weight:800;font-size:clamp(2.4rem,5.4vw,4.1rem);letter-spacing:-.042em}
h2{font-weight:800;font-size:clamp(1.85rem,3.6vw,2.9rem)}
h3{font-weight:700;font-size:1.06rem;letter-spacing:-.018em;line-height:1.3}
p{margin:0}
code{font-family:var(--f-mono)}

.eyebrow{
  display:inline-flex;align-items:center;gap:10px;
  font-family:var(--f-mono);font-size:.72rem;font-weight:600;
  letter-spacing:.2em;text-transform:uppercase;color:var(--cyan);
}
/* Маркер секции — лестница критичности. Такой глиф есть только
   у сканера: четыре ступени = crit / high / med / low. */
.sev-mark{display:flex;align-items:flex-end;gap:2px;height:13px}
.sev-mark s{display:block;width:3px;border-radius:1px;text-decoration:none}
.sev-mark s:nth-child(1){height:13px;background:var(--crit)}
.sev-mark s:nth-child(2){height:10px;background:var(--high)}
.sev-mark s:nth-child(3){height:7px;background:var(--med)}
.sev-mark s:nth-child(4){height:4px;background:var(--low)}

.lead{color:var(--ink-2);font-size:1.06rem;max-width:62ch}

.wrap{width:100%;max-width:var(--maxw);margin:0 auto;padding-inline:24px}
.sec{padding-block:var(--sec-pad)}
.sec-head{display:flex;flex-direction:column;gap:18px;max-width:68ch;margin-bottom:48px}
.more{display:flex;flex-wrap:wrap;gap:12px;margin-top:22px}

/* ---------- Кнопки ---------- */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:9px;
  font-family:var(--f-body);font-size:.94rem;font-weight:600;letter-spacing:-.005em;
  padding:13px 24px;border-radius:var(--r-md);border:1px solid transparent;
  text-decoration:none;cursor:pointer;white-space:nowrap;
  transition:transform .18s cubic-bezier(.2,.8,.2,1),box-shadow .18s ease,background-color .18s ease,border-color .18s ease,color .18s ease;
}
.btn:active{transform:translateY(1px)}
.btn-p{
  color:var(--ground);
  background:linear-gradient(135deg,#a5b0ff 0%,var(--indigo) 46%,var(--cyan) 100%);
  box-shadow:0 12px 30px rgba(99,102,241,.3);
}
.btn-p:hover{box-shadow:0 18px 42px rgba(99,102,241,.42);transform:translateY(-2px)}
.btn-g{color:var(--ink);background:rgba(129,140,248,.07);border-color:var(--line-2)}
.btn-g:hover{background:rgba(129,140,248,.14);border-color:var(--indigo);transform:translateY(-2px)}
.btn-sm{padding:9px 16px;font-size:.86rem;border-radius:var(--r-sm)}

a:focus-visible,button:focus-visible,summary:focus-visible{outline:2px solid var(--cyan);outline-offset:3px;border-radius:6px}

.tlink{
  color:var(--ink);font-weight:600;text-decoration:underline;text-decoration-color:var(--line-2);
  text-underline-offset:4px;transition:text-decoration-color .18s ease;
}
.tlink:hover{text-decoration-color:var(--indigo)}

/* ---------- Навигация ----------
   На широком экране ссылки и язык стоят в строке. Уже 1100 px они уходят
   в выпадающее меню под шапкой (кнопка .menu-btn, логика — assets/site.js):
   в шапке остаются только марка, CTA и кнопка меню. */
.nav-sentinel{position:absolute;top:0;height:1px;width:1px}
.nav{
  position:sticky;top:0;z-index:60;
  border-bottom:1px solid transparent;
  transition:background-color .25s ease,border-color .25s ease,backdrop-filter .25s ease;
}
.nav.is-stuck{
  background:rgba(11,17,29,.78);
  border-bottom-color:var(--line);
  -webkit-backdrop-filter:blur(14px) saturate(140%);
          backdrop-filter:blur(14px) saturate(140%);
}
.nav-in{display:flex;align-items:center;gap:28px;height:68px}
.brand{display:flex;align-items:center;gap:10px;text-decoration:none;color:var(--ink);flex-shrink:0}
.brand img{display:block;flex-shrink:0;width:36px;height:36px}
.brand b{font-family:var(--f-display);font-weight:800;font-size:1.2rem;letter-spacing:-.035em}
.nav-menu{display:flex;align-items:center;gap:24px;flex:1;min-width:0}
.nav-links{display:flex;gap:26px}
.nav-links a{
  color:var(--ink-3);text-decoration:none;font-size:.9rem;font-weight:500;white-space:nowrap;
  transition:color .18s ease;
}
.nav-links a:hover,.nav-links a[aria-current="page"]{color:var(--ink)}
.nav-menu .lang{margin-left:auto}
.nav-cta{display:flex;align-items:center;gap:10px}
.menu-btn{
  display:none;align-items:center;justify-content:center;width:42px;height:42px;padding:0;
  border-radius:var(--r-sm);border:1px solid var(--line-2);background:rgba(129,140,248,.07);color:var(--ink);cursor:pointer;
}
.menu-btn svg path{transition:transform .2s ease,opacity .2s ease;transform-origin:center}
.nav.menu-open .menu-btn .m1{transform:translateY(4px) rotate(45deg)}
.nav.menu-open .menu-btn .m2{opacity:0}
.nav.menu-open .menu-btn .m3{transform:translateY(-4px) rotate(-45deg)}

/* ---------- Hero ---------- */
.hero{padding-top:clamp(52px,6.5vw,88px);padding-bottom:clamp(64px,8vw,104px)}
.hero-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:clamp(36px,5vw,64px);align-items:center}
.hero-copy{display:flex;flex-direction:column;gap:24px;align-items:flex-start}
.hero h1{font-size:clamp(2.3rem,4.3vw,3.5rem)}
.grad{
  background:linear-gradient(96deg,#c7cdff 0%,var(--indigo) 34%,var(--cyan) 78%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
}
.hero-actions{display:flex;flex-wrap:wrap;gap:12px}
.hero-note{
  display:flex;gap:9px;align-items:flex-start;max-width:54ch;
  font-size:.84rem;line-height:1.55;color:var(--ink-3);
}
.hero-note::before{content:"";flex-shrink:0;width:6px;height:6px;margin-top:.5em;border-radius:50%;background:var(--med)}

/* ---------- Экран находки (иллюстрация в hero) ----------
   Поля — те же, что у просмотрщика доказательств DAST в приложении:
   severity, proof, exploitability, lifecycle, WSTG/OWASP, CWE, baseline и attack.
   Данные условные, это подписано прямо в шапке окна. */
.fv{
  margin:0;position:relative;border-radius:var(--r-xl);overflow:hidden;
  background:linear-gradient(168deg,var(--surface-2) 0%,var(--ground-2) 100%);
  border:1px solid var(--line-2);box-shadow:var(--shadow-lg);
}
.fv-bar{
  display:flex;align-items:center;gap:12px;padding:12px 18px;
  border-bottom:1px solid var(--line);background:rgba(11,17,29,.5);
}
.dots{display:flex;gap:6px;flex-shrink:0}
.dots i{width:9px;height:9px;border-radius:50%;background:rgba(229,237,249,.16)}
.fv-path{font-family:var(--f-mono);font-size:.76rem;color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.fv-label{
  margin-left:auto;flex-shrink:0;
  font-family:var(--f-mono);font-size:.64rem;font-weight:600;letter-spacing:.1em;text-transform:uppercase;
  padding:3px 10px;border-radius:999px;color:var(--med);background:rgba(251,191,36,.1);border:1px solid rgba(251,191,36,.32);
}
.fv-body{padding:20px 20px 18px;display:flex;flex-direction:column;gap:14px}
.fv-title{font-family:var(--f-body);font-weight:600;font-size:1.04rem;letter-spacing:-.01em;line-height:1.35}
.fv-route{font-family:var(--f-mono);font-size:.8rem;color:var(--ink-2);margin-top:3px;overflow-wrap:anywhere}
.fv-badges{display:flex;flex-wrap:wrap;gap:6px}
.fvb{
  font-family:var(--f-mono);font-size:.66rem;font-weight:600;letter-spacing:.04em;
  padding:3px 9px;border-radius:999px;color:var(--ink-2);background:rgba(129,140,248,.1);border:1px solid var(--line);
}
.fvb.crit{color:#ffb3bf;background:rgba(255,107,107,.18);border-color:rgba(255,107,107,.36);text-transform:uppercase;letter-spacing:.1em}
.fvb.ok{color:var(--low);background:rgba(74,222,128,.1);border-color:rgba(74,222,128,.3)}
.fv-meta{display:grid;grid-template-columns:auto minmax(0,1fr);gap:4px 16px;margin:0;font-family:var(--f-mono);font-size:.72rem}
.fv-meta dt{color:var(--ink-4)}
.fv-meta dd{margin:0;color:var(--ink-2);text-align:right}
.fv-tabs{display:none;gap:4px;padding:3px;border-radius:var(--r-md);background:rgba(11,17,29,.55);border:1px solid var(--line)}
.has-js .fv-tabs{display:flex}
.fv-tabs button{
  flex:1 1 0;min-width:0;min-height:36px;padding:7px 6px;border:0;border-radius:9px;cursor:pointer;
  font-family:var(--f-body);font-size:.78rem;font-weight:600;line-height:1.2;
  color:var(--ink-3);background:transparent;transition:color .18s ease,background-color .18s ease;
}
.fv-tabs button:hover{color:var(--ink)}
.fv-tabs button[aria-selected="true"]{color:var(--ink);background:rgba(129,140,248,.18);box-shadow:inset 0 0 0 1px var(--line-2)}
.fv-tabs button:focus-visible{outline-offset:1px}
.fv-panels{display:flex;flex-direction:column;gap:14px}
/* С JS панели лежат в одной ячейке сетки: высота окна не прыгает при смене вкладки. */
.has-js .fv-panels{display:grid}
.has-js .fv-panel{grid-area:1/1;transition:opacity .25s ease}
.has-js .fv-panel:not(.is-cur){visibility:hidden;opacity:0}
.fv-panel{display:flex;flex-direction:column;gap:10px;font-family:var(--f-mono);font-size:.76rem;line-height:1.65;color:var(--ink-2)}
.fv-h{font-family:var(--f-mono);font-size:.64rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-4)}
.has-js .fv-h{display:none}
.fv-box{padding:10px 12px;border-radius:10px;background:rgba(11,17,29,.6);border:1px solid var(--line)}
.fv-box.atk{border-color:rgba(255,107,107,.3);background:rgba(255,107,107,.05)}
.fv-k{display:block;font-size:.62rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-4);margin-bottom:3px}
.fv-box.atk .fv-k{color:#ffb3bf}
.fv-box code{display:block;color:var(--ink);white-space:pre-wrap;overflow-wrap:anywhere}
.fv-note{color:var(--ink-3);font-family:var(--f-body);font-size:.8rem;line-height:1.55}
.tm{display:grid;grid-template-columns:minmax(0,92px) minmax(0,1fr) auto;gap:10px;align-items:center}
.tm u{display:block;height:6px;border-radius:3px;background:rgba(229,237,249,.07);overflow:hidden;text-decoration:none}
.tm u b{display:block;height:100%;border-radius:3px;background:var(--indigo);transform-origin:left center;transform:scaleX(var(--s,1))}
.tm.atk u b{background:linear-gradient(90deg,var(--med),var(--crit))}
.tm .ms{font-variant-numeric:tabular-nums;color:var(--ink);text-align:right}
.tm.atk .ms{color:var(--med)}
.fv-kv{display:grid;grid-template-columns:auto minmax(0,1fr);gap:6px 14px}
.fv-kv span:nth-child(odd){color:var(--ink-4)}
.fv-kv span:nth-child(even){color:var(--ink)}
.fv-kv .ok{color:var(--low)}
.fv-open{
  display:flex;gap:9px;align-items:flex-start;padding:10px 12px;border-radius:10px;
  border:1px dashed rgba(251,191,36,.36);color:var(--ink-2);font-family:var(--f-body);font-size:.8rem;line-height:1.5;
}
.fv-open b{color:var(--med);font-weight:600}
.has-js .fv.rv .tm u b{transform:scaleX(0)}
.has-js .fv.rv.on .tm u b{transform:scaleX(var(--s,1));transition:transform .9s cubic-bezier(.2,.8,.2,1) .3s}

/* ---------- Звезда цикла (слайд 7 презентации) ----------
   Пять лучей = пять шагов. Активный луч и активный шаг справа
   подсвечиваются вместе; грани луча — два треугольника разной
   плотности, отсюда объём без фильтров. */
.loop{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.05fr);gap:clamp(28px,4vw,56px);align-items:center}
.star-wrap{display:flex;flex-direction:column;align-items:center;gap:10px}
.star{width:100%;max-width:500px;height:auto;display:block}
.star .fa{fill:rgba(47,183,240,.11);transition:fill .45s ease}
.star .fb{fill:rgba(47,183,240,.04);transition:fill .45s ease}
.star .arm.is-cur .fa{fill:rgba(47,183,240,.36)}
.star .arm.is-cur .fb{fill:rgba(47,183,240,.18)}
.star .ridge{stroke:rgba(127,211,245,.45);stroke-width:1}
.star .edge{fill:none;stroke:#7fd3f5;stroke-width:1.4;stroke-linejoin:round;opacity:.85}
.star .penta{fill:none;stroke:rgba(251,191,36,.34);stroke-width:1}
.star .arc{fill:none;stroke:rgba(47,183,240,.45);stroke-width:1.3}
.star .tip{fill:var(--ground);stroke:var(--cyan);stroke-width:1.6;transition:fill .3s ease,stroke .3s ease}
.star .tip.is-cur{fill:var(--cyan);stroke:var(--med);stroke-width:2.4}
.star .lbl{font-family:var(--f-body);font-size:14px;font-weight:500;fill:var(--ink-3);transition:fill .3s ease}
.star .lbl .n{font-family:var(--f-mono);font-size:10.5px;fill:var(--ink-4);transition:fill .3s ease}
.star .lbl.is-cur{fill:var(--ink)}
.star .lbl.is-cur .n{fill:var(--cyan)}
.star .core-t{font-family:var(--f-display);font-weight:800;font-size:15px;letter-spacing:.06em;fill:var(--ink)}
.star-cap{color:var(--ink-3);font-size:.9rem;line-height:1.5;text-align:center;max-width:40ch}

.steps{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}
.stp{
  position:relative;padding:15px 18px 15px 20px;border-radius:var(--r-md);
  border:1px solid var(--line);background:rgba(23,31,49,.45);
  transition:border-color .3s ease,background-color .3s ease;
}
.stp::before{
  content:"";position:absolute;left:-1px;top:13px;bottom:13px;width:2px;border-radius:2px;
  background:linear-gradient(180deg,var(--indigo),var(--cyan));opacity:0;transition:opacity .3s ease;
}
/* Активный шаг — НЕ класс .on: им же помечает появившиеся блоки reveal
   (.rv.on), и на карточках эти два состояния затирали друг друга — шаг,
   с которого уходила подсветка, заодно терял opacity и уезжал вниз. */
.stp.is-cur{border-color:var(--line-2);background:rgba(30,39,64,.72)}
.stp.is-cur::before{opacity:1}
.stp:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}
.stp-top{display:flex;align-items:baseline;gap:12px;margin-bottom:6px}
.stp .num{font-family:var(--f-mono);font-size:.68rem;font-weight:600;color:var(--cyan);letter-spacing:.14em;flex-shrink:0}
.stp p{color:var(--ink-3);font-size:.87rem;line-height:1.58}
.engs{display:flex;flex-wrap:wrap;gap:5px;margin-top:10px}
.eng{
  font-family:var(--f-mono);font-size:.63rem;font-weight:600;letter-spacing:.06em;color:var(--ink-2);
  padding:2px 8px;border-radius:5px;background:rgba(129,140,248,.1);border:1px solid var(--line);
}

/* ---------- Карточки ---------- */
.bento{display:grid;grid-template-columns:repeat(6,1fr);gap:16px}
.card{
  position:relative;overflow:hidden;isolation:isolate;
  grid-column:span 2;
  padding:26px;border-radius:var(--r-lg);
  background:linear-gradient(170deg,var(--surface-2) 0%,rgba(13,19,32,.92) 100%);
  border:1px solid var(--line);
  display:flex;flex-direction:column;gap:13px;
  transition:border-color .25s ease,transform .25s cubic-bezier(.2,.8,.2,1);
}
.card::before{ /* пятно под курсором */
  content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;opacity:0;
  background:radial-gradient(340px circle at var(--mx,50%) var(--my,50%),rgba(129,140,248,.13),transparent 62%);
  transition:opacity .28s ease;
}
.card:hover{border-color:var(--line-2);transform:translateY(-3px)}
.card:hover::before{opacity:1}
.card.wide{grid-column:span 3}
.tag{
  font-family:var(--f-mono);font-size:.68rem;font-weight:600;letter-spacing:.16em;text-transform:uppercase;
  color:var(--ink-4);
}
.card p{color:var(--ink-3);font-size:.9rem;line-height:1.6}
.viz{margin-top:auto;padding-top:18px}

.codebox{
  font-family:var(--f-mono);font-size:.73rem;line-height:1.85;
  background:rgba(11,17,29,.6);border:1px solid var(--line);border-radius:var(--r-md);
  padding:12px 13px;overflow-x:auto;
}
.codebox .cm{color:var(--ink-4)}
.codebox .st{color:#9bdcff}
.codebox .kw{color:var(--violet)}
.codebox .hit{color:var(--crit)}
.codebox .hint{color:var(--med)}

.rows{display:flex;flex-direction:column;gap:7px;font-family:var(--f-mono);font-size:.71rem}
.row2{display:flex;align-items:center;gap:9px;color:var(--ink-3)}
.row2 .nm{color:var(--ink-2)}
.row2 .nm.ok{color:var(--low)}
.row2 .cve{margin-left:auto;color:var(--ink-4);text-align:right}
.row2 .s{padding:1px 7px;border-radius:4px;font-size:.63rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase}
.s-crit{color:#ffb3bf;background:rgba(255,107,107,.17)}
.s-high{color:#fed7aa;background:rgba(251,146,60,.16)}
.s-med{color:#fde68a;background:rgba(251,191,36,.14)}
.s-weak{color:var(--ink-2);background:rgba(229,237,249,.08)}

.pings{display:flex;gap:8px;flex-wrap:wrap}
.ping{
  display:inline-flex;align-items:center;gap:7px;padding:5px 11px;border-radius:999px;
  font-family:var(--f-mono);font-size:.7rem;color:var(--ink-2);
  background:rgba(47,183,240,.08);border:1px solid rgba(47,183,240,.2);
}
.ping i{width:5px;height:5px;border-radius:50%;background:var(--cyan);animation:blip 2s ease-in-out infinite}
.ping:nth-child(2) i{animation-delay:.5s}
.ping:nth-child(3) i{animation-delay:1s}
@keyframes blip{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.72)}}

.fmts{display:flex;flex-wrap:wrap;gap:6px}
.fmt{
  font-family:var(--f-mono);font-size:.7rem;color:var(--ink-2);
  padding:5px 10px;border-radius:6px;background:rgba(129,140,248,.08);border:1px solid var(--line);
}

/* ---------- Роли ---------- */
.aud{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.audcard{
  padding:26px;border-radius:var(--r-lg);display:flex;flex-direction:column;gap:12px;
  background:linear-gradient(170deg,var(--surface-2) 0%,rgba(13,19,32,.9) 100%);
  border:1px solid var(--line);
  transition:border-color .25s ease,transform .25s cubic-bezier(.2,.8,.2,1);
}
.audcard:hover{border-color:var(--line-2);transform:translateY(-3px)}
.audcard .tag,.scard .tag{
  align-self:flex-start;font-size:.66rem;letter-spacing:.14em;color:var(--cyan);
  padding:4px 10px;border-radius:999px;background:rgba(47,183,240,.1);border:1px solid rgba(47,183,240,.22);
}
.audcard > p{color:var(--ink-3);font-size:.9rem;line-height:1.6}

/* ---------- Контур развёртывания ---------- */
.contour{display:grid;grid-template-columns:minmax(0,1.55fr) minmax(0,1fr);gap:16px}
.ct-zone,.ct-out{position:relative;padding:30px 22px 22px;border-radius:var(--r-xl)}
.ct-zone{border:1px dashed rgba(74,222,128,.42);background:rgba(74,222,128,.025)}
.ct-out{border:1px dashed var(--line-2);background:rgba(23,31,49,.3);display:flex;flex-direction:column;gap:14px}
.ct-cap{
  position:absolute;top:-10px;left:18px;padding:1px 10px;border-radius:999px;background:var(--ground);
  font-family:var(--f-mono);font-size:.66rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--low);
}
.ct-out .ct-cap{color:var(--ink-3)}
.ct-core{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}
.ct-node{padding:14px;border-radius:var(--r-md);border:1px solid var(--line-2);background:rgba(23,31,49,.72);display:flex;flex-direction:column;gap:3px}
.ct-node b{font-size:.92rem;font-weight:600;letter-spacing:-.01em}
.ct-node span{font-size:.8rem;line-height:1.45;color:var(--ink-3)}
.ct-node.main{grid-column:1/-1;border-color:rgba(47,183,240,.45);background:rgba(47,183,240,.07)}
.ct-links{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px;padding-top:14px;border-top:1px dashed var(--line-2);align-items:center}
.ct-links .lbl{font-family:var(--f-mono);font-size:.68rem;letter-spacing:.08em;color:var(--ink-4);margin-right:4px}
.ct-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:12px}
.ct-list li{position:relative;padding-left:22px;font-size:.88rem;line-height:1.5;color:var(--ink-2)}
.ct-list li::before{content:"↗";position:absolute;left:0;top:0;color:var(--cyan);font-family:var(--f-mono)}
.ct-foot{color:var(--ink-3);font-size:.84rem;line-height:1.55;margin-top:auto;padding-top:12px;border-top:1px solid var(--line)}

.deploy-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:16px}
.dcard{
  padding:24px;border-radius:var(--r-lg);border:1px solid var(--line);
  background:rgba(23,31,49,.5);display:flex;flex-direction:column;gap:11px;
  transition:border-color .25s ease,background-color .25s ease;
}
.dcard:hover{border-color:var(--line-2);background:rgba(23,31,49,.8)}
.dcard p{color:var(--ink-3);font-size:.885rem;line-height:1.6}

/* ---------- Сценарии и интеграции ---------- */
.scen{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.scard{
  padding:24px;border-radius:var(--r-lg);border:1px solid var(--line);
  background:linear-gradient(170deg,var(--surface-2) 0%,rgba(13,19,32,.9) 100%);
  display:flex;flex-direction:column;gap:12px;
}
.scard p{color:var(--ink-3);font-size:.885rem;line-height:1.6}
.scard .chips{margin-top:auto;padding-top:8px;gap:6px}
.scard .chip{padding:5px 11px;font-size:.8rem}
.note-line{
  display:flex;gap:12px;align-items:flex-start;margin-top:16px;padding:16px 18px;border-radius:var(--r-md);
  border:1px solid var(--line);background:rgba(11,17,29,.42);color:var(--ink-2);font-size:.9rem;line-height:1.55;
}
.note-line b{color:var(--ink);font-weight:600}

.chips{display:flex;flex-wrap:wrap;gap:9px}
.chip{
  padding:8px 15px;border-radius:999px;font-size:.85rem;color:var(--ink-2);
  background:rgba(129,140,248,.06);border:1px solid var(--line);
  transition:border-color .2s ease,color .2s ease;
}
.chip:hover{border-color:var(--line-2);color:var(--ink)}

.integr{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}
.igroup{
  padding:18px 18px 20px;border-radius:var(--r-lg);border:1px solid var(--line);
  background:rgba(23,31,49,.4);display:flex;flex-direction:column;gap:12px;
}
.igroup.hl{border-color:rgba(47,183,240,.32);background:rgba(47,183,240,.06)}
.ig-t{font-family:var(--f-mono);font-size:.68rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--cyan)}
.igroup .chips{gap:7px}
.igroup .chip{padding:6px 12px;font-size:.82rem}

/* ---------- Пилот ---------- */
.pilot{margin:0;border:1px solid var(--line-2);border-radius:var(--r-xl);overflow:hidden;
  background:linear-gradient(165deg,rgba(23,31,49,.72),rgba(13,19,32,.8))}
.prow{display:grid;grid-template-columns:210px minmax(0,1fr);gap:24px;padding:20px 26px;border-top:1px solid var(--line)}
.prow:first-child{border-top:0}
.prow dt{font-family:var(--f-mono);font-size:.7rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--cyan);padding-top:4px}
.prow dd{margin:0;color:var(--ink-2);font-size:.94rem;line-height:1.62}
.pilot-cta{display:flex;flex-wrap:wrap;gap:14px 22px;align-items:center;margin-top:24px}
.pilot-cta p{color:var(--ink-3);font-size:.86rem;line-height:1.55;max-width:58ch}

/* ---------- Редакции ---------- */
.tiers{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;align-items:stretch}
.tier{
  position:relative;padding:28px 26px;border-radius:var(--r-lg);
  border:1px solid var(--line);background:rgba(23,31,49,.5);
  display:flex;flex-direction:column;gap:14px;
}
.tier-hot{
  border-color:transparent;
  background:
    linear-gradient(rgba(23,31,49,.92),rgba(13,19,32,.94)) padding-box,
    linear-gradient(150deg,#a5b0ff,var(--indigo) 45%,var(--cyan)) border-box;
  border:1px solid transparent;
  box-shadow:0 22px 48px rgba(99,102,241,.16);
}
.tier-badge{
  position:absolute;top:-11px;left:26px;
  font-family:var(--f-mono);font-size:.62rem;font-weight:600;letter-spacing:.12em;text-transform:uppercase;
  color:var(--ground);padding:4px 11px;border-radius:999px;
  background:linear-gradient(135deg,#a5b0ff,var(--indigo) 55%,var(--cyan));
}
.tier-name{font-family:var(--f-display);font-weight:800;font-size:1.3rem;letter-spacing:-.03em}
.tier-price{font-family:var(--f-display);font-weight:600;font-size:1.1rem;letter-spacing:-.02em;line-height:1.2;color:var(--ink-2)}
.tier-lead{color:var(--ink-2);font-size:.9rem;line-height:1.55}
.tier-for{color:var(--ink-3);font-size:.84rem;line-height:1.5}
.tier ul{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:9px;
  padding-top:14px;border-top:1px solid var(--line)}
.tier li{position:relative;padding-left:19px;color:var(--ink-3);font-size:.87rem;line-height:1.5}
.tier li::before{
  content:"";position:absolute;left:0;top:.52em;width:7px;height:7px;border-radius:2px;
  background:var(--indigo);opacity:.65;
}
.tier-hot li::before{background:var(--cyan);opacity:.9}
.tier .btn{margin-top:auto;width:100%}
.cfg{
  margin-top:18px;padding:20px 22px;border-radius:var(--r-lg);border:1px dashed var(--line-2);
  background:rgba(11,17,29,.35);display:flex;flex-direction:column;gap:12px;
}
.cfg-t{font-size:.92rem;font-weight:600}
.cfg p{color:var(--ink-3);font-size:.86rem;line-height:1.55;max-width:74ch}

/* ---------- FAQ ---------- */
.faq{display:flex;flex-direction:column;gap:10px;max-width:900px}
.faq details{border:1px solid var(--line);border-radius:var(--r-md);background:rgba(23,31,49,.42);transition:border-color .2s ease,background-color .2s ease}
.faq details[open]{border-color:var(--line-2);background:rgba(23,31,49,.72)}
.faq summary{
  list-style:none;cursor:pointer;display:flex;justify-content:space-between;align-items:center;gap:18px;
  padding:18px 20px;font-weight:600;font-size:1rem;line-height:1.4;
}
.faq summary::-webkit-details-marker{display:none}
.faq summary::after{
  content:"";flex-shrink:0;width:9px;height:9px;margin-top:-4px;
  border-right:1.6px solid var(--ink-3);border-bottom:1.6px solid var(--ink-3);
  transform:rotate(45deg);transition:transform .2s ease;
}
.faq details[open] summary::after{transform:rotate(225deg);margin-top:4px}
.faq .ans{padding:0 20px 18px;display:flex;flex-direction:column;gap:10px;max-width:74ch}
.faq .ans p{color:var(--ink-2);font-size:.93rem;line-height:1.65}

/* ---------- Покрытие: граф deep discovery (слайд 9) ---------- */
.split{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:clamp(32px,5vw,64px);align-items:center}
.cov-top{align-items:end}
.checklist{display:flex;flex-direction:column;gap:12px;margin-top:8px;padding:0;list-style:none}
.checklist li{display:flex;gap:12px;align-items:flex-start;color:var(--ink-2);font-size:.94rem}
.checklist li svg{flex-shrink:0;margin-top:4px}
.panel{
  border-radius:var(--r-xl);border:1px solid var(--line);
  background:linear-gradient(165deg,var(--surface-2) 0%,rgba(13,19,32,.9) 100%);
  box-shadow:var(--shadow);padding:24px;
}
.panel-head{display:flex;align-items:center;gap:10px;margin-bottom:18px;flex-wrap:wrap}
.panel-head b{font-family:var(--f-body);font-size:.92rem;font-weight:600}
.panel-head .cnt{margin-left:auto;font-family:var(--f-mono);font-size:.72rem;color:var(--ink-4)}
/* На узком экране граф не сжимается в нечитаемое, а прокручивается внутри своей панели. */
.surface{margin-top:44px}
.surface-scroll,.codebox,.cd-panel{scrollbar-width:thin;scrollbar-color:rgba(129,140,248,.35) transparent}
.surface-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
.sgraph{display:block;width:100%;min-width:820px;height:auto}
.sgraph .sg-title{font-family:var(--f-display);font-weight:800;font-size:17px;letter-spacing:-.02em;fill:var(--ink)}
.sgraph .sg-title.dim{fill:var(--ink-3);font-weight:700}
.sgraph .classic{opacity:.75}
.sgraph .sg-box{fill:rgba(229,237,249,.02);stroke:rgba(229,237,249,.1)}
.sgraph .sg-doc{fill:rgba(229,237,249,.05);stroke:rgba(229,237,249,.3)}
.sgraph .sg-doct{font-family:var(--f-mono);font-size:9.5px;fill:var(--ink-3);text-anchor:middle}
.sgraph .sg-d{fill:none;stroke:rgba(229,237,249,.3);stroke-width:1.1;stroke-dasharray:4 4}
.sgraph .sg-q{font-family:var(--f-display);font-weight:700;font-size:15px;fill:var(--ink-4);text-anchor:middle}
.sgraph .sg-cap{font-family:var(--f-mono);font-size:10.5px;fill:var(--ink-4)}
.sgraph .sg-beamt{font-family:var(--f-mono);font-size:9.5px;fill:#bfe9fb}
.sgraph .sg-panel{fill:rgba(47,183,240,.035);stroke:rgba(47,183,240,.34)}
.sgraph .sg-root{fill:var(--ground);stroke:var(--cyan);stroke-width:2}
.sgraph .sg-e{fill:none;stroke:rgba(47,183,240,.6);stroke-width:1.3}
.sgraph .sg-e.am{stroke:rgba(251,191,36,.6)}
.sgraph .sg-p rect{fill:rgba(20,29,46,.94);stroke:rgba(47,183,240,.62);stroke-width:1.2}
.sgraph .sg-p.am rect{stroke:rgba(251,191,36,.72)}
.sgraph .sg-p text{font-family:var(--f-mono);font-size:11.5px;fill:var(--ink-2);text-anchor:middle}
.sgraph .sg-p.am text{fill:#fde6a8}
.sgraph .sg-dots{font-family:var(--f-mono);font-size:14px;fill:var(--ink-4);text-anchor:middle}
.sgraph .sg-w{animation:warnp 2.6s ease-in-out infinite}
.sgraph .sg-w.d1{animation-delay:.6s}
.sgraph .sg-w.d2{animation-delay:1.2s}
.sgraph .sg-w.d3{animation-delay:1.8s}
.sgraph .sg-w .tri{fill:var(--med)}
.sgraph .sg-w .bang{stroke:var(--ground);stroke-width:2;stroke-linecap:round}
@keyframes warnp{0%,100%{opacity:.6}50%{opacity:1}}
/* Рёбра дорисовываются при первом показе панели (pathLength="1"). */
.has-js .surface .sg-e{stroke-dasharray:1;stroke-dashoffset:1;transition:stroke-dashoffset 1.3s cubic-bezier(.2,.8,.2,1) .15s}
.has-js .surface.on .sg-e{stroke-dashoffset:0}
.graph-legend{
  display:flex;gap:16px;margin-top:16px;padding-top:14px;border-top:1px solid var(--line);
  font-family:var(--f-mono);font-size:.7rem;color:var(--ink-4);flex-wrap:wrap;
}
.graph-legend span{display:inline-flex;align-items:center;gap:7px}
.graph-legend i{width:7px;height:7px;border-radius:50%;flex-shrink:0}
.graph-legend .lg-route{background:rgba(47,183,240,.25);box-shadow:0 0 0 1px var(--cyan)}
.graph-legend .lg-auth{background:rgba(251,191,36,.22);box-shadow:0 0 0 1px var(--med)}
.graph-legend .lg-warn{background:var(--med);border-radius:0;clip-path:polygon(50% 0,100% 100%,0 100%);width:9px;height:8px}

/* ---------- Сторонние результаты ---------- */
.thirdp{
  display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);gap:clamp(24px,4vw,48px);align-items:center;
  padding:clamp(26px,4vw,40px);border-radius:var(--r-xl);border:1px solid var(--line-2);
  background:
    radial-gradient(ellipse 60% 120% at 8% 0%,rgba(99,102,241,.16),transparent 60%),
    linear-gradient(160deg,var(--surface-2),rgba(13,19,32,.92));
}
.thirdp-main{display:flex;flex-direction:column;gap:14px}

/* ---------- Шапка внутренних страниц ---------- */
.page-head{padding-top:clamp(52px,6.5vw,88px);padding-bottom:clamp(16px,3vw,32px)}
.page-head .sec-head{margin-bottom:0}
.page-head h1{font-size:clamp(2.2rem,4.8vw,3.6rem)}
.crumb{font-size:.86rem;color:var(--ink-3);text-decoration:none}
.crumb:hover{color:var(--ink)}
.need{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}
.need li{padding:20px 22px;border-radius:var(--r-lg);border:1px solid var(--line);background:rgba(23,31,49,.45);display:flex;flex-direction:column;gap:8px}
.need li b{font-size:.95rem;font-weight:600}
.need li span{color:var(--ink-3);font-size:.87rem;line-height:1.55}
.onec{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}
.onec .card{grid-column:auto}
.onec .codebox{font-size:.68rem}

/* ---------- CTA ---------- */
.cta{
  position:relative;overflow:hidden;
  border-radius:var(--r-xl);border:1px solid var(--line-2);
  background:
    radial-gradient(ellipse 70% 130% at 12% 0%,rgba(99,102,241,.26),transparent 62%),
    radial-gradient(ellipse 60% 120% at 92% 100%,rgba(47,183,240,.2),transparent 60%),
    linear-gradient(160deg,var(--surface-2),var(--ground-2));
  padding:clamp(38px,5vw,60px);
  display:flex;flex-direction:column;gap:22px;align-items:flex-start;
}
.cta h2{max-width:20ch}
.cta p{color:var(--ink-2);max-width:58ch}
.cta-actions{display:flex;flex-wrap:wrap;gap:12px}

/* ---------- Футер ---------- */
.foot{border-top:1px solid var(--line);margin-top:var(--sec-pad);padding-block:48px 36px}
.foot-grid{display:grid;grid-template-columns:1.6fr repeat(3,1fr);gap:36px}
.foot-brand{display:flex;flex-direction:column;gap:12px;max-width:34ch}
.foot-brand p{color:var(--ink-3);font-size:.85rem;line-height:1.6}
.foot-col{display:flex;flex-direction:column;gap:10px;align-items:flex-start}
.foot-col b{font-size:.8rem;font-weight:600;color:var(--ink);letter-spacing:.02em}
.foot-col a{color:var(--ink-3);text-decoration:none;font-size:.85rem;transition:color .18s ease}
.foot-col a:hover{color:var(--ink)}
.foot-bot{
  margin-top:38px;padding-top:22px;border-top:1px solid var(--line);
  display:flex;flex-wrap:wrap;gap:12px;justify-content:space-between;
  font-family:var(--f-mono);font-size:.73rem;color:var(--ink-3);
}

/* ---------- Reveal ---------- */
.has-js .rv{opacity:0;transform:translateY(18px)}
.has-js .rv.on{opacity:1;transform:none;transition:opacity .6s ease,transform .6s cubic-bezier(.2,.8,.2,1)}
.has-js .rv-d1.on{transition-delay:.07s}
.has-js .rv-d2.on{transition-delay:.14s}

/* ---------- Переключатель языка ---------- */
.lang{display:flex;gap:2px;padding:3px;border-radius:999px;background:rgba(129,140,248,.07);border:1px solid var(--line);flex-shrink:0}
.lang button{
  font-family:var(--f-mono);font-size:.72rem;font-weight:600;letter-spacing:.04em;
  padding:5px 10px;border-radius:999px;border:0;cursor:pointer;
  color:var(--ink-3);background:transparent;line-height:1.2;
  transition:color .18s ease,background-color .18s ease;
}
.lang button:hover{color:var(--ink)}
.lang button[aria-pressed="true"]{
  color:var(--ground);
  background:linear-gradient(135deg,#a5b0ff 0%,var(--indigo) 55%,var(--cyan) 100%);
}

/* Латиница остаётся в Inter/Archivo, иероглифы падают в системный CJK —
   так продуктовые термины не расползаются по ширине. Веб-шрифт CJK не
   грузим: это мегабайты трафика ради одного языка. */
:root[lang^="zh"]{
  --f-display:'Archivo',"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Noto Sans CJK SC","Source Han Sans SC",sans-serif;
  --f-body:'Inter',"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Noto Sans CJK SC","Source Han Sans SC",sans-serif;
}
:root[lang^="zh"] h1{letter-spacing:-.012em;line-height:1.18}
:root[lang^="zh"] h2,:root[lang^="zh"] h3{letter-spacing:-.005em;line-height:1.32}
:root[lang^="zh"] .lead,:root[lang^="zh"] .card p,:root[lang^="zh"] .stp p{line-height:1.78}
:root[lang^="zh"] .eyebrow{letter-spacing:.12em}

/* Пока применяется сохранённый язык — не показываем русский текст. */
.i18n-boot .page,.i18n-boot .amb{visibility:hidden}

/* ---------- Контакты: адрес продаж и контактный диалог ----------
   Все CTA с data-contact открывают один <dialog> (логика — assets/contact.js).
   Без JS диалог не показывается, а CTA остаются обычными mailto:-ссылками.
   Диалог открывается через showModal() и живёт в top layer — над шапкой
   без z-index, фон при этом inert. У самого .cd display не задаём:
   авторский display перебил бы dialog:not([open]){display:none}. */
.mail-line{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px}
.mail-cap{
  font-family:var(--f-mono);font-size:.7rem;font-weight:600;letter-spacing:.14em;
  text-transform:uppercase;color:var(--cyan);
}
.mail-link{
  display:inline-block;padding-block:2px;color:var(--ink);font-weight:600;
  text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:4px;text-decoration-color:var(--line-2);
  transition:color .18s ease,text-decoration-color .18s ease;
}
.foot-col .mail-line{flex-direction:column;align-items:flex-start;gap:2px;margin-top:4px}
.foot-col .mail-cap{color:var(--ink-3)}
.foot-col .mail-link{color:var(--ink-2);font-size:.85rem;font-weight:500}
.mail-link:hover{color:var(--ink);text-decoration-color:var(--indigo)}

.cd{
  width:min(600px,calc(100% - 32px));max-width:none;max-height:none;
  margin:auto;padding:0;border:0;background:transparent;color:var(--ink);overflow:visible;
}
.cd::backdrop{
  background:var(--scrim,rgba(11,17,29,.72));
  -webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);
}
/* Панель занимает весь бокс <dialog>: клик с target === dialog — это клик по подложке. */
.cd-panel{
  position:relative;
  max-height:calc(100vh - 32px);max-height:calc(100dvh - 32px);
  overflow-y:auto;overscroll-behavior:contain;
  padding:clamp(24px,4vw,34px);
  border-radius:var(--r-xl);border:1px solid var(--line-2);
  background:
    radial-gradient(ellipse 80% 60% at 0% 0%,rgba(99,102,241,.2),transparent 62%),
    linear-gradient(165deg,var(--surface-2) 0%,var(--ground-2) 100%);
  box-shadow:var(--shadow-lg);
}
.cd-x{
  position:absolute;top:12px;right:12px;
  display:flex;align-items:center;justify-content:center;width:44px;height:44px;padding:0;
  border-radius:var(--r-md);border:1px solid transparent;background:transparent;color:var(--ink-2);cursor:pointer;
  transition:color .18s ease,background-color .18s ease,border-color .18s ease;
}
.cd-x:hover{color:var(--ink);background:rgba(129,140,248,.1);border-color:var(--line-2)}
.cd-t{font-size:clamp(1.3rem,2.6vw,1.6rem);line-height:1.18;padding-right:44px}
.cd-t:focus{outline:none} /* фокус на заголовке ставится программно при открытии; это не элемент управления */
.cd-d{margin-top:10px;color:var(--ink-2);font-size:.95rem;line-height:1.6}
.cd-form{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 14px;margin-top:20px}
.cd-field{display:flex;flex-direction:column;gap:6px;min-width:0}
.cd-field.full,.cd-form .cd-actions{grid-column:1/-1}
.cd-field label{font-size:.8rem;font-weight:600;color:var(--ink-2)}
.cd-field .opt{font-weight:400;color:var(--ink-4);margin-left:6px}
.cd-in{
  width:100%;min-height:44px;padding:10px 12px;border-radius:10px;
  font-family:var(--f-body);font-size:.95rem;color:var(--ink);
  background:rgba(11,17,29,.6);border:1px solid var(--line-2);
  transition:border-color .18s ease,background-color .18s ease;
}
.cd-in:hover{border-color:var(--indigo)}
.cd-in:focus-visible{outline:2px solid var(--cyan);outline-offset:1px}
textarea.cd-in{min-height:84px;resize:vertical;line-height:1.5}
select.cd-in{
  appearance:none;-webkit-appearance:none;padding-right:36px;cursor:pointer;
  background-image:linear-gradient(45deg,transparent 50%,var(--ink-3) 50%),linear-gradient(135deg,var(--ink-3) 50%,transparent 50%);
  background-position:calc(100% - 18px) 50%,calc(100% - 13px) 50%;background-size:5px 5px;background-repeat:no-repeat;
}
select.cd-in option{background:var(--surface);color:var(--ink)}
.cd-actions{display:flex;flex-wrap:wrap;gap:12px;margin-top:6px}
.cd-actions .btn{flex:1 1 190px;min-height:48px;white-space:normal;text-align:center}
.cd-status{min-height:1.6em;margin-top:10px;font-size:.88rem;line-height:1.5;color:var(--ink-2)}
.cd-status.is-ok{color:var(--low)}
.cd-status.is-fail{color:var(--med)}
.cd-alt{
  display:flex;flex-wrap:wrap;align-items:center;gap:10px 12px;margin-top:6px;padding-top:16px;
  border-top:1px dashed var(--line-2);font-size:.86rem;color:var(--ink-3);
}
.cd-mail{
  display:inline-flex;align-items:center;gap:9px;min-height:40px;padding:6px 12px;
  border-radius:var(--r-sm);border:1px solid var(--line-2);background:rgba(11,17,29,.55);
  color:var(--ink);font-family:var(--f-mono);font-size:.9rem;text-decoration:none;
  transition:border-color .18s ease,background-color .18s ease;
}
.cd-mail svg{flex-shrink:0;color:var(--cyan)}
.cd-mail span{overflow-wrap:anywhere;text-decoration:underline;text-decoration-color:var(--line-2);text-underline-offset:4px}
.cd-mail:hover{border-color:var(--indigo);background:rgba(129,140,248,.08)}
.cd-warn{
  display:flex;gap:10px;align-items:flex-start;margin-top:14px;
  color:var(--ink-2);font-size:.84rem;line-height:1.5;
}
.cd-warn svg{flex-shrink:0;margin-top:2px;color:var(--med)}
.vh{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}
/* Блокировка прокрутки: overflow у body уходит во viewport (у html он visible),
   поэтому sticky-шапка остаётся на месте. Ширину исчезнувшей полосы прокрутки
   contact.js возвращает через padding-right у body — измерением до и после.
   scrollbar-gutter здесь не годится: Chrome резервирует место, но clientWidth
   его не показывает, и компенсация срабатывает дважды (сдвиг на полполосы). */
html.cd-lock body{overflow:hidden}
@keyframes cd-in{from{opacity:0;transform:translateY(10px) scale(.985)}}
@keyframes cd-up{from{opacity:0;transform:translateY(32px)}}
@keyframes cd-fade{from{opacity:0}}
.cd[open]{animation:cd-in .2s cubic-bezier(.2,.8,.2,1)}
.cd[open]::backdrop{animation:cd-fade .2s ease}

/* ---------- Адаптив ---------- */
/* Сразу над порогом меню (1101–1240 px) семь ссылок, язык и CTA едва влезают
   в строку: ужимаем промежутки, иначе «中文» наезжает на кнопку. */
@media (max-width:1240px){
  .nav-in{gap:20px}
  .nav-menu{gap:18px}
  .nav-links{gap:20px}
}
@media (max-width:1100px){
  .has-js .menu-btn{display:inline-flex}
  .nav-menu{
    display:none;position:absolute;left:0;right:0;top:100%;
    flex-direction:column;align-items:stretch;gap:0;
    padding:8px 24px 22px;background:var(--menu-bg);border-bottom:1px solid var(--line);box-shadow:var(--shadow);
    max-height:calc(100vh - 68px);max-height:calc(100dvh - 68px);overflow-y:auto;
  }
  .nav.menu-open{background:var(--menu-bg);border-bottom-color:var(--line)}
  .nav.menu-open .nav-menu{display:flex}
  .nav-links{flex-direction:column;gap:0}
  .nav-links a{padding:13px 0;font-size:1rem;border-bottom:1px solid var(--line)}
  .nav-menu .lang{margin:18px 0 0;align-self:flex-start}
  .nav-cta{margin-left:auto}
  .aud,.scen,.tiers{grid-template-columns:1fr}
  .deploy-grid{grid-template-columns:1fr}
  .contour{grid-template-columns:1fr}
  .thirdp{grid-template-columns:1fr}
}
@media (max-width:1000px){
  .hero-grid{grid-template-columns:1fr;gap:44px}
  .split{grid-template-columns:1fr}
  .cov-top{align-items:start}
  .loop{grid-template-columns:1fr}
  .onec,.need{grid-template-columns:1fr}
  .integr{grid-template-columns:repeat(2,minmax(0,1fr))}
  .foot-grid{grid-template-columns:1fr 1fr;gap:32px}
}
@media (max-width:760px){
  .integr{grid-template-columns:1fr}
  .nav-in{gap:14px}
  .bento{grid-template-columns:1fr}
  .card,.card.wide{grid-column:span 1}
  .amb i{animation:none}
  .foot-grid{grid-template-columns:1fr}
  .prow{grid-template-columns:1fr;gap:6px;padding:18px 20px}
  .ct-core{grid-template-columns:1fr}
  /* Телефон — нижняя шторка во всю ширину, с учётом safe-area. */
  .cd{width:100%;margin:auto 0 0}
  .cd[open]{animation-name:cd-up}
  .cd-panel{
    max-height:calc(100vh - 12px);max-height:calc(100dvh - 12px);
    border-radius:var(--r-xl) var(--r-xl) 0 0;border-bottom:0;
    padding:24px max(20px,env(safe-area-inset-right)) calc(20px + env(safe-area-inset-bottom)) max(20px,env(safe-area-inset-left));
  }
  .cd-x{top:10px;right:max(10px,env(safe-area-inset-right))}
  .cd-form{grid-template-columns:1fr}
  .cd-actions{flex-direction:column}
  .cd-actions .btn{flex:none;width:100%}
}
@media (max-width:480px){
  .wrap{padding-inline:16px}
  .nav-menu{padding-inline:16px}
  .brand b{font-size:1.08rem}
  .nav-cta .btn-sm{padding:9px 12px}
  .hero-actions .btn{flex:1 1 auto}
  .fv-body{padding:16px 14px}
  .fv-tabs button{font-size:.72rem;padding:7px 3px}
  .tm{grid-template-columns:minmax(0,74px) minmax(0,1fr) auto}
}

@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation-duration:.001ms !important;animation-iteration-count:1 !important;transition-duration:.001ms !important}
  .has-js .rv{opacity:1;transform:none}
  .has-js .fv.rv .tm u b{transform:scaleX(var(--s,1))}
  .cd[open],.cd[open]::backdrop{animation:none}
}

/* ---------- Уровни доступа к коду (platform.html) ---------- */
.lvls{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}
.lvls li{
  display:flex;gap:14px;align-items:baseline;padding:14px 16px;border-radius:var(--r-md);
  border:1px solid var(--line);background:rgba(11,17,29,.42);font-size:.88rem;line-height:1.5;color:var(--ink-3);
}
.lvls b{
  flex:0 0 96px;font-family:var(--f-mono);font-size:.72rem;font-weight:600;letter-spacing:.08em;
  text-transform:uppercase;color:var(--ink);
}
.sec-tight{padding-top:0}
.split .sec-head{margin-bottom:0}
