/* ── палитра ───────────────────────────────────────────────
   Шрифты только системные: ни один запрос не уходит на чужой
   сервер, поэтому в аналитику попадаете вы, а не Google.      */

:root{
  --paper:#E9EAE6; --card:#F3F4F0; --sunk:#DEE1DB;
  --ink:#15181A; --ink2:#49514E; --ink3:#757D79; --line:#C5CAC3;
  --sig:#2C6B7A; --led:#4A8757; --alert:#A34030;

  --sans:ui-sans-serif,system-ui,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
  --mono:ui-monospace,"SF Mono",SFMono-Regular,Menlo,Consolas,"Liberation Mono","DejaVu Sans Mono",monospace;

  --shell:1120px;
  --gut:clamp(1rem,.55rem + 1.5vw,1.75rem);
  --r:3px;
}
@media (prefers-color-scheme:dark){
  :root:not([data-theme="light"]){
    --paper:#0D1011; --card:#151A1B; --sunk:#090C0D;
    --ink:#E3E7E5; --ink2:#A2ABA7; --ink3:#767E7A; --line:#253032;
    --sig:#64B6C7; --led:#6DBE81; --alert:#D2705C;
  }
}
:root[data-theme="dark"]{
  --paper:#0D1011; --card:#151A1B; --sunk:#090C0D;
  --ink:#E3E7E5; --ink2:#A2ABA7; --ink3:#767E7A; --line:#253032;
  --sig:#64B6C7; --led:#6DBE81; --alert:#D2705C;
}

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0;background:var(--paper);color:var(--ink);
  font-family:var(--sans);font-size:16.5px;line-height:1.62;
  -webkit-font-smoothing:antialiased;
}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}
}
h1,h2,h3,p,ul,ol,dl,dd,figure{margin:0}
ul{padding:0;list-style:none}
a{color:inherit}
button{font:inherit;color:inherit;background:none;border:none;cursor:pointer}
:focus-visible{outline:2px solid var(--sig);outline-offset:3px}
code,pre,kbd{font-family:var(--mono)}

.shell{max-width:var(--shell);margin:0 auto;padding:0 var(--gut)}
.skip{position:absolute;left:-9999px;top:0;z-index:99;background:var(--ink);color:var(--paper);padding:.6rem 1rem;text-decoration:none}
.skip:focus{left:.5rem;top:.5rem}

/* ── статус-строка ── */
.statusbar{background:var(--sunk);border-bottom:1px solid var(--line);font-family:var(--mono);font-size:.7rem;letter-spacing:.06em}
.statusbar__in{display:flex;align-items:center;gap:.5rem;height:28px;color:var(--ink3);text-transform:uppercase}
.statusbar__sep{opacity:.5}
.statusbar__clock{font-variant-numeric:tabular-nums}
.statusbar__theme{margin-left:auto;font:inherit;letter-spacing:.06em;text-transform:uppercase;color:var(--ink3);border:1px solid transparent;padding:.1rem .4rem}
.statusbar__theme:hover{color:var(--sig);border-color:var(--line)}
.led{width:7px;height:7px;background:var(--led);border-radius:1px;display:inline-block;flex:none;animation:blink 4s ease-in-out infinite}
@keyframes blink{0%,92%,100%{opacity:1}96%{opacity:.35}}

/* ── шапка ── */
.head{border-bottom:1px solid var(--line);background:var(--paper);position:sticky;top:0;z-index:10}
.head__in{display:flex;align-items:center;gap:1.5rem;min-height:62px;flex-wrap:wrap}
.mark{text-decoration:none;display:flex;align-items:baseline;gap:.6rem;margin-right:auto}
.mark__nick{font-family:var(--mono);font-weight:700;font-size:1.05rem;letter-spacing:.02em}
.mark__name{font-family:var(--mono);font-size:.72rem;color:var(--ink3);letter-spacing:.06em}
.nav{display:flex;gap:.15rem;flex-wrap:wrap}
.nav__item{
  font-family:var(--mono);font-size:.76rem;letter-spacing:.05em;text-transform:uppercase;
  text-decoration:none;color:var(--ink2);padding:.4rem .62rem;border:1px solid transparent;
}
.nav__item:hover{color:var(--ink);border-color:var(--line)}
.nav__item.is-on{color:var(--ink);border-color:var(--line);background:var(--card);box-shadow:inset 0 -2px 0 var(--sig)}

