/* ═══ Основа ══════════════════════════════════════════════════════════ */
:root{
  --paper:#F2F0EA;        /* ватман */
  --paper-2:#E9E6DE;      /* поле листа */
  --paper-3:#DEDAD0;      /* заливка ячеек штампа */
  --ink:#15171B;          /* основная линия */
  --ink-2:#4C515B;        /* текст */
  --ink-3:#8B909B;        /* служебные подписи */
  --line:#C6C1B6;         /* тонкая линия */
  --line-2:#A29C90;       /* основная линия рамки */
  --accent:#0F3A93;       /* синий из логотипа */
  --accent-2:#2B6BE0;     /* тот же синий светлее: линии и наведение */
  --accent-soft:rgba(15,58,147,.08);
  --e:cubic-bezier(.16,1,.3,1);
  --z-nav:40; --z-menu:60; --z-rail:38;
}
/*
   Тёмного варианта у сайта нет намеренно.

   Замысел держится на светлом листе: ватман, тонкие линии, штамп,
   номера листов. В тёмной версии от него остаётся обычный тёмный
   лендинг, каких много, и вся затея теряет смысл. Вдобавок посетитель
   с ночной темой в системе видел совсем не то, что показывали
   заказчику, — а показывать нужно одно и то же всем.

   Поэтому фон объявлен явно и системную тему не слушает. Тёмным
   остаётся только титульный лист: он обложка комплекта, и таким
   задуман изначально.
*/
:root{color-scheme:light}
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;scroll-padding-top:6.5rem;font-size:106.25%}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
body{
  background:var(--paper);color:var(--ink);
  font-family:'Golos Text',system-ui,sans-serif;font-size:1rem;line-height:1.6;
  -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
  /* clip, а не hidden: hidden делает body контейнером прокрутки
     и липкие элементы перестают прилипать */
  overflow-x:clip;
}
img{display:block;max-width:100%;height:auto}
a{color:inherit;text-decoration:none}
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
:focus-visible{outline:2px solid var(--accent);outline-offset:3px}
::selection{background:var(--accent);color:var(--paper)}

/* ═══ Типографика ═════════════════════════════════════════════════════ */
/* Oswald узкий и вертикальный — ближе всего к чертёжному шрифту ГОСТ */
.h1,.h2,.h3,.sheet-t{font-family:'Oswald',sans-serif;font-weight:500;
  text-transform:uppercase;letter-spacing:.01em;line-height:.95}
.h1{font-size:clamp(2.6rem,9vw,6.4rem)}
.h2{font-size:clamp(1.9rem,5vw,3.4rem)}
.h3{font-size:clamp(1.15rem,2vw,1.45rem);line-height:1.1}
.mono{font-family:'JetBrains Mono',ui-monospace,monospace;
  font-variant-numeric:tabular-nums}
.lead{font-size:clamp(1.0625rem,1.7vw,1.3125rem);line-height:1.55;
  color:var(--ink-2);max-width:44ch}
p{color:var(--ink-2)}

/* ═══ Лист ════════════════════════════════════════════════════════════ */
/* Каждый раздел — лист документации со своей рамкой и номером. */
.sheet{position:relative;padding:clamp(3.5rem,8vw,7rem) 0;
  border-top:1px solid var(--line-2)}
.sheet:first-of-type{border-top:0}
.in{width:min(100% - 2.4rem,88rem);margin-inline:auto}
@media(min-width:900px){.in{width:min(100% - 6rem,88rem)}}

/* Номер листа и наименование — как основная надпись в углу */
.sheet-h{display:flex;align-items:baseline;gap:1rem;flex-wrap:wrap;
  padding-bottom:.7rem;border-bottom:1px solid var(--line);margin-bottom:2.4rem}
.sheet-n{font-family:'JetBrains Mono',monospace;font-size:.75rem;
  color:var(--accent);letter-spacing:.1em;flex-shrink:0}
.sheet-t{font-size:clamp(1.4rem,3.4vw,2.2rem)}
.sheet-note{margin-left:auto;font-family:'JetBrains Mono',monospace;
  font-size:.6875rem;color:var(--ink-3);letter-spacing:.06em;text-transform:uppercase}
@media(max-width:640px){.sheet-note{display:none}}
/* Номер листа то вставал в строку с названием, то срывался под него —
   зависело от длины названия. На телефоне ставим его всегда сверху,
   как надпись над штампом: листы выглядят одинаково. */
@media(max-width:560px){
  .sheet-h{flex-direction:column;align-items:flex-start;gap:.45rem;
    margin-bottom:1.8rem}
}

/* ═══ Координатная рамка страницы ═════════════════════════════════════ */
/* Засечки по вертикальному краю — только украшение, поэтому скрыты
   от программ чтения с экрана и не мешают на узком экране. */
.frame{position:fixed;inset:0;pointer-events:none;z-index:1}
.frame::before,.frame::after{content:'';position:absolute;top:0;bottom:0;
  width:1px;background:var(--line)}
.frame::before{left:1.2rem}.frame::after{right:1.2rem}
@media(max-width:900px){.frame{display:none}}

/* ═══ Шапка ═══════════════════════════════════════════════════════════ */
.bar{position:fixed;top:0;left:0;right:0;z-index:var(--z-nav);
  background:color-mix(in srgb,var(--paper) 88%,transparent);
  backdrop-filter:blur(12px);border-bottom:1px solid var(--line-2)}
.bar-in{display:flex;align-items:stretch;
  width:min(100% - 2.4rem,88rem);margin-inline:auto;height:3.9rem}
@media(min-width:900px){.bar-in{width:min(100% - 6rem,88rem)}}
.brand{display:flex;align-items:center;gap:.7rem;padding-right:1.2rem;
  border-right:1px solid var(--line);min-width:0}
.brand img{width:1.9rem;height:1.9rem;flex-shrink:0}
.brand-t{display:flex;flex-direction:column;line-height:1.05;min-width:0}
.brand-t b{font-family:'Oswald',sans-serif;font-weight:600;font-size:.9375rem;
  text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}
.brand-t span{font-family:'JetBrains Mono',monospace;font-size:.625rem;
  color:var(--ink-3);letter-spacing:.1em;text-transform:uppercase}
/*
   Шапка на телефоне.

   Название в одну строку не помещалось: двадцать знаков в Oswald шире,
   чем остаток шапки после трубки и бургера, и последняя буква налезала
   на разделитель. Поэтому с руки название встаёт в две строки, как в
   основной надписи на чертеже, а подпись «Москва · с 2019» убирается.
*/
@media(max-width:560px){
  .brand{gap:.55rem;padding-right:.8rem}
  .brand img{width:1.65rem;height:1.65rem}
  .brand-t span{display:none}
  .brand-t b{white-space:normal;font-size:.8125rem;line-height:1.06;
    letter-spacing:.02em}
}
@media(max-width:360px){
  .brand{gap:.45rem;padding-right:.6rem}
  .brand img{width:1.5rem;height:1.5rem}
  .brand-t b{font-size:.75rem}
}
.bar-mid{display:none;align-items:center;gap:.4rem;padding-inline:1.2rem;
  font-family:'JetBrains Mono',monospace;font-size:.6875rem;color:var(--ink-3);
  letter-spacing:.06em;text-transform:uppercase}
@media(min-width:1040px){.bar-mid{display:flex}}
.dotlive{width:6px;height:6px;background:var(--accent);border-radius:50%;
  animation:pulse 2.4s infinite}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.25}}
.bar-r{display:flex;align-items:stretch;margin-left:auto}
/* Позвонить — главное действие, и на телефоне оно тем более главное.
   Раньше номер в шапке скрывался на узком экране: там он и нужен. */
.bar-tel{display:flex;align-items:center;padding-inline:.9rem;
  border-left:1px solid var(--line);font-family:'JetBrains Mono',monospace;
  font-size:.8125rem;white-space:nowrap;transition:background .25s,color .25s}
@media(min-width:760px){.bar-tel{padding-inline:1.2rem}}
/* На самых узких экранах остаётся значок трубки, чтобы шапка не поехала */
.bar-tel span{display:none}
.bar-tel svg{width:1.15rem;height:1.15rem}
@media(min-width:561px){.bar-tel span{display:inline}.bar-tel svg{display:none}}
.bar-tel:hover{background:var(--accent);color:var(--paper)}
.burger{display:flex;align-items:center;gap:.6rem;padding-inline:1.1rem;
  border-left:1px solid var(--line);font-family:'JetBrains Mono',monospace;
  font-size:.6875rem;letter-spacing:.12em;text-transform:uppercase;
  transition:background .25s,color .25s}
.burger:hover{background:var(--ink);color:var(--paper)}
/* На узком экране слово «Разделы» вытесняет название компании и лезет
   на него. Оставляем один значок: смысл понятен и без подписи. */
@media(max-width:560px){
  .burger span{display:none}
  .burger{padding-inline:1rem}
  .brand{padding-right:.8rem}
  .brand-t b{font-size:.875rem}
}
.burger i{display:block;width:16px;height:9px;position:relative;flex-shrink:0}
.burger i::before,.burger i::after{content:'';position:absolute;left:0;right:0;
  height:1.5px;background:currentColor;transition:transform .4s var(--e)}
.burger i::before{top:0}.burger i::after{bottom:0}
body.open .burger i::before{transform:translateY(3.75px) rotate(45deg)}
body.open .burger i::after{transform:translateY(-3.75px) rotate(-45deg)}

/* ═══ Меню ════════════════════════════════════════════════════════════ */
/* Раскрывается как разворачиваемый лист: шторка идёт сверху вниз,
   строки выезжают по очереди. */
.menu{position:fixed;inset:0;z-index:var(--z-menu);
  background:var(--ink);color:var(--paper);
  clip-path:inset(0 0 100% 0);
  /* Закрытое меню убирается из потока доступности: раньше по Tab можно
     было уйти в невидимые пункты и потеряться на странице. Видимость
     гасится после того, как шторка ушла вверх. */
  visibility:hidden;
  transition:clip-path .72s var(--e),visibility 0s linear .72s;
  display:flex;flex-direction:column;overflow-y:auto}
body.open .menu{clip-path:inset(0 0 0 0);visibility:visible;
  transition:clip-path .72s var(--e),visibility 0s}
@media(prefers-reduced-motion:reduce){
  .menu{transition:clip-path .01s,visibility 0s linear .01s}}
/* Пока открыта шторка или бланк, страница под ними не прокручивается */
body.open,body.form{overflow:hidden}
.menu-top{display:flex;align-items:center;justify-content:space-between;
  height:3.9rem;padding-inline:1.2rem;border-bottom:1px solid rgba(242,240,234,.16);
  font-family:'JetBrains Mono',monospace;font-size:.6875rem;
  letter-spacing:.12em;text-transform:uppercase;flex-shrink:0}
