/* Резюме Александра Литвиненко. Тёмная тема основная: граф из частиц светится
   только на тёмном. Светлая включается кнопкой и хранит выбор посетителя. */

@font-face{font-family:"Geologica";font-style:oblique 0deg 12deg;font-display:swap;font-weight:100 900;src:url(fonts/geologica-cyrillic-full-normal.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:"Geologica";font-style:oblique 0deg 12deg;font-display:swap;font-weight:100 900;src:url(fonts/geologica-latin-full-normal.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:"Martian Mono";font-style:normal;font-display:swap;font-weight:100 800;font-stretch:75% 112.5%;src:url(fonts/martian-mono-cyrillic-wdth-normal.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:"Martian Mono";font-style:normal;font-display:swap;font-weight:100 800;font-stretch:75% 112.5%;src:url(fonts/martian-mono-latin-wdth-normal.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}

:root{
  --void:#06070A; --ink:#EEF1F6; --mist:#A3ABBA; --faint:#8A93A3;
  --line:rgba(238,241,246,.11); --line-strong:rgba(238,241,246,.24);
  --signal:#C4F54A; --signal-text:#C4F54A; --on-signal:#0A0C05;
  --ion:#8FB2FF;
  --glass:rgba(10,12,17,.64); --glass-hover:rgba(16,19,27,.82); --tag-bg:rgba(8,10,14,.74);
  --sans:"Geologica","Segoe UI",system-ui,-apple-system,sans-serif;
  --mono:"Martian Mono",ui-monospace,SFMono-Regular,Menlo,monospace;
  /* Две кривые: выход — ответ на действие и появление, вход-выход — зацикленное. */
  --ease-out:cubic-bezier(.16,1,.3,1);
  --ease-io:cubic-bezier(.65,0,.35,1);
  --pad:clamp(1rem,4vw,3rem);
  color-scheme:dark;
}
/* Палитра задана языком страницы: русская версия бирюзовая, английская лаймовая. */
:root[data-palette="teal"]{--signal:#46E6C3;--signal-text:#46E6C3;--ion:#A58BFF}
:root[data-mode="light"]{
  --void:#F2F3EE; --ink:#0B0D12; --mist:#454B58; --faint:#50566A;
  --line:rgba(11,13,18,.13); --line-strong:rgba(11,13,18,.28);
  --signal:#C4F54A; --signal-text:#375E00; --on-signal:#0A0C05;
  --ion:#2B45B8;
  --glass:rgba(246,247,243,.8); --glass-hover:rgba(252,252,250,.94); --tag-bg:rgba(250,250,247,.88);
  color-scheme:light;
}
:root[data-mode="light"][data-palette="teal"]{--signal:#46E6C3;--signal-text:#00634F;--ion:#5B3FC4}

*,*::before,*::after{box-sizing:border-box}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}
body{margin:0;background:var(--void);color:var(--ink);font:300 1.0625rem/1.6 var(--sans);-webkit-font-smoothing:antialiased;overflow-x:hidden}
a{color:inherit}
:focus-visible{outline:2px solid var(--signal-text);outline-offset:3px;border-radius:6px}
.skip{position:fixed;left:1rem;top:-4rem;z-index:50;background:var(--signal);color:var(--on-signal);padding:.6rem 1rem;border-radius:999px;text-decoration:none;font-weight:600}
.skip:focus{top:1rem}

/* ---------- сцена ---------- */
#graph{position:fixed;inset:0 0 auto;width:100%;height:100lvh;display:block;z-index:0}
.veil{position:fixed;inset:0;z-index:1;pointer-events:none;background:radial-gradient(120% 90% at 50% 45%,transparent 55%,color-mix(in srgb,var(--void) 72%,transparent) 100%)}
.tags{position:fixed;inset:0 0 auto;height:100lvh;z-index:3;pointer-events:none;overflow:hidden}
.tag{position:absolute;left:0;top:0;font:400 .75rem/1 var(--mono);color:var(--ink);padding:.55rem .8rem;border-radius:4px;border:1px solid var(--line-strong);background:var(--tag-bg);white-space:nowrap;opacity:0;visibility:hidden;will-change:transform,opacity;display:flex;gap:.5rem;align-items:center}
.tag::before{content:"";width:.35rem;height:.35rem;background:var(--ion)}
.tag.hot::before{background:var(--signal)}
.tag.big{font:700 1.15rem/1 var(--sans);letter-spacing:-.02em;padding:.7rem 1rem;border-color:transparent;background:transparent;text-shadow:0 0 18px var(--void)}
.tag.big::before{display:none}
.tag.on{visibility:visible}

/* ---------- шапка ---------- */
.top{position:fixed;inset:0 0 auto;z-index:20;display:flex;align-items:center;gap:1.5rem;padding:.9rem var(--pad);border-bottom:1px solid transparent;transition:background-color .4s var(--ease-out),border-color .4s var(--ease-out)}
.top.scrolled{background:color-mix(in srgb,var(--void) 74%,transparent);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-color:var(--line)}
.logo{display:flex;align-items:center;gap:.6rem;font:600 1.05rem/1 var(--sans);letter-spacing:-.01em;text-decoration:none;margin-right:auto}
.logo-mark{width:.8rem;height:.8rem;border:1.5px solid var(--signal-text);transform:rotate(45deg);position:relative}
.logo-mark::after{content:"";position:absolute;inset:2.5px;background:var(--signal-text)}
.nav{display:flex;gap:1.6rem;font-size:.9375rem;font-weight:400}
.nav a{text-decoration:none;color:var(--mist);transition:color .2s}
.nav a:hover{color:var(--ink)}
.top-tools{display:flex;gap:.5rem;align-items:center}
.icon-btn{appearance:none;border:1px solid var(--line-strong);background:transparent;color:var(--ink);width:2.75rem;height:2.75rem;border-radius:50%;display:grid;place-items:center;cursor:pointer;transition:border-color .2s;font:600 .8125rem/1 var(--mono)}
.icon-btn:hover{border-color:var(--ink)}
.icon-btn svg{width:1.1rem;height:1.1rem}
.icon-btn.lang{text-decoration:none;color:var(--signal-text);letter-spacing:.02em}
.menu-btn{display:none}
.btn{display:inline-flex;align-items:center;gap:.6rem;font:500 .9375rem/1 var(--sans);text-decoration:none;border-radius:999px;padding:.95rem 1.4rem;border:1px solid transparent;white-space:nowrap;cursor:pointer;transition:transform .25s var(--ease-out),background-color .25s,border-color .25s}
.btn svg{width:1rem;height:1rem;transition:transform .25s var(--ease-out)}
.btn:hover svg{transform:translate(2px,-2px)}
.btn:active{transform:scale(.97)}
.btn-signal{background:var(--signal);color:var(--on-signal);font-weight:600}
.btn-signal:hover{background:color-mix(in srgb,var(--signal) 84%,#fff)}
.btn-line{border-color:var(--line-strong);color:var(--ink);background:color-mix(in srgb,var(--void) 35%,transparent)}
.btn-line:hover{border-color:var(--ink)}
.btn-top{padding:.75rem 1.1rem}

/* ---------- общие ---------- */
main{position:relative;z-index:2}
.wrap{max-width:1320px;margin-inline:auto;padding-inline:var(--pad)}
.section{padding-block:clamp(3rem,8vh,5rem)}
/* Пауза между разделами: здесь прокручивается только перестройка графа и ярлыки. */
.interlude{height:160vh}
.label{font:400 .75rem/1.5 var(--mono);letter-spacing:.02em;color:var(--signal-text);margin:0;display:flex;gap:.6rem;align-items:center;text-transform:lowercase}
.label::before{content:"";width:1.6rem;height:1px;background:currentColor}
h1,h2,h3{margin:0;text-wrap:balance}
h2{font:700 clamp(2.2rem,5vw,4.6rem)/.98 var(--sans);letter-spacing:-.04em;margin-block:1rem 1.25rem}
.lede{text-wrap:pretty;max-width:44ch;color:var(--mist);font-size:clamp(1.0625rem,1.3vw,1.25rem);line-height:1.55;margin:0}
.head{margin-bottom:clamp(2rem,5vh,3rem)}
.head.narrow{max-width:46rem}
.shadowed{text-shadow:0 0 28px var(--void),0 0 2px var(--void)}
.glass{background:var(--glass);backdrop-filter:blur(12px) saturate(1.2);-webkit-backdrop-filter:blur(12px) saturate(1.2);border:1px solid var(--line)}
.actions{display:flex;gap:.75rem;flex-wrap:wrap}
.split{display:grid;grid-template-columns:repeat(12,1fr);gap:1.5rem}
.split.end .col{grid-column:6/span 7}
.split.start .col{grid-column:1/span 7}

/* Появление по прокрутке. Без JS и при выключенной анимации всё видно сразу. */
.js-reveal .reveal{opacity:0;transform:translateY(24px);transition:opacity .9s var(--ease-out),transform .9s var(--ease-out);transition-delay:var(--d,0s)}
.js-reveal .reveal.in{opacity:1;transform:none}

/* Угловые засечки — единственный «интерфейсный» декор; держат карточки в сетке графа. */
.card{position:relative}
.card::before,.card::after{content:"";position:absolute;width:10px;height:10px;border-color:var(--signal-text);border-style:solid;opacity:.0;transition:opacity .3s var(--ease-out)}
.card::before{left:-1px;top:-1px;border-width:1px 0 0 1px}
.card::after{right:-1px;bottom:-1px;border-width:0 1px 1px 0}
.card:hover::before,.card:hover::after{opacity:1}

/* ---------- первый экран ---------- */
.hero{min-height:100svh;display:grid;grid-template-rows:1fr auto;padding-top:5rem}
.hero-grid{display:grid;align-items:center;width:100%}
.hero-text{min-width:0}
.kicker{font:400 .8125rem/1 var(--mono);color:var(--ink);display:inline-flex;align-items:center;gap:.7rem;margin:0 0 1.6rem;padding:.55rem .8rem;border:1px solid var(--line-strong);border-radius:4px;background:color-mix(in srgb,var(--void) 40%,transparent)}
.pulse{width:.5rem;height:.5rem;border-radius:50%;background:var(--signal);box-shadow:0 0 0 0 color-mix(in srgb,var(--signal) 60%,transparent);animation:pulse 2.4s var(--ease-out) infinite}
@keyframes pulse{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--signal) 60%,transparent)}100%{box-shadow:0 0 0 10px transparent}}
h1{font:800 clamp(3rem,8.2vw,8.4rem)/.9 var(--sans);letter-spacing:-.055em}
/* Маска появления режет только снизу: overflow:hidden срезал конец фамилии, когда
   на экранах шире ~1460 px имя становилось шире колонки (замечено на 1728 px). */
h1 .line{display:block;padding-bottom:.06em;clip-path:inset(-.3em -1em -.12em -1em)}
h1 .line>span{display:block}
.js-reveal h1 .line>span{transform:translateY(105%);animation:rise 1.2s var(--ease-out) forwards}
.js-reveal h1 .line:nth-child(2)>span{animation-delay:.12s}
@keyframes rise{to{transform:none}}
.hero-sub{max-width:40ch;margin:1.8rem 0 1.2rem;color:var(--mist);font-size:clamp(1.0625rem,1.35vw,1.25rem);line-height:1.5}
.status{font:400 .75rem/1.6 var(--mono);color:var(--faint);margin:0 0 2rem}
.facts-wrap{width:100%;margin-top:3rem;padding-bottom:2rem}
/* Цифры лежат на стекле, как карточки ниже: иначе нижняя часть сферы шла поверх подписей
   и граф на первом экране читался передним планом, а дальше — фоном. */
.facts{display:grid;grid-template-columns:repeat(4,1fr);margin:0;border-radius:18px;overflow:hidden}
.fact{padding:1.4rem 1.5rem 1.6rem}
.fact+.fact{border-left:1px solid var(--line)}
.fact dt{font:700 clamp(2rem,3.6vw,3.3rem)/1 var(--sans);letter-spacing:-.045em;font-variant-numeric:tabular-nums;white-space:nowrap}
.fact dd{margin:.6rem 0 0;color:var(--mist);font-size:.9375rem;line-height:1.45;max-width:26ch;text-wrap:balance}
.fact:nth-child(2){--d:.08s}.fact:nth-child(3){--d:.16s}.fact:nth-child(4){--d:.24s}

/* ---------- SalesWings ---------- */
.meta{display:flex;flex-wrap:wrap;gap:.4rem 1.2rem;font:400 .75rem/1.6 var(--mono);color:var(--faint);margin:1.2rem 0 0}
.meta a{color:var(--signal-text);text-decoration:none;border-bottom:1px solid transparent}
.meta a:hover{border-color:currentColor}
.story{color:var(--ink);font-size:clamp(1.0625rem,1.35vw,1.25rem);line-height:1.55;max-width:48ch;margin:0 0 2rem}
.agents{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(3,1fr);gap:.75rem;perspective:1200px}
.agent{border-radius:14px;padding:1.2rem 1.2rem 1.35rem;display:grid;gap:.55rem;align-content:start}
.agent:nth-child(2){--d:.1s}.agent:nth-child(3){--d:.2s}
.agent-n{font:400 .6875rem/1 var(--mono);color:var(--signal-text)}
.agent h3{font:600 1.35rem/1.1 var(--sans);letter-spacing:-.02em}
.agent p{margin:0;color:var(--mist);font-size:.9375rem;line-height:1.45}
.results{display:flex;flex-wrap:wrap;gap:1rem 3rem;margin-top:2rem;padding-top:1.5rem;border-top:1px solid var(--line)}
.result strong{display:block;font:700 clamp(2rem,3.4vw,3rem)/1 var(--sans);letter-spacing:-.045em;color:var(--signal-text)}
.result span{display:block;color:var(--mist);font-size:.9375rem;margin-top:.45rem}

/* ---------- сервисы ---------- */
.prods{display:grid;grid-template-columns:repeat(3,1fr);gap:.75rem;perspective:1400px}
.prod{border-radius:14px;padding:1.3rem 1.3rem 1.4rem;display:grid;grid-template-rows:auto auto 1fr auto;gap:.6rem;text-decoration:none;transition:background-color .3s,border-color .3s}
a.prod:hover{background:var(--glass-hover);border-color:var(--line-strong)}
.prod:nth-child(3n+2){--d:.08s}.prod:nth-child(3n){--d:.16s}
.prod.settle,.agent.settle{transition:transform .7s var(--ease-out),opacity .9s var(--ease-out),background-color .3s,border-color .3s}
.prod-top{display:flex;justify-content:space-between;gap:1rem;font:400 .6875rem/1.4 var(--mono);color:var(--faint)}
.live{display:inline-flex;align-items:center;gap:.4rem;color:var(--ink)}
.live::before{content:"";width:.4rem;height:.4rem;border-radius:50%;background:var(--signal);box-shadow:0 0 8px var(--signal)}
.prod h3{font:600 1.35rem/1.15 var(--sans);letter-spacing:-.02em}
.prod p{margin:0;color:var(--mist);font-size:.9375rem;line-height:1.5}
.stack{font:400 .6875rem/1.4 var(--mono);color:var(--faint);padding-top:.7rem;border-top:1px dashed var(--line)}
.more{color:var(--mist);max-width:70ch;margin:1.75rem 0 0;font-size:.975rem}
.protos{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:1.5rem;align-items:center}
.protos-label{font:400 .75rem/1 var(--mono);color:var(--signal-text);margin-right:.5rem}
.protos a,.protos>span:not(.protos-label){font-size:.875rem;color:var(--mist);text-decoration:none;padding:.5rem .8rem;border:1px solid var(--line);border-radius:999px;background:color-mix(in srgb,var(--void) 50%,transparent);transition:border-color .2s,color .2s}
.protos a:hover{border-color:var(--line-strong);color:var(--ink)}
.protos b{font-weight:600;color:var(--ink);margin-right:.35rem}

/* ---------- опыт ---------- */
.timeline{list-style:none;margin:0;padding:0;position:relative}
.timeline::before{content:"";position:absolute;left:.3rem;top:.5rem;bottom:.5rem;width:1px;background:linear-gradient(var(--signal-text),var(--line) 40%)}
.role{position:relative;padding:0 0 2.4rem 2.2rem}
.role::before{content:"";position:absolute;left:0;top:.35rem;width:.65rem;height:.65rem;border:1px solid var(--signal-text);background:var(--void);transform:rotate(45deg)}
.role:first-child::before{background:var(--signal)}
.role-when{font:400 .75rem/1 var(--mono);color:var(--signal-text);margin:0 0 .6rem}
.role h3{font:600 clamp(1.4rem,2.4vw,1.9rem)/1.1 var(--sans);letter-spacing:-.025em}
.role h3 span{font:400 .8125rem/1 var(--mono);color:var(--faint);letter-spacing:0;margin-left:.5rem}
.role-title{margin:.4rem 0 .9rem;color:var(--mist);font-size:.975rem}
.role ul{margin:0;padding:0;list-style:none;display:grid;gap:.55rem;max-width:62ch}
.role li{position:relative;padding-left:1.1rem;font-size:.975rem;line-height:1.5}
.role li::before{content:"";position:absolute;left:0;top:.72em;width:.45rem;height:1px;background:var(--faint)}

/* ---------- учёба ---------- */
.edu-grid{display:grid;grid-template-columns:1fr 1fr;gap:.75rem}
.edu{border-radius:14px;padding:1.4rem}
.edu:nth-child(2){--d:.1s}
.edu h3{font:600 1.2rem/1.2 var(--sans);letter-spacing:-.015em}
.edu p{margin:.35rem 0 1.1rem;color:var(--mist);font-size:.9375rem;line-height:1.5}
.edu p.small{font:400 .75rem/1.7 var(--mono);color:var(--faint);margin-bottom:.6rem}
.principles{margin:.9rem 0 0;padding:0;list-style:none;display:grid;gap:.7rem}
.principles li{position:relative;padding-left:1.4rem;font-size:.9375rem;line-height:1.5;color:var(--ink)}
.principles li::before{content:"";position:absolute;left:0;top:.5em;width:.45rem;height:.45rem;border:1px solid var(--signal-text);transform:rotate(45deg)}
.skills{margin:1.5rem 0 0;display:grid;gap:.6rem}
.skills>div{display:grid;grid-template-columns:7.5rem 1fr;gap:1rem;padding-top:.6rem;border-top:1px solid var(--line)}
.skills dt{font:400 .75rem/1.6 var(--mono);color:var(--signal-text)}
.skills dd{margin:0;color:var(--mist);font-size:.9375rem;line-height:1.5}

/* ---------- контакт ---------- */
.contact{min-height:100svh;display:grid;align-content:end;text-align:center;padding-block:46vh clamp(3rem,8vh,5rem)}
.contact .label{justify-content:center}
/* Заголовок в одну строку: над ним на компьютере висит сигнал, двум строкам там тесно. */
.contact h2{font-size:clamp(2rem,4vw,3.8rem);margin-inline:auto}
.contact .lede{margin:0 auto 2.2rem}
.contact .actions{justify-content:center}
.foot{position:relative;z-index:2;border-top:1px solid var(--line);padding:1.5rem var(--pad) 1.75rem;display:flex;flex-wrap:wrap;gap:.75rem 2rem;justify-content:space-between;color:var(--faint);font:400 .75rem/1.5 var(--mono);background:color-mix(in srgb,var(--void) 84%,transparent)}

/* Режим снимков для скриншотов: без плавной прокрутки. */
html.shot{scroll-behavior:auto}
.foot a{color:var(--mist);text-decoration:none}
.foot a:hover{color:var(--ink)}

/* ---------- адаптив ---------- */
@media (max-width:1080px){
  .split.end .col,.split.start .col{grid-column:1/-1}
  .prods{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:860px){
  .nav{position:fixed;inset:0;z-index:-1;flex-direction:column;justify-content:center;gap:1.4rem;padding:var(--pad);background:var(--void);font:600 1.8rem/1.1 var(--sans);letter-spacing:-.03em;opacity:0;visibility:hidden;transition:opacity .35s var(--ease-out),visibility 0s .35s}
  .nav a{color:var(--ink)}
  .nav.open{opacity:1;visibility:visible;transition:opacity .35s var(--ease-out)}
  .menu-btn{display:grid}
  .btn-top{display:none}
  .facts{grid-template-columns:repeat(2,1fr)}
  .fact:nth-child(3){border-left:0}
  .fact:nth-child(n+3){border-top:1px solid var(--line)}
  .agents,.edu-grid{grid-template-columns:1fr}
  .interlude{height:130vh}
  .tag{font-size:.6875rem;padding:.45rem .65rem}
  .tag.big{font-size:1rem}
}
@media (max-width:620px){
  body{font-size:1rem}
  h1{font-size:clamp(2.6rem,13.4vw,4rem)}
  h2{font-size:clamp(1.9rem,9.6vw,2.6rem)}
  .prods{grid-template-columns:1fr}
  .fact dt{font-size:clamp(1.7rem,8.4vw,2.2rem)}
  .fact{padding:1.1rem .9rem 1.25rem}
  .skills>div{grid-template-columns:1fr;gap:.25rem}
  .glass{backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}
}
/* Портретный экран: верхняя треть первого экрана отдана графу, имя начинается под ним.
   Текст разделов идёт поверх графа во всю ширину, а в плотных узлах частицы
   складываются до белого при любой яркости — подписи проваливали контраст.
   Подложка с мягкими краями глушит граф только под текстом, переходы остаются яркими. */
@media (max-aspect-ratio:9/10){
  .hero{padding-top:calc(4.5rem + 28vh)}
  .section{background:linear-gradient(transparent,color-mix(in srgb,var(--void) 92%,transparent) 5rem,color-mix(in srgb,var(--void) 92%,transparent) calc(100% - 5rem),transparent)}
  .contact>.wrap{background:linear-gradient(transparent,color-mix(in srgb,var(--void) 92%,transparent) 4rem);padding-top:4rem}
  .contact{padding-top:34vh}
}
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  .interlude{height:16vh}
  .tags{display:none}
  .pulse{animation:none}
  .js-reveal .reveal{opacity:1;transform:none;transition:none}
  .js-reveal h1 .line>span{transform:none;animation:none}
  .btn,.btn svg,.card::before,.card::after{transition:none}
}