main{padding:calc(var(--gut)*1.6) var(--gut) calc(var(--gut)*2.4)}

/* ── общие элементы ── */
.eyebrow{font-family:var(--mono);font-size:.7rem;letter-spacing:.14em;text-transform:uppercase;color:var(--ink3);margin-bottom:.7rem}
.eyebrow::before{content:"// ";opacity:.55}
.block{margin-bottom:3.2rem}
.block__head{display:flex;align-items:baseline;justify-content:space-between;gap:1rem;margin-bottom:1rem}
.block__head .eyebrow{margin-bottom:0}
.more{font-family:var(--mono);font-size:.74rem;color:var(--ink2);text-decoration:none;letter-spacing:.04em}
.more:hover{color:var(--sig)}
.blank{border:1px dashed var(--line);padding:1.4rem;color:var(--ink2);font-size:.95rem}
.status{font-family:var(--mono);font-size:.74rem;color:var(--ink3);margin-bottom:1rem}

.btn{
  display:inline-block;font-family:var(--mono);font-size:.78rem;letter-spacing:.06em;text-transform:uppercase;
  background:var(--ink);color:var(--paper);border:1px solid var(--ink);padding:.55rem 1.1rem;
  text-decoration:none;border-radius:var(--r);
}
.btn:hover{background:var(--sig);border-color:var(--sig)}
.btn--quiet{background:transparent;color:var(--ink);border-color:var(--line)}
.btn--quiet:hover{background:transparent;color:var(--sig);border-color:var(--sig)}
.btn--danger{background:transparent;color:var(--alert);border-color:var(--alert)}
.btn--danger:hover{background:var(--alert);color:var(--paper)}

/* ── шильдик на главной ── */
.plate{border:1px solid var(--line);background:var(--card);margin-bottom:3.2rem;border-radius:var(--r);overflow:hidden}
.plate__bar{
  display:flex;align-items:center;justify-content:space-between;gap:1rem;
  background:var(--sunk);border-bottom:1px solid var(--line);
  padding:.5rem .95rem;font-family:var(--mono);font-size:.72rem;letter-spacing:.1em;text-transform:uppercase;
}
.plate__state{display:flex;align-items:center;gap:.45rem;color:var(--ink2)}
.plate__body{padding:1.9rem .95rem 1.5rem}
.plate__role{font-size:clamp(1.6rem,1rem + 2.6vw,2.7rem);line-height:1.08;font-weight:650;letter-spacing:-.02em}
.plate__tag{margin-top:.6rem;color:var(--ink2);font-size:1.06rem;max-width:48ch}
.plate__specs{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));border-top:1px solid var(--line)}
.plate__specs>div{padding:.8rem .95rem;border-right:1px solid var(--line)}
.plate__specs>div:last-child{border-right:0}
.plate__specs dt{font-family:var(--mono);font-size:.66rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink3)}
.plate__specs dd{margin:.2rem 0 0;font-size:.92rem}