@media(min-width:900px){.menu-top{padding-inline:3rem}}
.menu-brand{display:flex;align-items:center;gap:.7rem;min-width:0}
.menu-brand img{width:1.6rem;height:1.6rem;flex-shrink:0}
@media(max-width:560px){.menu-brand{font-size:.625rem}}
.menu-x{padding:.5rem .9rem;border:1px solid rgba(242,240,234,.3);
  transition:background .25s,color .25s}
.menu-x:hover{background:var(--paper);color:var(--ink)}
.menu-list{flex:1;display:flex;flex-direction:column;justify-content:center;
  padding:2.5rem 1.2rem}
@media(min-width:900px){.menu-list{padding:2rem 3rem}}
.mrow{display:flex;align-items:baseline;gap:1.2rem;padding:.75rem 0;
  border-bottom:1px solid rgba(242,240,234,.14);overflow:hidden}
.mrow:first-child{border-top:1px solid rgba(242,240,234,.14)}
.mrow b{font-family:'Oswald',sans-serif;font-weight:500;text-transform:uppercase;
  font-size:clamp(1.6rem,5.5vw,3.2rem);line-height:1;
  display:block;transform:translateY(110%);transition:transform .6s var(--e)}
body.open .mrow b{transform:translateY(0)}
.mrow:nth-child(1) b{transition-delay:.16s}
.mrow:nth-child(2) b{transition-delay:.22s}
.mrow:nth-child(3) b{transition-delay:.28s}
.mrow:nth-child(4) b{transition-delay:.34s}
.mrow:nth-child(5) b{transition-delay:.40s}
.mrow:nth-child(6) b{transition-delay:.46s}
.mrow:nth-child(7) b{transition-delay:.52s}
.mrow span{font-family:'JetBrains Mono',monospace;font-size:.6875rem;
  color:rgba(242,240,234,.45);flex-shrink:0;width:2.5rem}
.mrow em{margin-left:auto;font-style:normal;font-size:.8125rem;
  color:rgba(242,240,234,.5);text-align:right;display:none}
@media(min-width:760px){.mrow em{display:block}}
.mrow:hover b{color:var(--accent)}
.menu-foot{padding:1.5rem 1.2rem;border-top:1px solid rgba(242,240,234,.16);
  display:flex;flex-wrap:wrap;gap:.6rem 2rem;
  font-family:'JetBrains Mono',monospace;font-size:.75rem;
  color:rgba(242,240,234,.6);flex-shrink:0}
@media(min-width:900px){.menu-foot{padding:1.5rem 3rem}}
.menu-foot a:hover{color:var(--accent)}

/* ═══ Титульный лист: обложка комплекта ═══════════════════════════════
   Внутри комплекта листы белые, а обложка тёмная. Здесь то же самое:
   под титулом идёт видео объекта, поэтому лист становится тёмным, и
   светлый текст ложится на кадр без осветления самого кадра. */
.title{position:relative;min-height:100svh;display:flex;align-items:flex-end;
  padding-top:calc(3.9rem + clamp(2rem,5vw,4rem));
  padding-bottom:clamp(2.5rem,6vw,4.5rem);
  background:#0A0C10;color:#F2F0EA;overflow:hidden;border-top:0;
  /* Локальная палитра обложки: логотипный синий на тёмном не читается */
  --accent:#7FA8F7;--ink-2:rgba(242,240,234,.78);--ink-3:rgba(242,240,234,.55);
  --line:rgba(242,240,234,.22);--line-2:rgba(242,240,234,.34)}
/* Ширину не переопределяем: правило .in уже задаёт поля и предел в
   88rem. Здесь когда-то стояло width:100%, и оно перебивало предел —
   на широком мониторе заголовок растягивался во всю ширину и лип к
   левому краю, а все остальные листы стояли аккуратной колонкой. */
.title .in{position:relative;z-index:2}
.title-bg{position:absolute;inset:0;z-index:0;background:#0A0C10}
/* Оба слоя позиционированы явно, и порядок задан числами.
   Раньше кадр был позиционирован, а видео нет — и кадр накрывал его
   целиком: ролик играл, а на экране стояла картинка. Позиционированный
   элемент рисуется поверх непозиционированного, сколько бы раз он ни
   стоял выше в разметке. */
.title-bg video,.title-bg img{position:absolute;inset:0;
  width:100%;height:100%;object-fit:cover;display:block}
.title-bg img{z-index:0}
.title-bg video{z-index:1;opacity:0;transition:opacity 1.1s ease}
.title-bg video.on{opacity:1}
/* Вуаль. Слева, где текст, кадр приглушён почти полностью; справа
   остаётся читаемым. Обычные градиенты, без фильтров: фильтр поверх
   играющего видео роняет частоту кадров. */
/* Плотность подобрана расчётом, а не на глаз: по семи кадрам ролика
   худший контраст светлого текста в текстовой зоне выходит 8.8:1 при
   вуали .74, то есть кадр остаётся видимым на четверть, а весь текст,
   включая мелкий, проходит норму с запасом. */
.title-veil{position:absolute;inset:0;z-index:1;pointer-events:none;
  background:
    linear-gradient(90deg,rgba(10,12,16,.74) 0%,rgba(10,12,16,.62) 40%,
      rgba(10,12,16,.34) 74%,rgba(10,12,16,.22) 100%),
    linear-gradient(0deg,rgba(10,12,16,.72) 0%,rgba(10,12,16,0) 46%)}
@media(max-width:780px){
  /* На узком экране текст идёт во всю ширину, поэтому плотность выше
     только внизу, где он и находится. Верх кадра остаётся открытым:
     там видно и монтажника, и лампы, ради которых ролик и снят. */
  .title-veil{background:linear-gradient(0deg,rgba(10,12,16,.9) 0%,
    rgba(10,12,16,.76) 34%,rgba(10,12,16,.4) 68%,rgba(10,12,16,.24) 100%)}
  /* Текст прижимаем к низу: сверху остаётся чистый кадр */
  .title{min-height:100svh}
  .title .in{padding-bottom:.5rem}
  /* Размерная линия с двумя засечками на узком экране только мешает */
  .dim{margin-top:1.2rem;font-size:.625rem}
  .dim span:first-child,.dim span:last-child{display:none}
}
.title .btn{border-color:rgba(242,240,234,.5);color:#F2F0EA}
.title .btn::before{background:#F2F0EA}
.title .btn:hover{color:#0A0C10}
.title .btn-acc{border-color:#F2F0EA;background:#F2F0EA;color:#0A0C10}
.title .btn-acc::before{background:var(--accent)}
.title .btn-acc:hover{color:#0A0C10}

/* Метка прокрутки: линия ползёт вниз и повторяется */
.scroller{position:absolute;left:50%;bottom:1.1rem;z-index:2;translate:-50% 0;
  display:flex;flex-direction:column;align-items:center;gap:.5rem;
  font-family:'JetBrains Mono',monospace;font-size:.5625rem;
  letter-spacing:.16em;text-transform:uppercase;color:rgba(242,240,234,.5)}
.scroller i{display:block;width:1px;height:2.4rem;background:rgba(242,240,234,.25);
  position:relative;overflow:hidden}
.scroller i::after{content:'';position:absolute;left:0;width:1px;height:1rem;
  background:#F2F0EA;animation:trickle 2.4s var(--e) infinite}
@keyframes trickle{0%{top:-1rem}60%,100%{top:2.4rem}}
@media(max-width:780px){.scroller{display:none}}
@media(prefers-reduced-motion:reduce){.scroller i::after{animation:none;top:0}}

.title-eyebrow{display:flex;align-items:center;gap:.8rem;
  font-family:'JetBrains Mono',monospace;font-size:.6875rem;color:var(--ink-3);
  letter-spacing:.14em;text-transform:uppercase;margin-bottom:1.4rem}
.title-eyebrow::after{content:'';flex:1;height:1px;background:var(--line)}

/* Пока обложка на экране, шапка растворяется в кадре. Размытие в этот
   момент отключено: размывать движущееся видео дорого. */
.bar-logo-l{display:none}
body.cover .bar{background:transparent;backdrop-filter:none;
  border-bottom-color:rgba(242,240,234,.18);color:#F2F0EA}
body.cover .brand{border-right-color:rgba(242,240,234,.18)}
body.cover .bar-tel,body.cover .burger{border-left-color:rgba(242,240,234,.18)}
body.cover .brand-t span,body.cover .bar-mid{color:rgba(242,240,234,.6)}
body.cover .bar-logo-d{display:none}
body.cover .bar-logo-l{display:block}
body.cover .burger:hover{background:#F2F0EA;color:#0A0C10}
body.cover .bar-tel:hover{background:#F2F0EA;color:#0A0C10}

/* Заголовок прочерчивается: маска уезжает вправо, строка за строкой */
.draw{display:block;overflow:hidden}
.draw>span{display:block;clip-path:inset(0 100% 0 0);
  animation:draw 1.05s var(--e) forwards}
@keyframes draw{to{clip-path:inset(0 0 0 0)}}
.draw:nth-of-type(1)>span{animation-delay:.15s}
.draw:nth-of-type(2)>span{animation-delay:.32s}
.draw:nth-of-type(3)>span{animation-delay:.49s}
.acc{color:var(--accent)}
@media(prefers-reduced-motion:reduce){.draw>span{animation:none;clip-path:none}}

/* Размерная линия: то же, чем на чертеже показывают габарит */
.dim{display:flex;align-items:center;gap:.7rem;margin:1.8rem 0 0;
  font-family:'JetBrains Mono',monospace;font-size:.6875rem;color:var(--ink-3);
  letter-spacing:.08em}
.dim-l{flex:1;height:1px;background:var(--line-2);position:relative;
  transform:scaleX(0);transform-origin:left;
  animation:dimgrow 1s var(--e) .7s forwards}
@keyframes dimgrow{to{transform:scaleX(1)}}
.dim-l::before,.dim-l::after{content:'';position:absolute;top:-3px;
  width:1px;height:7px;background:var(--line-2)}
.dim-l::before{left:0}.dim-l::after{right:0}
@media(prefers-reduced-motion:reduce){.dim-l{animation:none;transform:none}}

.title-grid{display:grid;gap:2rem;margin-top:2.6rem}
@media(min-width:960px){.title-grid{grid-template-columns:1.1fr .9fr;
  gap:3rem;align-items:end}}
.title-cta{display:flex;flex-wrap:wrap;gap:.8rem;margin-top:1.8rem}
@media(max-width:480px){
  .title-cta{flex-direction:column;align-items:stretch}
  .title-cta .btn{justify-content:center}
}

/* ═══ Кнопки ══════════════════════════════════════════════════════════ */
/* Прямоугольник без скруглений, заливка выезжает снизу — как штамп,
   который прикладывают к листу. */
.btn{position:relative;display:inline-flex;align-items:center;gap:.7rem;
  padding:.95rem 1.5rem;border:1px solid var(--ink);overflow:hidden;
  font-family:'JetBrains Mono',monospace;font-size:.8125rem;
  letter-spacing:.06em;text-transform:uppercase;isolation:isolate;
  transition:color .3s}
.btn::before{content:'';position:absolute;inset:0;z-index:-1;background:var(--ink);
  transform:translateY(101%);transition:transform .45s var(--e)}
.btn:hover{color:var(--paper)}
.btn:hover::before{transform:translateY(0)}
.btn svg{width:1rem;height:1rem;transition:transform .4s var(--e)}
.btn:hover svg{transform:translateX(4px)}
.btn-acc{border-color:var(--accent);background:var(--accent);color:var(--paper)}
.btn-acc::before{background:var(--ink)}
.btn-sm{padding:.6rem 1rem;font-size:.6875rem}

/* ═══ Бегущая строка систем ═══════════════════════════════════════════ */
.tape{border-block:1px solid var(--line-2);background:var(--paper-2);
  overflow:hidden;padding:.85rem 0}
.tape-in{display:flex;width:max-content;animation:run 46s linear infinite}
.tape:hover .tape-in{animation-play-state:paused}
@keyframes run{to{transform:translateX(-50%)}}
.tape-i{display:flex;align-items:center;gap:.9rem;padding-inline:1.4rem;
  font-family:'Oswald',sans-serif;font-weight:500;text-transform:uppercase;
  font-size:1.0625rem;letter-spacing:.04em;white-space:nowrap;color:var(--ink)}
.tape-i::after{content:'';width:5px;height:5px;background:var(--accent);
  transform:rotate(45deg)}
@media(prefers-reduced-motion:reduce){.tape-in{animation:none}}

/* ═══ Экспликация: таблица показателей ════════════════════════════════ */
.expl{display:grid;gap:1px;background:var(--line);border:1px solid var(--line-2)}
@media(min-width:680px){.expl{grid-template-columns:repeat(2,1fr)}}
@media(min-width:1000px){.expl{grid-template-columns:repeat(4,1fr)}}
.expl-c{background:var(--paper);padding:1.6rem 1.4rem;position:relative;
  transition:background .35s}
.expl-c:hover{background:var(--paper-2)}
.expl-c b{display:block;font-family:'Oswald',sans-serif;font-weight:600;
  font-size:clamp(2.4rem,5vw,3.6rem);line-height:1;
  font-variant-numeric:tabular-nums}
.expl-c span{display:block;margin-top:.5rem;font-size:.875rem;color:var(--ink-2)}
.expl-c i{position:absolute;top:1rem;right:1.2rem;font-style:normal;
  font-family:'JetBrains Mono',monospace;font-size:.625rem;color:var(--ink-3)}

/* ═══ Двухколонник с выноской ═════════════════════════════════════════ */
.duo{display:grid;gap:2rem}
@media(min-width:900px){.duo{grid-template-columns:1fr 1fr;gap:3rem;align-items:start}}
.duo-txt p+p{margin-top:1rem}
.figure{position:relative;border:1px solid var(--line-2);background:var(--paper-2)}
.figure img{width:100%}
.figure figcaption{display:flex;gap:.8rem;padding:.7rem .9rem;
  border-top:1px solid var(--line-2);
  font-family:'JetBrains Mono',monospace;font-size:.6875rem;color:var(--ink-3);
  text-transform:uppercase;letter-spacing:.06em}
.figure figcaption b{color:var(--accent);flex-shrink:0}
/* Крестики совмещения в углах кадра */
.figure::before,.figure::after{content:'';position:absolute;width:11px;height:11px;
  border:1px solid var(--accent);border-width:1px 0 0 1px;z-index:2}
.figure::before{top:-1px;left:-1px}
.figure::after{bottom:-1px;right:-1px;border-width:0 1px 1px 0}

/* ═══ Ведомость систем ════════════════════════════════════════════════ */
/* Строка раскрывается вниз, как позиция в спецификации. */
.spec{border-top:1px solid var(--line-2)}
.spec-row{border-bottom:1px solid var(--line)}
.spec-h{display:flex;align-items:center;gap:1rem;width:100%;text-align:left;
  padding:1.35rem .4rem;transition:padding-left .35s var(--e),background .3s}
.spec-h:hover{padding-left:1.1rem;background:var(--paper-2)}
.spec-h em{font-style:normal;font-family:'JetBrains Mono',monospace;
  font-size:.6875rem;color:var(--accent);width:2.6rem;flex-shrink:0}
.spec-h b{font-family:'Oswald',sans-serif;font-weight:500;text-transform:uppercase;
  font-size:clamp(1.05rem,2.6vw,1.6rem);line-height:1.1;letter-spacing:.01em}
.spec-h i{margin-left:auto;flex-shrink:0;display:block;width:14px;height:14px;
  position:relative}
.spec-h i::before,.spec-h i::after{content:'';position:absolute;background:var(--ink);
  transition:transform .4s var(--e),opacity .3s}
.spec-h i::before{left:0;right:0;top:6.25px;height:1.5px}
.spec-h i::after{top:0;bottom:0;left:6.25px;width:1.5px}
.spec-row.on .spec-h i::after{transform:rotate(90deg);opacity:0}
.spec-body{display:grid;grid-template-rows:0fr;transition:grid-template-rows .55s var(--e)}
.spec-row.on .spec-body{grid-template-rows:1fr}
.spec-body>div{overflow:hidden}
.spec-in{padding:0 .4rem 1.6rem 3.6rem}
.spec-in p{max-width:62ch;margin-bottom:1rem}
.chips{display:flex;flex-wrap:wrap;gap:.4rem}
.chip{padding:.35rem .7rem;border:1px solid var(--line-2);background:var(--paper-2);
  font-family:'JetBrains Mono',monospace;font-size:.6875rem;color:var(--ink-2);
  transition:border-color .25s,color .25s}
.chip:hover{border-color:var(--accent);color:var(--accent)}

/* ═══ Разрез: безопасность на вершине ═════════════════════════════════ */
/* Слои идут снизу вверх, верхний выделен — это и есть заявление
   о приоритете технической безопасности. */
.cut{display:flex;flex-direction:column-reverse;gap:1px;background:var(--line);
  border:1px solid var(--line-2)}
.cut-l{background:var(--paper);padding:1.3rem 1.4rem;display:flex;gap:1.1rem;
  align-items:baseline;position:relative;transition:background .35s,padding-left .35s var(--e)}
.cut-l:hover{background:var(--paper-2);padding-left:1.9rem}
.cut-l em{font-style:normal;font-family:'JetBrains Mono',monospace;
  font-size:.6875rem;color:var(--ink-3);width:2.4rem;flex-shrink:0}
.cut-l b{font-family:'Oswald',sans-serif;font-weight:500;text-transform:uppercase;
  font-size:1.0625rem;letter-spacing:.02em}
.cut-l span{margin-left:auto;font-size:.875rem;color:var(--ink-2);
  text-align:right;max-width:40ch;display:none}
@media(min-width:820px){.cut-l span{display:block}}
.cut-l.top{background:var(--accent);color:var(--paper)}
.cut-l.top:hover{background:var(--accent)}
.cut-l.top em,.cut-l.top span{color:rgba(242,240,234,.82)}
/* Штриховка 45° на верхнем слое — так на чертеже выделяют сечение */
.cut-l.top::after{content:'';position:absolute;inset:0;pointer-events:none;
  background:repeating-linear-gradient(45deg,transparent 0 6px,
    rgba(242,240,234,.14) 6px 7px)}

/* ═══ Технологическая карта ═══════════════════════════════════════════ */
.flow{position:relative;display:grid;gap:1px;background:var(--line);
  border:1px solid var(--line-2)}
@media(min-width:760px){.flow{grid-template-columns:repeat(5,minmax(0,1fr))}}
.flow-s{background:var(--paper);padding:1.5rem 1.3rem 1.7rem;
  display:flex;flex-direction:column;gap:.7rem;position:relative;
  transition:background .35s}
.flow-s:hover{background:var(--paper-2)}
.flow-n{font-family:'JetBrains Mono',monospace;font-size:.6875rem;color:var(--accent);
  letter-spacing:.1em}
.flow-s h3{font-family:'Oswald',sans-serif;font-weight:500;text-transform:uppercase;
  font-size:1.0625rem;line-height:1.15;letter-spacing:.02em}
.flow-s p{font-size:.875rem;line-height:1.5}
/* Линия хода работ: заполняется по мере прокрутки */
.flow-bar{height:2px;background:var(--line);margin-top:1rem;position:relative;
  overflow:hidden}
.flow-bar::after{content:'';position:absolute;inset:0 100% 0 0;background:var(--accent);
  transition:inset .8s var(--e)}
.flow-wrap.on .flow-bar::after{inset:0}

/* ═══ Спецификация оборудования ═══════════════════════════════════════ */
.pick{display:flex;gap:0;border:1px solid var(--line-2);
  margin-bottom:2rem;flex-wrap:wrap}
.pick button{flex:1 1 auto;padding:.9rem 1.1rem;border-right:1px solid var(--line);
  font-family:'JetBrains Mono',monospace;font-size:.75rem;letter-spacing:.08em;
  text-transform:uppercase;color:var(--ink-3);
  transition:background .3s,color .3s;white-space:nowrap}
.pick button:last-child{border-right:0}
.pick button:hover{color:var(--ink)}
.pick button[aria-selected=true]{background:var(--ink);color:var(--paper)}
.pane{display:none}
.pane.on{display:block;animation:fade .5s var(--e)}
@keyframes fade{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}

.cards{display:grid;gap:1px;background:var(--line);border:1px solid var(--line-2)}
@media(min-width:640px){.cards{grid-template-columns:repeat(2,1fr)}}
@media(min-width:1000px){.cards{grid-template-columns:repeat(3,1fr)}}
.card{background:var(--paper);padding:1.4rem;display:flex;flex-direction:column;
  gap:.8rem;transition:background .35s}
.card:hover{background:var(--paper-2)}
.card img{width:100%;aspect-ratio:1;object-fit:contain;background:#fff;
  border:1px solid var(--line);padding:.6rem}
.card h4{font-family:'Oswald',sans-serif;font-weight:500;text-transform:uppercase;
  font-size:1.0625rem;letter-spacing:.02em}
.card dl{display:grid;gap:.3rem;font-family:'JetBrains Mono',monospace;
  font-size:.75rem}
.card dl div{display:flex;justify-content:space-between;gap:.8rem;
  padding-bottom:.3rem;border-bottom:1px dotted var(--line)}
.card dt{color:var(--ink-3)}
.card dd{text-align:right}
.card .btn{margin-top:auto;justify-content:center}

/* ═══ Колесо работ ════════════════════════════════════════════════════
   Квадратные карточки стоят по окружности и наклонены по касательной,
   как цифры на циферблате. Круг проворачивается при прокрутке.
   Наведение выпрямляет и приближает карточку, нажатие показывает оборот.

   Карточка — div с role="button", а не <button>: элементы формы не
   поддерживают трёхмерные преобразования, внутри кнопки переворот
   не работает. */
.wh-stage{position:relative;width:100%;aspect-ratio:1/1;max-width:54rem;
  margin-inline:auto;--r:19rem;--card:11rem}
.wh-ring{position:absolute;inset:0;transform:rotate(var(--rot,0deg));
  will-change:transform}
.wh-slot{position:absolute;left:50%;top:50%;
  width:var(--card);height:var(--card);
  margin-left:calc(var(--card)/-2);margin-top:calc(var(--card)/-2);
  transform:rotate(var(--a)) translateY(calc(var(--r)*-1));
  perspective:900px;cursor:pointer}
.wh-card{position:relative;width:100%;height:100%;transform-style:preserve-3d;
  transition:transform .55s var(--e)}
.wh-slot[aria-expanded="true"] .wh-card{transform:rotateY(180deg)}

/* На большом экране наведение выпрямляет карточку встречным поворотом:
   собственный угол плюс текущий угол круга, оба со знаком минус. */
@media(min-width:681px) and (hover:hover){
  .wh-slot:hover,.wh-slot:focus-within{z-index:10}
  .wh-slot:hover .wh-card,.wh-slot:focus-within .wh-card{
    transform:rotate(calc(-1*(var(--a) + var(--rot,0deg)))) scale(1.9)}
  .wh-slot[aria-expanded="true"] .wh-card{
    transform:rotate(calc(-1*(var(--a) + var(--rot,0deg)))) scale(1.9) rotateY(180deg)}
  .wh-slot:hover .wh-face,.wh-slot:focus-within .wh-face{
    border-color:var(--accent);box-shadow:0 1.2rem 2.6rem rgba(21,23,27,.26)}
}
.wh-face{position:absolute;inset:0;
  backface-visibility:hidden;-webkit-backface-visibility:hidden;
  border:1px solid var(--line-2);background:var(--paper);overflow:hidden;
  box-shadow:0 .5rem 1.4rem rgba(21,23,27,.13)}
.wh-front img{width:100%;height:100%;object-fit:cover}
/* Пока снимка с площадки нет, лицевая сторона держит вид работ
   типографикой. Кадр подставляется без правки разметки. */
.wh-ph{width:100%;height:100%;display:flex;align-items:center;
  justify-content:center;padding:.9rem;text-align:center;
  background:var(--accent);color:#F2F0EA;
  font-family:'Oswald',sans-serif;font-weight:500;text-transform:uppercase;
  font-size:.75rem;line-height:1.15;letter-spacing:.02em}
.wh-cap{position:absolute;left:0;right:0;bottom:0;z-index:2;padding:.5rem .55rem;
  background:linear-gradient(to top,rgba(21,23,27,.88),rgba(21,23,27,0));
  color:#F2F0EA;font-family:'Oswald',sans-serif;font-weight:500;
  text-transform:uppercase;font-size:.5rem;line-height:1.1;letter-spacing:.02em;
  opacity:0;transition:opacity .35s var(--e)}
.wh-slot:hover .wh-cap,.wh-slot:focus-within .wh-cap{opacity:1}
.wh-pos{position:absolute;left:0;top:0;z-index:2;
  font-family:'JetBrains Mono',monospace;font-size:.5625rem;letter-spacing:.1em;
  background:var(--paper);color:var(--accent);padding:.22rem .4rem;
  border-right:1px solid var(--line-2);border-bottom:1px solid var(--line-2)}
.wh-back{transform:rotateY(180deg);background:var(--paper-2);
  padding:.7rem .75rem;display:flex;flex-direction:column;gap:.3rem}
.wh-kind{font-family:'JetBrains Mono',monospace;font-size:.5rem;
  letter-spacing:.14em;text-transform:uppercase;color:var(--accent)}
.wh-name{font-family:'Oswald',sans-serif;font-weight:500;text-transform:uppercase;
  font-size:.8125rem;line-height:1.05;letter-spacing:.01em;
  padding-bottom:.35rem;border-bottom:1px solid var(--line)}
.wh-back ul{list-style:none;margin-top:.1rem}
.wh-back li{display:flex;gap:.3rem;padding:.14rem 0;
  font-size:.5625rem;line-height:1.3;color:var(--ink-2)}
.wh-back li::before{content:'—';color:var(--accent);flex-shrink:0}

/* Ступица: текст в середине, он не вращается */
.wh-hub{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  width:min(24rem,58%);text-align:center;pointer-events:none;z-index:3}
.wh-hub b{display:block;font-family:'Oswald',sans-serif;font-weight:500;
  text-transform:uppercase;line-height:.94;letter-spacing:.01em;
  font-size:clamp(1.6rem,3.6vw,2.9rem)}
.wh-hub span{display:block;margin-top:.5rem;color:var(--ink-2);
  font-size:.9375rem;line-height:1.4}
.wh-hub i{display:block;margin-top:1rem;font-style:normal;
  font-family:'JetBrains Mono',monospace;font-size:.625rem;
  letter-spacing:.18em;text-transform:uppercase;color:var(--ink-3)}
.wh-bar{display:flex;align-items:center;gap:.8rem;flex-wrap:wrap;margin-top:1rem;
  font-family:'JetBrains Mono',monospace;font-size:.6875rem;letter-spacing:.06em;
  text-transform:uppercase;color:var(--ink-3)}
.wh-bar .now{color:var(--ink)}
@media(max-width:1100px){.wh-stage{--r:15.5rem;--card:9rem}}
/* Планшетная полоса. Карточка мельчает, но текст на обороте ужимать
   дальше нельзя: восемь пикселей не читаются. Вместо этого убираем
   список работ и оставляем на обороте только вид и название. */
@media(max-width:860px) and (min-width:681px){
  .wh-stage{--r:12.5rem;--card:8rem}
  .wh-back ul{display:none}
  .wh-back{justify-content:center}
  .wh-kind{font-size:.5625rem}
  .wh-name{font-size:.875rem;border-bottom:0}
}

/* Телефон: окружность нечитаема, показываем ленту с прилипанием */
.wh-swipe{display:none}
.wh-hub i.touch{display:none}
@media(max-width:680px){
  .wh-stage{aspect-ratio:auto;max-width:none;--card:min(17rem,72vw)}
  .wh-ring{position:static;transform:none!important;display:flex;gap:1px;
    overflow-x:auto;overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch;
    scroll-snap-type:x mandatory;background:var(--line-2);
    border:1px solid var(--line-2)}
  .wh-slot{position:static;flex:0 0 var(--card);height:var(--card);margin:0;
    transform:none!important;scroll-snap-align:center;perspective:1000px}
  .wh-face{border:0;box-shadow:none}
  .wh-hub{position:static;transform:none;width:auto;margin:0 0 1.4rem;
    text-align:left;pointer-events:auto}
  .wh-hub b{font-size:clamp(1.5rem,7vw,2rem)}
  .wh-hub i.hover{display:none}
  .wh-hub i.touch{display:block}
  /* Оборот читается с руки, поэтому шрифты крупнее */
  .wh-back{padding:1rem 1.05rem;gap:.45rem}
  .wh-kind{font-size:.6875rem}
  .wh-name{font-size:1.0625rem;padding-bottom:.5rem}
  .wh-back li{font-size:.8125rem;padding:.22rem 0}
  .wh-pos{font-size:.6875rem;padding:.3rem .5rem}
  .wh-ph{font-size:1.0625rem}
  .wh-swipe{display:flex;align-items:center;gap:.4rem;margin-top:.7rem;
    font-family:'JetBrains Mono',monospace;font-size:.625rem;
    letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3)}
}
@media(prefers-reduced-motion:reduce){.wh-ring,.wh-card{transition:none}}

/* ═══ Барабан камер ═══════════════════════════════════════════════════ */
/* Три карточки по дуге: центральная развёрнута к читателю, соседние
   отклонены и уведены вглубь. Сцена тёмная, а сами карточки светлые:
   съёмка камер сделана на белом фоне, и затемнять её нельзя — товар
   пропадает. Получается лист спецификации, висящий в тёмной комнате.
   Позади лежит тот же кадр, размытый до пятна: он даёт глубину. */
.cf{position:relative;overflow:hidden;background:#0A0C10;
  border:1px solid var(--line-2);margin-top:.5rem;
  padding:clamp(1.4rem,3vw,2.2rem) 0 1.3rem}
.cf-bg{position:absolute;inset:0;z-index:0;pointer-events:none}
.cf-bg img{width:100%;height:100%;object-fit:cover;
  filter:brightness(.34) blur(38px);transform:scale(1.2);
  transition:opacity .8s var(--e)}
.cf-bg::after{content:'';position:absolute;inset:0;
  background:radial-gradient(circle at 50% 45%,rgba(10,12,16,.2) 0%,rgba(10,12,16,.92) 100%)}
.cf-stage{position:relative;z-index:1;height:clamp(27rem,46vw,31rem);
  perspective:1500px;touch-action:pan-y}
.cf-c{position:absolute;top:0;left:50%;width:clamp(15rem,21vw,18.5rem);height:100%;
  margin-left:calc(clamp(15rem,21vw,18.5rem) / -2);
  display:flex;flex-direction:column;overflow:hidden;text-align:left;
  background:var(--paper);border:1px solid rgba(242,240,234,.2);padding:0;
  cursor:pointer;transform-origin:center center;
  box-shadow:0 24px 60px rgba(0,0,0,.55);
  transition:transform .8s var(--e),opacity .8s var(--e),filter .8s var(--e)}
.cf-ph{position:relative;flex:0 0 46%;background:#EDF1F6;overflow:hidden}
.cf-c img{width:100%;height:100%;object-fit:cover}
.cf-veil{display:none}
.cf-in{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column;
  align-items:flex-start;gap:.22rem;padding:.8rem .9rem .9rem;color:var(--ink);
  border-top:1px solid var(--line)}
.cf-tag{font-family:'JetBrains Mono',monospace;font-size:.5625rem;
  letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3)}
.cf-name{font-family:'Oswald',sans-serif;font-weight:600;font-size:1.5rem;
  line-height:1;letter-spacing:.01em}
.cf-sub{font-size:.78rem;line-height:1.3;color:var(--ink-2)}
.cf-dl{display:grid;grid-template-columns:auto 1fr;gap:.05rem .8rem;width:100%;
  margin-top:.35rem;padding-top:.45rem;border-top:1px solid var(--line);
  font-family:'JetBrains Mono',monospace;font-size:.625rem;letter-spacing:.03em}
.cf-dl i{font-style:normal;color:var(--ink-3);text-transform:uppercase}
.cf-dl u{text-decoration:none;text-align:right;font-variant-numeric:tabular-nums}
.cf-go{display:inline-flex;align-items:center;gap:.45rem;margin-top:auto;
  padding:.5rem .8rem;border:1px solid var(--ink);
  font-family:'JetBrains Mono',monospace;font-size:.625rem;letter-spacing:.1em;
  text-transform:uppercase;transition:background .25s,color .25s}
.cf-c.on:hover .cf-go{background:var(--ink);color:var(--paper)}
.cf-go svg{width:.8rem;height:.8rem}
/* У соседних карточек подпись не читается, поэтому её нет вовсе, а кадр
   занимает всю высоту: сбоку стоит снимок, а не карточка с пустотой. */
.cf-c .cf-in{opacity:0;transition:opacity .45s var(--e),flex .8s var(--e)}
.cf-c.on .cf-in{opacity:1;transition-delay:.2s}
.cf-c:not(.on) .cf-in{flex:0 0 0;padding-block:0;border-top:0}
.cf-c:not(.on) .cf-ph{flex:1 1 auto}

.cf-nav{position:relative;z-index:2;display:flex;align-items:center;
  justify-content:center;gap:1rem;margin-top:1.3rem}
.cf-arr{width:2.75rem;height:2.75rem;display:flex;align-items:center;
  justify-content:center;border:1px solid rgba(242,240,234,.32);color:#F2F0EA;
  transition:background .25s,color .25s,border-color .25s}
.cf-arr:hover{background:#F2F0EA;color:#0A0C10}
.cf-arr svg{width:1.1rem;height:1.1rem}
.cf-count{font-family:'JetBrains Mono',monospace;font-size:.6875rem;
  letter-spacing:.12em;color:rgba(242,240,234,.6);
  font-variant-numeric:tabular-nums;min-width:4.5rem;text-align:center}
.cf-dots{display:flex;align-items:center;gap:.4rem}
.cf-dots button{width:.5rem;height:.5rem;border:1px solid rgba(242,240,234,.45);
  transition:width .35s var(--e),background .3s}
.cf-dots button[aria-selected="true"]{width:1.6rem;background:#7FA8F7;
  border-color:#7FA8F7}
@media(max-width:560px){
  .cf-count{display:none}
  .cf-c{width:min(72vw,16.5rem);margin-left:calc(min(72vw,16.5rem) / -2)}
  .cf-name{font-size:1.3rem}
}
@media(prefers-reduced-motion:reduce){
  .cf-c,.cf-in,.cf-bg img{transition:none}
}

/* ═══ Виджет подбора станции ══════════════════════════════════════════ */
.calc{display:grid;gap:1px;background:var(--line);border:1px solid var(--line-2);
  margin-top:2rem}
@media(min-width:920px){.calc{grid-template-columns:1.1fr .9fr}}
.calc-a,.calc-b{background:var(--paper);padding:1.6rem}
@media(min-width:760px){.calc-a,.calc-b{padding:2rem}}
.calc h4{font-family:'Oswald',sans-serif;font-weight:500;text-transform:uppercase;
  font-size:1.0625rem;letter-spacing:.03em;margin-bottom:1.1rem;
  padding-bottom:.6rem;border-bottom:1px solid var(--line)}
.load{display:flex;align-items:flex-start;gap:.85rem;padding:.75rem 0;
  border-bottom:1px dotted var(--line);cursor:pointer;transition:padding-left .3s}
.load:last-of-type{border-bottom:0}
.load:hover{padding-left:.35rem}
.load input{appearance:none;flex-shrink:0;width:1.05rem;height:1.05rem;
  margin-top:.22rem;border:1px solid var(--line-2);cursor:pointer;position:relative;
  transition:background .25s,border-color .25s}
.load input:checked{background:var(--accent);border-color:var(--accent)}
.load input:checked::after{content:'';position:absolute;left:.3rem;top:.08rem;
  width:.26rem;height:.55rem;border:solid #fff;border-width:0 2px 2px 0;rotate:45deg}
.load b{display:block;font-size:.9375rem;font-weight:500}
.load em{display:block;font-style:normal;font-size:.8125rem;color:var(--ink-3);
  margin-top:.1rem}
.load .kw{margin-left:auto;font-family:'JetBrains Mono',monospace;font-size:.75rem;
  color:var(--ink-3);white-space:nowrap;padding-top:.15rem}
.hrs{margin-top:1.2rem;padding-top:1.1rem;border-top:1px solid var(--line)}
.hrs label{display:flex;justify-content:space-between;font-size:.9375rem;
  margin-bottom:.6rem}
.hrs output{font-family:'JetBrains Mono',monospace;color:var(--accent)}
input[type=range]{width:100%;appearance:none;height:2px;background:var(--line-2);
  cursor:pointer}
input[type=range]::-webkit-slider-thumb{appearance:none;width:.95rem;height:.95rem;
  background:var(--accent);cursor:pointer}
input[type=range]::-moz-range-thumb{width:.95rem;height:.95rem;background:var(--accent);
  border:0}
.res{display:flex;justify-content:space-between;align-items:baseline;gap:1rem;
  padding:.8rem 0;border-bottom:1px dotted var(--line)}
.res:last-of-type{border-bottom:0}
.res dt{font-size:.9375rem;color:var(--ink-3)}
.res dd{font-family:'JetBrains Mono',monospace;font-size:1.1875rem;
  font-variant-numeric:tabular-nums}
/* ═══ Линейка ПОДСОЛНУХ ═══════════════════════════════════════════════ */
/* Модели различаются мощностью и ценой, поэтому это не три карточки, а
   строки спецификации: числа стоят колонкой и сравниваются взглядом.
   Строка, которую подобрал расчёт ниже, помечается кромкой слева. */
.rng{display:grid;gap:1px;background:var(--line);border:1px solid var(--line-2)}
.rng-r{position:relative;background:var(--paper);display:grid;gap:.45rem;
  padding:1.15rem 1.2rem;transition:background .3s}
.rng-r:hover{background:var(--paper-2)}
/* Кромка нарисована тенью внутрь, а не отдельным слоем: слой в сетке
   растягивал строку и разрывал линейку. */
.rng-r{box-shadow:inset 0 0 0 0 var(--accent);transition:background .3s,box-shadow .35s var(--e)}
.rng-r.fit{box-shadow:inset 2px 0 0 0 var(--accent);background:var(--paper-2)}
.rng-i{font-family:'JetBrains Mono',monospace;font-size:.6875rem;
  letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3)}
.rng-t{display:flex;flex-direction:column;gap:.25rem}
.rng-n{font-family:'Oswald',sans-serif;font-weight:500;font-size:1.125rem;
  text-transform:uppercase;letter-spacing:.02em}
.rng-w{font-family:'JetBrains Mono',monospace;font-size:.6875rem;
  letter-spacing:.06em;color:var(--ink-3)}
.rng-p{font-family:'Oswald',sans-serif;font-weight:600;line-height:1;
  font-size:clamp(1.45rem,3.4vw,1.9rem);font-variant-numeric:tabular-nums;
  white-space:nowrap}
.rng-p u{text-decoration:none;margin-left:.2em;font-size:.58em;color:var(--ink-3)}
@media(min-width:700px){
  .rng-r{grid-template-columns:auto 1fr auto;align-items:center;
    gap:.4rem 1.8rem;padding:1.35rem 1.6rem}
}
/* С этой ширины справа висит линейка листов, и цена упиралась в её
   подпись. Отводим колонку с числом на ширину подписи. */
@media(min-width:1100px){.rng-r{padding-right:9rem}}
@media(prefers-reduced-motion:reduce){.rng-r{transition:none}}

.verdict{margin-top:1.2rem;padding:.95rem 1.05rem;border-left:2px solid var(--accent);
  background:var(--accent-soft);font-size:.9375rem;line-height:1.55;color:var(--ink-2)}

/* ═══ География ═══════════════════════════════════════════════════════ */
.geo{display:grid;gap:2rem}
@media(min-width:940px){.geo{grid-template-columns:1.3fr .7fr;gap:2.5rem}}
.cities{display:grid;gap:1px;background:var(--line);border:1px solid var(--line-2)}
.city{background:var(--paper);padding:.85rem 1rem;display:flex;
  justify-content:space-between;gap:1rem;transition:background .3s,padding-left .3s}
.city:hover{background:var(--paper-2);padding-left:1.5rem}
.city b{font-weight:500;font-size:.9375rem}
.city span{font-family:'JetBrains Mono',monospace;font-size:.6875rem;
  color:var(--ink-3)}
.globe-box{position:relative;aspect-ratio:1;max-width:34rem;margin-inline:auto;
  width:100%;opacity:0;transition:opacity .9s}
.globe-box.ready{opacity:1}
.globe-box canvas{width:100%;height:100%;display:block;cursor:grab}
.globe-box canvas:active{cursor:grabbing}

/* ═══ Штамп: контакты и реквизиты ═════════════════════════════════════ */
/* Настоящая основная надпись: ячейки с подписями полей. */
.stamp{border:1px solid var(--ink);display:grid;gap:0;
  grid-template-columns:1fr;margin-top:2.4rem}
@media(min-width:760px){.stamp{grid-template-columns:repeat(3,1fr)}}
.cell{border-bottom:1px solid var(--line-2);border-right:0;padding:1.1rem 1.2rem}
@media(min-width:760px){.cell{border-right:1px solid var(--line-2)}
  .cell:nth-child(3n){border-right:0}}
.cell:last-child{border-bottom:0}
.cell u{display:block;text-decoration:none;font-family:'JetBrains Mono',monospace;
  font-size:.625rem;color:var(--ink-3);letter-spacing:.12em;text-transform:uppercase;
  margin-bottom:.4rem}
.cell b{display:block;font-size:1rem;font-weight:500;line-height:1.4}
.cell .big{font-family:'Oswald',sans-serif;font-weight:500;font-size:1.35rem;
  letter-spacing:.01em}
.cell a:hover{color:var(--accent)}
.cell-wide{grid-column:1/-1}

/* ═══ Линейка листов справа ═══════════════════════════════════════════ */
/* Заменяет привычное меню-док: показывает, на каком листе читатель. */
.rail{position:fixed;inset:auto 0 auto auto;top:50%;translate:0 -50%;
  z-index:var(--z-rail);display:none;flex-direction:column;gap:0;
  padding-right:.35rem;opacity:0;transition:opacity .5s}
@media(min-width:1100px){.rail{display:flex}}
.rail.show{opacity:1}
body.open .rail{opacity:0;pointer-events:none}
.rail a{display:flex;align-items:center;justify-content:flex-end;gap:.7rem;
  height:2.1rem;padding-right:.5rem;font-family:'JetBrains Mono',monospace;
  font-size:.625rem;color:var(--ink-3);transition:color .3s}
.rail a::after{content:'';width:14px;height:1px;background:var(--line-2);
  transition:width .35s var(--e),background .3s}
.rail a b{opacity:0;transform:translateX(6px);transition:opacity .3s,transform .35s var(--e);
  white-space:nowrap;font-weight:400;text-transform:uppercase;letter-spacing:.08em}
.rail a:hover b,.rail a.active b{opacity:1;transform:none}
.rail a:hover{color:var(--ink)}
.rail a:hover::after{width:26px;background:var(--ink)}
.rail a.active{color:var(--accent)}
.rail a.active::after{width:34px;background:var(--accent)}

/* ═══ Появление блоков ════════════════════════════════════════════════
   Прятать содержимое имеет право только работающий скрипт: класс js он
   ставит себе сам. Если скрипт не выполнился или наблюдатель за
   появлением дал сбой, текст просто остаётся на месте — пустого экрана
   не будет ни при каких обстоятельствах. Это уже случалось: разделы
   оказывались в кадре и не проявлялись. */
.js .rv{opacity:0;transform:translateY(22px);
  transition:opacity .75s var(--e),transform .75s var(--e)}
.js .rv.on{opacity:1;transform:none}
@media(prefers-reduced-motion:reduce){
  .js .rv{opacity:1;transform:none;transition:none}}

/* ═══ Кнопка наверх ═══════════════════════════════════════════════════ */
.up{position:fixed;inset:auto 1.2rem 1.2rem auto;z-index:var(--z-rail);
  display:flex;align-items:center;gap:.5rem;padding:.7rem 1rem;
  border:1px solid var(--ink);background:var(--paper);
  font-family:'JetBrains Mono',monospace;font-size:.6875rem;
  letter-spacing:.1em;text-transform:uppercase;
  opacity:0;visibility:hidden;transform:translateY(10px);
  transition:opacity .4s,visibility .4s,transform .4s var(--e),background .25s,color .25s}
.up.show{opacity:1;visibility:visible;transform:none}
.up:hover{background:var(--ink);color:var(--paper)}
/* Стрелке не задавали размер, и она схлопывалась в ноль: на кнопке было
   одно слово. Размер тот же, что у стрелок в остальных кнопках листа. */
.up svg{width:1rem;height:1rem}
@media(min-width:1100px){.up{inset:auto 3.5rem 1.6rem auto}}
/* На телефоне кнопка висит над текстом и закрывает собой строку: подпись
   к ленте работ и сноску о договорах читать было нечем. Поэтому с руки
   остаётся одна стрелка в квадрате, слово убирается. */
@media(max-width:780px){
  .up{gap:0;padding:0;width:2.75rem;height:2.75rem;justify-content:center;
    inset:auto .9rem .9rem auto}
  .up span{display:none}
}

.copy{margin-top:1.6rem;font-family:'JetBrains Mono',monospace;font-size:.6875rem;
  color:var(--ink-3);line-height:1.7}

/* ═══ Переход к заданию ═══════════════════════════════════════════════ */
/* Полоса в конце листа: короткий вопрос и одна кнопка. Смысл в том,
   чтобы читатель не искал контакты в конце страницы, а мог отдать
   объект на расчёт там, где у него возник вопрос. */
.next{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
  gap:1rem 1.6rem;margin-top:2.4rem;padding-top:1.4rem;
  border-top:1px solid var(--line-2)}
.next-t{display:flex;flex-direction:column;gap:.35rem;max-width:46ch}
.next-t u{text-decoration:none;font-family:'JetBrains Mono',monospace;
  font-size:.6875rem;letter-spacing:.12em;text-transform:uppercase;
  color:var(--ink-3)}
.next-t b{font-family:'Oswald',sans-serif;font-weight:500;
  font-size:clamp(1.05rem,2.2vw,1.3rem);text-transform:uppercase;
  letter-spacing:.02em;line-height:1.2}
@media(max-width:560px){
  .next{gap:.9rem}
  .next .btn{width:100%;justify-content:center;font-size:.75rem;
    padding-inline:1rem;letter-spacing:.04em}}

/* ═══ Ведомость объектов ══════════════════════════════════════════════ */
/* Строка объекта устроена как позиция ведомости: тип объекта, перечень
   систем и колонка показателей. Числа набраны моноширинным, чтобы
   сравнивались по вертикали. */
.obj{display:grid;gap:1px;background:var(--line);border:1px solid var(--line-2)}
.obj-r{background:var(--paper);padding:1.3rem 1.2rem;display:grid;gap:1rem;
  transition:background .3s}
.obj-r:hover{background:var(--paper-2)}
@media(min-width:860px){
  .obj-r{grid-template-columns:1.15fr 1fr;gap:2rem;padding:1.6rem}
}
.obj-i{font-family:'JetBrains Mono',monospace;font-size:.6875rem;
  letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);
  display:block;margin-bottom:.5rem}
.obj-n{font-family:'Oswald',sans-serif;font-weight:500;font-size:1.25rem;
  text-transform:uppercase;letter-spacing:.02em;line-height:1.15;
  margin-bottom:.7rem}
.obj-s{display:flex;flex-wrap:wrap;gap:.4rem}
.obj-s span{padding:.2rem .55rem;border:1px solid var(--line-2);
  font-family:'JetBrains Mono',monospace;font-size:.625rem;
  letter-spacing:.08em;text-transform:uppercase;color:var(--ink-2)}
.obj-d{display:grid;grid-template-columns:repeat(2,1fr);gap:.9rem 1.2rem;
  align-content:start}
.obj-d div{display:flex;flex-direction:column;gap:.2rem}
.obj-d dt{font-family:'JetBrains Mono',monospace;font-size:.625rem;
  letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3)}
.obj-d dd{font-family:'Oswald',sans-serif;font-weight:500;font-size:1.0625rem;
  font-variant-numeric:tabular-nums}
.obj-d dd.empty{color:var(--ink-3);font-family:'JetBrains Mono',monospace;
  font-size:.8125rem;font-weight:400}

/* ═══ Задание на расчёт ═══════════════════════════════════════════════ */
/* Панель выезжает справа и ведёт себя как бланк: шапка с номером формы,
   строки-поля, зона приложения и штамп отправителя внизу. Скруглений
   нет намеренно — это лист, а не карточка приложения. */
.lay{position:fixed;inset:0;z-index:var(--z-menu);background:rgba(10,12,16,.55);
  opacity:0;visibility:hidden;transition:opacity .4s,visibility 0s linear .4s}
body.form .lay{opacity:1;visibility:visible;transition:opacity .4s,visibility 0s}
@supports (backdrop-filter:blur(2px)){.lay{backdrop-filter:blur(2px)}}

.form-p{position:fixed;inset:0 0 0 auto;z-index:calc(var(--z-menu) + 1);
  width:min(38rem,100%);display:flex;flex-direction:column;
  background:var(--paper);border-left:1px solid var(--ink);
  transform:translateX(100%);visibility:hidden;
  transition:transform .5s var(--e),visibility 0s linear .5s;
  overscroll-behavior:contain}
body.form .form-p{transform:none;visibility:visible;
  transition:transform .5s var(--e),visibility 0s}
@media(prefers-reduced-motion:reduce){
  .lay,.form-p{transition:opacity .01s,visibility .01s,transform .01s}}

.form-top{flex-shrink:0;display:flex;align-items:center;justify-content:space-between;
  gap:1rem;padding:1rem 1.2rem;background:var(--ink);color:var(--paper);
  font-family:'JetBrains Mono',monospace;font-size:.6875rem;
  letter-spacing:.12em;text-transform:uppercase}
.form-top b{font-weight:400;color:rgba(242,240,234,.6)}
.form-x{padding:.7rem 1rem;min-height:2.75rem;border:1px solid rgba(242,240,234,.35);
  color:inherit;transition:background .25s,color .25s}
.form-x:hover{background:var(--paper);color:var(--ink)}
.form-b{flex:1;overflow-y:auto;padding:1.4rem 1.2rem 2rem;
  -webkit-overflow-scrolling:touch}
@media(min-width:600px){.form-top{padding:1rem 1.8rem}
  .form-b{padding:1.8rem 1.8rem 2.4rem}}
.form-h{font-family:'Oswald',sans-serif;font-weight:600;text-transform:uppercase;
  font-size:clamp(1.5rem,4vw,1.9rem);line-height:1.05;letter-spacing:-.005em;
  margin-bottom:.6rem}
.form-lead{color:var(--ink-2);font-size:.9375rem;line-height:1.6;
  margin-bottom:1.4rem}
.form-ctx{display:none;margin-bottom:1.4rem;padding:.7rem .9rem;
  border-left:2px solid var(--accent);background:var(--accent-soft);
  font-family:'JetBrains Mono',monospace;font-size:.6875rem;
  letter-spacing:.06em;color:var(--ink-2);line-height:1.6}
.form-ctx.on{display:block}

.fld{display:flex;flex-direction:column;gap:.35rem;margin-bottom:1rem}
.fld label{font-family:'JetBrains Mono',monospace;font-size:.6875rem;
  letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3)}
.fld label i{font-style:normal;color:var(--accent)}
.fld input,.fld textarea{width:100%;padding:.75rem .85rem;border:1px solid var(--line-2);
  background:var(--paper-2);color:var(--ink);font:inherit;font-size:.9375rem;
  border-radius:0;transition:border-color .25s,box-shadow .25s,background .25s}
.fld textarea{min-height:6.5rem;resize:vertical;line-height:1.55}
.fld input:hover,.fld textarea:hover{border-color:var(--ink-3)}
.fld input:focus,.fld textarea:focus{outline:none;border-color:var(--accent);
  background:var(--paper);box-shadow:inset 0 0 0 1px var(--accent)}
.fld .err{display:none;font-family:'JetBrains Mono',monospace;font-size:.625rem;
  letter-spacing:.06em;color:#A3230F}
.fld.bad input,.fld.bad textarea{border-color:#A3230F;box-shadow:inset 0 0 0 1px #A3230F}
.fld.bad .err{display:block}
@media(min-width:520px){.fld-2{display:grid;grid-template-columns:1fr 1fr;gap:0 1rem}}

/* Приложение: рамка пунктиром, как поле для вклейки на бланке */
.drop{position:relative;display:block;padding:1.2rem;border:1px dashed var(--ink-3);
  background:var(--paper-2);text-align:left;cursor:pointer;
  transition:border-color .25s,background .25s}
.drop:hover,.drop.over{border-color:var(--accent);background:var(--accent-soft)}
.drop input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}
.drop u{display:block;text-decoration:none;font-family:'JetBrains Mono',monospace;
  font-size:.6875rem;letter-spacing:.1em;text-transform:uppercase;
  color:var(--ink-3);margin-bottom:.4rem}
.drop b{display:block;font-weight:500;font-size:.9375rem;margin-bottom:.3rem}
.drop span{display:block;font-size:.8125rem;color:var(--ink-3);line-height:1.5}
.files{list-style:none;margin:.7rem 0 0;padding:0;display:flex;
  flex-direction:column;gap:1px;background:var(--line)}
.files li{background:var(--paper);display:flex;align-items:center;gap:.7rem;
  padding:.55rem .7rem;font-family:'JetBrains Mono',monospace;font-size:.6875rem;
  color:var(--ink-2)}
.files li b{font-weight:400;flex:1;min-width:0;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.files li em{font-style:normal;color:var(--ink-3);flex-shrink:0}
.files button{flex-shrink:0;width:1.5rem;height:1.5rem;border:1px solid var(--line-2);
  display:flex;align-items:center;justify-content:center;line-height:1;
  transition:background .2s,color .2s}
.files button:hover{background:var(--ink);color:var(--paper)}

.agree{display:flex;align-items:flex-start;gap:.7rem;margin:1.2rem 0;
  font-size:.8125rem;line-height:1.55;color:var(--ink-2)}
.agree{padding:.35rem 0}
.agree input{flex-shrink:0;width:1.25rem;height:1.25rem;margin-top:.05rem;
  accent-color:var(--accent)}
.agree a{border-bottom:1px solid var(--line-2)}
.agree a:hover{border-color:var(--accent);color:var(--accent)}
.form-send{width:100%;justify-content:center}
.form-send[disabled]{opacity:.55;cursor:not-allowed}
.form-st{margin-top:1rem;padding:.85rem 1rem;border-left:2px solid var(--line-2);
  font-size:.875rem;line-height:1.55;color:var(--ink-2);display:none}
.form-st.on{display:block}
.form-st.ok{border-color:var(--accent);background:var(--accent-soft)}
.form-st.no{border-color:#A3230F;background:rgba(163,35,15,.07)}
.form-foot a{display:inline-block;padding-block:.5rem}
.form-foot{margin-top:1.6rem;padding-top:1rem;border-top:1px solid var(--line-2);
  font-family:'JetBrains Mono',monospace;font-size:.625rem;line-height:1.8;
  letter-spacing:.06em;text-transform:uppercase;color:var(--ink-3);
  display:flex;flex-wrap:wrap;gap:.3rem 1.2rem}

/* ═══ Гармошка работ ══════════════════════════════════════════════════
   Кадры стоят в ряд корешками, как папки на полке. Наведение раскрывает
   одну позицию, соседние остаются узкими полосами с подписью вдоль
   корешка. Скруглений нет намеренно: это лист комплекта, а не карточки
   приложения. */
.eg{display:flex;gap:1px;background:var(--line);border:1px solid var(--line-2);
  height:clamp(24rem,52vw,34rem);overflow:hidden}
/* Пока скрипт не собрал позиции, пустой рамки на листе не висит */
.eg:empty{display:none}
.eg-plain{list-style:none;display:grid;gap:1px;background:var(--line);
  border:1px solid var(--line-2);padding:0}
@media(min-width:680px){.eg-plain{grid-template-columns:repeat(2,1fr)}}
.eg-plain li{background:var(--paper);padding:.85rem 1rem;font-weight:500}
.eg-i{position:relative;flex:1 1 0;min-width:0;overflow:hidden;background:var(--ink);
  border:0;padding:0;cursor:pointer;display:block;
  transition:flex .75s var(--e),filter .6s var(--e)}
.eg-i.on{flex:6 1 0}
.eg-i img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  filter:grayscale(1) brightness(.55);transform:scale(1.08);
  transition:filter .7s var(--e),transform 1.1s var(--e)}
.eg-i.on img{filter:none;transform:none}
.eg-i:focus-visible{outline:2px solid var(--accent-2);outline-offset:-4px}

/* Вуаль под подписью: та же плотность, что на обложке */
.eg-veil{position:absolute;inset:0;
  background:linear-gradient(0deg,rgba(10,12,16,.88) 0%,rgba(10,12,16,.35) 42%,
    rgba(10,12,16,0) 70%);
  opacity:0;transition:opacity .5s var(--e)}
.eg-i.on .eg-veil{opacity:1}

/* Корешок: номер позиции и название вдоль полосы */
.eg-spine{position:absolute;left:50%;bottom:1.2rem;translate:-50% 0;
  writing-mode:vertical-rl;transform:rotate(180deg);
  font-family:'JetBrains Mono',monospace;font-size:.6875rem;letter-spacing:.16em;
  text-transform:uppercase;color:rgba(242,240,234,.92);white-space:nowrap;
  transition:opacity .35s;text-shadow:0 1px 6px rgba(10,12,16,.7)}
.eg-i.on .eg-spine{opacity:0}

/* Раскрытая позиция */
.eg-body{position:absolute;left:0;right:0;bottom:0;padding:1.6rem;
  display:flex;flex-direction:column;align-items:flex-start;gap:.55rem;
  text-align:left;color:#F2F0EA;opacity:0;transform:translateY(14px);
  transition:opacity .5s var(--e),transform .5s var(--e)}
.eg-i.on .eg-body{opacity:1;transform:none;transition-delay:.18s}
.eg-pos{font-family:'JetBrains Mono',monospace;font-size:.6875rem;
  letter-spacing:.14em;text-transform:uppercase;color:rgba(242,240,234,.62);
  border-left:2px solid #7FA8F7;padding-left:.6rem}
.eg-name{font-family:'Oswald',sans-serif;font-weight:600;text-transform:uppercase;
  font-size:clamp(1.3rem,2.4vw,2rem);line-height:1;letter-spacing:.01em;
  white-space:nowrap}
.eg-sub{font-size:.875rem;line-height:1.5;color:rgba(242,240,234,.82);
  max-width:44ch;white-space:normal}
.eg-go{display:inline-flex;align-items:center;gap:.5rem;margin-top:.3rem;
  font-family:'JetBrains Mono',monospace;font-size:.6875rem;letter-spacing:.12em;
  text-transform:uppercase;color:#F2F0EA;
  border-bottom:1px solid rgba(242,240,234,.45);padding-bottom:.15rem}
.eg-go svg{width:.85rem;height:.85rem}

/* Строка состояния под гармошкой: как в ведомости */
.eg-bar{display:flex;flex-wrap:wrap;align-items:center;gap:.6rem 1.2rem;
  margin-top:1rem;font-family:'JetBrains Mono',monospace;font-size:.6875rem;
  letter-spacing:.06em;text-transform:uppercase;color:var(--ink-3)}
.eg-bar b{font-weight:400;color:var(--ink)}

/* Телефон: гармошка не работает пальцем, поэтому лента с прилипанием */
@media(max-width:780px){
  .eg{height:auto;flex-wrap:nowrap;overflow-x:auto;scroll-snap-type:x mandatory;
    -webkit-overflow-scrolling:touch}
  .eg-i{flex:0 0 78%;height:22rem;scroll-snap-align:center}
  .eg-i,.eg-i.on{flex:0 0 78%}
  .eg-i img{filter:none;transform:none}
  .eg-spine{display:none}
  .eg-body{opacity:1;transform:none;padding:1.1rem}
  /* С руки кадр виден целиком, поэтому под подписью плотность выше */
  .eg-veil{opacity:1;background:linear-gradient(0deg,rgba(10,12,16,.94) 0%,
    rgba(10,12,16,.72) 38%,rgba(10,12,16,.18) 66%,rgba(10,12,16,0) 82%)}
  .eg-name{font-size:1.15rem;white-space:normal}
  .eg-sub{font-size:.8125rem}
}
@media(prefers-reduced-motion:reduce){
  .eg-i,.eg-i img,.eg-body,.eg-veil{transition:none}
}

/* ═══ Телефон: правки поверх общего каскада ═══════════════════════════ */
/* Блок стоит последним намеренно. Правила ниже спорят с базовыми и
   должны выигрывать по порядку, а не по весу селектора: так их видно
   все разом и не приходится наращивать специфичность. */

/* Третья вкладка срывалась на вторую строку и висела там одна.
   Три колонки нулевой минимальной ширины держат строй при любой ширине. */
@media(max-width:560px){
  .pick{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));
    margin-bottom:1.6rem}
  .pick button{padding:.85rem .25rem;font-size:.5625rem;letter-spacing:.01em;
    text-align:center;white-space:normal;line-height:1.25;overflow-wrap:anywhere}
}

/* Четыре показателя в столбик занимали по экрану каждый, и лист
   превращался в бесконечную ленту. Ставим по два в ряд: цифры
   сравниваются взглядом, прокрутка сокращается вдвое. */
@media(max-width:679px){
  .expl{grid-template-columns:repeat(2,minmax(0,1fr))}
  .expl-c{padding:1.1rem .9rem}
  .expl-c b{font-size:clamp(1.6rem,8vw,2.3rem)}
  .expl-c span{font-size:.8125rem;margin-top:.35rem}
  .expl-c i{font-size:.5625rem;top:.7rem;right:.7rem}
}

/* ═══ Обложка объекта ═════════════════════════════════════════════════ */
/* Кадр объекта во всю ширину, поверх — та же тёмная палитра, что на
   титульном листе. Кадр медленно наезжает и уходит вверх при прокрутке,
   текст выходит по очереди: сначала подпись, потом строки заголовка,
   потом размерная линия и кнопки. Всё движение выключается, если в
   системе просят уменьшить анимацию. */
.ohero{position:relative;min-height:78svh;display:flex;align-items:flex-end;
  overflow:hidden;background:#0A0C10;color:#F2F0EA;border-top:0;
  padding-top:calc(3.9rem + clamp(2rem,6vw,4rem));
  padding-bottom:clamp(2.2rem,6vw,4rem);
  --accent:#7FA8F7;--ink-2:rgba(242,240,234,.82);--ink-3:rgba(242,240,234,.58);
  --line:rgba(242,240,234,.24);--line-2:rgba(242,240,234,.36)}
.ohero .in{position:relative;z-index:3}
.ohero-bg{position:absolute;inset:-6% 0;z-index:0;will-change:transform}
.ohero-bg img{width:100%;height:100%;object-fit:cover;object-position:50% 42%;
  transform:scale(1.1);animation:kenburns 30s var(--e) forwards}
@keyframes kenburns{to{transform:scale(1)}}
/* Плотность подобрана так же, как на обложке: слева текстовая зона
   тёмная, справа кадр остаётся открытым. */
.ohero-veil{position:absolute;inset:0;z-index:1;pointer-events:none;
  background:
    linear-gradient(90deg,rgba(10,12,16,.9) 0%,rgba(10,12,16,.74) 42%,
      rgba(10,12,16,.36) 76%,rgba(10,12,16,.24) 100%),
    linear-gradient(0deg,rgba(10,12,16,.88) 0%,rgba(10,12,16,0) 58%)}
@media(max-width:780px){
  .ohero{min-height:74svh}
  /* Кадр с руки виден целиком, поэтому светлые здания попадают под
     подпись: плотность выше по всей высоте, иначе мелкий текст плывёт. */
  .ohero-veil{background:linear-gradient(0deg,rgba(10,12,16,.94) 0%,
    rgba(10,12,16,.86) 45%,rgba(10,12,16,.62) 76%,rgba(10,12,16,.44) 100%)}
}

/* Угловые засечки: то, чем на чертеже отмечают границу кадра */
.ohero-marks{position:absolute;inset:1.1rem;z-index:2;pointer-events:none}
.ohero-marks span{position:absolute;width:26px;height:26px}
.ohero-marks span::before,.ohero-marks span::after{content:'';position:absolute;
  background:rgba(242,240,234,.5)}
.ohero-marks span::before{left:0;top:0;width:100%;height:1px;
  transform:scaleX(0);animation:markx .8s var(--e) .5s forwards}
.ohero-marks span::after{left:0;top:0;width:1px;height:100%;
  transform:scaleY(0);animation:marky .8s var(--e) .6s forwards}
@keyframes markx{to{transform:scaleX(1)}}
@keyframes marky{to{transform:scaleY(1)}}
.ohero-marks span:nth-child(1){left:0;top:0}
.ohero-marks span:nth-child(2){right:0;top:0;transform:scaleX(-1)}
.ohero-marks span:nth-child(3){left:0;bottom:0;transform:scaleY(-1)}
.ohero-marks span:nth-child(4){right:0;bottom:0;transform:scale(-1)}
@media(max-width:560px){.ohero-marks{inset:.7rem}.ohero-marks span{width:18px;height:18px}}

/* Выход содержимого */
.up-in{opacity:0;transform:translateY(16px);animation:upin .95s var(--e) forwards}
@keyframes upin{to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){
  .ohero-bg img{animation:none;transform:none}
  .ohero-marks span::before{animation:none;transform:scaleX(1)}
  .ohero-marks span::after{animation:none;transform:scaleY(1)}
  .up-in{animation:none;opacity:1;transform:none}
}

.ohero .btn{border-color:rgba(242,240,234,.55);color:#F2F0EA}
.ohero .btn::before{background:#F2F0EA}
.ohero .btn:hover{color:#0A0C10}
.ohero .btn-acc{border-color:#F2F0EA;background:#F2F0EA;color:#0A0C10}
.ohero .btn-acc::before{background:var(--accent)}
.ohero .btn-acc:hover{color:#0A0C10}
.obj-h{margin:2.4rem 0 .9rem;font-family:'Oswald',sans-serif;font-weight:500;
  text-transform:uppercase;letter-spacing:.03em}


/* Схема комплекса. Рисунок собственный: столбик на секцию, высота
   пропорциональна этажности, под землёй два уровня штриховкой. */
.scheme-box{margin-top:2rem;background:var(--paper-2);padding:1.4rem 0 0}
.scheme{display:block;width:100%;height:auto}
.scheme .sec rect{fill:var(--paper);stroke:var(--line-2);stroke-width:1}
.scheme .sec.acc rect{fill:var(--accent-soft);stroke:var(--accent)}
.scheme .fl{font-family:'Oswald',sans-serif;font-weight:600;font-size:19px;
  fill:var(--ink);text-anchor:middle}
.scheme .sec.acc .fl{fill:var(--accent)}
.scheme .nm,.scheme .lv,.scheme .cap{font-family:'JetBrains Mono',monospace;
  font-size:11px;letter-spacing:.1em;fill:var(--ink-3)}
.scheme .nm{text-anchor:middle}
.scheme .ground{stroke:var(--ink);stroke-width:1.5}
.scheme #hatch line{stroke:var(--line-2);stroke-width:1}
.scheme .ub{fill:none;stroke:var(--line-2);stroke-width:1}
@media(max-width:560px){
  .scheme .fl{font-size:15px}
  .scheme .nm,.scheme .lv,.scheme .cap{font-size:13px}
}
.scheme-box{max-width:46rem;margin-inline:auto}
/* Строка ведомости стала ссылкой на лист объекта */
a.obj-r{color:inherit;display:grid}
a.obj-r:hover .obj-go{color:var(--accent)}
.obj-city{font-family:'JetBrains Mono',monospace;font-size:.75rem;
  letter-spacing:.06em;color:var(--ink-3);text-transform:none;
  display:inline-block;margin-left:.3rem}
.obj-go{color:var(--accent-2);font-family:'JetBrains Mono',monospace;
  font-size:.875rem;transition:color .25s}
/* Структурная схема шире портретной: даём ей больше поля */
.scheme-wide{max-width:58rem}
.scheme .bx rect{fill:var(--paper);stroke:var(--line-2);stroke-width:1}
.scheme .bx.acc rect{fill:var(--accent-soft);stroke:var(--accent)}
.scheme .bx.dim rect{fill:var(--paper-2);stroke:var(--line)}
.scheme .bt{font-family:'Oswald',sans-serif;font-weight:500;font-size:15px;
  fill:var(--ink);text-anchor:middle;dominant-baseline:middle}
.scheme .bs,.scheme .nt{font-family:'JetBrains Mono',monospace;font-size:10.5px;
  fill:var(--ink-3);text-anchor:middle;dominant-baseline:middle}
.scheme .nt{text-anchor:start}
.scheme .ln{stroke:var(--line-2);stroke-width:1.2;fill:none}
/* Заявление рядом с гармошкой: та же крупная цифра, что в экспликации */
.wh-claim{display:block;font-family:'Oswald',sans-serif;font-weight:600;
  text-transform:uppercase;font-size:clamp(1.6rem,3.6vw,2.6rem);line-height:1;
  letter-spacing:-.005em;font-variant-numeric:tabular-nums}

/* ═══ Карточки объектов ═══════════════════════════════════════════════ */
/* Главное на листе: кадр объекта, показатели и переход на его лист.
   Две карточки в ряд, на телефоне друг под другом. Скруглений нет —
   это позиция ведомости, увеличенная до размера, который она заслужила. */
.obc{display:grid;gap:1px;background:var(--line);border:1px solid var(--line-2)}
@media(min-width:900px){.obc{grid-template-columns:1fr 1fr}}
.obc-i{display:flex;flex-direction:column;background:var(--paper);color:inherit;
  transition:background .3s}
.obc-i:hover{background:var(--paper-2)}
.obc-ph{position:relative;display:block;aspect-ratio:16/9;overflow:hidden;
  background:#0A0C10}
.obc-ph img{width:100%;height:100%;object-fit:cover;
  transition:transform 1.2s var(--e)}
.obc-i:hover .obc-ph img{transform:scale(1.045)}
.obc-veil{position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(0deg,rgba(10,12,16,.86) 0%,rgba(10,12,16,.28) 48%,
    rgba(10,12,16,.12) 100%)}
.obc-tag{position:absolute;top:1rem;left:1rem;padding:.3rem .6rem;
  background:rgba(10,12,16,.62);border:1px solid rgba(242,240,234,.3);
  font-family:'JetBrains Mono',monospace;font-size:.625rem;letter-spacing:.12em;
  text-transform:uppercase;color:rgba(242,240,234,.92)}
.obc-ttl{position:absolute;left:1.2rem;right:1.2rem;bottom:1rem;display:block;
  color:#F2F0EA}
.obc-ttl b{display:block;font-family:'Oswald',sans-serif;font-weight:600;
  text-transform:uppercase;font-size:clamp(1.35rem,2.6vw,1.9rem);line-height:1.02;
  letter-spacing:.01em}
.obc-ttl em{display:block;margin-top:.25rem;font-style:normal;
  font-family:'JetBrains Mono',monospace;font-size:.6875rem;letter-spacing:.1em;
  text-transform:uppercase;color:rgba(242,240,234,.72)}
.obc-b{display:flex;flex-direction:column;gap:1rem;padding:1.2rem;flex:1}
@media(min-width:600px){.obc-b{padding:1.5rem}}
.obc-d{display:grid;grid-template-columns:repeat(3,1fr);gap:.9rem}
.obc-d span{display:flex;flex-direction:column;gap:.2rem;min-width:0}
.obc-d u{text-decoration:none;font-family:'JetBrains Mono',monospace;
  font-size:.5625rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3)}
.obc-d b{font-family:'Oswald',sans-serif;font-weight:600;font-size:1.0625rem;
  font-variant-numeric:tabular-nums;white-space:nowrap}
.obc-s{display:flex;flex-wrap:wrap;gap:.35rem}
.obc-s i{font-style:normal;padding:.2rem .5rem;border:1px solid var(--line-2);
  font-family:'JetBrains Mono',monospace;font-size:.5625rem;letter-spacing:.08em;
  text-transform:uppercase;color:var(--ink-2)}
.obc-go{margin-top:auto;display:inline-flex;align-items:center;gap:.5rem;
  font-family:'JetBrains Mono',monospace;font-size:.6875rem;letter-spacing:.1em;
  text-transform:uppercase;color:var(--accent-2);
  transition:gap .3s var(--e)}
.obc-i:hover .obc-go{gap:.85rem}
.obc-go svg{width:.9rem;height:.9rem}

/* ═══ Слои объекта ════════════════════════════════════════════════════ */
/* Пять слоёв одной строкой слева направо: только номер и название.
   Последний — наш, он выделен кромкой и подложкой. */
.lyr{display:grid;gap:1px;background:var(--line);border:1px solid var(--line-2)}
@media(min-width:760px){.lyr{grid-template-columns:repeat(5,minmax(0,1fr))}}
.lyr-c{background:var(--paper);padding:.9rem 1rem;display:flex;
  flex-direction:column;gap:.3rem;transition:background .3s}
.lyr-c em{font-style:normal;font-family:'JetBrains Mono',monospace;
  font-size:.625rem;letter-spacing:.12em;color:var(--ink-3)}
.lyr-c b{font-family:'Oswald',sans-serif;font-weight:500;font-size:.9375rem;
  text-transform:uppercase;letter-spacing:.02em;line-height:1.15}
.lyr-c.on{background:var(--accent-soft);box-shadow:inset 0 2px 0 0 var(--accent)}
.lyr-c.on em{color:var(--accent)}

/* ═══ Схема географии ═════════════════════════════════════════════════ */
/* Города стоят по настоящим координатам на сетке широт и долгот: это
   не карта, а план съёмки. Линии из Москвы показывают, откуда ведут
   объекты. Рисунок собственный, поэтому и стиль тот же, что у листов. */
.geo-fig{background:var(--paper-2);padding:1rem 1rem 0}
.geo-map{display:block;width:100%;height:auto}
.geo-map .fld{fill:var(--paper);stroke:var(--line-2);stroke-width:1}
.geo-map .gl{stroke:var(--line);stroke-width:1;stroke-dasharray:2 4}
.geo-map .gt{font-family:'JetBrains Mono',monospace;font-size:10px;
  fill:var(--ink-3);text-anchor:middle}
.geo-map .gl-y{text-anchor:end}
.geo-map .ties line{stroke:var(--accent);stroke-width:1;opacity:.28}
.geo-map .pt circle{fill:var(--accent)}
.geo-map .pt-m circle{fill:var(--accent);stroke:var(--paper);stroke-width:2}
.geo-map .pl{font-family:'Oswald',sans-serif;font-weight:500;font-size:13px;
  fill:var(--ink);text-transform:uppercase;letter-spacing:.02em}
.geo-map .pn{font-family:'JetBrains Mono',monospace;font-size:9.5px;
  fill:var(--ink-3);letter-spacing:.1em}
.geo-map .cap{font-family:'JetBrains Mono',monospace;font-size:10px;
  fill:var(--ink-3);letter-spacing:.12em}
@media(max-width:560px){
  .geo-map .pl{font-size:17px}
  .geo-map .pn,.geo-map .gt,.geo-map .cap{font-size:13px}
  .geo-map .cap-r{display:none}
}