/* ── карточки работ ── */
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:1px;background:var(--line);border:1px solid var(--line);border-radius:var(--r);overflow:hidden}
.card{background:var(--card);padding:1.3rem;display:flex;flex-direction:column;gap:.55rem;text-decoration:none;transition:background .14s}
.card:hover{background:var(--sunk)}
.card__top{display:flex;justify-content:space-between;align-items:center;font-family:var(--mono);font-size:.7rem;letter-spacing:.08em;color:var(--ink3)}
.card__flag{color:var(--sig);text-transform:uppercase}
.card__title{font-size:1.12rem;line-height:1.3;font-weight:640}
.card__sum{color:var(--ink2);font-size:.93rem}
.card__foot{margin-top:auto;padding-top:.7rem;display:flex;justify-content:space-between;gap:.8rem;font-family:var(--mono);font-size:.7rem;color:var(--ink3)}

/* ── строки записей ── */
.rows{border-top:1px solid var(--line)}
.row{display:grid;grid-template-columns:minmax(120px,150px) 1fr auto;gap:1.2rem;align-items:start;
  padding:1.05rem .2rem;border-bottom:1px solid var(--line);text-decoration:none;transition:background .12s}
.row:hover{background:var(--card)}
.row__date{font-family:var(--mono);font-size:.74rem;color:var(--ink3);padding-top:.2rem}
.row__title{display:block;font-size:1.05rem;font-weight:600;line-height:1.35}
.row__ex{display:block;color:var(--ink2);font-size:.9rem;margin-top:.2rem}
.row__meta{font-family:var(--mono);font-size:.7rem;color:var(--ink3);white-space:nowrap;padding-top:.25rem}
@media (max-width:640px){
  .row{grid-template-columns:1fr;gap:.35rem}
  .row__meta{padding-top:0}
}

/* ── фильтры и поиск ── */
.chips{display:flex;flex-wrap:wrap;gap:.35rem;margin-bottom:1.1rem}
.chip{font-family:var(--mono);font-size:.73rem;border:1px solid var(--line);padding:.28rem .6rem;color:var(--ink2);text-decoration:none;border-radius:var(--r)}
.chip:hover{border-color:var(--sig);color:var(--sig)}
.chip.is-on{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.chip--year{color:var(--ink3)}
.find{display:flex;gap:.4rem;margin-bottom:1.1rem;max-width:520px}
.find__input{flex:1;font-family:var(--mono);font-size:.88rem;background:var(--card);border:1px solid var(--line);color:var(--ink);padding:.55rem .7rem;border-radius:var(--r)}
.find__input:focus{outline:none;border-color:var(--sig)}
.find__go{font-family:var(--mono);font-size:.76rem;text-transform:uppercase;letter-spacing:.06em;border:1px solid var(--line);padding:.5rem .9rem;border-radius:var(--r)}
.find__go:hover{border-color:var(--sig);color:var(--sig)}

/* ── заголовок страницы ── */
.pagehead{margin-bottom:2rem;max-width:60ch}
.pagehead__h{font-size:clamp(1.6rem,1rem + 2.2vw,2.4rem);line-height:1.1;letter-spacing:-.018em;font-weight:650}
.pagehead__sub{color:var(--ink2);margin-top:.6rem}

/* ── статья ── */
.article{max-width:66ch;margin:0 auto}
.back{font-family:var(--mono);font-size:.72rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ink2);text-decoration:none;display:inline-block;margin-bottom:1.6rem}
.back:hover{color:var(--sig)}
.article__h{font-size:clamp(1.55rem,1rem + 2.2vw,2.35rem);line-height:1.1;letter-spacing:-.018em;font-weight:660}
.article__lead{margin-top:.8rem;color:var(--ink2);font-size:1.05rem}
.article__tags{font-family:var(--mono);font-size:.73rem;color:var(--ink3);margin-top:.7rem}
.article__tags a{text-decoration:none}
.article__tags a:hover{color:var(--sig)}

.prose{margin-top:1.6rem}
.prose p{margin-bottom:1.1rem}
.prose h2{font-size:1.22rem;font-weight:640;margin:2.1rem 0 .6rem;letter-spacing:-.01em}
.prose ul{margin:0 0 1.1rem;padding-left:1.1rem;list-style:none}
.prose li{position:relative;margin-bottom:.35rem}
.prose li::before{content:"—";position:absolute;left:-1.1rem;color:var(--ink3)}
.prose blockquote{margin:0 0 1.1rem;border-left:2px solid var(--sig);padding:.15rem 0 .15rem 1rem;color:var(--ink2)}
.prose code{background:var(--sunk);border:1px solid var(--line);padding:.05em .3em;font-size:.88em;border-radius:2px}
.prose pre{background:var(--sunk);border:1px solid var(--line);padding:.9rem 1rem;overflow-x:auto;margin:0 0 1.2rem;border-radius:var(--r)}
.prose pre code{background:none;border:0;padding:0;font-size:.86rem;line-height:1.55}
.prose a{color:var(--sig)}
.prose strong{font-weight:660}

/* ── файлы ── */
.files{margin-top:2.4rem;border-top:1px solid var(--line);padding-top:1.4rem}
.files__list{display:flex;flex-direction:column;gap:1px;background:var(--line);border:1px solid var(--line);border-radius:var(--r);overflow:hidden}
.file__link{display:flex;align-items:center;gap:.9rem;background:var(--card);padding:.75rem .9rem;text-decoration:none}
.file__link:hover{background:var(--sunk)}
.file__ext{font-family:var(--mono);font-size:.66rem;letter-spacing:.06em;border:1px solid var(--line);padding:.15rem .4rem;color:var(--sig);flex:none;min-width:3.2rem;text-align:center}
.file__name{flex:1;font-size:.93rem;overflow-wrap:anywhere}
.file__size{font-family:var(--mono);font-size:.7rem;color:var(--ink3);flex:none}

.nextlink{display:block;max-width:66ch;margin:2.6rem auto 0;border-top:1px solid var(--line);padding-top:1.3rem;text-decoration:none}
.nextlink span{display:block;font-family:var(--mono);font-size:.7rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink3);margin-bottom:.25rem}
.nextlink b{font-size:1.08rem;font-weight:640}
.nextlink:hover b{color:var(--sig)}

/* ── резюме ── */
.cvlist{display:flex;flex-direction:column;gap:1px;background:var(--line);border:1px solid var(--line);border-radius:var(--r);overflow:hidden}
.cvitem{display:grid;grid-template-columns:minmax(110px,150px) 1fr;gap:1.1rem;background:var(--card);padding:1rem .95rem}
.cvitem__period{font-family:var(--mono);font-size:.75rem;color:var(--ink3)}
.cvitem__body b{display:block;font-weight:640}
.cvitem__org{display:block;color:var(--ink2);font-size:.93rem}
.cvitem__note{display:block;font-family:var(--mono);font-size:.72rem;color:var(--ink3);margin-top:.25rem}
@media (max-width:560px){.cvitem{grid-template-columns:1fr;gap:.3rem}}
.skills{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:1.2rem}
.skills__group h3{font-family:var(--mono);font-size:.72rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink3);margin-bottom:.5rem}
.skills__group li{padding:.18rem 0;border-bottom:1px solid var(--line);font-size:.94rem}
.plainlist li{padding:.35rem 0;border-bottom:1px solid var(--line)}
.about{max-width:70ch}
.about__links{margin-top:1.4rem;display:flex;gap:.6rem;flex-wrap:wrap}

/* ── контакты ── */
.contacts{display:flex;flex-direction:column;gap:1px;background:var(--line);border:1px solid var(--line);border-radius:var(--r);overflow:hidden;max-width:640px}
.contact{display:flex;gap:1.2rem;background:var(--card);padding:.9rem 1rem;text-decoration:none;align-items:baseline}
a.contact:hover{background:var(--sunk)}
.contact__label{font-family:var(--mono);font-size:.72rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ink3);min-width:7rem;flex:none}
.contact__value{overflow-wrap:anywhere}

/* ── подвал ── */
.foot{border-top:1px solid var(--line);background:var(--sunk)}
.foot__in{display:flex;flex-wrap:wrap;gap:.8rem;justify-content:space-between;padding-top:1.2rem;padding-bottom:1.2rem;font-family:var(--mono);font-size:.72rem;color:var(--ink3)}
.foot a{color:var(--ink2)}

/* ═══════════════════════════════════════════════════════════
   ДВИЖЕНИЕ

   Три правила, которым здесь подчиняется всё:
   1. Анимация показывает связь между состояниями, а не украшает.
   2. Двигаются только transform и opacity — они считаются на видеокарте
      и не заставляют браузер пересчитывать раскладку.
   3. Всё выключается при prefers-reduced-motion. Это не вежливость:
      для части людей движение на экране вызывает тошноту и головную боль.
   ═════════════════════════════════════════════════════════ */

/* ── переходы между страницами ──
   Браузер сам снимает «до» и «после» и анимирует разницу. Ни строчки JS.
   Где не поддерживается — страницы просто переключаются, как раньше. */
@view-transition{ navigation:auto }

@media (prefers-reduced-motion:no-preference){
  /* Шапка, статус-строка и подвал получают собственные имена и остаются
     неподвижными: двигается только содержимое. */
  .statusbar{ view-transition-name:vt-status }
  .head{ view-transition-name:vt-head }
  .foot{ view-transition-name:vt-foot }
  main{ view-transition-name:vt-main }

  ::view-transition-old(vt-main){ animation:vt-out .18s ease-in both }
  ::view-transition-new(vt-main){ animation:vt-in .28s cubic-bezier(.2,.85,.3,1) both }
  @keyframes vt-out{ to{ opacity:0; transform:translateY(-6px) } }
  @keyframes vt-in{ from{ opacity:0; transform:translateY(10px) } }

  /* Заголовок статьи назван так же, как заголовок карточки, с которой пришли
     (имя вешает app.js по клику) — браузер перетягивает один в другой. */
  .article__h{ view-transition-name:vt-title }
}

/* ── полоса прочитанного ──
   Ширина привязана к прокрутке документа средствами CSS: без обработчика
   scroll, без requestAnimationFrame, без единого кадра на главном потоке. */
.readbar{height:2px;background:var(--sig);transform:scaleX(0);transform-origin:0 50%}
@supports (animation-timeline:scroll()){
  @media (prefers-reduced-motion:no-preference){
    .readbar{animation:readprogress linear both;animation-timeline:scroll(root block)}
    @keyframes readprogress{ from{transform:scaleX(0)} to{transform:scaleX(1)} }
  }
}

/* ── проявление при прокрутке ──
   animation-timeline: view() заменяет Intersection Observer целиком.
   Важно: без поддержки элементы остаются видимыми — контент никогда
   не прячется в надежде, что скрипт его покажет. */
@supports (animation-timeline:view()){
  @media (prefers-reduced-motion:no-preference){
    .card,.row,.cvitem,.file__link,.contact,.tile{
      animation:enter linear both;
      animation-timeline:view();
      animation-range:entry 0% entry 34%;
    }
    @keyframes enter{ from{opacity:0;transform:translateY(16px)} to{opacity:1;transform:none} }
  }
}

/* ── появление при загрузке ── */
@media (prefers-reduced-motion:no-preference){
  .plate,.pagehead,.article{animation:enter-up .5s cubic-bezier(.2,.85,.3,1) backwards}
  .plate{animation-delay:.04s}
  .plate__specs>div{animation:enter-up .42s cubic-bezier(.2,.85,.3,1) backwards}
  .plate__specs>div:nth-child(1){animation-delay:.16s}
  .plate__specs>div:nth-child(2){animation-delay:.22s}
  .plate__specs>div:nth-child(3){animation-delay:.28s}
  .plate__specs>div:nth-child(4){animation-delay:.34s}
  @keyframes enter-up{ from{opacity:0;transform:translateY(12px)} to{opacity:1;transform:none} }

  /* Луч по панели: раз в девять секунд, чуть заметно. Столько же живёт
     мигание индикатора — вместе они дают ощущение работающего прибора. */
  .plate__bar{position:relative;overflow:hidden}
  .plate__bar::after{
    content:"";position:absolute;inset:0;pointer-events:none;
    background:linear-gradient(100deg,transparent 35%,var(--sig) 50%,transparent 65%);
    opacity:.14;transform:translateX(-110%);
    animation:sweep 9s cubic-bezier(.6,0,.4,1) infinite;
  }
  @keyframes sweep{ 0%{transform:translateX(-110%)} 55%,100%{transform:translateX(110%)} }
}

/* ── отклик на наведение ── */
.card{position:relative}
.card::after{
  content:"";position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--sig);
  transform:scaleX(0);transform-origin:0 50%;transition:transform .22s cubic-bezier(.2,.85,.3,1);
}
.card:hover::after,.card:focus-visible::after{transform:scaleX(1)}
.card__title{transition:color .16s}
.card:hover .card__title{color:var(--sig)}

.nav__item{position:relative;transition:color .16s}
.nav__item::after{
  content:"";position:absolute;left:.62rem;right:.62rem;bottom:.22rem;height:1px;background:currentColor;
  transform:scaleX(0);transform-origin:0 50%;transition:transform .2s cubic-bezier(.2,.85,.3,1);
}
.nav__item:hover::after{transform:scaleX(1)}
.nav__item.is-on::after{display:none}

.row{transition:background .14s,padding-left .18s cubic-bezier(.2,.85,.3,1)}
.row:hover{padding-left:.7rem}
.row__title{transition:color .16s}
.row:hover .row__title{color:var(--sig)}

.btn{transition:background .16s,border-color .16s,color .16s,transform .1s}
.btn:active{transform:translateY(1px)}
.chip{transition:border-color .16s,color .16s,background .16s}
.file__link,.contact{transition:background .14s}
.nextlink b{transition:color .16s}
.statusbar__theme{transition:color .16s,border-color .16s}

/* Смена темы — плавная, иначе переключатель бьёт по глазам вспышкой. */
@media (prefers-reduced-motion:no-preference){
  body,.head,.statusbar,.foot,.card,.plate,.plate__bar,.prose pre,.prose code{
    transition:background-color .28s ease,color .28s ease,border-color .28s ease;
  }
}

/* ═══ СХЕМА СТЕНДА ═══════════════════════════════════════ */

.topowrap{border:1px solid var(--line);background:var(--card);border-radius:var(--r);padding:1rem;overflow-x:auto;margin-bottom:1rem}
.topo{display:block;width:100%;min-width:640px;height:auto;overflow:visible}

.topo__wire{fill:none;stroke:var(--line);stroke-width:1.5}
.topo__flow{fill:none;stroke:var(--sig);stroke-width:1.5;stroke-dasharray:5 15;stroke-dashoffset:0;opacity:.75}
.topo__wirelabel{font-family:var(--mono);font-size:9px;fill:var(--ink3);letter-spacing:.06em}

/* Пакеты бегут по проводам. Задержки заданы селекторами, а не атрибутом
   style, — инлайновые стили запрещены политикой безопасности страницы. */
@media (prefers-reduced-motion:no-preference){
  .topo__flow{animation:traffic 2.4s linear infinite}
  .topo__link:nth-of-type(2) .topo__flow{animation-delay:-.4s}
  .topo__link:nth-of-type(3) .topo__flow{animation-delay:-.8s}
  .topo__link:nth-of-type(4) .topo__flow{animation-delay:-1.2s}
  .topo__link:nth-of-type(5) .topo__flow{animation-delay:-1.6s}
  .topo__link:nth-of-type(6) .topo__flow{animation-delay:-2s}
  @keyframes traffic{ to{ stroke-dashoffset:-40 } }
}

.topo__box{fill:var(--paper);stroke:var(--line);stroke-width:1.5;transition:stroke .18s,fill .18s}
.topo__badge{fill:var(--sunk);stroke:var(--line);stroke-width:1}
.topo__code{font-family:var(--mono);font-size:9px;font-weight:700;fill:var(--sig);letter-spacing:.06em}
.topo__label{font-family:var(--sans);font-size:12.5px;font-weight:600;fill:var(--ink)}
.topo__addr{font-family:var(--mono);font-size:9.5px;fill:var(--ink3)}
.topo__led{fill:var(--led)}
@media (prefers-reduced-motion:no-preference){
  .topo__led{animation:blink 4s ease-in-out infinite}
  .topo__node:nth-of-type(even) .topo__led{animation-delay:-1.7s}
}

.topo__node{cursor:pointer}
.topo__node:hover .topo__box,.topo__node:focus-visible .topo__box{stroke:var(--sig);fill:var(--card)}
.topo__node:focus-visible{outline:none}
.topo__node:focus-visible .topo__box{stroke-width:2.5}
.topo__node.is-active .topo__box{stroke:var(--sig);stroke-width:2.5;fill:var(--card)}
.topo__link.is-dim{opacity:.28}
.topo__link.is-lit .topo__wire{stroke:var(--sig)}

.topoinfo{border:1px solid var(--line);border-left:2px solid var(--sig);background:var(--card);
  padding:.9rem 1rem;border-radius:var(--r);margin-bottom:2.4rem;min-height:4.6rem}
.topoinfo__hint{font-family:var(--mono);font-size:.76rem;color:var(--ink3)}
.topoinfo__head{display:flex;align-items:baseline;gap:.7rem;flex-wrap:wrap;margin-bottom:.3rem}
.topoinfo__name{font-weight:640;font-size:1.05rem}
.topoinfo__addr{font-family:var(--mono);font-size:.76rem;color:var(--sig)}
.topoinfo__note{color:var(--ink2);font-size:.94rem}

/* ═══ СПРЯТАННЫЙ ТЕРМИНАЛ ════════════════════════════════ */

.term{
  position:fixed;left:0;right:0;bottom:0;z-index:60;
  background:var(--sunk);border-top:1px solid var(--sig);
  font-family:var(--mono);font-size:.83rem;line-height:1.5;
  max-height:min(62vh,460px);display:flex;flex-direction:column;
  transform:translateY(101%);transition:transform .24s cubic-bezier(.2,.85,.3,1);
}
.term.is-open{transform:translateY(0)}
.term__bar{display:flex;align-items:center;gap:.5rem;padding:.35rem .8rem;border-bottom:1px solid var(--line);
  font-size:.7rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink3)}
.term__close{margin-left:auto;color:var(--ink3);font-family:var(--mono);font-size:.72rem}
.term__close:hover{color:var(--alert)}
.term__out{flex:1;overflow-y:auto;padding:.7rem .8rem;white-space:pre-wrap;overflow-wrap:anywhere;color:var(--ink2);margin:0}
.term__out b{color:var(--ink);font-weight:600}
.term__out .ok{color:var(--led)}
.term__out .er{color:var(--alert)}
.term__out .hl{color:var(--sig)}
.term__line{display:flex;align-items:center;gap:.5rem;padding:.5rem .8rem;border-top:1px solid var(--line)}
.term__ps{color:var(--sig);flex:none}
.term__in{flex:1;background:none;border:none;color:var(--ink);font:inherit;padding:0}
.term__in:focus{outline:none}
.term__hint{font-family:var(--mono);font-size:.7rem;color:var(--ink3);opacity:.75}
.term__hint kbd{border:1px solid var(--line);padding:0 .25rem;border-radius:2px}
