/* ── шрифты ──
   Держим у себя, а не на Google Fonts: там гарнитура разрезана на подмножества,
   и символ рубля лежит отдельным файлом (latin-ext). Если браузер его не
   подтянул — ₽ рисуется системным шрифтом и выбивается из строки; так и было
   у клиента на Android (Артём, 23.09). Здесь всё в одном файле: латиница,
   кириллица, ₽, №, м², стрелки. Пересобрать — scripts/build-fonts.py */
@font-face{font-family:'Onest';font-style:normal;font-weight:300;font-display:swap;src:url('../fonts/onest-300.woff2') format('woff2')}
@font-face{font-family:'Onest';font-style:normal;font-weight:400;font-display:swap;src:url('../fonts/onest-400.woff2') format('woff2')}
@font-face{font-family:'Onest';font-style:normal;font-weight:500;font-display:swap;src:url('../fonts/onest-500.woff2') format('woff2')}
@font-face{font-family:'Onest';font-style:normal;font-weight:600;font-display:swap;src:url('../fonts/onest-600.woff2') format('woff2')}
@font-face{font-family:'Manrope';font-style:normal;font-weight:300;font-display:swap;src:url('../fonts/manrope-300.woff2') format('woff2')}
@font-face{font-family:'Manrope';font-style:normal;font-weight:400;font-display:swap;src:url('../fonts/manrope-400.woff2') format('woff2')}
@font-face{font-family:'Manrope';font-style:normal;font-weight:500;font-display:swap;src:url('../fonts/manrope-500.woff2') format('woff2')}

/* ==================== CSS ПЕРЕМЕННЫЕ ====================
   ГК «МЕТРЫ» — концепт
   Палитра из брендбука: графит #101010, тёмно-коричневый #251B12,
   терракота #75412B, серый #A2A4A1, светло-серый #F1F1F1
   ───────────────────────────────────────────────────────── */

:root{
  --ink:#0B0B0B;
  --graphite:#101010;
  --brown:#251B12;
  --terra:#75412B;        /* базовая терракота брендбука (rgb 117/65/43) — заливки кнопок и плашек */
  /* Текстовый вариант рыжего: тот же тон (hue 18°), светлее ровно настолько, чтобы читаться
     на графите (контраст 4,6). Прежний #C08152 был желтее и бледнее — Анастасия, чат 22.09:
     «сейчас будто бы чуть тусклее». Чистый #75412B на тёмном фоне не читается. */
  --terra-lit:#B36542;
  --card:#151515;          /* подложка карточек на странице: чуть светлее фона */
  --grey:#A2A4A1;
  --light:#F1F1F1;

  --line:rgba(241,241,241,.14);
  --line-soft:rgba(241,241,241,.07);

  --bar:56px;
  --pad:clamp(16px,2.2vw,34px);
  /* ── вертикальный ритм ──
     Один отступ сверху и снизу у всех блоков: раньше соседние секции
     стояли с 160 / 112 / 116 / 140 px, и сайт «дышал» неровно. */
  --sec-pt:clamp(64px,7.6vw,130px);
  --sec-pb:clamp(56px,6.6vw,112px);
  /* Один кегль для всех заголовков секций: они стояли от 45 до 69 px,
     и блоки читались как разные по важности без причины. */
  --h2:clamp(28px,3.7vw,60px);
  --h2-lh:1.05;

  --e:cubic-bezier(.22,1,.36,1);

  /* ── семантические токены ──
     Всё оформление ссылается на них, а не на цвета напрямую: фон, текст,
     линии и подложки задаются здесь и нигде больше. Значения совпадают
     с исходными — вид сайта от этого не изменился. */
  --bg:var(--ink);
  --fg:var(--light);
  --muted:var(--grey);
  --hair:var(--line);
  --hair-soft:var(--line-soft);
  --surface:rgba(255,255,255,.035);
  --surface-2:rgba(255,255,255,.06);
  --accent:var(--terra-lit);
}

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

/* ── полоса прокрутки ────────────────────────────────────
   Своя вместо системной: тонкая линия без стрелок и рамок.
   Firefox понимает только пару свойств — там она просто тонкая. */
/* Стандартное scrollbar-width задаём ТОЛЬКО там, где нет webkit-правил:
   в Chromium оно перебивает ::-webkit-scrollbar и возвращает системный
   скруглённый ползунок. Здесь всё построено на прямых углах. */
@supports not selector(::-webkit-scrollbar){
  html{scrollbar-width:thin;scrollbar-color:rgba(241,241,241,.22) transparent}
}
::-webkit-scrollbar{width:6px;height:6px}
::-webkit-scrollbar-track{background:rgba(241,241,241,.05);border-radius:0}
::-webkit-scrollbar-thumb{
  background:rgba(241,241,241,.24);
  border-radius:0;
  border:0;
  transition:background .3s var(--e);
}
::-webkit-scrollbar-thumb:hover{background:var(--accent)}
::-webkit-scrollbar-button{display:none;width:0;height:0}
::-webkit-scrollbar-corner{background:transparent}

/* Со включённым Lenis нативная плавность мешает: две анимации
   на одном скролле дают рывки */
html{
  scroll-behavior:auto;
  /* Место под полосу прокрутки держим всегда. Иначе прелоадер и меню,
     которые ставят overflow:hidden, убирают полосу — и вся страница
     дёргается вбок в момент открытия и закрытия. */
  scrollbar-gutter:stable;
}
/* Safari 27 (iOS 27) включил якорение прокрутки: когда что-то над экраном меняет
   высоту (подгрузка кадров, пересчёт сцен), он сам сдвигает прокрутку — на
   закреплённых сценах это толчки. Сцены держат положение сами (01.10.2026). */
html,body{overflow-anchor:none}

body{
  margin:0;
  background:var(--bg);
  color:var(--fg);
  font-family:"Manrope",system-ui,sans-serif;
  font-weight:300;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}

h1,h2,h3,.wordmark,.switch__item,.panel__num,.figure strong{
  font-family:"Onest",system-ui,sans-serif;
  font-weight:400;
  letter-spacing:-.02em;
}

/* Яндекс.Браузер вешает на изображения свою панель («умная камера»,
   «смотреть»). Она цепляется к самому <img>, поэтому события у картинок
   выключены, а сверху лежит прозрачный слой — наводиться не на что.
   Кликов по фото у нас нет, ссылки лежат отдельными элементами. */
/* <picture> прозрачна для раскладки: у контейнеров остаются те же
   прямые потомки-картинки, и старые правила вида .cat__img img работают
   без изменений. Сама обёртка нужна только ради WebP-источника. */
picture{display:contents}
/* При display:contents детьми контейнера становятся и <source> тоже:
   в гибких раскладках он занимал позицию и добавлял лишний зазор
   перед картинкой. На выбор источника это правило не влияет —
   браузер разбирает <source> до отрисовки. */
picture source{display:none}
img{display:block;width:100%;height:100%;object-fit:cover;pointer-events:none}
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
a{color:inherit;text-decoration:none}

/* Системная синяя рамка фокуса выбивается из палитры: убираем её
   при клике мышью, но оставляем клавиатуре — своей, терракотовой. */
:focus{outline:0}
:focus-visible{outline:1px solid var(--accent);outline-offset:3px}

/* ── живые координаты курсора ──────────────────────────── */
.coords{
  font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;
  color:var(--accent);
  font-variant-numeric:tabular-nums;
  pointer-events:none;
}

/* ── шапка ── 6 равных колонок, границы падают на 1/3 и 2/3 ── */
.bar{
  position:fixed;inset:0 0 auto;z-index:50;
  display:grid;grid-template-columns:repeat(6,1fr);
  height:var(--bar);
  background:rgba(11,11,11,.92);
  backdrop-filter:blur(18px) saturate(140%);
  border-bottom:1px solid var(--hair);
}
.bar__cell{
  display:flex;align-items:center;gap:10px;
  padding:0 var(--pad);
  border-right:1px solid var(--hair);
  transition:color .35s var(--e),background .35s var(--e);
  font-size:13px;letter-spacing:.01em;
  color:rgba(241,241,241,.72);
}
.bar__cell:hover{color:var(--fg);background:rgba(241,241,241,.04)}
.bar__cell--brand{gap:12px}
.bar__cell--action{
  justify-content:space-between;border-right:0;
  color:var(--fg);
}
.bar__cell--action:hover{background:none}
.bar__phone{
  font-family:"Onest",sans-serif;
  font-size:clamp(11.5px,.95vw,14px);letter-spacing:.01em;
  white-space:nowrap;
  transition:color .3s var(--e);
}
.bar__phone:hover{color:var(--accent)}

/* бургер */
.burger{
  display:flex;flex-direction:column;justify-content:center;gap:4px;
  width:26px;height:26px;flex:none;
}
.burger span{
  display:block;height:1px;background:var(--light);
  transition:transform .45s var(--e),opacity .3s var(--e),width .45s var(--e);
}
.burger span:nth-child(1){width:100%}
.burger span:nth-child(2){width:70%}
.burger span:nth-child(3){width:100%}
.burger:hover span:nth-child(2){width:100%}
body._menu-open .burger span:nth-child(1){transform:translateY(5px) rotate(45deg)}
body._menu-open .burger span:nth-child(2){opacity:0}
body._menu-open .burger span:nth-child(3){transform:translateY(-5px) rotate(-45deg);width:100%}

/* ── полное меню ───────────────────────────────────────── */
.menu{
  position:fixed;inset:var(--bar) 0 auto;z-index:45;
  background:var(--graphite);
  border-bottom:1px solid var(--hair);
  padding:clamp(30px,4vw,58px) 0 0;
  transform:translateY(-101%);
  visibility:hidden;
  transition:transform .72s var(--e),visibility .72s;
  max-height:calc(100svh - var(--bar));
  /* Список длиннее экрана: он прокручивается сам. Атрибут
     data-lenis-prevent в разметке говорит плавному скроллу не
     перехватывать здесь колесо и касания, иначе панель стоит колом.
     overscroll-behavior не даёт прокрутке «протечь» на страницу. */
  overflow-y:auto;overscroll-behavior:contain;
  -webkit-overflow-scrolling:touch;
}
body._menu-open{overflow:hidden}
body._menu-open .menu{transform:translateY(0);visibility:visible}

/* затемнение под меню — панель читается как слой, а не как кусок страницы */
.scrim{
  position:fixed;inset:var(--bar) 0 0;z-index:44;
  background:rgba(6,6,6,.62);backdrop-filter:blur(2px);
  opacity:0;visibility:hidden;
  transition:opacity .5s var(--e),visibility .5s;
}
body._menu-open .scrim{opacity:1;visibility:visible}

.menu__grid{
  display:grid;grid-template-columns:repeat(5,1fr);
  gap:1px;background:var(--hair-soft);
  border-top:1px solid var(--hair-soft);
}
.menu__col{
  display:flex;flex-direction:column;
  padding:18px var(--pad) 22px;
  background:var(--graphite);
}
.menu__head{
  margin:0 0 12px;
  font-size:10px;letter-spacing:.16em;text-transform:uppercase;
  color:var(--accent);
}
.menu__col a{
  position:relative;
  padding:7px 0;
  font-size:14px;line-height:1.35;color:rgba(241,241,241,.74);
  transition:color .3s var(--e),padding-left .4s var(--e);
}
/* сдвиг полем, а не transform: transform занят появлением строк */
.menu__col a:hover{color:var(--fg);padding-left:6px}

/* колонка контактов — только для двухколоночной раскладки, см. media.css */
.menu__col--contacts{display:none}
.menu__col-phone{
  font-family:"Onest",sans-serif;font-size:clamp(17px,4.6vw,21px);
  color:var(--fg);padding-bottom:2px;
}

/* Строки меню приходят по очереди снизу — задержку --d ставит main.js
   по порядку, поэтому список читается как разворачивающийся, а не как
   мгновенно возникший экран. */
.menu__head,.menu__col a,.office,.menu__legal a,.menu__foot > *{
  opacity:0;transform:translateY(12px);
  transition:opacity .5s var(--e) var(--d,0s),
             transform .6s var(--e) var(--d,0s),
             color .3s var(--e),padding-left .4s var(--e);
}
body._menu-open .menu__head,
body._menu-open .menu__col a,
body._menu-open .office,
body._menu-open .menu__legal a,
body._menu-open .menu__foot > *{opacity:1;transform:none}

.menu__offices{
  display:grid;grid-template-columns:repeat(2,1fr);
  border-top:1px solid var(--hair);
}
/* разделитель — рамка у второй плитки. Раньше он рисовался фоном
   контейнера через gap:1px, и пока плитки проявлялись (они приходят
   с задержкой), под ними светился серый прямоугольник. */
.office{padding:18px var(--pad) 20px;background:var(--graphite)}
.office + .office{border-left:1px solid var(--hair-soft)}
.office__city{
  display:block;margin-bottom:9px;
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
}
.office p{margin:0 0 6px;font-size:13.5px;line-height:1.4;color:rgba(241,241,241,.8)}
.office a{
  display:inline-block;margin-bottom:7px;
  font-family:"Onest",sans-serif;font-size:15px;
  transition:color .3s var(--e);
}
.office a:hover{color:var(--accent)}
/* Часы работы — мелкой строкой под телефоном, как в подвале. Правило
   потерялось при разведении классов меню и карточки офиса продаж,
   и режим набирался кеглем телефона. */
.office__hours{display:block;font-size:11.5px;line-height:1.4;color:var(--muted)}

/* Общая почта стоит рядом с номером — и в меню, и в подвале. Раньше
   она была только у московского офиса вместо телефона, и при переходе
   на единый номер пропала со всего сайта. */
.menu__mail,.foot__mail{
  font-size:13px;color:var(--muted);
  border-bottom:1px solid var(--hair);padding-bottom:2px;
  transition:color .3s var(--e),border-color .3s var(--e);
}
.menu__mail:hover,.foot__mail:hover{color:var(--fg);border-color:var(--accent)}
.sales__hours{display:block;font-size:11.5px;color:var(--muted)}

.menu__foot{
  display:flex;align-items:center;flex-wrap:wrap;gap:18px clamp(20px,3vw,44px);
  padding:22px var(--pad) 26px;
  border-top:1px solid var(--hair);
}
.menu__phone{font-family:"Onest",sans-serif;font-size:clamp(18px,1.7vw,24px)}
.menu__cta{
  display:inline-flex;align-items:center;gap:8px;
  padding:10px 18px;border:1px solid var(--hair);
  font-size:13px;
  transition:background .35s var(--e),color .35s var(--e),border-color .35s var(--e);
}
.menu__cta i{font-style:normal;color:var(--accent)}
.menu__cta:hover{background:var(--light);color:var(--ink);border-color:var(--fg)}
.menu__cta:hover i{color:var(--ink)}
.menu__soc{display:flex;gap:16px;margin-left:auto;flex-wrap:wrap}
.menu__soc a{font-size:12px;color:var(--muted);transition:color .3s var(--e)}
.menu__soc a:hover{color:var(--fg)}

.logo{
  width:auto;height:clamp(14px,1.15vw,18px);
  object-fit:contain;
  opacity:.95;
  transition:opacity .35s var(--e);
}
.bar__cell--brand:hover .logo{opacity:1}

/* ══ HERO ══════════════════════════════════════════════ */
.hero{
  /* Приём с pioneer.ru: следующий блок наезжает поверх первого экрана, но сам
     первый экран не стоит колом — он уезжает вверх втрое медленнее страницы.
     Закрепление даёт скорость 0, а transform добавляет свою треть: разница
     ходов и читается как параллакс. Скролл нативный, перехвата нет. */
  position:sticky;top:0;z-index:0;
  transform:translate3d(0,calc(var(--leave,0) * -34svh),0);
  will-change:transform;
  min-height:100svh;
  padding:calc(var(--bar) + 1px) 0 0;
  display:flex;flex-direction:column;
  overflow:hidden;
}

.hero__stage{position:absolute;inset:0;z-index:0}
.hero__stage::after{content:"";position:absolute;inset:0;z-index:1;pointer-events:none}
.shot{
  position:absolute;inset:0;margin:0;
  opacity:0;
  transition:opacity 1.1s var(--e);
  will-change:opacity,transform;
}
/* медленное дыхание кадра — бесконечное, стартует сразу при загрузке */
.shot._is-active{opacity:1;animation:kenburns 26s ease-in-out infinite alternate}
@keyframes kenburns{
  from{transform:scale(1)    translate3d(0,0,0)}
  to  {transform:scale(1.16) translate3d(-1.8%,-1.4%,0)}
}
.shot img{filter:grayscale(.45) contrast(1.06) brightness(.62)}

/* WebGL-слой первого экрана. Пока текстуры не загрузились, в кадре обычные
   .shot — подмена происходит одним переключением класса, без мигания. */
.hero__canvas{
  position:absolute;inset:0;
  width:100%;height:100%;
  display:block;
  opacity:0;transition:opacity .5s var(--e);
}
.hero__stage._is-gl .hero__canvas{opacity:1}
/* картинки остаются в разметке: из них модуль берёт пути, они же запасной
   вариант без WebGL. Поверх холста они не нужны. */
.hero__stage._is-gl .shot{opacity:0;animation:none}

/* по мере наезда первый экран уходит в тень — иначе он «просвечивает»
   сквозь край следующего блока и кажется, что страница дрожит */
.hero__dim{
  position:absolute;inset:0;z-index:3;pointer-events:none;
  background:var(--bg);
  opacity:calc(var(--leave,0) * .45);
}

/* ── линейка прокрутки ──
   Правый край страницы: шкала с делениями и бегунок, который считает
   пройденное в метрах. Полоса тонкая и не перехватывает клики. */
.ruler{
  position:fixed;right:0;top:0;bottom:0;z-index:40;
  width:56px;pointer-events:none;
  opacity:0;transition:opacity .6s var(--e);
}
.ruler._is-on{opacity:.85}
/* сама шкала — повторяющийся градиент: мелкое деление каждые 12px,
   крупное каждые 60px. Рисовать сотни элементов ради этого незачем. */
.ruler__scale{
  position:absolute;right:0;top:0;bottom:0;width:14px;
  background:
    repeating-linear-gradient(to bottom,
      rgba(241,241,241,.2) 0 1px, transparent 1px 12px),
    repeating-linear-gradient(to bottom,
      rgba(241,241,241,.34) 0 1px, transparent 1px 60px);
  background-size:6px 12px, 14px 60px;
  background-repeat:repeat-y;
  background-position:right top, right top;
}
.ruler__mark{
  position:absolute;right:0;top:0;
  display:flex;align-items:center;gap:8px;
  transform:translateY(-50%);
  transition:top .1s linear;
}
.ruler__mark::after{
  content:"";width:20px;height:1px;background:rgba(179,101,66,.85);
}
.ruler__mark span{
  font-family:"Onest",sans-serif;font-variant-numeric:tabular-nums;font-size:10px;letter-spacing:.12em;
  color:rgba(179,101,66,.9);white-space:nowrap;
}

.hero__veil{
  position:absolute;inset:0;
  /* Затемнение ровное по всему кадру: градиент к низу выдавал сам себя
     полосой под заголовком. Читаемость текста теперь держат не вуаль,
     а тени у самих надписей — см. .hero__title и .switch__item. */
  background:rgba(11,11,11,.20);
}

/* три слова-переключателя ── ровно 3 равные колонки,
   их границы совпадают с границами ячеек шапки */
.switch{
  position:relative;z-index:2;
  display:grid;grid-template-columns:repeat(3,1fr);
  border-bottom:1px solid var(--hair);
}
.switch__item{
  min-width:0;
  position:relative;
  text-shadow:0 1px 18px rgba(11,11,11,.8);
  display:flex;align-items:center;
  min-height:clamp(50px,4vw,64px);
  padding:clamp(13px,1.3vw,19px) var(--pad);
  text-align:left;
  /* кегль сбавлен: на широком экране слова спорили с заголовком героя */
  font-size:clamp(15px,1.35vw,20px);
  line-height:1.05;
  letter-spacing:-.015em;
  white-space:nowrap;
  color:rgba(241,241,241,.5);
  border-right:1px solid var(--hair);
  transition:color .5s var(--e),background .5s var(--e);
}
.switch__item:last-child{border-right:0}
/* На телефоне три полных названия в строку не встают — там работают
   короткие подписи в одно слово, подмена идёт в media.css. */
.switch__short{display:none}
/* полоса-прогресс: заполняется за --dur, по заполнении экран меняется */
.switch__item::after{
  content:"";position:absolute;left:0;bottom:-1px;
  width:100%;height:2px;background:var(--accent);
  transform:scaleX(0);transform-origin:left;
}
.switch__item:hover{color:rgba(241,241,241,.8)}
.switch__item._is-active{color:var(--fg)}
.switch__item._is-active::after{
  animation:fill var(--dur,5s) linear forwards;
}
.switch._is-paused .switch__item._is-active::after{animation-play-state:paused}
@keyframes fill{from{transform:scaleX(0)}to{transform:scaleX(1)}}

/* низ героя */
.hero__foot{
  position:relative;z-index:2;
  isolation:isolate;
  margin-top:auto;
  /* minmax(0,1fr) обязателен: с обычным 1fr длинный заголовок не даёт
     колонке сжаться и выталкивает панели за край экрана */
  display:grid;grid-template-columns:minmax(0,1fr) auto;
  align-items:end;gap:clamp(20px,3vw,44px);
  padding:0 var(--pad) clamp(52px,6vw,84px);
}

.hero__title{
  margin:0;
  /* Строки прижаты к низу: заголовок держит высоту самого длинного
     варианта (её считает main.js), и при переключении слайдов нижняя
     строка у всех остаётся на одной линии — расстояние до панелей
     с цифрами не меняется. Свободное место уходит вверх, в кадр. */
  display:flex;flex-direction:column;justify-content:flex-end;
  font-size:clamp(30px,4.3vw,74px);
  line-height:1.0;
  font-weight:300;
  /* nowrap убран: на длинной фразе он ломал сетку. Переносы задаём
     сами разбивкой на строки в разметке */
  /* вуаль теперь ровная, без плотного низа — читаемость держит сама надпись */
  text-shadow:0 2px 28px rgba(11,11,11,.85), 0 1px 4px rgba(11,11,11,.6);
}
.hero__title{position:relative;overflow:hidden}
/* Заголовок слайда едет одним блоком, а не построчно: при построчном
   перекате высоту в потоке задавал ещё старый текст, и в момент
   подстановки строки съезжали. Уходящий набор становится абсолютным
   и на высоту не влияет, поэтому геометрия не меняется вовсе. */
.hero__set{
  display:flex;flex-direction:column;width:100%;
  transition:transform .9s var(--e),opacity .9s var(--e);
}
.hero__set > span{display:block;overflow:hidden}
.hero__set > span > *{display:block}
.hero__set--enter{transform:translateY(104%);opacity:0}
.hero__set--leave{
  position:absolute;left:0;bottom:0;
  transform:translateY(-104%);opacity:0;
}

/* карточки-панели */
/* Мягкое пятно под нижним блоком: без плашки строки терялись на светлых
   участках кадра. Границ у него нет — это размытая тень, а не подложка,
   поэтому оно не спорит с линиями и не читается как элемент. */
.hero__foot::before{
  content:"";position:absolute;z-index:-1;
  left:calc(var(--pad) * -1);right:calc(var(--pad) * -1);
  top:-8%;bottom:-40%;
  background:radial-gradient(120% 100% at 30% 85%,
    rgba(8,8,8,.78) 0%, rgba(8,8,8,.54) 38%, rgba(8,8,8,.22) 64%, transparent 82%);
  pointer-events:none;
}

/* Панели держатся на линиях, как второй и третий экраны: никаких плашек
   и заливок. Плашка с размытием выбивалась из общего языка страницы —
   там всё построено на тонких разделителях по чёрному. */
.panels{display:flex;border-top:1px solid var(--hair)}
.panel{
  width:clamp(196px,19vw,300px);
  padding:18px 20px 20px;
  border-left:1px solid var(--hair);
  display:flex;flex-direction:column;gap:10px;
  transition:background .5s var(--e);
}
/* на наведении ячейка, наоборот, уходит в глубокий чёрный: так строки
   читаются гарантированно, а панель отделяется от кадра без плашки */
.panel:hover{background:rgba(6,6,6,.86)}
/* блик, пробегающий по панели в момент смены */
.panel--stat,.panel--yield{position:relative;overflow:hidden}
/* Блик по панели при переключении убран: на цифрах, которые и так
   перекатываются строками, пролетающий градиент читался как засветка
   экрана. Разметку и класс оставляем — вернуть можно одним правилом. */
.panel--stat > *{position:relative;z-index:2}

/* перекат строк.
   width:100% обязателен — иначе контейнер сжимается по старому тексту
   и новый («7» → «14») режется маской */
.roll{display:block;position:relative;overflow:hidden;width:100%}
.roll__line{
  display:block;width:100%;
  transition:transform .62s var(--e),opacity .46s var(--e);
}
.roll__line--out.is-gone{transform:translateY(-115%);opacity:0}
.roll__line--in{
  position:absolute;left:0;top:0;width:100%;
  transform:translateY(115%);opacity:0;
}
.roll__line--in.is-here{transform:translateY(0);opacity:1}

/* в строке координат контейнеры не тянутся по ширине родителя */
.hero__geo .roll{width:auto;white-space:nowrap}
.hero__geo .roll__line{width:auto;white-space:nowrap}

.panel header{display:flex;justify-content:space-between;align-items:center}
.panel header i{font-style:normal;color:var(--muted);font-size:13px}
/* подписи, цифры и сноски набраны как в строке данных второго экрана:
   один кегль, один трекинг, одна гарнитура — блоки перекликаются */
.panel__label{font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
/* подложки больше нет — читаемость держат тени самих строк */
.panel{text-shadow:0 1px 14px rgba(8,8,8,.9), 0 1px 3px rgba(8,8,8,.7)}
.panel__num{
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(42px,5vw,72px);line-height:.94;
  letter-spacing:-.065em;word-spacing:-.12em;
  /* Перед ₽ стоит тонкий пробел U+2009. Обычный этот word-spacing
     съедает в минус (-3 px) и знак липнет к слову, узкий неразрывный
     U+202F даёт +4 px и зияет; тонкий — +1 px, замерено на кегле 34 px. */
  font-variant-numeric:tabular-nums;
  /* pre, а не nowrap: при nowrap браузер схлопывает подряд идущие пробелы,
     и точную величину зазора перед ₽ не набрать */
  white-space:pre;
}
/* колонки панели не должны раздуваться от длинного содержимого */
.panel{min-width:0}
.panel__num{max-width:100%;overflow:hidden;text-overflow:ellipsis}
/* Значения всех разделов короткие по построению («29%», «42 м²»,
   «2027»), поэтому кегль один на всех — см. sectionStats в data.js. */
/* Подпись держит высоту одной строки: тексты приходят из модели и
   бывают разной длины, а при переключении разделов панель не должна
   менять высоту — иначе прыгают карточки под первым экраном. */
.panel__sub{
  margin:0;font-size:clamp(12px,1vw,15px);line-height:1.45;color:var(--muted);
  /* Держим две строки под подпись, но перенос разрешён: nowrap на узком
     экране распирал колонку, и первый экран уезжал за край вьюпорта. */
  min-height:2.9em;
}

/* цена — строкой под цифрой, фирменным цветом.
   margin-top уравнивает отступ «лейбл → цифра» с отступом
   «лейбл → Санкт-Петербург» в соседней панели */
.stat{
  display:flex;flex-direction:column;align-items:stretch;gap:9px;flex:1;
  margin-top:16px;
}
/* кегль тот же, что у подписей городов на карте */
.stat__price{
  font-size:clamp(12px,1vw,15px);line-height:1;
  color:var(--accent);letter-spacing:.02em;
  white-space:nowrap;
}

/* панель «География» — две точки, соединённые фирменным пунктиром */
/* нижняя строка первого экрана */
.hero__bottom{
  position:absolute;left:0;right:0;bottom:18px;z-index:2;
  display:flex;align-items:center;justify-content:space-between;gap:20px;
  padding:0 var(--pad);
}

/* Координаты объекта в кадре. Ширина строки задана, координаты прижаты
   к её правому краю: раньше их держал запас min-width у адреса, и на
   длинном адресе разделительная линия уезжала вправо — при смене
   слайда она прыгала вместе с текстом. */
.hero__geo{
  display:flex;align-items:center;gap:10px;
  width:min(100%,430px);
  font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;
  color:var(--muted);
  font-variant-numeric:tabular-nums;
}
.hero__geo-dot{
  position:relative;width:5px;height:5px;flex:none;
  background:var(--accent);border-radius:50%;
}
.hero__geo-dot::after{
  content:"";position:absolute;inset:-5px;
  border:1px solid var(--accent);border-radius:50%;
  animation:ping 3.4s var(--e) infinite;
}
.hero__geo-addr{color:rgba(241,241,241,.86);flex:none}
.hero__geo-num{
  --pad-l:10px;
  margin-left:auto;flex:none;
  padding-left:var(--pad-l);border-left:1px solid var(--hair);
}
/* Приезжающая строка позиционируется абсолютно, а её точка отсчёта —
   padding box: без этого новые координаты на время переката вставали
   вплотную к линии и после анимации отскакивали на свои 10px. */
.hero__geo-num .roll__line--in{left:var(--pad-l)}
.hero__geo-addr,.hero__geo-num{transition:opacity .25s var(--e)}

/* ══ МАНИФЕСТ ══════════════════════════════════════════ */
.eyebrow{
  margin:0 0 clamp(20px,2.6vw,34px);
  font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--accent);
}

/* всё, что идёт после первого экрана, едет поверх него своим фоном */
.manifest,.catalog,.foot{position:relative;z-index:1;background:var(--bg)}

/* ══ ЭКРАН 2 — МАНИФЕСТ ═══════════════════════════════════════════════════
   Композиция по мотивам 250broadway: подпись мелким кеглем стоит НАД
   крупным значением, ячейки разделены вертикальными линиями, первая
   ячейка держит весь блок, остальные ей подчинены. Фотографий нет —
   работает только типографика.
════════════════════════════════════════════════════════════════════════ */
.manifest{
  position:relative;z-index:1;background:var(--bg);
  padding:var(--sec-pt) var(--pad) var(--sec-pb);
  border-top:1px solid var(--hair);
  overflow:hidden;
  scroll-margin-top:var(--bar);
}

/* появление из-под маски: строка выезжает снизу, край режется контейнером */
.mask{display:block;overflow:hidden}
.mask > span{
  display:block;
  transform:translateY(105%);
  transition:transform 1s var(--e) var(--d,0s);
}
._is-in .mask > span,.mask._is-in > span{transform:none}

.manifest__head{max-width:min(1180px,92vw)}
.say{
  margin:clamp(20px,2.4vw,36px) 0 0;
  font-weight:300;
  font-size:var(--h2);
  line-height:var(--h2-lh);letter-spacing:-.03em;
}
.say em{font-style:normal;color:var(--muted)}

/* ── строка данных ── */
.dataline{
  display:grid;
  /* первая колонка ведущая — она держит блок, как «648,000 sf» у 250broadway */
  grid-template-columns:1.55fr 1fr 1fr;
  margin:clamp(56px,7vw,120px) 0 clamp(40px,5vw,80px);
  border-top:1px solid var(--hair);
}
.cell{
  /* меряем кегль значения от ширины самой колонки: по vw он либо мельчит
     на широких экранах, либо не влезает на узких */
  container-type:inline-size;
  padding:clamp(18px,2vw,30px) clamp(12px,1.2vw,22px) clamp(28px,3.4vw,54px);
  border-left:1px solid var(--hair);
  min-width:0;
}
.cell:first-child{border-left:0;padding-left:0}
.cell__label{
  margin:0 0 clamp(14px,1.8vw,26px);
  font-size:11px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--muted);
}
.cell__val{
  display:block;
  font-family:"Onest",sans-serif;font-weight:300;
  /* стартовый кегль; точную величину подбирает manifest.js замером строки */
  font-size:clamp(34px,6vw,120px);line-height:.92;
  /* плотный трекинг: строка становится уже, и подгонка оставляет
     цифре больший кегль в той же колонке. Пробел ужимаем отдельно —
     в «с 2018» и «>50 тыс м²» он на таком кегле зияет дырой */
  letter-spacing:-.065em;word-spacing:-.12em;
  font-variant-numeric:tabular-nums;
  white-space:nowrap;
}
/* Табличные цифры нужны только там, где идёт отсчёт: они держат ширину,
   пока значение меняется. В остальных ячейках «1» занимает место нуля,
   и вокруг единицы зияют дыры — там цифры пропорциональные. */
.cell__val:not([data-count]){font-variant-numeric:proportional-nums}
/* Кегль привязан к ширине колонки, но у каждой ячейки свой коэффициент:
   строки разной длины при одном кегле занимают разное место. Значения
   подобраны по числу знаков — «с 2018» короткая, «>50 тыс м²» самая
   длинная. manifest.js потом дотачивает результат замером, но и без
   него блок выглядит верно. */
@supports (container-type:inline-size){
  .cell__val{font-size:clamp(30px,17cqw,150px)}
  .cell:nth-child(1) .cell__val{font-size:clamp(34px,26cqw,190px)}
  .cell:nth-child(2) .cell__val{font-size:clamp(28px,15cqw,104px)}
  .cell:nth-child(3) .cell__val{font-size:clamp(28px,17cqw,116px)}
}

/* Подпись кадра — одинаковая на всех вкладках: заголовок и пояснение под ним.
   Раньше у планов был Onest 16px, а у фото дома — 11px серым одной строкой,
   и вкладки выглядели как с разных сайтов (Артём, 23.09).
   Цифры в заголовке плана — тот же data-field, что и в плитке, поэтому после
   уточнения обмеров они не разойдутся. */
.lot__view figcaption b{
  display:block;font-weight:400;color:var(--fg);
  font-family:"Onest",sans-serif;font-size:clamp(13px,1.1vw,16px);
  letter-spacing:-.01em;margin-bottom:3px;
}
.lot__view figcaption span{display:block}

/* Вторая площадь под крупной цифрой: клиент (21.09) просит показывать
   рядом с общей ещё и «жилая + санузел». МОП сознательно не показываем —
   на её схеме он зачёркнут. */
.cell__sub{
  margin:clamp(10px,1.2vw,16px) 0 0;
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(15px,1.5vw,22px);line-height:1.15;
  letter-spacing:-.02em;color:var(--fg);
}
.cell__sub i{
  display:block;font-style:normal;
  font-family:"Manrope",sans-serif;font-weight:400;
  font-size:11px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--muted);margin-bottom:4px;
}

.cell__note{
  margin:clamp(12px,1.4vw,20px) 0 0;
  font-size:clamp(12px,1vw,15px);line-height:1.45;color:var(--muted);
  max-width:26ch;
}

/* ── нижняя строка ── */
.manifest__foot{
  display:grid;grid-template-columns:minmax(0,1fr) auto;
  gap:clamp(24px,4vw,80px);align-items:end;
  padding-bottom:clamp(50px,7vw,110px);
}
/* Лид-абзац под заголовком стоял вплотную к нему: у футера манифеста нет
   верхнего отступа, а заголовок свой отступ отдаёт только сверху. Клиент
   21.09 просил такой же воздух, как в блоках с шагами. Отступ вешаем только
   на футер с текстом — там, где внутри цифры, компоновка плотная нарочно. */
.manifest__foot:has(.lede){margin-top:clamp(28px,3.4vw,64px)}
.lede{
  margin:0;max-width:64ch;
  font-size:clamp(14px,1.25vw,19px);line-height:1.62;color:var(--muted);
}
/* слова проявляются по очереди — текст будто набирается */
.lede i{
  font-style:normal;display:inline-block;
  opacity:0;transform:translateY(.5em);
  transition:opacity .5s var(--e) var(--d,0s),transform .5s var(--e) var(--d,0s);
}
.lede._is-in i{opacity:1;transform:none}

.credo{
  margin:0;text-align:right;white-space:nowrap;
  font-family:"Onest",sans-serif;
  font-size:clamp(13px,1.15vw,18px);color:var(--accent);
}


/* ── общие для шапки портфеля: заголовок, разделы, ссылка ── */
.say--sm{
  margin:clamp(16px,1.8vw,26px) 0 0;
  font-size:var(--h2);
}
.pside{
  padding-left:clamp(16px,2.4vw,40px);
  border-left:1px solid var(--hair);
}
.tabs{display:flex;flex-direction:column;border-top:1px solid var(--hair)}
.tab{
  display:flex;align-items:baseline;gap:12px;
  padding:clamp(9px,1vw,14px) 0;
  border-bottom:1px solid var(--hair);
  text-align:left;
  font-size:clamp(13px,1.1vw,17px);
  color:rgba(241,241,241,.6);
  transition:color .35s var(--e),padding-left .45s var(--e);
}
.tab:hover,.tab._is-active{color:var(--fg);padding-left:6px}
/* активный раздел держит и номер, и свою линию — как в блоке вопросов */
.tab._is-active{border-bottom-color:var(--accent)}

.ghost{
  display:inline-flex;align-items:center;gap:8px;
  font-size:12px;letter-spacing:.06em;color:var(--muted);
  transition:color .3s var(--e);
}
.ghost i{font-style:normal;color:var(--accent)}
.ghost:hover{color:var(--fg)}

/* ══ ВАРИАНТ В — ОБВОДКИ ══════════════════════════════════════════════════
   Карточка собрана теми же средствами, что строка данных второго экрана:
   рамка и разделители вместо плашек, цена крупной цифрой. Кнопки лежат за
   нижней кромкой и выезжают на наведении, поэтому в покое лента выглядит
   каталогом, а не витриной с призывами.
════════════════════════════════════════════════════════════════════════ */
.catalog{
  position:relative;z-index:1;background:var(--bg);
  padding:var(--sec-pt) 0 var(--sec-pb);
  border-top:1px solid var(--hair);
}
.catalog__top{
  display:grid;grid-template-columns:1.5fr 1fr;
  gap:clamp(24px,4vw,70px);
  padding:0 var(--pad) clamp(34px,4.5vw,66px);
  align-items:end;
}
/* Подзаголовок портфеля набран как вводный абзац второго экрана:
   один кегль, один цвет, одна мера строки — блоки перекликаются. */
.ptitle__note{
  margin:clamp(16px,2vw,26px) 0 0;max-width:64ch;
  font-size:clamp(14px,1.25vw,19px);line-height:1.62;color:var(--muted);
}

/* ссылка на карту ушла из списка разделов — ей там было не место */
.ghost--map{margin-top:clamp(20px,2.4vw,34px)}

/* контейнер прижимаем к содержимому: растянутый на всю колонку он давал
   серую полосу справа от стрелок */
.arrows{display:inline-flex;gap:0;margin-top:clamp(16px,2vw,28px);width:fit-content}
.arrow{
  width:46px;height:40px;
  border:1px solid var(--hair);border-left:0;
  color:var(--fg);font-size:15px;line-height:1;
  transition:background .3s var(--e),color .3s var(--e),border-color .3s var(--e);
}
.arrow:first-child{border-left:1px solid var(--hair)}
.arrow:hover,.arrow:active,.arrow:focus-visible{
  background:var(--light);color:var(--ink);border-color:var(--fg);
}
/* гаснет только сама стрелка: opacity на всей кнопке делала рамку
   полупрозрачной, и пара выглядела кривой.
   Переход отключён: в момент, когда кнопка становится недоступной,
   светлый фон ещё не успевал сойти — и белая стрелка на белом фоне
   пропадала на долю секунды. */
.arrow:disabled{
  color:rgba(241,241,241,.22);
  background:transparent;border-color:var(--hair);
  pointer-events:none;transition:none;
}

.crail{overflow:hidden;padding:0 var(--pad) 10px;cursor:grab}
.crail._is-drag{cursor:grabbing}
/* stretch: карточки равны по самой высокой, полосы кнопок — на одной линии */
.crail__track{
  display:flex;align-items:stretch;
  gap:clamp(14px,1.4vw,24px);will-change:transform;
}

.cat{
  position:relative;
  width:clamp(258px,26vw,360px);flex:none;
  display:flex;flex-direction:column;
  /* Подложка вместо рамки: у STONE карточка отделена от фона плашкой,
     а не обводкой. Четыре вложенные рамки, которые были здесь раньше,
     превращали карточку в таблицу. */
  background:var(--surface);
  opacity:0;transform:translateY(20px);
  transition:opacity .7s var(--e) var(--d,0s),transform .7s var(--e) var(--d,0s),
             background .4s var(--e);
}
.cat._is-in{opacity:1;transform:none}
/* наведённая карточка поднимается над соседями: снизу из неё
   выезжает описание, и оно должно лежать поверх следующего ряда */
.cat:hover,.cat:focus-within{background:var(--surface-2);z-index:5}

/* Снимок сжимается при наведении ровно на ту высоту, которую займёт
   описание: карточка остаётся прежнего размера и ряд не расходится. */
.cat__img{
  position:relative;aspect-ratio:1/1;overflow:hidden;
  transition:aspect-ratio .45s var(--e);
}
.cat:hover .cat__img,.cat:focus-within .cat__img{aspect-ratio:5/4}
.cat__ph{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  filter:grayscale(.3) brightness(.94);
  opacity:0;transition:opacity .35s var(--e),filter .7s var(--e);
}
.cat__ph._is-on{opacity:1}
.cat:hover .cat__ph{filter:grayscale(0) brightness(1)}

/* теги поверх кадра: год постройки и город */
.cat__tags{
  position:absolute;left:10px;top:10px;z-index:2;
  display:flex;flex-wrap:wrap;gap:6px;max-width:calc(100% - 60px);
}
.tag{
  padding:5px 10px;
  background:rgba(8,8,8,.68);backdrop-filter:blur(6px);
  font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--fg);
  font-variant-numeric:tabular-nums;
}
/* Город раньше красился терракотой — на плашке поверх светлого плана и поверх
   фотографии фасада он читался хуже адреса рядом. Теперь обе плашки светлые
   и одинаковые (Артём, 23.09). */
/* сколько ещё кадров скрыто под курсором */
.cat__more{
  position:absolute;right:10px;top:10px;z-index:2;
  padding:5px 9px;
  background:rgba(8,8,8,.68);backdrop-filter:blur(6px);
  font-size:10px;letter-spacing:.06em;color:var(--muted);
}
/* полосы кадров — как в галерее «Самолёта» */
.cat__bars{
  position:absolute;left:10px;right:10px;bottom:10px;z-index:2;
  display:flex;gap:5px;
  opacity:0;transition:opacity .3s var(--e);
}
.cat__img[data-shots="1"] .cat__bars{display:none}
.cat:hover .cat__bars{opacity:1}
.cat__bars i{flex:1;height:1px;background:rgba(255,255,255,.3);transition:background .3s var(--e)}
.cat__bars i._is-on{background:var(--light)}

.cat__body{display:flex;flex-direction:column;flex:1;padding:14px 14px 16px}
.cat__body h3{
  margin:0;font-weight:400;
  font-size:clamp(16px,1.35vw,22px);line-height:1.15;letter-spacing:-.02em;
}
/* строка метро с точкой — приём из карточки STONE */
.cat__metro{
  display:flex;align-items:center;gap:7px;
  margin:9px 0 0;font-size:12px;color:var(--muted);
}
.cat__metro i{
  width:5px;height:5px;flex:none;border-radius:50%;background:var(--accent);
}
/* параметры дома плашками без обводок */
.cat__facts{
  list-style:none;margin:auto 0 0;padding:14px 0 0;
  display:flex;flex-wrap:wrap;gap:5px;
}
.cat__facts li{
  padding:5px 9px;background:var(--surface-2);
  font-size:11px;line-height:1.2;color:var(--muted);
  font-variant-numeric:tabular-nums;
}

/* Описание раскрывается под заголовком, а не под кнопками: место
   под него освобождает сам снимок, поэтому карточка не растёт
   и не наезжает на соседний ряд. */
.cat__drop{
  display:grid;grid-template-rows:0fr;
  opacity:0;
  transition:grid-template-rows .45s var(--e),opacity .3s var(--e);
}
.cat:hover .cat__drop,.cat:focus-within .cat__drop{grid-template-rows:1fr;opacity:1}
.cat__drop p{
  overflow:hidden;margin:0;
  font-size:12px;line-height:1.5;color:var(--muted);
}
.cat:hover .cat__drop p,.cat:focus-within .cat__drop p{padding-top:9px}

/* Кнопки видны всегда: в каталоге выезжающие по наведению накрывали
   карточку следующего ряда. */
.cat__act{
  position:relative;z-index:3;
  display:flex;flex:none;
  border-top:1px solid rgba(255,255,255,.09);
}
/* вся карточка — ссылка: слой поверх снимка и текста */
.cat__link{position:absolute;inset:0;z-index:2}
.cat__link span{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
.cat__act a{
  flex:1;display:flex;align-items:center;justify-content:center;gap:8px;
  padding:13px;font-size:12px;color:var(--fg);
  transition:background .3s var(--e),color .3s var(--e);
}
.cat__act a i{font-style:normal;color:var(--accent)}
.cat__act a.alt{color:var(--muted);border-left:1px solid rgba(255,255,255,.09)}
.cat__act a:hover{background:var(--terra);color:var(--light)}
.cat__act a:hover i{color:var(--ink)}


/* ==================== ОБЪЕКТ: ХОД РЕНОВАЦИИ И НОВОСТИ ====================
   Оба блока пришли из прототипа: лента этапов по месяцам и три
   карточки новостей проекта внизу страницы. */
.build{
  position:relative;z-index:1;background:var(--bg);
  padding:var(--sec-pt) var(--pad) var(--sec-pb);
  border-top:1px solid var(--hair);
}
.build__rail{
  display:flex;gap:8px;overflow-x:auto;
  margin:clamp(26px,3vw,46px) 0 clamp(20px,2.4vw,34px);
  padding-bottom:4px;scrollbar-width:none;
}
.build__rail::-webkit-scrollbar{display:none}
.build__m{
  flex:none;padding:9px 16px;
  background:rgba(255,255,255,.05);
  font-size:12px;color:var(--muted);white-space:nowrap;
  transition:color .3s var(--e),background .3s var(--e);
}
.build__m:hover{color:var(--fg)}
.build__m._is-on{background:var(--terra);color:var(--light)}
.build__body{display:grid;grid-template-columns:1.7fr 1fr;gap:clamp(16px,2vw,32px);align-items:stretch}
.build__shot{margin:0;overflow:hidden;aspect-ratio:16/9}
.build__shot img{
  width:100%;height:100%;object-fit:cover;
  filter:grayscale(.25) brightness(.9);
  animation:featin .5s var(--e) both;
}
.build__side{
  display:flex;flex-direction:column;
  padding:clamp(20px,2.2vw,34px);background:var(--surface);
}
.build__k{
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);
}
.build__t{margin:14px 0 0;font-size:clamp(13px,1.05vw,16px);line-height:1.6;color:var(--muted)}
.build__facts{display:flex;gap:clamp(18px,2.4vw,40px);margin:auto 0 0;padding-top:24px}
.build__facts dt{font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
.build__facts dd{
  margin:8px 0 0;
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(20px,2vw,32px);line-height:1;letter-spacing:-.04em;
  font-variant-numeric:tabular-nums;
}

.news{
  position:relative;z-index:1;background:var(--bg);
  padding:var(--sec-pt) var(--pad) var(--sec-pb);
  border-top:1px solid var(--hair);
}
.news__head{
  display:flex;align-items:baseline;justify-content:space-between;gap:20px;
  margin-bottom:clamp(24px,3vw,44px);
}
.news__title{
  margin:0;font-weight:300;
  font-size:var(--h2);line-height:var(--h2-lh);letter-spacing:-.04em;
}
.news__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(14px,1.5vw,24px)}
.post{
  display:flex;flex-direction:column;
  background:var(--surface);
  transition:background .4s var(--e);
}
.post:hover{background:var(--surface-2)}
.post__img{aspect-ratio:16/10;overflow:hidden}
.post__img img{
  width:100%;height:100%;object-fit:cover;
  filter:grayscale(.35) brightness(.85);
  transition:transform 1.1s var(--e),filter .7s var(--e);
}
.post:hover .post__img img{transform:scale(1.04);filter:grayscale(0) brightness(1)}
.post__body{padding:clamp(16px,1.8vw,26px)}
.post__date{font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--accent)}
.post__body h3{
  margin:12px 0 8px;font-weight:400;
  font-size:clamp(16px,1.3vw,21px);line-height:1.2;letter-spacing:-.02em;
}
.post__body p{margin:0;font-size:clamp(12px,.95vw,14px);line-height:1.55;color:var(--muted)}

/* ==================== СТРАНИЦА ЛОТА ====================
   Из прототипа («страница недвижки»): слева планировка с переключателем
   видов, справа цена, отделка и способ покупки. Планировки нарисованы
   вектором — чертёж в линиях сайта читается лучше растрового плана. */
/* Отступ от шапки до крошек одинаковый на всех внутренних страницах —
   тот же, что в каталоге (.clg-hero). Здесь он был вдвое больше
   и страница лота начиналась заметно ниже соседних.
   Исключение — страница дома: там крошки лежат в первом экране
   у самого заголовка, и это сделано намеренно. */
.lot{
  position:relative;z-index:1;background:var(--bg);
  padding:calc(var(--bar) + clamp(26px,3.4vw,54px)) var(--pad) var(--sec-pb);
}
/* Крошки: одинаковые на каталоге, доме и лоте — разный вид цепочки
   на соседних страницах читается как разные сайты. */
.lot__crumbs a,.obj-hero__crumbs a,.clg-hero .eyebrow a{border-bottom:1px solid var(--hair)}
.obj-hero__crumbs{margin:0 0 clamp(16px,2vw,28px)}
.lot__crumbs a:hover,.obj-hero__crumbs a:hover{color:var(--fg)}
.lot__grid{
  display:grid;grid-template-columns:1fr minmax(300px,26%);
  gap:clamp(16px,2vw,32px);align-items:start;
  margin-top:clamp(18px,2.2vw,32px);
}
.lot__main{background:var(--surface);padding:clamp(18px,2vw,32px)}
.lot__head{display:flex;align-items:flex-start;justify-content:space-between;gap:20px}
.lot__title{
  margin:0;font-weight:300;font-family:"Onest",sans-serif;
  font-size:clamp(24px,2.8vw,44px);line-height:1;letter-spacing:-.04em;
}
.lot__sub{margin:10px 0 0;font-size:13px;color:var(--muted)}
.lot__tools{display:flex;gap:8px}
.lot__tool{
  width:36px;height:36px;display:grid;place-items:center;
  background:var(--surface-2);color:var(--muted);
  transition:color .3s var(--e),background .3s var(--e);
}
.lot__tool i{font-style:normal;font-size:14px}
.lot__tool:hover{color:var(--accent);background:rgba(179,101,66,.16)}

.lot__views{position:relative;margin-top:clamp(16px,2vw,28px);aspect-ratio:16/11}
.lot__view{
  position:absolute;inset:0;margin:0;
  display:none;place-items:center;
}
.lot__view._is-on{display:grid;animation:featin .45s var(--e) both}
.lot__view svg{width:100%;height:100%}
.lot__view--photo img{width:100%;height:100%;object-fit:cover;filter:brightness(.92)}
.lot__view figcaption{
  position:absolute;left:0;bottom:0;padding:10px 14px;
  background:rgba(8,8,8,.7);font-size:11px;color:var(--muted);
}
/* Векторный план этажа: svg инлайном, поэтому красится темой страницы.
   Чертёж отдаёт только геометрию и группы (walls/windows/furniture/lots),
   цвет живёт здесь — светлая версия сайта переопределит эти же переменные. */

.lot__view--vector svg{padding:clamp(14px,2.4vw,36px);box-sizing:border-box}
/* планы из PDF архитекторов — файлом (img.lot__svg), а не инлайном: те же поля и размер, что у svg */
.lot__view--vector img.lot__svg{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;padding:clamp(14px,2.4vw,36px);box-sizing:border-box}
/* подсветка лота на плане этажа — одно правило на все чертежи: контуру и номеру лота страница ставит класс _is-lot
   (src/lib/plans/files.ts markLot); то же правило лежит в <style> чертежей, собранных из PDF (src/lib/plans/convert.ts) */
.g-lots polygon._is-lot{fill:var(--acc);fill-opacity:.16;stroke:var(--acc);stroke-width:1.6}
.num g._is-lot circle{fill:var(--acc)}
.num g._is-lot text{fill:var(--bg,#0B0B0B)}

/* чертёж */
.pl rect,.pl line{fill:none;stroke:rgba(241,241,241,.55);stroke-width:1.2}
.pl__win{fill:var(--accent);stroke:none}
.pl__door{fill:rgba(241,241,241,.35);stroke:none}
.pl__me{fill:rgba(179,101,66,.22);stroke:var(--accent);stroke-width:1.2}
.pl__f rect{fill:rgba(255,255,255,.05);stroke:rgba(241,241,241,.28);stroke-width:1}
.pl__t text,.pl__f text{
  fill:var(--grey);font-size:11px;text-anchor:middle;
  font-family:"Onest",sans-serif;font-variant-numeric:tabular-nums;letter-spacing:.02em;
}
.pl__d text{fill:var(--accent);font-size:10px;text-anchor:middle;letter-spacing:.1em}

.lot__tabs{display:flex;flex-wrap:wrap;gap:8px;margin-top:clamp(14px,1.6vw,22px)}
.lot__tab{
  padding:9px 15px;background:rgba(255,255,255,.05);
  font-size:12px;color:var(--muted);
  transition:color .3s var(--e),background .3s var(--e);
}
.lot__tab:hover{color:var(--fg)}
.lot__tab._is-on{background:var(--terra);color:var(--light)}

.lot__specs{
  display:grid;grid-template-columns:repeat(6,1fr);gap:clamp(10px,1.2vw,20px);
  margin:clamp(20px,2.4vw,34px) 0 0;padding-top:clamp(16px,2vw,26px);
  border-top:1px solid rgba(255,255,255,.09);
}
.lot__specs dt{font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
.lot__specs dd{margin:8px 0 0;font-size:clamp(13px,1.1vw,17px);font-variant-numeric:tabular-nums}

/* панель условий */
.lot__panel{
  position:sticky;top:calc(var(--bar) + 16px);
  background:var(--surface);padding:clamp(18px,2vw,30px);
}
.lot__price{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}
.lot__price strong{
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(24px,2.4vw,38px);line-height:1;letter-spacing:-.04em;
  color:var(--accent);font-variant-numeric:tabular-nums;
}
.lot__price s{font-size:13px;color:var(--muted);text-decoration-thickness:1px}
.lot__perm{margin:10px 0 0;font-size:12px;color:var(--muted)}
.lot__row{
  display:flex;align-items:baseline;justify-content:space-between;gap:12px;
  padding:12px 0;border-bottom:1px solid rgba(255,255,255,.09);
  font-size:13px;
}
.lot__row:first-of-type{margin-top:clamp(16px,2vw,24px);border-top:1px solid rgba(255,255,255,.09)}
.lot__row span{color:var(--muted)}
.lot__k{
  margin:clamp(18px,2vw,26px) 0 10px;
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
}
.lot__pay{display:flex;flex-direction:column;gap:6px}
.pay{
  display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:12px 14px;background:rgba(255,255,255,.05);text-align:left;
  transition:background .3s var(--e),color .3s var(--e);
}
.pay__n{font-size:13px;color:var(--fg)}
.pay__v{font-size:11px;color:var(--accent);font-variant-numeric:tabular-nums}
.pay:hover{background:rgba(255,255,255,.09)}
.pay._is-on{background:rgba(179,101,66,.18);box-shadow:inset 0 0 0 1px rgba(179,101,66,.5)}
.lot__note{margin:12px 0 clamp(18px,2vw,26px);font-size:12px;line-height:1.5;color:var(--muted)}
.lot__second{
  display:block;margin-top:12px;text-align:center;
  font-size:12px;color:var(--muted);
  transition:color .3s var(--e);
}
.lot__second:hover{color:var(--fg)}

/* карточка дома под лотом */
.about-p{
  position:relative;z-index:1;background:var(--bg);
  padding:0 var(--pad) var(--sec-pb);
}
.about-p__card{
  display:grid;grid-template-columns:1fr 1fr;
  background:var(--surface);
}
.about-p__body{padding:clamp(22px,2.6vw,44px);display:flex;flex-direction:column;align-items:flex-start}
.about-p__title{
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(22px,2.4vw,38px);line-height:1;letter-spacing:-.035em;
  transition:color .3s var(--e);
}
.about-p__title i{font-style:normal;color:var(--accent)}
.about-p__title:hover{color:var(--accent)}
.about-p__type{margin:12px 0 0;font-size:13px;color:var(--muted)}
.about-p__metro{display:flex;align-items:center;gap:7px;margin:10px 0 0;font-size:12px;color:var(--muted)}
.about-p__metro i{width:5px;height:5px;border-radius:50%;background:var(--accent)}
.about-p__tags{display:flex;flex-wrap:wrap;gap:6px;margin:16px 0 0}
.about-p__tags .tag{background:var(--surface-2);color:var(--muted)}
.about-p__text{
  margin:16px 0 clamp(20px,2.4vw,32px);max-width:46ch;
  font-size:clamp(12px,1vw,15px);line-height:1.6;color:var(--muted);
}
.about-p__shot{margin:0;overflow:hidden}
.about-p__shot img{width:100%;height:100%;object-fit:cover;filter:grayscale(.2) brightness(.9)}

/* ==================== КНОПКИ И ПОЛЯ ==================== */
/* Кнопки без белой заливки: белое пятно на чёрном било по глазам
   и спорило с фотографиями. Контур терракотой, заливка приходит
   только на наведении. */
.btn{
  display:inline-flex;align-items:center;gap:10px;
  padding:15px 26px;
  background:none;color:var(--fg);
  border:1px solid rgba(179,101,66,.55);
  font-size:13px;letter-spacing:.01em;
  transition:background .3s var(--e),color .3s var(--e),border-color .3s var(--e);
}
.btn i{font-style:normal;color:var(--accent);transition:color .3s var(--e)}
.btn:hover{background:var(--terra);color:var(--light);border-color:var(--terra)}
.btn:hover i{color:var(--ink)}
.btn--wide{width:100%;justify-content:center}
.btn--ghost{
  background:none;color:var(--fg);
  border:1px solid var(--hair);
}
.btn--ghost:hover{background:var(--light);color:var(--ink)}

.field{display:block;margin-bottom:clamp(16px,2vw,26px)}
.field__label{
  display:block;margin-bottom:9px;
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
}
.field__input{
  width:100%;padding:13px 0;
  background:none;border:0;border-bottom:1px solid var(--hair);
  color:var(--fg);font:inherit;font-size:16px;
  transition:border-color .35s var(--e);
}
.field__input:focus{outline:0;border-bottom-color:var(--accent)}
/* Автозаполнение браузера красит поле своим светлым фоном и перебивает
   любой background. Единственный способ его перекрыть — залить поле
   внутренней тенью и задать цвет текста отдельным свойством. */
.field__input:-webkit-autofill,
.field__input:-webkit-autofill:hover,
.field__input:-webkit-autofill:focus{
  -webkit-text-fill-color:var(--fg);
  -webkit-box-shadow:0 0 0 100px var(--graphite) inset;
  box-shadow:0 0 0 100px var(--graphite) inset;
  caret-color:var(--fg);
  transition:background-color 9999s ease-out;
}
.field__input::placeholder{color:rgba(241,241,241,.35)}
.field__input._is-bad{border-bottom-color:#B4553C}

/* Плашек под чипами нет: выбор отмечает только терракотовая полоса
   снизу — как у табов расчёта. Тёмные прямоугольники в форме читались
   как отдельные кнопки и спорили с полями. */
.chips{
  display:flex;gap:clamp(14px,2vw,34px);
  margin-bottom:clamp(18px,2.4vh,30px);
  border-top:1px solid var(--hair);
}
.chip{
  position:relative;flex:1;
  padding:14px 0 13px;background:none;color:rgba(241,241,241,.5);
  font-size:13px;text-align:left;
  transition:color .3s var(--e);
}
.chip::after{
  content:"";position:absolute;left:0;right:0;bottom:0;height:1px;
  background:var(--accent);
  transform:scaleX(0);transform-origin:left;
  transition:transform .45s var(--e);
}
.chip._is-active::after{transform:scaleX(1)}
.chip:hover{color:var(--fg)}
.chip._is-active{color:var(--fg)}

/* ==================== ЭКРАН 4 — ГОРОД И ПРОЦЕСС ====================
   Одна сцена на три такта. Ведут три переменные, все считает main.js:
   --open  раскрытие окна с видео,
   --text  проявление фразы поверх кадра,
   --shape переход кадра в портретную форму, вокруг которой идут этапы.
   Видео при этом не подменяется — оно то же самое, меняется только окно. */
.film{
  height:560svh;position:relative;z-index:1;background:var(--bg);
  /* Размер портретного окна держим в переменных: по ним же строится
     сетка этапов, иначе подписи наезжают на кадр. Пропорция 3:2. */
  --fw:46vw; --fh:30.8vw;
}
.film__stage{
  position:sticky;top:0;height:100svh;
  display:flex;align-items:center;justify-content:center;
  overflow:hidden;
}
.film__frame{
  position:absolute;
  /* Кадр начинает во весь экран, маска открывает его слева направо.
     В третьем такте он не обрезается, а физически сжимается в окно
     3:2 по центру — те же пропорции, что у самих снимков, поэтому
     в окне виден весь кадр, а не его середина. Размер меняется,
     значит и холст WebGL пересчитывается: качество не теряется. */
  top:calc(var(--shape,0) * (50svh - var(--fh) / 2));
  bottom:calc(var(--shape,0) * (50svh - var(--fh) / 2));
  left:calc(var(--shape,0) * (50vw - var(--fw) / 2));
  right:calc(var(--shape,0) * (50vw - var(--fw) / 2));
  clip-path:inset(0 calc(99% - 99% * var(--open,0)) 0 0);
  transition:none;
}
.film__src{
  width:100%;height:100%;object-fit:cover;
  /* лёгкий встречный наезд, чтобы раскрытие не выглядело плоским */
  transform:translateX(calc(-3% + 3% * var(--open,0)));
  filter:brightness(calc(.88 - .1 * var(--shape,0)));
}
/* когда холст готов, показываем его: видео остаётся в разметке
   и продолжает играть — с него берётся текстура первого кадра */
.film__frame canvas{
  position:absolute;inset:0;width:100%;height:100%;display:block;
  opacity:0;transition:opacity .4s var(--e);
}
.film__frame._is-gl canvas{opacity:1}
.film__frame._is-gl .film__src{opacity:0}
.film__veil{
  position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(8,8,8,.18),rgba(8,8,8,.6));
  opacity:calc(var(--say,0) * .9);
}

/* ── фраза поверх раскрытого кадра ── */
.film__over{
  position:relative;z-index:2;text-align:center;
  width:min(1100px,86vw);
  pointer-events:none;
  /* своя переменная: фраза должна успеть уйти ДО того, как кадр
     начнёт сжиматься, иначе она накладывается на текст этапов */
  opacity:var(--say,0);
}
.film__eyebrow{margin:0 0 clamp(18px,2vw,30px)}
.film__say{
  margin:0;
  font-family:"Onest",sans-serif;font-weight:300;
  /* тот же кегль, что у заголовков секций: фраза поверх кадра —
     такой же H2, только на фотографии */
  font-size:var(--h2);line-height:var(--h2-lh);letter-spacing:-.03em;
}
.film__say em{font-style:normal;color:var(--accent)}

/* Пословный выезд: слово режется своим контейнером.
   Имя с префиксом sw- намеренно: класс .word уже занят секцией
   «слово компании», и общий .word ломал ей вёрстку.

   Прячем слова только когда скрипт жив (класс _js на секции) —
   иначе при отключённом JS фраза исчезла бы совсем. */
.sw{display:inline-block;overflow:clip;vertical-align:bottom;line-height:inherit}
.sw__in{display:inline-block;will-change:transform}
.film._js .sw__in{
  transform:translateY(110%);
  transition:transform .85s var(--e) var(--d,0s);
}
.film._js .film__say._is-said .sw__in{transform:none}

/* ── этапы вокруг портретного кадра ── */
.film__steps{
  position:absolute;inset:0;z-index:2;
  display:grid;
  /* средняя колонка ровно по ширине кадра, а не уже его: иначе
     подписи заезжают на фотографию. Разводит их gap. */
  grid-template-columns:minmax(0,1fr) var(--fw) minmax(0,1fr);
  align-items:center;gap:clamp(20px,3vw,60px);
  padding:calc(var(--bar) + 4vh) var(--pad) 6vh;
  /* этапы включаются последними — когда кадр уже принял форму */
  opacity:var(--steps,0);
  pointer-events:none;
}
.film__side{grid-column:1;justify-self:end;text-align:right;max-width:34ch;width:100%}
.film__aside{grid-column:3;max-width:38ch;width:100%}

/* Лента шагов: все четыре живут одновременно, активный в центре,
   соседние сдвинуты выше и ниже и погашены. При прокрутке они
   физически едут снизу вверх — пропустить шаг невозможно. */
.reel{position:relative;height:clamp(180px,26vh,260px)}
.reel__item{
  position:absolute;left:0;right:0;top:50%;
  transform:translateY(-50%);
  will-change:transform,opacity,clip-path;
}
.reel__in{will-change:transform,filter}
.film__side .reel__item{text-align:right}
.adv__num{
  margin:0 0 clamp(8px,1vw,14px);
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(44px,6vw,110px);line-height:.9;
  letter-spacing:-.06em;color:var(--accent);
  font-variant-numeric:tabular-nums;
}
.adv__title{
  margin:0;font-weight:300;
  font-size:clamp(20px,2.4vw,40px);line-height:1.1;letter-spacing:-.03em;
}
.adv__text{
  margin:0;
  font-size:clamp(13px,1.05vw,16px);line-height:1.65;color:var(--muted);
}
.adv__dots{display:flex;gap:8px;margin-top:clamp(16px,2vw,28px)}
.adv__dots i{width:22px;height:1px;background:var(--hair);transition:background .5s var(--e)}
.adv__dots i._is-on{background:var(--accent)}

/* ==================== ЭКРАН 6 — БЫЛО / СТАЛО ==================== */
.ba{
  position:relative;z-index:1;background:var(--bg);
  /* блок целиком должен помещаться в экран: сравнивать «до» и «после»,
     прокручивая кадр, невозможно */
  min-height:100svh;
  display:flex;flex-direction:column;justify-content:center;
  padding:var(--sec-pt) var(--pad) var(--sec-pb);
  border-top:1px solid var(--hair);
}
.ba__top{position:relative;margin-bottom:clamp(20px,2.6vw,40px)}
.ba__hint{
  position:absolute;right:0;bottom:0;margin:0;
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
}
.ba__stage{
  position:relative;
  /* пропорция держится, но кадр не выше свободной высоты экрана */
  aspect-ratio:3/2;max-height:62svh;margin:0 auto;width:100%;
  overflow:hidden;
  container-type:inline-size;   /* для 100cqw кадра «до» в .ba__clip */
  border:1px solid var(--hair);
  cursor:ew-resize;user-select:none;
  /* горизонтальный жест забирает шторка, вертикальный отдаём странице:
     без этого браузер считал перетаскивание началом прокрутки и
     шторка на телефоне почти не двигалась */
  touch-action:pan-y;
}
.ba__img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.ba__clip{
  /* --split ведёт main.js: доля кадра «до». Обрезка шириной + overflow, не clip-path:
     Safari при перерисовке терял clip-path и на миг показывал «до» во весь кадр (29.10) */
  position:absolute;top:0;bottom:0;left:0;width:var(--split, 50%);
  overflow:hidden;
}
/* кадр «до» — во всю ширину сцены, а не обрезки: 100cqw от .ba__stage */
.ba__clip .ba__img{width:100cqw;max-width:none}
.ba__handle{
  position:absolute;top:0;bottom:0;left:var(--split, 50%);
  width:1px;background:var(--light);
  transform:translateX(-.5px);
}
.ba__handle i{
  position:absolute;top:50%;left:50%;
  width:44px;height:44px;margin:-22px 0 0 -22px;
  border:1px solid var(--light);background:rgba(8,8,8,.5);
  backdrop-filter:blur(4px);
}
.ba__handle i::before,.ba__handle i::after{
  content:"";position:absolute;top:50%;width:6px;height:6px;
  border-top:1px solid var(--light);border-right:1px solid var(--light);
}
.ba__handle i::before{left:11px;transform:translateY(-50%) rotate(-135deg)}
.ba__handle i::after{right:11px;transform:translateY(-50%) rotate(45deg)}
.ba__tag{
  position:absolute;bottom:16px;
  padding:6px 12px;background:rgba(8,8,8,.72);
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--fg);
}
.ba__tag--l{left:16px}
.ba__tag--r{right:16px;color:var(--accent)}

/* ==================== ЭКРАН 7 — РАСЧЁТ ====================
   Раскладка по образцу 250broadway: кадр во всю высоту слева, панель
   с расчётом справа. Панель на графите — единственное место, где мы
   отходим от чистого чёрного: так она читается как рабочая область. */
.calc{
  position:relative;z-index:1;background:var(--bg);
  border-top:1px solid var(--hair);
}
/* Кадр держит левую колонку во всю высоту, справа заголовок стоит над
   панелью управления. Раскладка задана явно: на телефоне порядок ячеек
   другой — заголовок, график, управление (см. media.css). */
.calc__grid{
  display:grid;grid-template-columns:1.05fr 1fr;grid-template-rows:auto 1fr;
  min-height:100svh;
}
/* Заголовок стоит над схемой, в левой колонке: справа он утяжелял
   панель, и она уезжала вниз намного ниже левой части. */
.calc__head{
  grid-column:1;grid-row:1;align-self:end;
  padding:var(--sec-pt) clamp(22px,3vw,60px) 0;
}
.calc__scheme{grid-column:1;grid-row:2}
/* Панель начинается с той же высоты, что и заголовок слева: подпись
   «Сумма вложений» встаёт на строку надзаголовка, сумма — на строку h2.
   Поэтому не center, а start с тем же верхним отступом. */
.calc__panel{grid-column:2;grid-row:1 / span 2;align-self:start}
.calc__shot,.calc__scheme{position:relative;margin:0;overflow:hidden}
/* ── панель вместо картинки ──
   Кривая накопленного дохода и шахматка лотов. Обе перерисовываются
   при любом движении калькулятора: цифры справа не нарисованные,
   а посчитанные, и это видно. */
.calc__scheme{
  display:flex;flex-direction:column;justify-content:flex-start;
  gap:clamp(22px,2.6vw,40px);
  padding:clamp(18px,2.2vw,34px) clamp(22px,3vw,56px) var(--sec-pb);
  background:var(--bg);
}
.chart__k{
  margin:0 0 clamp(14px,1.6vw,22px);
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
}

/* ── выбор дома в калькуляторе ──
   Вместо процентных вкладок: считаем по конкретному дому и его лотам. */
.calc__houses{display:flex;flex-wrap:wrap;gap:5px;margin:clamp(8px,.9vw,13px) 0 0}
.calc__house{
  padding:8px 13px;background:var(--surface);
  font-size:12px;color:var(--muted);
  transition:color .3s var(--e),background .3s var(--e);
}
.calc__house:hover{color:var(--fg)}
.calc__house._is-on{background:rgba(179,101,66,.16);color:var(--accent)}

/* ── главный итог ──
   Ответ на вопрос «сколько я заработаю»: без него блок оставался
   набором процентов, из которых человек считал сам. */
.calc__total{
  margin-top:clamp(10px,1.1vw,14px);
  padding-top:clamp(9px,1vw,12px);border-top:1px solid var(--hair);
}
.calc__big{
  display:block;margin:6px 0 4px;
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(30px,3.6vw,58px);line-height:1;letter-spacing:-.05em;
  color:var(--accent);font-variant-numeric:tabular-nums;
}
.calc__hint{font-size:12px;color:var(--muted)}

/* ── два потока дохода ──
   Рента приходит деньгами каждый месяц, рост цены — при продаже.
   Одной цифрой «29%» это читалось как обещание ежемесячной выплаты. */
.calc__streams{
  display:grid;grid-template-columns:1fr 1fr;gap:clamp(12px,1.3vw,20px);
  margin-top:clamp(8px,.9vw,12px);
}
.stream{padding-top:clamp(9px,1vw,12px);border-top:1px solid var(--hair)}
.stream__top{display:flex;flex-direction:column;gap:5px}
/* единственный акцент в блоке результатов — совокупная доходность */
.calc__cell:last-child .calc__val{color:var(--accent)}
.stream__val{
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(22px,2.2vw,34px);line-height:1;letter-spacing:-.04em;
  font-variant-numeric:tabular-nums;
}
/* Итог за десять лет стоит подписью прямо под значением: подписи
   «в месяц на счёт» и «в год к цене лота» убраны — период уже назван
   в шапке потока («10,6% годовых», «18% в год»), а линия-разделитель
   здесь больше не нужна, строк осталось две. */
.stream__sum{
  display:block;
  font-size:11.5px;color:var(--muted);font-variant-numeric:tabular-nums;
}
.stream__sum b{color:rgba(241,241,241,.82);font-weight:400}
.stream__why{
  margin:7px 0 0;font-size:11.5px;line-height:1.4;color:var(--muted);
}

/* ── планы лотов ──
   Не абстрактная сетка квадратов, а план студии: контур стен, проём
   двери и окно, а внутри — разбивка по квадратным метрам. Закрашены
   те метры, что покупаются на выбранную сумму; последний метр может
   быть закрашен частично — так видно дробную площадь. */
.metres__plans{
  display:flex;flex-wrap:wrap;gap:clamp(10px,1.4vw,20px);
  margin-bottom:clamp(14px,1.6vw,20px);
}
.plan-lot{
  position:relative;
  width:clamp(120px,13vw,178px);
  padding:7px;
  border:1px solid rgba(179,101,66,.4);
  animation:planIn .5s var(--e) both;
}
@keyframes planIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
/* окно на фасадной стене и проём двери — план читается как помещение */
.plan-lot::before{
  content:"";position:absolute;left:22%;right:22%;top:-1px;height:3px;
  background:var(--bg);
  box-shadow:0 0 0 1px var(--accent) inset;
}
.plan-lot::after{
  content:"";position:absolute;left:-1px;bottom:16%;width:3px;height:22%;
  background:var(--bg);
  box-shadow:0 0 0 1px rgba(241,241,241,.45) inset;
}
.plan-lot__grid{
  display:grid;grid-template-columns:repeat(var(--cols,6),1fr);
  gap:2px;
}
.plan-lot__grid i{
  position:relative;aspect-ratio:1;display:block;
  background:rgba(255,255,255,.04);
  overflow:hidden;
}
/* Сам метр заливается изнутри — так видно и частичный, дробный метр.
   Заливка светлая: сплошное терракотовое поле перетягивало на себя
   весь блок, акцент оставлен только контуру плана и цифрам. */
.plan-lot__grid i::after{
  content:"";position:absolute;left:0;bottom:0;right:0;
  height:0;background:rgba(241,241,241,.5);
  transition:height .45s var(--e) var(--d,0s);
}
.plan-lot__grid i._is-on::after{height:100%}
.plan-lot__grid i._is-part::after{height:var(--part,50%)}
.plan-lot__cap{
  display:flex;justify-content:space-between;gap:8px;
  margin-top:7px;
  font-size:10px;letter-spacing:.08em;color:var(--muted);
  font-variant-numeric:tabular-nums;
}
/* сколько лотов не поместилось на экран */
.metres__more{
  align-self:center;
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(18px,1.8vw,28px);letter-spacing:-.03em;color:var(--muted);
}
.metres__note{
  margin:0;font-size:clamp(12px,1vw,15px);color:var(--muted);
}
.metres__note b{
  color:var(--fg);font-variant-numeric:tabular-nums;
}
/* Пара цифр про метр: стоимость и доход. Держат левую колонку
   в равновесии с панелью справа — там итог по всей сумме. */
.metres__pair{
  display:grid;grid-template-columns:1fr 1fr;gap:clamp(14px,1.8vw,28px);
  margin-top:clamp(20px,2.4vw,32px);
  padding-top:clamp(16px,1.8vw,24px);border-top:1px solid var(--hair);
}
.metres__one{display:flex;flex-direction:column;gap:8px}
.metres__val{
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(22px,2.4vw,38px);line-height:1;letter-spacing:-.05em;
  color:var(--fg);font-variant-numeric:tabular-nums;
}
/* блок «Метр приносит» убран по просьбе клиента (22.09) — осталась одна ячейка */
.metres__pair{grid-template-columns:1fr}
.metres__unit{font-size:12px;color:var(--muted)}
.metres__rate .calc__label{width:100%}

/* ── рулетка лет ──
   Горизонтальная лента с делениями: заливка доходит до точки
   окупаемости, засечка подписывает её значение. */
.tape{margin-top:clamp(26px,3vw,44px)}
.tape__body{position:relative;height:34px}
.tape__scale{
  position:absolute;inset:auto 0 0;height:22px;
  background:
    repeating-linear-gradient(to right, var(--hair) 0 1px, transparent 1px 12px),
    repeating-linear-gradient(to right, rgba(241,241,241,.28) 0 1px, transparent 1px 60px);
  background-size:12px 10px, 60px 22px;
  background-position:left bottom, left bottom;
  background-repeat:repeat-x;
}
.tape__fill{
  position:absolute;left:0;bottom:0;height:22px;width:0;
  background:linear-gradient(90deg,rgba(241,241,241,.18),rgba(241,241,241,.06));
  border-right:1px solid var(--accent);
  transition:width .6s var(--e);
}
.tape__mark{
  position:absolute;bottom:0;left:0;
  transform:translateX(-50%);
  transition:left .6s var(--e);
}
.tape__mark i{
  display:block;width:1px;height:34px;margin:0 auto;background:var(--accent);
}
.tape__mark b{
  position:absolute;bottom:38px;left:50%;transform:translateX(-50%);
  font-family:"Onest",sans-serif;font-variant-numeric:tabular-nums;font-size:11px;letter-spacing:.1em;
  color:var(--accent);white-space:nowrap;font-weight:400;
}
/* вторая засечка — возврат одной арендой: она тише основной */
.tape__mark--rent i{background:rgba(241,241,241,.45)}
.tape__mark--rent b{bottom:auto;top:38px;color:var(--muted)}
.tape__mark--rent._is-end b{left:auto;right:6px;transform:none;text-align:right}
.tape__x{
  display:flex;justify-content:space-between;margin-top:10px;
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
}

/* шахматка лотов: те, что покупаются на сумму, загораются волной */
.lots__grid{
  display:grid;grid-template-columns:repeat(17,1fr);
  gap:clamp(5px,.6vw,9px);
}
.lots__grid i{
  display:block;aspect-ratio:1;
  border:1px solid var(--hair-soft);
  transition:background .4s var(--e),border-color .4s var(--e);
}
.lots__grid i._is-on{background:rgba(179,101,66,.22);border-color:rgba(179,101,66,.5)}
.lots__grid i._is-hot{background:var(--accent);border-color:var(--accent)}
.lots__note{
  margin:clamp(12px,1.4vw,18px) 0 0;
  font-size:clamp(12px,.95vw,14px);color:var(--muted);
}

/* Панель без плашки и рамок: блок держится воздухом и расстояниями,
   а не коробками. Единственная линия — под шкалой суммы. */
.calc__panel{
  padding:var(--sec-pt) clamp(22px,3vw,60px) var(--sec-pb);
  display:flex;flex-direction:column;justify-content:flex-start;
  gap:clamp(14px,1.6vw,24px);
}
.calc__title{
  margin:clamp(12px,1.4vw,20px) 0 0;font-weight:300;
  font-size:var(--h2);line-height:var(--h2-lh);letter-spacing:-.03em;
}
.calc__title em{font-style:normal;color:var(--muted)}

.calc__label{
  display:block;
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
}
.calc__sum{padding-top:0}
/* Верхний отступ повторяет зазор «надзаголовок → h2» слева
   (34px схлопнутых margin) плюс 4px на разницу интерлиньяжа:
   у h2 line-height 1.05, у суммы .95 — иначе цифра встаёт выше строки. */
.calc__out{
  display:block;margin:calc(clamp(20px,2.6vw,34px) + 4px) 0 clamp(10px,1.2vw,16px);
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(28px,3.4vw,56px);line-height:.95;
  letter-spacing:-.055em;word-spacing:-.1em;
  font-variant-numeric:tabular-nums;
}
.calc__ends{
  display:flex;justify-content:space-between;gap:16px;margin-top:6px;
  font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);
}
/* Ползунок рисуем сами — системный выбивается из оформления.
   Сам input высокий (это зона касания: пальцем в полосу толщиной
   в пиксель попасть невозможно), а видимая линия живёт в треке. */
.calc__range{
  -webkit-appearance:none;appearance:none;
  width:100%;height:40px;margin:clamp(16px,2vw,24px) 0 0;
  background:transparent;outline:0;cursor:pointer;display:block;
  touch-action:pan-y;
}
/* Пройденный участок шкалы закрашен: долю считает main.js и кладёт
   в --fill, а трек рисует градиент с резкой границей. */
.calc__range::-webkit-slider-runnable-track{
  height:1px;
  background:linear-gradient(90deg,
    var(--accent) 0 var(--fill,0%), var(--hair) var(--fill,0%) 100%);
}
.calc__range::-moz-range-track{height:1px;background:var(--hair)}
.calc__range::-moz-range-progress{height:1px;background:var(--accent)}

/* Ручка — небольшая пилюля: её видно на линии и по ней легко попасть. */
.calc__range::-webkit-slider-thumb{
  -webkit-appearance:none;appearance:none;
  width:30px;height:14px;margin-top:-6.5px;
  background:var(--accent);border:0;border-radius:99px;cursor:grab;
  box-shadow:0 2px 10px rgba(8,8,8,.55);
  transition:background .3s var(--e),transform .2s var(--e);
}
.calc__range::-moz-range-thumb{
  width:30px;height:14px;
  background:var(--accent);border:0;border-radius:99px;cursor:grab;
  box-shadow:0 2px 10px rgba(8,8,8,.55);
}
.calc__range:active::-webkit-slider-thumb{cursor:grabbing;transform:scale(1.06)}

/* Типы объектов: линия сверху и разделители между ними — так группа
   читается как переключатель, а не как три случайные подписи. */
.calc__types{
  display:flex;
  border-top:1px solid var(--hair);
  padding-top:clamp(14px,1.6vw,22px);
}
.calc__type{
  position:relative;flex:1;
  display:flex;flex-direction:column;gap:6px;align-items:flex-start;
  padding:0 clamp(16px,2vw,32px) 14px;background:none;
  border-left:1px solid var(--hair);
  color:rgba(241,241,241,.5);text-align:left;
  transition:color .3s var(--e);
}
.calc__type:first-child{border-left:0;padding-left:0}
/* активное состояние — полоса снизу, а не белая плашка */
.calc__type::after{
  content:"";position:absolute;left:0;right:0;bottom:0;height:1px;
  background:var(--accent);
  transform:scaleX(0);transform-origin:left;
  transition:transform .45s var(--e);
}
.calc__type._is-active::after{transform:scaleX(1)}
.calc__type i{
  font-style:normal;font-family:"Onest",sans-serif;
  font-size:clamp(15px,1.5vw,22px);letter-spacing:-.03em;color:var(--muted);
  font-variant-numeric:tabular-nums;transition:color .3s var(--e);
}
.calc__type span{font-size:11px;letter-spacing:.06em}
.calc__type:hover{color:var(--fg)}
.calc__type._is-active{color:var(--fg)}
.calc__type._is-active i{color:var(--accent)}

.calc__res{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(16px,2vw,34px)}
.calc__cell{padding:0}
/* Значения светлые: три терракотовые цифры подряд перегружали панель.
   Акцент оставлен только совокупной доходности — см. ниже. */
.calc__val{
  display:block;margin-top:10px;
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(17px,1.8vw,30px);line-height:1;
  letter-spacing:-.05em;color:var(--fg);
  font-variant-numeric:tabular-nums;white-space:nowrap;
}
.calc__note{
  margin:clamp(8px,.9vw,11px) 0 clamp(7px,.8vw,10px);
  font-size:clamp(12px,.95vw,15px);line-height:1.6;color:var(--muted);
}
/* условия расчёта списком: подпись слева, значение справа, по строке на условие */
.calc__terms{
  list-style:none;margin:clamp(10px,1.1vw,14px) 0 0;padding:0;
  border-top:1px solid var(--hair);
}
.calc__terms li{
  display:flex;justify-content:space-between;gap:16px;
  padding:clamp(7px,.7vw,9px) 0;border-bottom:1px solid var(--hair);
  font-size:clamp(12px,.95vw,15px);line-height:1.4;
}
.calc__terms span{color:var(--muted)}
.calc__terms b{font-weight:400;color:var(--fg);text-align:right;font-variant-numeric:tabular-nums}

/* ==================== ЭКРАН 8 — ИНТЕРВЬЮ ====================
   Блок работает как разговор: слева вопросы, справа один развёрнутый
   ответ крупным набором и портрет под ним. Аккордеон с пятью
   одинаковыми строками читался как справка, а не как позиция компании. */
.talk{
  position:relative;z-index:1;background:var(--bg);overflow:hidden;
  padding:var(--sec-pt) var(--pad) var(--sec-pb);
  border-top:1px solid var(--hair);
}
.talk__stage{
  display:grid;grid-template-columns:1fr 1.25fr;
  gap:clamp(30px,5vw,110px);align-items:start;
}

.talk__lead{
  margin:clamp(14px,2vw,24px) 0 clamp(26px,3.4vw,50px);font-weight:300;
  font-size:var(--h2);line-height:var(--h2-lh);letter-spacing:-.035em;
}
.talk__lead em{font-style:normal;color:var(--muted)}

.talk__list{list-style:none;margin:0;padding:0;border-top:1px solid var(--hair)}
.talk__q{
  display:flex;align-items:baseline;gap:clamp(12px,1.4vw,22px);
  width:100%;padding:clamp(13px,1.6vw,20px) 0;
  border-bottom:1px solid var(--hair);
  text-align:left;color:rgba(241,241,241,.55);
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(14px,1.25vw,20px);line-height:1.25;
  transition:color .35s var(--e),padding-left .45s var(--e);
}
/* Вместо порядковых номеров — знак раскрытия: закрытый вопрос
   помечен плюсом, открытый — минусом. Нумерация тут ничего не
   объясняла, а знак сразу читается как «нажми и раскроется». */
.talk__q i{
  flex:none;position:relative;
  width:11px;height:11px;color:var(--muted);
  transition:color .35s var(--e);
}
.talk__q i::before,.talk__q i::after{
  content:'';position:absolute;left:0;top:50%;
  width:100%;height:1px;background:currentColor;
  transition:transform .45s var(--e);
}
.talk__q i::before{transform:translateY(-50%)}
.talk__q i::after{transform:translateY(-50%) rotate(90deg)}
/* активный: вертикальная палочка схлопывается — плюс становится минусом */
.talk__q._is-active i::after{transform:translateY(-50%) rotate(90deg) scaleX(0)}
.talk__q:hover{color:var(--fg);padding-left:6px}
/* выбранный вопрос держит и цвет строки, и цвет своей линии —
   на пяти одинаковых пунктах одного оттенка текста мало */
.talk__q._is-active{
  color:var(--fg);padding-left:6px;
  border-bottom-color:var(--accent);
}
.talk__q._is-active i{color:var(--accent)}

/* ── ответ ── */
.talk__answer{position:relative;padding-left:clamp(34px,4.4vw,84px)}
.talk__mark{
  /* кавычка стоит на поле слева от текста и не лезет под первую строку */
  position:absolute;left:0;top:-.18em;margin:0;
  font-family:"Onest",sans-serif;font-weight:400;
  font-size:clamp(42px,4.6vw,84px);line-height:1;
  color:var(--accent);opacity:.22;pointer-events:none;
}
.talk__text{
  margin:0 0 clamp(30px,4vw,60px);min-height:7em;
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(18px,2.1vw,34px);line-height:1.32;letter-spacing:-.02em;
  color:var(--fg);
}
/* строки ответа выезжают из-под маски по очереди */
.talk__text .ln{display:block;overflow:hidden}
.talk__text .ln > span{
  display:block;transform:translateY(105%);
  transition:transform .7s var(--e) var(--d,0s);
}
.talk__text._is-in .ln > span{transform:none}

.talk__author{
  display:flex;align-items:center;gap:clamp(14px,1.8vw,26px);margin:0;
  padding-top:clamp(18px,2.4vw,32px);border-top:1px solid var(--hair);
}
.talk__author img{
  /* портрет крупнее подписи: на 96 px лицо не читалось */
  width:clamp(96px,9.5vw,140px);aspect-ratio:3/4;object-fit:cover;flex:none;
  filter:grayscale(.18) brightness(.97);
}
.talk__author figcaption{display:flex;flex-direction:column;gap:5px}
.talk__name{font-family:"Onest",sans-serif;font-size:clamp(14px,1.15vw,18px)}
.talk__role{font-size:11.5px;color:var(--muted)}

/* ==================== ПОДВАЛ ====================
   Сцена закреплена, слои приходят по очереди и наезжают друг на друга.
   Всё ведут переменные, которые считает main.js по доле прокрутки:
   --p1 раскрытие кадра, --p2 карточка, --p3 панель снизу,
   --p4 содержимое панели, --p5 карточка контактов поверх.  */
.fin{position:relative;z-index:1;height:230svh;background:var(--bg)}
.fin__stage{
  /* vh — запасной вариант для браузеров без svh; svh берёт наименьшую
     высоту окна, при которой панели браузера уже показаны, поэтому
     содержимое сцены не уезжает под нижнюю панель */
  position:sticky;top:0;height:100vh;height:100svh;overflow:hidden;
}

/* слой 1: кадр стоит на весь экран, открывается шторкой снизу вверх.
   Картинка при этом не масштабируется — двигается только край маски,
   поэтому кадр не «выезжает из квадрата», а проявляется на месте. */
.fin__media{
  position:absolute;inset:0;
  /* Шторка идёт слева направо. Вертикальные варианты упирались в то,
     что секция въезжает снизу: любая горизонтальная кромка оставляла
     сверху чёрное поле. По вертикали кадр открыт всегда, движется
     только правая кромка — пустоты не возникает ни на одной фазе. */
  clip-path:inset(0 calc(72% - 72% * var(--p1,0)) 0 0);
}
/* гаснет перед подменой кадра и проявляется уже с новым городом */
.fin__media img._is-out{opacity:0}
.fin__media img{
  /* без затемнения: текст лежит на плашке, кадр золотого часа читается сам (Артём, 16.09) */
  width:100%;height:100%;object-fit:cover;
  /* перетекание при смене города */
  transition:opacity .45s var(--e),transform .9s var(--e);
  /* лёгкий встречный ход: кадр приподнимается, пока открывается маска */
  transform:translateX(calc(-4% + 4% * var(--p1,0)));
}

/* слой 2: карточка объекта на кадре — та же, что в каталоге */
.fin__card.cat{
  position:absolute;left:clamp(16px,3vw,60px);top:50%;z-index:3;
  width:clamp(230px,20vw,320px);
  background:rgba(8,8,8,.55);backdrop-filter:blur(8px);
  /* специфичность как у .cat._is-in — иначе тот перебивает прозрачность
     и карточка висит на экране до того, как кадр вообще открылся */
  opacity:var(--p2,0);
  transform:translateY(calc(-50% + 24px - 24px * var(--p2,0)));
}

/* Карточка офиса продаж: живёт на том же месте и в том же виде, что
   карточка объекта на главной — кадр во всю ширину, обводка по краю
   и строка-разделитель под снимком. */
.sales.fin__card{
  position:absolute;left:clamp(16px,3vw,60px);top:50%;z-index:3;
  width:clamp(240px,21vw,330px);
  padding:0;border:1px solid var(--hair);
  background:rgba(8,8,8,.62);backdrop-filter:blur(8px);
  opacity:var(--p2,0);
  transform:translateY(calc(-50% + 24px - 24px * var(--p2,0)));
}
.sales__img{aspect-ratio:4/3;overflow:hidden;border-bottom:1px solid var(--hair)}
.sales__img img{width:100%;height:100%;object-fit:cover;filter:brightness(.92)}
.sales__k{
  display:block;padding:11px 14px;
  border-bottom:1px solid var(--hair);
  font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--muted);
}
/* переключатель города: две вкладки под снимком офиса */
.sales__cities{display:flex;border-bottom:1px solid var(--hair)}
.sales__city{
  flex:1;padding:11px 10px;
  font-size:11px;letter-spacing:.06em;color:var(--muted);
  transition:color .3s var(--e),background .3s var(--e);
}
.sales__city + .sales__city{border-left:1px solid var(--hair)}
.sales__city:hover{color:var(--fg);background:rgba(255,255,255,.06)}
/* Выбранный город залит терракотой, как кнопка: полупрозрачная подложка
   на снимке офиса почти не читалась (Артём, 23.09) */
.sales__city._is-on{
  color:var(--light);background:var(--terra);font-weight:500;
  border-left-color:var(--terra);
}
.sales__city._is-on:hover{background:var(--accent)}
.sales__phone{
  display:block;margin-top:12px;
  font-size:13px;color:var(--fg);font-variant-numeric:tabular-nums;
  transition:color .3s var(--e);
}
.sales__phone:hover{color:var(--accent)}
.sales__tg{
  display:block;margin-top:8px;font-size:12px;color:var(--muted);
  transition:color .3s var(--e);
}
.sales__tg i{font-style:normal;color:var(--accent)}
.sales__tg:hover{color:var(--fg)}
.sales__body{padding:16px 14px 18px}
.sales__body h3{
  margin:0;font-weight:400;
  font-size:clamp(16px,1.3vw,21px);line-height:1.15;letter-spacing:-.02em;
}
.sales__metro{
  display:flex;align-items:center;gap:7px;
  margin:9px 0 0;font-size:12px;color:var(--muted);
}
.sales__metro i{width:5px;height:5px;flex:none;border-radius:50%;background:var(--accent)}
.sales__hours{
  display:flex;gap:18px;margin:14px 0 0;
  padding-top:14px;border-top:1px solid var(--hair);
}
.sales__hours dt{font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
.sales__hours dd{margin:6px 0 0;font-size:13px;font-variant-numeric:tabular-nums}
.sales__go{
  display:inline-block;margin-top:14px;
  padding-bottom:3px;border-bottom:1px solid var(--hair);
  font-size:12px;color:var(--fg);
  transition:color .3s var(--e),border-color .3s var(--e);
}
.sales__go i{font-style:normal;color:var(--accent)}
.sales__go:hover{border-color:var(--accent)}

/* слой 3: панель поднимается снизу и накрывает правую часть кадра */
/* Панель подогнана под форму: ширина по содержимому, а поле справа
   равно полю кадра слева — иначе тёмная плашка тянется до самого края
   и выглядит пустой. */
.fin__panel{
  position:absolute;right:0;top:0;bottom:0;z-index:4;
  width:min(46%,660px);
  background:var(--graphite);
  border-left:1px solid var(--hair);
  padding:clamp(60px,9vh,110px) clamp(16px,3vw,60px) clamp(24px,3vh,44px) clamp(24px,3.4vw,64px);
  display:flex;flex-direction:column;justify-content:center;
  transform:translateY(calc(100% - 100% * var(--p3,0)));
}
.fin__menu{display:flex;flex-direction:column;opacity:var(--p4,0)}
.fin__menu a{
  padding:clamp(5px,.8vh,10px) 0;
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(22px,2.8vw,44px);line-height:1.08;letter-spacing:-.03em;
  color:rgba(241,241,241,.75);
  transition:color .35s var(--e),padding-left .45s var(--e);
}
.fin__menu a:hover{color:var(--fg);padding-left:12px}

.fin__form{
  max-width:100%;margin:0;
  opacity:var(--p4,0);
  transform:translateY(calc(24px - 24px * var(--p4,0)));
}
.fin__title{
  margin:0 0 clamp(14px,2vh,22px);font-weight:300;
  font-size:var(--h2);line-height:var(--h2-lh);letter-spacing:-.03em;
}
.fin__title em{font-style:normal;color:var(--muted)}
.fin__note{
  margin:0 0 clamp(22px,3vh,38px);max-width:44ch;
  font-size:clamp(13px,1.05vw,16px);line-height:1.6;color:var(--muted);
}
.fin__form .field__input{font-size:18px;padding:15px 0}
.fin__head{
  margin:0 0 clamp(14px,2vh,22px);
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);
}
.fin__legal{
  display:flex;justify-content:space-between;gap:16px;
  font-size:11px;color:var(--muted);opacity:var(--p4,0);
}
.lead__done{margin:14px 0 0;font-size:13px;color:var(--accent)}
/* состояние «отправлено» (30.10): форма целиком сменяется экраном благодарности */
.fin__form._is-sent{display:flex;flex-direction:column;justify-content:center}
.fin__form._is-sent > :not(.sent){display:none!important}
.sent{animation:sentIn .6s var(--e) both}
.sent__mark{display:block;width:56px;height:56px;margin:0 0 clamp(18px,2.4vh,28px);fill:none;stroke:var(--accent);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}
.sent__mark circle{stroke-dasharray:164;stroke-dashoffset:164;animation:sentDraw .8s var(--e) .1s forwards}
.sent__mark path{stroke-dasharray:36;stroke-dashoffset:36;animation:sentDraw .45s var(--e) .7s forwards}
.sent__title span{display:block}
.sent__title em{color:var(--accent)}
.sent__note{margin-bottom:clamp(22px,3vh,34px)}
.sent__act{display:flex;flex-wrap:wrap;gap:10px}
.sent__act .btn{flex:1 1 180px;justify-content:center}
@keyframes sentIn{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
@keyframes sentDraw{to{stroke-dashoffset:0}}
@media (prefers-reduced-motion:reduce){.sent,.sent__mark circle,.sent__mark path{animation:none;stroke-dashoffset:0}}

/* поля формы на тёмной панели */
.fin__panel .field__input{color:var(--fg)}

/* ==================== КУРСОР ====================
   Кружок инвертирует то, что под ним: на тёмном светлый, на светлом
   тёмный. Отдельного цвета не нужно — работает difference.
   На тач-устройствах не показываем: там курсора нет. */
/* ── курсор ──
   Точка, которая мягко разрастается над ссылками и кнопками. */
.dot{
  position:fixed;top:0;left:0;z-index:200;
  width:8px;height:8px;margin:-4px 0 0 -4px;
  border-radius:50%;
  background:var(--light);
  mix-blend-mode:difference;
  pointer-events:none;
  opacity:0;
  transition:opacity .3s var(--e),width .3s var(--e),height .3s var(--e),
             margin .3s var(--e),background .3s var(--e);
  will-change:transform;
}
.dot._is-on{opacity:1}
/* над ссылками и кнопками перекрестие собирается в точку: там курсор
   должен показывать действие, а не измерять */
.dot._is-hot{width:24px;height:24px;margin:-12px 0 0 -12px}
/* над ссылками и кнопками кружок раздувается */
.dot._is-big{width:20px;height:20px;margin:-10px 0 0 -10px}
/* на сенсорных экранах кружок выключен — правило в media.css */

/* ==================== ПРЕЛОАДЕР ====================
   Логотип в двух копиях: серая подложка и терракотовая заливка поверх.
   Заливка открывается слева направо по доле загруженных кадров. */
.pre{
  position:fixed;inset:0;z-index:300;
  display:flex;align-items:center;justify-content:center;
  background:var(--bg);
  transition:opacity .75s var(--e), visibility .75s;
}
.pre._is-done{opacity:0;visibility:hidden}
body._pre-on{overflow:hidden}
/* запасной путь для браузеров без scrollbar-gutter */
html.no-gutter body._pre-on,
html.no-gutter body._menu-open{padding-right:var(--sbw,0px)}

.pre__logo{
  position:relative;
  /* минимальный кегль: логотип здесь индикатор, а не заставка */
  width:clamp(112px,11vw,152px);
}
.pre__svg{display:block;width:100%;height:auto}
.pre__svg--base path{fill:rgba(241,241,241,.14)}
.pre__svg--fill{
  position:absolute;inset:0;
  /* --p ведёт JS: 0 — логотип пустой, 100 — залит целиком */
  clip-path:inset(0 calc((100 - var(--p,0)) * 1%) 0 0);
}
.pre__svg--fill path{fill:var(--accent)}

/* ==================== БОЛЬШОЙ ПОДВАЛ ====================
   Вид взят из бургер-меню: колонки разделены линиями через зазор
   на подложке, тот же кегль и те же отступы. Наезжает на сцену
   с формой своим фоном. */
.foot{
  position:relative;z-index:6;background:var(--graphite);
  border-top:1px solid var(--hair);
  padding:clamp(50px,7vw,100px) 0 clamp(20px,2.4vw,34px);
}
.foot__brand{display:inline-block;margin:0 var(--pad) clamp(36px,4.5vw,70px)}
.foot__brand img{width:clamp(190px,22vw,360px);height:auto;object-fit:contain}

/* линии между колонками — зазор на подложке, как в меню */
.foot__grid{
  display:grid;grid-template-columns:repeat(5,1fr);
  gap:1px;background:var(--hair-soft);
  border-top:1px solid var(--hair-soft);
}
.foot__col{
  display:flex;flex-direction:column;gap:3px;
  padding:22px var(--pad) 30px;
  background:var(--graphite);
}
/* Колонка контактов нужна только там, где сетка складывается в две
   колонки и шестая ячейка пустует. На пяти колонках её нет. */
.foot__col--contacts{display:none}
.foot__col-phone{
  font-family:"Onest",sans-serif;font-size:clamp(17px,4.6vw,21px);
  color:var(--fg);
}
.foot__head{
  margin:0 0 14px;
  font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--accent);
}
.foot__col a{
  padding:7px 0;
  font-size:14px;line-height:1.35;color:rgba(241,241,241,.74);
  transition:color .3s var(--e),transform .4s var(--e);
}
.foot__col a:hover{color:var(--fg);transform:translateX(5px)}

.foot__offices{
  display:grid;grid-template-columns:repeat(2,1fr);
  gap:1px;background:var(--hair-soft);
  border-top:1px solid var(--hair);
}
.foot__office{
  font-style:normal;padding:18px var(--pad) 22px;background:var(--graphite);
}
.foot__city{
  display:block;margin-bottom:9px;
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
}
.foot__office p{margin:0 0 6px;font-size:13.5px;line-height:1.4;color:rgba(241,241,241,.8)}
.foot__office a{
  display:inline-block;margin-bottom:7px;
  font-family:"Onest",sans-serif;font-size:15px;
  transition:color .3s var(--e);
}
.foot__office a:hover{color:var(--accent)}
.foot__hours{display:block;font-size:11.5px;color:var(--muted)}

.foot__act{
  display:flex;align-items:center;flex-wrap:wrap;gap:18px clamp(20px,3vw,44px);
  padding:22px var(--pad) 26px;
  border-top:1px solid var(--hair);
}
.foot__phone{font-family:"Onest",sans-serif;font-size:clamp(18px,1.7vw,24px)}
.foot__phone:hover{color:var(--accent)}
.foot__soc{display:flex;gap:16px;margin-left:auto;flex-wrap:wrap}
.foot__soc a{font-size:12px;color:var(--muted);transition:color .3s var(--e)}
.foot__soc a:hover{color:var(--fg)}

.foot__legal{
  display:flex;gap:clamp(14px,2vw,34px);flex-wrap:wrap;
  padding:16px var(--pad);
  border-top:1px solid var(--hair);
}
.foot__legal a{
  font-size:11.5px;color:var(--muted);
  border-bottom:1px solid transparent;
  transition:color .3s var(--e),border-color .3s var(--e);
}
.foot__legal a:hover{color:var(--fg);border-bottom-color:var(--hair)}

.foot__bottom{
  display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;
  padding:16px var(--pad) 0;
  border-top:1px solid var(--hair);
  font-size:11px;color:var(--muted);
}
.foot__by{margin-left:auto}

/* правовые ссылки в бургер-меню */
.menu__legal{
  display:flex;gap:clamp(12px,1.8vw,28px);flex-wrap:wrap;
  padding:16px var(--pad);
  border-top:1px solid var(--hair-soft);
}
.menu__legal a{
  font-size:11.5px;color:var(--muted);
  transition:color .3s var(--e);
}
.menu__legal a:hover{color:var(--fg)}

/* ==================== СТРАНИЦА КАТАЛОГА ====================
   Префикс clg-, а не cat-: класс .cat занят карточкой объекта.
   Раскладка повторяет прототип клиента: фильтр строкой над выдачей,
   офферы, популярные подборки, затем список с сортировкой. */
/* Шапка поджата: заголовок и описание стоят в строку, а не друг под
   другом — иначе первые карточки уходили за нижнюю кромку экрана. */
.clg-hero{
  position:relative;z-index:1;background:var(--bg);
  padding:calc(var(--bar) + clamp(26px,3.4vw,54px)) var(--pad) clamp(20px,2.4vw,34px);
}
.clg-hero .eyebrow a{border-bottom:1px solid var(--hair)}
.clg-hero__row{
  display:grid;grid-template-columns:1fr minmax(280px,34%);
  gap:clamp(20px,3vw,60px);align-items:start;
  margin-top:clamp(14px,1.8vw,26px);
}
.clg-hero__row .say{font-size:var(--h2)}
.clg-hero__note{
  /* один кегль с вводным абзацем главной — подзаголовки не должны
     отличаться от страницы к странице. Прижат вправо: так он держит
     правый край сетки, как строка данных на главной. */
  margin:0;text-align:right;
  font-size:clamp(13px,1.05vw,16px);line-height:1.6;color:var(--muted);
}
.clg{
  position:relative;z-index:1;background:var(--bg);
  padding:0 var(--pad) var(--sec-pb);
}

/* ── строка фильтра ── */
.fbar{
  display:grid;
  /* Шесть равных колонок на всю ширину — одна сетка на оба ряда:
     поле «ещё фильтров» встаёт ровно под полем верхнего ряда, а не
     растягивается на всю строку (Артём, 23.09). Полей больше шести —
     перенос на следующую строку той же сетки, без сжатия в полоску. */
  grid-template-columns:repeat(6,1fr);
  gap:clamp(12px,1.4vw,24px);align-items:end;
  padding-bottom:clamp(12px,1.4vw,20px);
}
.fbar__f{min-width:0}
/* Кнопка раскрытия фильтра — только для телефона (см. media.css) */
.fbar__toggle{
  display:none;align-items:center;gap:10px;width:100%;
  padding:13px 16px;border:1px solid var(--hair);
  font-size:13px;color:var(--fg);
}
.fbar__toggle em{
  font-style:normal;padding:2px 8px;
  background:rgba(179,101,66,.18);color:var(--accent);
  font-size:11px;font-variant-numeric:tabular-nums;
}
.fbar__toggle i{
  margin-left:auto;width:8px;height:8px;
  border-right:1px solid var(--muted);border-bottom:1px solid var(--muted);
  transform:translateY(-2px) rotate(45deg);
  transition:transform .35s var(--e);
}
.fbar__toggle._is-open i{transform:translateY(2px) rotate(225deg);border-color:var(--accent)}
.fbar__lab{
  display:block;margin-bottom:9px;
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
}
/* Поля фильтра и кнопка «Показать каталог» — одной высоты: кнопка
   рисовалась по своему тексту и рядом с полем площади выглядела
   мельче (Артём, 23.09). Высота задана одна на всех, не подгонкой
   отступов — иначе она разъезжается от размера шрифта в поле. */
.fbar,.fbar__more{--fh:48px}
.fbar .sel__btn,.fbar .pair{min-height:var(--fh)}
.fbar .pair__f{align-items:center}

/* ── свой селект: системный список ОС в тёмной теме выглядит чужеродно ── */
.sel{position:relative}
.sel__btn{
  width:100%;display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:12px 14px;border:1px solid var(--hair);
  font:inherit;font-size:14px;color:var(--fg);text-align:left;
  transition:border-color .3s var(--e);
}
.sel__btn span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sel__btn i{
  flex:none;width:8px;height:8px;
  border-right:1px solid var(--grey);border-bottom:1px solid var(--grey);
  transform:translateY(-2px) rotate(45deg);
  transition:transform .35s var(--e),border-color .3s var(--e);
}
.sel:hover .sel__btn,.sel._is-open .sel__btn{border-color:rgba(179,101,66,.55)}
.sel._is-open .sel__btn i{transform:translateY(2px) rotate(225deg);border-color:var(--accent)}
.sel__list{
  position:absolute;left:0;right:0;top:calc(100% - 1px);z-index:9;
  list-style:none;margin:0;padding:0;
  max-height:min(46vh,340px);overflow:auto;
  background:var(--bg);border:1px solid rgba(179,101,66,.55);
  opacity:0;transform:translateY(-6px);pointer-events:none;
  transition:opacity .25s var(--e),transform .3s var(--e);
}
.sel._is-open .sel__list{opacity:1;transform:none;pointer-events:auto}
.sel__list button{
  width:100%;padding:11px 14px;text-align:left;
  font:inherit;font-size:14px;color:var(--muted);
  transition:color .25s var(--e),background .25s var(--e);
}
.sel__list button:hover{color:var(--fg);background:rgba(255,255,255,.04)}
.sel__list button._is-on{color:var(--accent)}

.pair{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--hair);
  border:1px solid var(--hair)}
.pair__f{display:flex;align-items:baseline;gap:8px;padding:11px 12px;background:var(--bg)}
.pair__f span{font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
.pair__input{
  width:100%;min-width:0;background:none;border:0;color:var(--fg);
  font:inherit;font-size:15px;font-variant-numeric:tabular-nums;
}
.pair__input:focus{outline:0;color:var(--accent)}
/* системные стрелки у number сбивают сетку */
.pair__input::-webkit-outer-spin-button,
.pair__input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.pair__input[type=number]{-moz-appearance:textfield}

/* ── офферы ──
   В прототипе это два серых прямоугольника «оффер/акция». Здесь под
   ними идёт кадр объекта: акция без картинки читалась как черновик. */
.offers{
  display:grid;
  /* две равные колонки: баннер занимает ровно две карточки выдачи,
     как и соседний — разная ширина читалась как ошибка сетки */
  grid-template-columns:1fr 1fr;
  gap:clamp(14px,1.5vw,24px);
  grid-column:1/-1;
}
.offer{
  position:relative;overflow:hidden;
  display:flex;flex-direction:column;align-items:flex-start;
  gap:clamp(6px,.7vw,12px);
  aspect-ratio:21/9;
  padding:clamp(22px,2.4vw,40px);
  background:var(--surface);
  box-shadow:inset 0 0 0 1px var(--hair);
  transition:background .4s var(--e),box-shadow .4s var(--e);
}
.offer:hover{background:var(--surface-2);box-shadow:inset 0 0 0 1px rgba(179,101,66,.4)}

/* ── баннер на фотографии ──
   Кадр снят с пустой левой половиной, поэтому лежит обычным cover. */
.offer--photo{
  background:var(--ink);
}
.offer__bg{
  position:absolute;inset:0;z-index:0;
  width:100%;height:100%;object-fit:cover;
  transition:transform 1.3s var(--e);
}
.offer--photo:hover .offer__bg{transform:scale(1.03)}
/* Грань рисуем на том же слое, что и градиент: и outline, и inset-тень
   на самой карточке закрывались картинкой — она лежит выше по стеку,
   и рамки не было видно вовсе. Тёмный край кадра без неё сливается
   с чёрным фоном страницы. */
.offer--photo::after{
  content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(90deg,rgba(11,11,11,.86) 0%,rgba(11,11,11,.45) 40%,rgba(11,11,11,0) 68%);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.22);
  transition:box-shadow .4s var(--e);
}
.offer--photo:hover::after{box-shadow:inset 0 0 0 1px rgba(179,101,66,.75)}

/* ── акцентный баннер ──
   Единственное цветное пятно в выдаче: среди тёмных карточек акция
   должна читаться как акция, а не как ещё один объект. Чертёж на нём
   остаётся, но линии перекрашиваются в графит. */
.offer--accent{
  background:linear-gradient(135deg,#8a4d2f 0%,#75412B 46%,#5c3221 100%);
  box-shadow:none;color:#F6EFE9;
}
.offer--accent:hover{background:linear-gradient(135deg,#965434 0%,#7d4630 46%,#63361f 100%)}
.offer--accent .offer__tag{background:rgba(11,11,11,.28);color:#F6EFE9}
.offer--accent .offer__note{color:rgba(246,239,233,.82)}

.offer--accent .art__grid path{stroke:rgba(255,255,255,.14)}
.offer--accent .art__ink path,
.offer--accent .art__ink circle{stroke:rgba(255,255,255,.72)}
.offer--accent .art__thin{stroke:rgba(255,255,255,.4) !important}
.offer--accent .art__dim path{stroke:rgba(255,255,255,.45)}
.offer--accent .art__dim text{fill:rgba(246,239,233,.8)}
.offer--accent .art__mark path{stroke:#F6EFE9}

/* ── чертёж вместо картинки ──
   Линии, размерные выноски и моноширинные подписи — язык проектной
   документации. Он честнее рендера: компания и работает по чертежам,
   согласованным с КГИОП. */
.offer__art{
  position:absolute;top:0;z-index:0;
  right:clamp(18px,2.4vw,44px);
  width:58%;height:100%;
  overflow:visible;
}
.offer__art *{vector-effect:non-scaling-stroke;fill:none}
/* подложка-сетка: она же намекает на миллиметровку листа */
.art__grid path{stroke:rgba(241,241,241,.07);stroke-width:1}
/* основные линии — тонкие, но различимые */
.art__ink path,.art__ink circle,.art__ink rect{stroke:rgba(241,241,241,.55);stroke-width:1.2}
.art__thin{stroke:rgba(241,241,241,.28) !important;stroke-width:1 !important}
.art__base{stroke:var(--accent) !important;stroke-width:1.6 !important}
/* окна и дверь — акцент терракотой, как окна в вечернем доме */
.art__win rect{stroke:rgba(179,101,66,.6);stroke-width:1.1}
.art__door{stroke:var(--accent) !important;stroke-width:1.4 !important}
/* размерная линия и подпись под чертежом */
.art__dim path{stroke:rgba(241,241,241,.35);stroke-width:1}
.art__dim text{
  fill:var(--muted);font-family:"Onest",sans-serif;font-variant-numeric:tabular-nums;
  font-size:19px;letter-spacing:.12em;text-anchor:middle;stroke:none;
}
.art__mark path{stroke:var(--accent);stroke-width:1.4}

/* Линии прочерчиваются, когда баннер доезжает до экрана: чертёж
   собирается на глазах, а не появляется готовым. */
.offer__art path,.offer__art circle,.offer__art rect{
  stroke-dasharray:var(--len,1400);stroke-dashoffset:var(--len,1400);
  transition:stroke-dashoffset 1.4s var(--e) var(--d,0s);
}
.offer._is-in .offer__art path,
.offer._is-in .offer__art circle,
.offer._is-in .offer__art rect{stroke-dashoffset:0}
.offer__art text{opacity:0;transition:opacity .6s var(--e) .9s}
.offer._is-in .offer__art text{opacity:1}

/* Фоновый кадр исключён: иначе он попадал под правило для текстовых
   детей, вставал в поток и превращался в маленькую картинку сверху. */
.offer > *:not(.offer__art):not(.offer__bg){
  position:relative;z-index:2;max-width:min(52%,34ch);
}
.offer__tag{
  padding:5px 10px;background:rgba(8,8,8,.55);
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);
}
.offer__title{
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(22px,2.3vw,38px);line-height:1.04;letter-spacing:-.035em;
}
.offer__note{
  font-size:clamp(12px,1vw,15px);line-height:1.55;color:rgba(241,241,241,.72);
}
/* кнопка — как «Оставить заявку» в промо-карточке и всегда в одном месте, левый нижний угол: при длинном
   тексте ссылка уезжала за край кадра 21:9 (Артём, 26.10). Место под неё держит padding-bottom баннера. */
.offer{padding-bottom:calc(clamp(22px,2.4vw,40px) + 58px)}
.offers .offer > span.offer__go{
  position:absolute;z-index:2;left:clamp(22px,2.4vw,40px);bottom:clamp(22px,2.4vw,40px);max-width:none;
  display:inline-flex;align-items:center;gap:8px;padding:12px 20px;
  background:var(--terra);color:var(--light);
  font-size:12px;letter-spacing:.04em;
  transition:background .3s var(--e),transform .3s var(--e);
}
.offers .offer > span.offer__go i{font-style:normal;color:inherit}
.offers .offer:hover > span.offer__go{transform:translateY(-1px)}
/* описание — не больше трёх строк: текст не наезжает на кнопку */
.offer__note{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden}

/* ── популярные подборки: пресеты фильтра одной строкой ── */
.picks{margin-top:clamp(12px,1.4vw,20px)}
.picks__head{
  margin:0 0 12px;
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
}
.picks__rail{
  display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding-bottom:4px;
  scrollbar-width:none;overscroll-behavior-x:contain;
}
.picks__rail::-webkit-scrollbar{display:none}
.pick{
  flex:none;padding:9px 15px;
  border:1px solid var(--hair);
  font-size:12px;color:var(--muted);white-space:nowrap;
  transition:color .3s var(--e),border-color .3s var(--e);
}
.pick:hover{color:var(--fg)}
.pick._is-on{color:var(--accent);border-color:rgba(179,101,66,.55)}
/* метки дома живут в том же ряду, что подборки: для человека это
   один жест — готовое условие в одно нажатие */
.pick._is-fold{display:none}
.picks__more{
  margin-left:4px;
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);
  display:inline-flex;align-items:center;gap:6px;white-space:nowrap;
}
.picks__more i{font-style:normal;font-size:11px}
.picks__more[hidden]{display:none}

/* ── шапка выдачи ── */
.clg__list{padding-top:clamp(20px,2.4vw,34px)}
.clg__bar{
  display:flex;align-items:center;justify-content:space-between;gap:20px;
  flex-wrap:wrap;
  padding-bottom:clamp(14px,1.6vw,22px);border-bottom:1px solid var(--hair);
}
.clg__count{
  font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
  font-variant-numeric:tabular-nums;
}
.clg__tools{display:flex;align-items:center;gap:clamp(12px,1.4vw,24px)}
.sel--sort{min-width:200px}
.sel--sort .sel__btn{padding:9px 12px;font-size:12px}
.sel--sort .sel__list{left:auto;right:0;min-width:100%}

.clg__items{
  display:grid;grid-template-columns:repeat(4,1fr);
  gap:clamp(14px,1.5vw,24px);
  padding-top:clamp(22px,2.6vw,40px);
}
.clg__items .cat{width:auto;min-width:0}

/* ── промо-карточка внутри выдачи ── */
.cat--promo{
  position:relative;overflow:hidden;
  display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;
  gap:12px;padding:clamp(20px,2vw,32px);
}
/* Визуал — объёмный знак бренда. Кадр пересобран под пропорцию
   карточки: знак стоит в верхней части, снизу чистое поле под текст,
   поэтому снимок лежит обычным cover. */
.cat--promo img{
  position:absolute;inset:0;z-index:0;
  width:100%;height:100%;object-fit:cover;object-position:center top;
}
/* Грань идёт на слое градиента, а не outline'ом на карточке: картинка
   внутри лежит выше по стеку и закрывала рамку целиком. Без неё низ
   карточки — почти чёрный градиент — растворяется в фоне выдачи. */
.cat--promo::after{
  content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(180deg,rgba(11,11,11,0) 38%,rgba(11,11,11,.85) 70%);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.22);
  transition:box-shadow .4s var(--e);
}
.cat--promo:hover::after{box-shadow:inset 0 0 0 1px rgba(179,101,66,.75)}
.cat--promo > *:not(img){position:relative;z-index:2}
/* Метка стоит в углу кадра — там же, где год у карточки объекта.
   Селектор с двумя классами: правило выше задаёт всем детям
   position:relative и иначе перебивает по специфичности. */
.cat--promo .cat--promo__tag{
  position:absolute;left:14px;top:14px;
  background:rgba(179,101,66,.92);color:var(--ink);
}
/* залитая кнопка: единственная в ряду, поэтому баннер видно сразу */
.promo__btn{
  display:inline-flex;align-items:center;gap:8px;
  margin-top:6px;padding:12px 20px;
  background:var(--terra);color:var(--light);
  font-size:12px;letter-spacing:.04em;
  transition:background .3s var(--e),transform .3s var(--e);
}
.promo__btn i{font-style:normal}
.promo__btn:hover{background:#d79a6a;transform:translateY(-1px)}
.cat--promo h3{
  margin:0;font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(20px,1.9vw,30px);line-height:1.1;letter-spacing:-.03em;
}
.cat--promo p{margin:0;font-size:13px;line-height:1.55;color:var(--muted)}
.cat--promo .ghost{margin-top:8px}

.clg__empty{
  padding:clamp(40px,6vw,90px) 0;text-align:center;color:var(--muted);
  font-size:clamp(13px,1.05vw,16px);
}
.clg__reset{
  display:block;margin:clamp(26px,3vw,44px) auto 0;
  padding-bottom:3px;border-bottom:1px solid var(--hair);
  font-size:11px;letter-spacing:.08em;color:var(--muted);
  transition:color .3s var(--e),border-color .3s var(--e);
}
.clg__reset:hover{color:var(--fg);border-color:var(--fg)}

/* ==================== СТРАНИЦА ОБЪЕКТА ====================
   Первый экран: кадр во всю ширину, поверх название и цена.
   Дальше строка характеристик, локация, галерея и расчёт. */
.obj-hero{
  position:relative;z-index:1;
  min-height:100svh;display:flex;align-items:flex-end;
  padding:calc(var(--bar) + 4vh) var(--pad) clamp(40px,5vw,80px);
  overflow:hidden;
}
/* Кадры первого экрана меняются сами, как на главной: те же .shot,
   тот же WebGL-модуль. Вместе с кадром меняется и заголовок —
   сначала адрес дома, дальше по одному доводу о нём. */
.obj-hero__media{position:absolute;inset:0;z-index:0}
.obj-hero__media img{width:100%;height:100%;object-fit:cover}
.obj-hero__veil{
  position:absolute;inset:0;z-index:2;pointer-events:none;
  background:linear-gradient(180deg,rgba(8,8,8,.55) 0%,rgba(8,8,8,.25) 40%,rgba(8,8,8,.9) 100%);
}
.obj-hero__body{position:relative;z-index:2;width:100%}
.obj-hero__row{
  display:grid;grid-template-columns:1fr auto;
  gap:clamp(20px,3vw,60px);align-items:start;
}
.obj-hero__lead{min-width:0}

/* метрики объекта — строка справа внизу, как в референсе клиента */
.obj-hero__meta{
  display:flex;flex-wrap:wrap;gap:clamp(16px,2.2vw,44px);margin:0;
}
.obj-hero__cell dt{
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);
}
.obj-hero__cell dd{
  display:flex;align-items:center;gap:8px;
  margin:9px 0 0;
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(16px,1.5vw,24px);line-height:1;letter-spacing:-.03em;
  font-variant-numeric:tabular-nums;
}
.dotmark{width:6px;height:6px;flex:none;border-radius:50%;background:var(--accent)}

/* полосы кадров: активная наливается за время показа */
.obj-hero__bars{
  display:flex;gap:8px;
  margin:clamp(20px,2.6vw,38px) 0 0;max-width:420px;
}
.objbar{flex:1;padding:8px 0}
.objbar i{display:block;height:2px;background:rgba(255,255,255,.24);position:relative}
.objbar i::after{
  content:"";position:absolute;left:0;top:0;bottom:0;width:100%;
  background:var(--accent);transform:scaleX(0);transform-origin:left;
}
.objbar._is-on i::after{animation:objfill var(--objdur,6.5s) linear forwards}
@keyframes objfill{from{transform:scaleX(0)}to{transform:scaleX(1)}}
/* пройденные кадры остаются залитыми приглушённо */
.objbar._is-past i::after{transform:scaleX(1);background:rgba(255,255,255,.4);animation:none}
.obj-hero__back{margin:0 0 clamp(16px,2vw,28px);font-size:12px;color:var(--muted)}
.obj-hero__back a{border-bottom:1px solid var(--hair);transition:color .3s var(--e)}
.obj-hero__back a:hover{color:var(--fg)}
.obj-hero__title{
  margin:0;font-weight:300;
  font-size:clamp(38px,7vw,120px);line-height:.94;letter-spacing:-.04em;
}
.obj-hero__sub{
  margin:clamp(12px,1.4vw,20px) 0 clamp(24px,3vw,44px);max-width:64ch;
  font-size:clamp(14px,1.25vw,19px);line-height:1.62;color:var(--muted);
}
.obj-hero__val{
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(18px,1.9vw,30px);line-height:1;
  letter-spacing:-.04em;word-spacing:-.1em;color:var(--accent);
  font-variant-numeric:tabular-nums;
}
.obj-hero__act{display:flex;gap:12px;flex-wrap:wrap;margin-top:clamp(20px,2.6vw,38px)}

.specs{position:relative;z-index:1;background:var(--bg);padding:0 var(--pad) var(--sec-pb)}
.specs__grid{display:grid;grid-template-columns:repeat(5,1fr);border-top:1px solid var(--hair)}
/* метки дома — те же, по которым работают подборки каталога */
.tags{display:flex;flex-wrap:wrap;gap:6px;padding-top:clamp(6px,1vw,14px)}
.tags .tag{background:var(--surface-2);color:var(--muted)}
.spec{padding:clamp(18px,2vw,30px) clamp(12px,1.4vw,22px) clamp(24px,3vw,44px);border-left:1px solid var(--hair)}
.spec:first-child{border-left:0;padding-left:0}
.spec__k{display:block;font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
.spec__v{
  display:block;margin:clamp(12px,1.6vw,22px) 0 6px;
  font-family:"Onest",sans-serif;font-weight:300;
  font-size:clamp(20px,2.4vw,40px);line-height:1;letter-spacing:-.04em;
}
.spec__n{font-size:11px;color:var(--muted)}

/* ── три довода об объекте (в прототипе — блок «УТП») ── */
.usp{
  display:grid;grid-template-columns:1fr 1.55fr 1fr;
  gap:clamp(12px,1.4vw,22px);
  margin-top:clamp(34px,4vw,64px);
}
.usp__i{
  position:relative;min-height:clamp(280px,26vw,420px);
  display:flex;align-items:flex-end;overflow:hidden;
}
.usp__i img{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  filter:grayscale(.35) brightness(.72);
  transition:transform 1.2s var(--e),filter .8s var(--e);
}
.usp__i:hover img{transform:scale(1.05);filter:grayscale(0) brightness(.85)}
.usp__i::after{
  content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(8,8,8,0) 30%,rgba(8,8,8,.9) 100%);
}
.usp__body{position:relative;z-index:2;padding:clamp(18px,2vw,32px)}
/* подписи карточек стоят на фото — терракота на нём не читалась (клиент, 22.09):
   светлый капс с лёгкой тенью */
.usp__k{
  display:block;margin-bottom:10px;
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:rgba(241,241,241,.85);
  text-shadow:0 1px 2px rgba(0,0,0,.6);
}
.usp__body h3{
  margin:0 0 8px;font-weight:400;
  font-size:clamp(17px,1.6vw,26px);line-height:1.15;letter-spacing:-.02em;
}
.usp__body p{margin:0;font-size:clamp(12px,.95vw,14px);line-height:1.55;color:var(--muted)}

/* ── особенности проекта: вкладки идея / архитектура / пространство ── */
.feat{
  position:relative;z-index:1;background:var(--bg);
  padding:var(--sec-pt) var(--pad) var(--sec-pb);
  border-top:1px solid var(--hair);
}
.feat__tabs{display:flex;gap:clamp(18px,2.4vw,40px);margin:clamp(26px,3vw,46px) 0 0}
.feat__tab{
  padding-bottom:9px;border-bottom:1px solid transparent;
  font-size:clamp(13px,1.15vw,17px);color:var(--muted);
  transition:color .3s var(--e),border-color .3s var(--e);
}
.feat__tab:hover{color:var(--fg)}
.feat__tab._is-on{color:var(--accent);border-bottom-color:var(--accent)}
.feat__panes{position:relative;margin-top:clamp(24px,3vw,44px)}
.feat__pane{
  display:none;
  grid-template-columns:1fr 1.25fr;gap:clamp(20px,3vw,60px);align-items:start;
}
.feat__pane._is-on{display:grid;animation:featin .6s var(--e) both}
@keyframes featin{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
.feat__text h3{
  margin:0 0 clamp(14px,1.6vw,24px);font-weight:300;
  font-family:"Onest",sans-serif;
  font-size:clamp(20px,2.2vw,36px);line-height:1.1;letter-spacing:-.03em;
}
.feat__text p{margin:0 0 14px;font-size:clamp(13px,1.05vw,16px);line-height:1.65;color:var(--muted)}
.feat__note{
  padding-top:14px;border-top:1px solid var(--hair);
  color:var(--fg) !important;
}
.feat__shot{margin:0;overflow:hidden;aspect-ratio:16/10}
.feat__shot img{width:100%;height:100%;object-fit:cover;filter:grayscale(.2) brightness(.92)}

/* ── выбрать лот: фильтр и планировки внутри дома ── */
.plans{
  position:relative;z-index:1;background:var(--bg);
  padding:var(--sec-pt) var(--pad) var(--sec-pb);
  border-top:1px solid var(--hair);
}
.plans__title{
  margin:0 0 clamp(24px,3vw,42px);font-weight:300;
  font-size:var(--h2);line-height:var(--h2-lh);letter-spacing:-.04em;
}
.fbar--plans{grid-template-columns:repeat(6,1fr)}   /* та же сетка, что у основного фильтра (25.09) */
/* Лоты выводятся теми же карточками, что и дома в каталоге: четыре
   в ряд, то же наведение и листание кадров — отдельный вид карточки
   на одной странице выглядел как чужой блок. */
.plans__grid{
  display:grid;grid-template-columns:repeat(4,1fr);
  gap:clamp(14px,1.5vw,24px);
  margin-top:clamp(26px,3vw,46px);
}
.plans__grid .cat{width:auto;min-width:0}
/* цена лота — единственная плашка, набранная акцентом */
.cat__facts li._price{color:var(--accent);background:rgba(179,101,66,.14)}

.obj-about{
  position:relative;z-index:1;background:var(--bg);
  padding:var(--sec-pt) var(--pad) var(--sec-pb);
  border-top:1px solid var(--hair);
}
.obj-about__grid{display:grid;grid-template-columns:1fr 1.6fr;gap:clamp(24px,4vw,80px)}
.pluses{list-style:none;margin:clamp(28px,3.4vw,50px) 0 0;padding:0;border-top:1px solid var(--hair)}
.pluses li{
  display:flex;gap:clamp(12px,1.6vw,26px);align-items:baseline;
  padding:clamp(13px,1.5vw,20px) 0;border-bottom:1px solid var(--hair);
  font-size:clamp(13px,1.05vw,16px);line-height:1.5;color:rgba(241,241,241,.8);
}
.pluses span{
  flex:none;font-size:10px;letter-spacing:.12em;color:var(--accent);
  font-variant-numeric:tabular-nums;
}

/* галерея едет вбок, пока страница идёт вниз */
.gal{position:relative;z-index:1;background:var(--bg);height:260svh}
/* Сцена держит и шапку, и ленту: заголовок уезжал к верхнему краю
   экрана, а кадры оставались по центру — между ними зияла пустота.
   Теперь они закреплены вместе и едут одним блоком. */
.gal__stage{
  position:sticky;top:0;height:100svh;overflow:hidden;
  display:flex;flex-direction:column;justify-content:center;
  gap:clamp(18px,2.4vw,40px);
}
.gal__track{display:flex;gap:clamp(14px,1.6vw,28px);padding:0 var(--pad);will-change:transform}
.gal__item{flex:none;width:min(58vw,760px);margin:0}
.gal__item img{width:100%;height:auto;aspect-ratio:3/2;object-fit:cover}
.gal__item figcaption{
  margin-top:12px;font-size:10px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--muted);
}

/* ── согласие: свой чекбокс вместо системного ──
   Родной квадратик рисует ОС по своим правилам и в тёмной теме
   выглядит инородно. Прячем его, но оставляем в разметке: он ловит
   клик по подписи, обязательность и фокус с клавиатуры. */
.agree{
  display:flex;align-items:flex-start;gap:12px;
  margin:0 0 clamp(18px,2.4vh,28px);cursor:pointer;
}
.agree__box{
  position:absolute;width:1px;height:1px;opacity:0;
}
.agree__mark{
  position:relative;flex:none;
  width:18px;height:18px;margin-top:1px;
  border:1px solid var(--hair);
  transition:border-color .3s var(--e),background .3s var(--e);
}
.agree__mark::after{
  content:"";position:absolute;left:5px;top:2px;
  width:5px;height:9px;
  border:solid var(--ink);border-width:0 1.5px 1.5px 0;
  transform:rotate(45deg) scale(0);
  transition:transform .25s var(--e);
}
.agree:hover .agree__mark{border-color:rgba(241,241,241,.4)}
.agree__box:checked + .agree__mark{background:var(--accent);border-color:var(--accent)}
.agree__box:checked + .agree__mark::after{transform:rotate(45deg) scale(1)}
.agree__box:focus-visible + .agree__mark{outline:1px solid var(--accent);outline-offset:2px}
.agree__box._is-bad + .agree__mark{border-color:#B4553C}
.agree__text{font-size:12px;line-height:1.5;color:var(--muted)}
.agree__text a{border-bottom:1px solid var(--hair);transition:color .3s var(--e)}
.agree__text a:hover{color:var(--fg)}

/* ссылка на разработчика в подвале */
.foot__by a{
  color:var(--muted);border-bottom:1px solid var(--hair);
  transition:color .3s var(--e),border-color .3s var(--e);
}
.foot__by a:hover{color:var(--accent);border-color:var(--accent)}

/* ── вопросы раздела ──
   Тот же блок, что интервью на главной, но без портрета: это ответы
   раздела, а не реплика гендиректора. Граница сверху остаётся: она
   отделяет блок от выдачи, как у всех секций. */
.talk--section .talk__answer{min-height:0}

/* ── первый экран страницы дома ──
   Та же раскладка, что на главной: заголовок слева, две цифры справа.
   Крошки идут отдельной строкой над ними — в сетке из двух колонок
   они иначе занимали место заголовка и уводили его в правую ячейку. */
/* колонки берём от базового .hero__foot: своё правило здесь перебивало
   мобильную раскладку в одну колонку, и заголовок ложился на цифры */
/* Крошки и заголовок — одна колонка, прижатая к низу: отдельной
   строкой грида крошки уезжали вверх, к верхнему краю панелей. */
.hero__lead{display:flex;flex-direction:column;justify-content:flex-end;min-width:0}
.hero--object .obj-hero__crumbs{margin:0 0 clamp(8px,.9vw,14px)}
.hero--object .obj-hero__crumbs a{border-bottom:1px solid var(--hair)}

/* Кадры дома темнее, чем на главной (арка, двор, вечерний проспект),
   поэтому ровная вуаль в 20% гасила их окончательно. Здесь она уходит
   в градиент: верх кадра почти чистый, затемнение собирается снизу —
   ровно там, где лежат заголовок и цифры. */
.hero--object .hero__veil{
  background:linear-gradient(180deg,
    rgba(11,11,11,0) 0%, rgba(11,11,11,.06) 38%,
    rgba(11,11,11,.42) 72%, rgba(11,11,11,.78) 100%);
}
/* Стрелка держится верхнего угла: длинная подпись («Офисов в продаже»)
   переносится на две строки, а не выталкивает её из ячейки. */
.panel header{align-items:flex-start;gap:10px}
.panel__label{flex:1;min-width:0}
.panel header i{flex:none;line-height:1.2}

/* ── характеристики дома в стиле манифеста ──
   Тот же блок, что «01 — Кто мы» на главной. Вторая строка данных
   набрана мельче: две строки одинаково крупных цифр спорили бы
   друг с другом, а ведущей должна остаться доходность. */
.manifest--object .dataline--sub{
  margin:0 0 clamp(30px,4vw,56px);
}
.manifest--object .dataline--sub .cell{
  padding-bottom:clamp(20px,2.4vw,34px);
}
.manifest--object .dataline--sub .cell__val{
  font-size:clamp(24px,9cqw,54px);letter-spacing:-.045em;
}
.manifest--object .tags{margin-top:0}

/* Стрелки ленты на странице дома стоят у правого края экрана:
   вертикальная линия отделяла их от заголовка, будто там колонка
   с содержанием, — а в ячейке только две кнопки. */
.pside--arrows{border-left:0;padding-left:0;justify-self:end}
.pside--arrows .arrows{margin-left:auto}

/* ── шапка галереи дома ──
   Заголовок и подпись стоят над лентой: раньше блок начинался прямо
   с фотографий и читался как чужая вставка. Лента ниже по-прежнему
   закреплена и едет по горизонтали от прокрутки. */
.gal__head{
  display:grid;grid-template-columns:1.4fr minmax(0,1fr);
  gap:clamp(20px,3vw,60px);align-items:start;
  padding:0 var(--pad);
}
.gal__note{
  margin:0;font-size:clamp(12px,1vw,15px);line-height:1.55;color:var(--muted);
  max-width:46ch;
}

/* ══ ЧТО СДЕЛАЛИ С ДОМОМ — ИСТОРИЯ ПО ПРОКРУТКЕ ═════════
   Экран закрепляется на три такта: слева меняется текст, справа
   перетекает кадр. Высота секции задаёт длину истории — по одному
   экрану прокрутки на такт плюс экран на выход. */
.story{
  position:relative;z-index:1;background:var(--bg);
  border-top:1px solid var(--hair);
  height:320svh;
}
.story__stage{
  position:sticky;top:0;height:100svh;overflow:hidden;
  display:grid;grid-template-columns:1fr 1.05fr;
  gap:clamp(24px,4vw,80px);align-items:center;
  padding:calc(var(--bar) + clamp(20px,3vw,40px)) var(--pad) clamp(30px,4vw,60px);
}
.story__side{min-width:0;display:flex;flex-direction:column;justify-content:center}
.story__lead{
  margin:0 0 clamp(24px,3vw,44px);font-weight:300;
  font-size:var(--h2);line-height:var(--h2-lh);letter-spacing:-.03em;
}
.story__lead span{display:block}
.story__lead em{font-style:normal;color:var(--muted)}

/* Такты лежат друг на друге: активный виден, остальные ждут своей
   очереди. Высоту держит самый длинный — иначе блок скачет. */
.story__steps{position:relative;min-height:clamp(200px,22vw,280px)}
.story__step{
  position:absolute;inset:0;
  opacity:0;transform:translateY(18px);
  transition:opacity .5s var(--e),transform .6s var(--e);
  pointer-events:none;
}
.story__step._is-on{opacity:1;transform:none;pointer-events:auto}
.story__num{
  margin:0 0 clamp(10px,1.2vw,16px);
  font-size:10px;letter-spacing:.16em;color:var(--accent);
}
.story__step h3{
  margin:0 0 clamp(10px,1.2vw,16px);font-weight:400;
  font-size:clamp(18px,1.7vw,26px);line-height:1.2;letter-spacing:-.02em;
}
.story__step p{
  margin:0 0 12px;font-size:clamp(13px,1.05vw,15.5px);
  line-height:1.6;color:var(--muted);max-width:46ch;
}
.story__note{
  margin:0;padding-top:12px;border-top:1px solid var(--hair);
  color:rgba(241,241,241,.82) !important;
}
/* три засечки хода: та же логика, что у полосы переключателей */
.story__dots{display:flex;gap:6px;margin-top:clamp(20px,2.4vw,34px)}
.story__dots i{
  width:26px;height:1px;background:var(--hair);
  transition:background .4s var(--e);
}
.story__dots i._is-on{background:var(--accent)}

/* Кадры перетекают друг в друга и слегка наезжают: смена картинки
   встык читалась как перезагрузка блока. */
.story__media{position:relative;height:100%;min-width:0}
.story__shot{
  position:absolute;inset:0;margin:0;overflow:hidden;
  opacity:0;transform:scale(1.04);
  transition:opacity .7s var(--e),transform 1.2s var(--e);
}
.story__shot._is-on{opacity:1;transform:none}
.story__shot img{width:100%;height:100%;object-fit:cover;display:block}

/* ══ НОВОСТИ: КРУПНАЯ ПЕРВАЯ ═══════════════════════════
   Свежая запись занимает половину полосы кадром, остальные идут
   строками справа — как в газете. Три равные карточки не давали
   понять, что здесь главное и что произошло только что. */
.news__lead{
  display:grid;grid-template-columns:1.15fr 1fr;
  gap:clamp(24px,3vw,60px);align-items:start;
}
.lead-post{display:block;color:inherit}
.lead-post__img{margin:0;overflow:hidden;background:var(--surface)}
.lead-post__img img{
  width:100%;height:auto;aspect-ratio:3/2;object-fit:cover;display:block;
  transition:transform 1.1s var(--e);
}
.lead-post:hover .lead-post__img img{transform:scale(1.03)}
.lead-post__body{padding-top:clamp(14px,1.6vw,22px)}
.lead-post__body h3{
  margin:clamp(8px,1vw,14px) 0 clamp(8px,1vw,12px);font-weight:400;
  font-size:clamp(19px,1.9vw,30px);line-height:1.15;letter-spacing:-.02em;
}
.lead-post__body p{
  margin:0;font-size:clamp(13px,1.05vw,15.5px);line-height:1.55;
  color:var(--muted);max-width:52ch;
}
.lead-post__go{
  display:inline-block;margin-top:clamp(12px,1.4vw,18px);
  font-size:12px;letter-spacing:.06em;color:var(--accent);
}
.lead-post__go i{font-style:normal}

.news__list{list-style:none;margin:0;padding:0}
.news__list li{border-top:1px solid var(--hair)}
.news__list li:last-child{border-bottom:1px solid var(--hair)}
.news__list a{
  display:block;padding:clamp(16px,1.8vw,26px) 0;color:inherit;
  transition:padding-left .4s var(--e),color .3s var(--e);
}
.news__list a:hover{padding-left:10px}
.news__list h3{
  margin:8px 0 6px;font-weight:400;
  font-size:clamp(16px,1.3vw,21px);line-height:1.2;letter-spacing:-.015em;
  transition:color .3s var(--e);
}
.news__list a:hover h3{color:var(--accent)}
.news__list p{
  margin:0;font-size:clamp(12.5px,1vw,14.5px);line-height:1.5;color:var(--muted);
  max-width:46ch;
}

/* ═══ V2 — правки после разбора 16.09.2026 ═══════════════════════════════
   Клиент: подписи первого экрана не читаются, кнопки не читаются как
   кнопки, список разделов сбоку непонятно к чему относится. Правки
   собраны одним блоком, чтобы было видно, что менялось относительно v1. */

/* подзаголовок первого экрана — фраза клиента под h1 */
.hero__lede{
  margin:clamp(14px,1.6vw,24px) 0 0;max-width:46ch;
  font-size:clamp(14px,1.2vw,18px);line-height:1.5;
  color:rgba(241,241,241,.82);
  text-shadow:0 1px 14px rgba(11,11,11,.8);
}
/* h1 и подзаголовок стоят в одной ячейке сетки, панели с цифрами — рядом */
.hero__foot > .hero__lede{grid-column:1;align-self:end}
.hero__foot > .panels{grid-column:2;grid-row:1 / span 2}
/* без подзаголовка второй строки нет — иначе пустой ряд с отступом
   сетки поднимает заголовок над панелями */
.hero__foot:not(:has(.hero__lede)) > .panels{grid-row:1}
.hero__foot > .hero__title{grid-column:1}

/* подписи под цифрами первого экрана: крупнее и светлее */
.panel__sub{font-size:clamp(13px,1.1vw,17px);color:rgba(241,241,241,.78)}
.hero__geo{font-size:12px;color:rgba(241,241,241,.7)}
.hero__geo-addr{color:var(--fg)}

/* кнопки: залиты фирменной терракотой, а не только обведены */
.btn{
  background:var(--terra);color:var(--light);border-color:var(--terra);
  font-weight:500;font-size:14px;
}
.btn i{color:var(--light)}
.btn:hover{background:var(--accent);border-color:var(--accent);color:var(--ink)}
.btn--ghost{background:none;color:var(--fg);border-color:var(--hair);font-weight:400}
.btn--ghost i{color:var(--accent)}
.btn--ghost:hover{background:var(--light);color:var(--ink)}

/* портфель: разделы строкой над лентой, справа кнопка каталога и стрелки */
.pside--act{
  display:flex;flex-direction:column;align-items:flex-end;gap:clamp(14px,1.6vw,22px);
  border-left:0;padding-left:0;
}
.pside--act .arrows{margin-top:0}
.tabs--row{
  flex-direction:row;flex-wrap:wrap;gap:0;
  margin:0 var(--pad) clamp(22px,2.6vw,38px);
  border-top:0;border-bottom:1px solid var(--hair);
}
.tabs--row .tab{
  flex:none;padding:12px 22px 14px;
  border-bottom:0;border-right:1px solid var(--hair);
}
.tabs--row .tab:first-child{padding-left:0}
.tabs--row .tab:hover,.tabs--row .tab._is-active{padding-left:22px}
.tabs--row .tab:first-child:hover,.tabs--row .tab:first-child._is-active{padding-left:0}
.tabs--row .tab._is-active{box-shadow:inset 0 -2px 0 var(--accent)}
.ptitle__note b{font-weight:500;color:var(--fg)}

/* этапы: кнопка у последнего шага */
.adv__btn{margin-top:clamp(14px,1.6vw,22px)}

/* до/после: подводка под заголовком */
.ba__lede{
  margin:clamp(14px,1.6vw,22px) 0 0;max-width:56ch;
  font-size:clamp(14px,1.25vw,19px);line-height:1.6;color:var(--muted);
}

/* форма: пометка «необязательно» у почты */
.field__label small{font-size:inherit;letter-spacing:inherit;color:rgba(241,241,241,.35);margin-left:8px}

/* калькулятор смарт-квартир (v2) */
.calc__lede{
  margin:clamp(14px,1.6vw,22px) 0 0;max-width:52ch;
  font-size:clamp(14px,1.2vw,18px);line-height:1.6;color:var(--muted);
}
.calc__sum--adr{margin-top:clamp(18px,2vw,28px)}
.calc__params-unused{
  list-style:none;margin:clamp(18px,2vw,28px) 0 0;padding:clamp(12px,1.3vw,18px) 0 0;
  display:grid;grid-template-columns:repeat(2,1fr);gap:10px clamp(14px,1.6vw,24px);
  border-top:1px solid var(--hair);
}
.calc__params li{display:flex;justify-content:space-between;gap:12px;font-size:12px;color:var(--muted)}
.calc__params b{font-weight:400;color:rgba(241,241,241,.82);white-space:nowrap}
.calc__hint b{font-weight:400;color:rgba(241,241,241,.82)}


/* лот: жилая площадь рядом с заголовком; дом: кнопка к лотам на первом экране */
.lot__sub-area b{font-weight:400;color:rgba(241,241,241,.82)}
.hero__cta{margin-top:clamp(18px,2vw,28px)}
/* каталог: вторая строка заголовка тем же цветом — просьба клиента (16.09) */
.clg-hero .say em{color:inherit}

/* калькулятор смарт-квартир компактнее: итоги в одну строку, отступы короче */
.calc--smart .calc__sum--adr{margin-top:clamp(12px,1.4vw,20px)}
.calc--smart .calc__total{margin-top:clamp(16px,1.8vw,26px)}
.calc--smart .calc__streams{display:grid;grid-template-columns:1fr 1fr;gap:clamp(12px,1.6vw,24px)}
.calc--smart .stream__val{font-size:clamp(20px,2vw,32px)}
.calc--smart .calc__foot{margin-top:clamp(14px,1.6vw,22px)}
@media (max-width:700px){.calc--smart .calc__streams{grid-template-columns:1fr}}

/* заголовок первого экрана в три строки: первая («Девелопер») приглушена,
   ударение — на «современной жизни» и «в историческом центре» */
.hero__set > span:first-child:nth-last-child(3){color:rgba(241,241,241,.55)}

/* портфель: шапка в одну колонку, вкладки + каталог + стрелки в одном ряду */
.catalog__top{grid-template-columns:1fr}
.tabs--row{align-items:stretch}
.tabs__act{margin-left:auto;display:flex;align-items:center;gap:clamp(10px,1.2vw,18px);padding-bottom:2px}
.tabs__act .arrows{margin-top:0}
.tabs__all{padding:11px 18px;font-size:13px;white-space:nowrap}
.calc--smart .calc__houses{margin-top:clamp(12px,1.4vw,18px)}
.calc--smart .calc__house:disabled{opacity:.35;cursor:default}

/* лот: фото-вкладки не вылезают из окна просмотра — картинка растянута
   абсолютом внутри, а само окно режет лишнее (раньше при центровке
   в гриде картинка брала свою высоту и накрывала вкладки) */
.lot__views{overflow:hidden}
.lot__view--photo img{position:absolute;inset:0;width:100%;height:100%}
/* кнопка к лотам на первом экране дома: контурная, по ширине текста,
   а не во всю колонку заголовка */
.hero__cta{align-self:flex-start;width:auto;padding:12px 20px;font-size:13px}
.hero__lead{display:flex;flex-direction:column;align-items:flex-start}
/* контурные кнопки: на наведении заливка фирменной терракотой, не белым */
.btn--ghost:hover{background:var(--accent);border-color:var(--accent);color:var(--ink)}
.btn--ghost:hover i{color:var(--ink)}
/* линия под вкладками — только под самими вкладками, не под кнопкой и стрелками */
.tabs--row{border-bottom:0}
.tabs--row .tab{border-bottom:1px solid var(--hair)}

/* шапка при открытом меню — сплошная, как панель меню под ней:
   полупрозрачный фон с размытием давал синеватый оттенок от кадра */
body._menu-open .bar{background:var(--graphite);backdrop-filter:none;-webkit-backdrop-filter:none}

/* до/после: табы категорий и заглушка для категорий без фото */
.ba__tabs{display:flex;flex-wrap:wrap;gap:0;margin-top:clamp(18px,2vw,28px)}
.ba__tab{
  padding:11px 20px 13px;border-bottom:1px solid var(--hair);border-right:1px solid var(--hair);
  font-size:clamp(13px,1.1vw,17px);color:rgba(241,241,241,.6);
  transition:color .35s var(--e),box-shadow .35s var(--e);
}
.ba__tab:first-child{padding-left:0}
.ba__tab:hover,.ba__tab._is-on{color:var(--fg)}
.ba__tab._is-on{box-shadow:inset 0 -2px 0 var(--accent)}
.ba__pending{
  position:absolute;inset:0;z-index:3;margin:0;display:flex;align-items:center;justify-content:center;
  padding:0 var(--pad);text-align:center;
  font-size:clamp(14px,1.3vw,20px);color:var(--fg);background:rgba(11,11,11,.72);
}
.ba__stage._is-pending .ba__img,.ba__stage._is-pending .ba__handle,.ba__stage._is-pending .ba__tag{filter:blur(6px) brightness(.6)}

/* реализованные проекты */
.done{position:relative;z-index:1;background:var(--bg);padding:var(--sec-pt) var(--pad) var(--sec-pb);border-top:1px solid var(--hair)}
.done__top{display:grid;grid-template-columns:1.5fr 1fr;gap:clamp(24px,4vw,70px);align-items:end;margin-bottom:clamp(28px,3.4vw,50px)}
.done__lede{margin:0;font-size:clamp(14px,1.25vw,19px);line-height:1.62;color:var(--muted)}
.done__grid{display:grid;grid-template-columns:repeat(6,1fr);gap:clamp(10px,1.2vw,18px)}
.done__card img{width:100%;aspect-ratio:4/3;object-fit:cover;display:block;filter:brightness(.92)}
.done__addr{margin:10px 0 0;font-size:clamp(13px,1vw,15px);color:var(--fg)}
.done__note{margin:3px 0 0;font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}

/* карта на странице дома */
.map{position:relative;z-index:1;background:var(--bg);padding:var(--sec-pt) var(--pad) var(--sec-pb);border-top:1px solid var(--hair)}
.map__top{margin-bottom:clamp(20px,2.6vw,40px)}
.map__box{height:clamp(320px,52vh,560px);border:1px solid var(--hair);background:var(--graphite)}
.map__box .leaflet-control-attribution{background:rgba(11,11,11,.7);color:var(--muted);font-size:10px}
.map__box .leaflet-control-attribution a{color:var(--muted)}
.map__box .leaflet-bar a{background:var(--graphite);color:var(--fg);border-color:var(--hair)}
.map__tip{background:var(--graphite);color:var(--fg);border:1px solid var(--accent);border-radius:0;font:12px "Onest",sans-serif;padding:5px 9px}
.map__tip::before{display:none}
/* первый экран: подпись ближе к заголовку */
.hero__lede{margin-top:clamp(8px,.9vw,14px)}

/* первый экран: заголовок и подпись без межстрочного зазора сетки */
.hero__foot{row-gap:0}

/* цифры манифеста: три факта одного ранга — один кегль, равные колонки,
   больше воздуха снизу («50 000+ м²» в ведущей колонке не помещался) */
.dataline{grid-template-columns:1fr 1fr 1fr}
@supports (container-type:inline-size){
  .dataline .cell .cell__val{font-size:clamp(28px,14.5cqw,96px)}
}
.dataline .cell{padding-bottom:clamp(36px,4.4vw,70px)}
.dataline .cell__note{max-width:26ch}

/* первый экран без WebGL: кадры меняются срезом слева направо,
   по кромке бежит фирменная линия */
.shot{opacity:1;clip-path:inset(0 100% 0 0);transition:none;z-index:0}
.shot._was-active{clip-path:inset(0);z-index:1;animation:none}
.shot._is-active{clip-path:inset(0);z-index:2;transition:clip-path 1.1s var(--e)}
.hero__wipe{
  position:absolute;top:0;bottom:0;left:0;width:1px;z-index:3;
  background:var(--accent);opacity:0;pointer-events:none;
}
.hero__wipe._run{animation:heroWipe 1.1s var(--e) both}
@keyframes heroWipe{
  0%{left:0;opacity:0}
  8%{opacity:1}
  92%{opacity:1}
  100%{left:100%;opacity:0}
}
/* индикатор шагов под цифрами */
.film__side .adv__dots{justify-content:flex-end}

/* калькулятор: два ползунка в один ряд, цифры над ними компактнее */
.calc--smart .calc__inputs{display:grid;grid-template-columns:1fr 1fr;gap:clamp(16px,2vw,32px)}
.calc--smart .calc__sum--adr{margin-top:0}
.calc--smart .calc__out{font-size:clamp(22px,2.2vw,36px)}
/* первый экран: смена кадров маской, медленнее и мягче; линии больше нет */
.shot._is-active{transition:clip-path 2.2s cubic-bezier(.65,0,.2,1)}
.hero__wipe{display:none}

/* мелкие подписи над заголовками («Портфель», «Город», «Результат»…) сняты
   везде — Артём, 16.09. Крошки навигации тем же классом остаются: в них есть ссылки. */
.eyebrow:not(:has(a)):not(.obj-hero__crumbs):not(.lot__crumbs){display:none}
/* зум одинаковый у всех кадров и с одной фазы — при смене нет сдвига */
.shot{animation:kenburns 26s ease-in-out infinite alternate}
.shot._was-active{animation:kenburns 26s ease-in-out infinite alternate}

/* первый экран: фото не трогаем — ни фильтра, ни ровной вуали. Читаемость
   текста держит только затемнение нижней трети кадра + пятно под надписями
   (Артём, 16.09: «пусть фото будет яркой и красивой») */
.shot img{filter:none}
.hero__veil{
  background:linear-gradient(to top,
    rgba(11,11,11,.88) 0%, rgba(11,11,11,.62) 22%, rgba(11,11,11,.28) 42%, rgba(11,11,11,0) 62%);
}
.hero__foot::before{
  background:radial-gradient(120% 100% at 30% 85%,
    rgba(8,8,8,.7) 0%, rgba(8,8,8,.42) 38%, rgba(8,8,8,.12) 64%, transparent 82%);
}
/* подпись первого экрана скрыта, пока идёт прелоадер — появится вместе с заголовком */
body._pre-on .hero__lede{opacity:0}
/* заглушка «ждём фото» действительно скрыта, когда hidden: display:flex
   выше перебивал атрибут, и тёмная плашка лежала поверх всех пар до/после */
.ba__pending[hidden]{display:none}

/* первый экран: нижняя часть кадра уходит в размытие и темнеет — текст
   читается, а сама фотография выше остаётся чистой (Артём, 16.09).
   Размытие прогрессивное: маска-градиент на слое с backdrop-filter. */
.hero__veil{
  -webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);
  -webkit-mask-image:linear-gradient(to top, #000 0%, #000 18%, rgba(0,0,0,.6) 34%, transparent 56%);
  mask-image:linear-gradient(to top, #000 0%, #000 18%, rgba(0,0,0,.6) 34%, transparent 56%);
  background:linear-gradient(to top, rgba(11,11,11,.9) 0%, rgba(11,11,11,.55) 30%, rgba(11,11,11,0) 60%);
}

/* до/после: заголовок и подводка слева, вкладки справа по нижней линии,
   подсказка «потяните за линию» снята (Артём, 16.09) */
.ba__top{display:grid;grid-template-columns:minmax(0,1.4fr) auto;grid-template-rows:auto auto;column-gap:clamp(24px,4vw,70px);align-items:end}
.ba__top .say{grid-column:1;grid-row:1}
.ba__top .ba__lede{grid-column:1;grid-row:2}
.ba__top .ba__tabs{grid-column:2;grid-row:1 / span 2;align-self:end;justify-self:end;margin-top:0}
.ba__top .ba__hint{display:none}

/* первый экран: без теней у текста и переключателей — читаемость держат
   затемнения: сильнее снизу, совсем лёгкое сверху под строкой слов (Артём, 16.09) */
.hero__title,.hero__lede,.switch__item,.switch__item span,.panel,.hero__geo{text-shadow:none}
.hero__veil{
  background:linear-gradient(to top, rgba(11,11,11,.96) 0%, rgba(11,11,11,.72) 26%, rgba(11,11,11,.3) 48%, rgba(11,11,11,0) 64%);
  -webkit-mask-image:linear-gradient(to top, #000 0%, #000 22%, rgba(0,0,0,.6) 38%, transparent 60%);
  mask-image:linear-gradient(to top, #000 0%, #000 22%, rgba(0,0,0,.6) 38%, transparent 60%);
}
.hero__stage::after{background:linear-gradient(to bottom, rgba(11,11,11,.42) 0%, rgba(11,11,11,.18) 12%, rgba(11,11,11,0) 26%)}
/* верхний градиент — над всеми кадрами: раньше лежал на одном уровне
   с ними, и активный кадр его перекрывал (градиент «прыгал» при смене) */
.hero__stage::after{z-index:3}
.hero__veil{z-index:3}
/* «Девелопер» — таким же светлым, как остальные строки (Артём, 16.09) */
.hero__set > span:first-child:nth-last-child(3){color:inherit}
/* нижнее затемнение мягче: пик 72% у кромки, к половине экрана сходит на нет,
   размытие тоже ниже и слабее */
.hero__veil{
  background:linear-gradient(to top, rgba(11,11,11,.72) 0%, rgba(11,11,11,.46) 22%, rgba(11,11,11,.18) 40%, rgba(11,11,11,0) 54%);
  /* блюр минимальный, 5px, и на десктопе, и на телефоне (Артём, 16.09) */
  -webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);
  -webkit-mask-image:linear-gradient(to top, #000 0%, #000 14%, rgba(0,0,0,.5) 30%, transparent 50%);
  mask-image:linear-gradient(to top, #000 0%, #000 14%, rgba(0,0,0,.5) 30%, transparent 50%);
}
.hero__foot::before{
  background:radial-gradient(120% 100% at 30% 85%,
    rgba(8,8,8,.42) 0%, rgba(8,8,8,.24) 38%, rgba(8,8,8,.06) 64%, transparent 82%);
}

/* страницы домов (scripts/build-houses.mjs): сводка по лотам с кнопками —
   пока у клиента нет таблицы по лотам, блок «Выбрать лот» заменяет сводка */
.manifest--lots .manifest__cta{
  display:flex;flex-wrap:wrap;align-items:center;gap:14px 18px;
  margin-top:clamp(22px,2.6vw,40px);
}
.manifest--lots .manifest__cta .calc__note{flex-basis:100%;margin:0;max-width:52ch}

/* маркер дома на Яндекс-карте (ветка с ключом в main.js): точка терракотой + подпись */
.map__pin{position:relative;transform:translate(-50%,-50%);pointer-events:none}
.map__pin i{display:block;width:18px;height:18px;border-radius:50%;background:var(--accent);box-shadow:0 0 0 4px rgba(179,101,66,.25)}
.map__pin .map__tip{position:absolute;left:50%;bottom:calc(100% + 8px);transform:translateX(-50%);white-space:nowrap}

/* «Смотреть больше проектов» на страницах дома и лота: шапка в две колонки —
   правило портфеля главной (одна колонка) сюда не относится; ссылка «весь
   каталог» и стрелки стоят на одной линии по низу */
#more .catalog__top{grid-template-columns:1.5fr 1fr;align-items:end}
#more .ptitle .ghost{margin-bottom:0}

/* заголовок первого экрана страницы дома: адрес длиннее фраз главной
   («Большой проспект» не влезал в колонку и резервировал лишнюю строку) —
   кегль чуть меньше, чем на главной */
.hero--object .hero__title{font-size:clamp(28px,3.4vw,60px)}

/* прелоадер после исчезновения не должен ловить клики: с ним карточки
   портфеля на главной не открывались (Артём, 16.09) */
.pre._is-done{pointer-events:none}

/* ── каталог: «ещё фильтры» (клиент, созвон 16.09) ──
   Дополнительный ряд раскрывается на всю ширину сетки и по умолчанию свёрнут. */
/* «Ещё фильтры» жмётся к строке полей: гап сетки для ссылки велик,
   она висела в воздухе и растягивала блок по высоте (Артём, 23.09) */
/* Порядок в сетке: поля → раскрытый второй ряд → ссылка. Ссылка стоит
   под обоими рядами, иначе раскрытые поля появляются ПОД надписью
   «свернуть фильтры» и читаются как чужой блок (Артём, 23.09). */
.fbar__toggle-row{grid-column:1/-1;order:2;margin-top:calc(10px - clamp(12px,1.4vw,24px))}
.pair--one{grid-template-columns:1fr}
.pair--one .pair__f{border-right:0}
.fbar__more-btn{
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);
  display:inline-flex;align-items:center;gap:6px;white-space:nowrap;
}
.fbar__more-btn i{font-style:normal;font-size:11px}
.fbar__more{
  grid-column:1/-1;order:1;display:none;
  /* колонки те же, что у верхнего ряда: subgrid там, где он есть,
     иначе те же шесть долей — ширина совпадает при общем gap */
  grid-template-columns:repeat(6,1fr);gap:clamp(12px,1.4vw,24px);align-items:end;
}
@supports (grid-template-columns:subgrid){.fbar__more{grid-template-columns:subgrid}}
.fbar__more._is-open{display:grid}
.fchips{display:flex;flex-wrap:wrap;gap:8px}
.fchip{
  padding:11px 14px;border:1px solid var(--hair);font-size:12px;color:var(--fg);
  transition:background .3s var(--e),border-color .3s var(--e),color .3s var(--e);
}
.fchip:hover{border-color:var(--muted)}
.fchip._is-on{background:var(--accent);border-color:var(--accent);color:var(--ink)}
@media (max-width:1400px){.fbar{grid-template-columns:repeat(4,1fr)}.fbar__more{grid-template-columns:repeat(4,1fr)}}
@media (max-width:1100px){.fbar{grid-template-columns:repeat(3,1fr)}.fbar__more{grid-template-columns:repeat(3,1fr)}}
@media (max-width:700px){.fbar{grid-template-columns:1fr}.fbar__more{grid-template-columns:1fr}}

/* «Похожие лоты» на телефоне: ряд подборок прокручивается, а не выпирает за экран */
@media (max-width:700px){
  .plans__head{flex-wrap:wrap}
  /* на странице лота этот же ряд — переключатель похожих лотов:
     он остаётся прокруткой в одну строку, переносить его некуда */
  .plans__head .picks__rail{width:100%;min-width:0;flex-wrap:nowrap;overflow-x:auto}
  .plans__head .pick{flex:0 0 auto;white-space:nowrap}
}

/* «Выбрать лот» на страницах домов: сводка по дому строкой под заголовком */
.plans__lead{display:flex;flex-direction:column;gap:clamp(10px,1.2vw,18px);margin-bottom:clamp(24px,3vw,42px)}
.plans__lead .plans__title{margin:0}
.plans__note{margin:0;max-width:62ch;font-size:clamp(13px,1.05vw,16px);line-height:1.5;color:rgba(241,241,241,.7)}
/* сводка по дому — пунктами через разделители, не через точку в одну строку (22.09) */
.plans__facts{
  list-style:none;display:flex;flex-wrap:wrap;gap:8px 0;margin:0 0 clamp(10px,1vw,14px);padding:0;
  font-size:clamp(13px,1.05vw,16px);line-height:1.4;color:var(--fg);
}
.plans__facts li{padding:0 clamp(12px,1.2vw,18px);border-left:1px solid var(--hair)}
.plans__facts li:first-child{padding-left:0;border-left:0}
/* цена «от» под числом лотов — акцентом (клиент, 22.09: «цену выделить поярче») */
.cell__note ._accent{color:var(--accent);font-weight:500}
.plans__note b{color:var(--fg);font-weight:400}

/* ── страница лота: подписанные инструменты, листалки во вкладках ── */
.lot__tool{width:auto;padding:0 12px;gap:7px;grid-auto-flow:column;font-size:11px;letter-spacing:.06em;text-transform:uppercase}
.lot__tool span{color:var(--fg)}
.slider{position:absolute;inset:0;overflow:hidden;touch-action:pan-y}
.slider__track{display:flex;height:100%;transition:transform .6s var(--e);will-change:transform}
.slider__track > *{flex:0 0 100%;position:relative;height:100%}
.slider__track picture,.slider__track img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.slider__nav{position:absolute;right:12px;bottom:12px;display:flex;align-items:center;gap:6px;z-index:2}
.slider__num{padding:0 10px;font-size:11px;letter-spacing:.06em;color:var(--fg);background:rgba(8,8,8,.7);height:32px;display:grid;place-items:center;font-variant-numeric:tabular-nums}
.slider__prev,.slider__next{width:32px;height:32px;display:grid;place-items:center;background:rgba(8,8,8,.7);color:var(--fg);font-size:14px;transition:background .3s var(--e),color .3s var(--e)}
.slider__prev:hover,.slider__next:hover{background:var(--terra);color:var(--light)}
.lot__view--photo .slider + figcaption{z-index:2;max-width:60%}
/* карточка дома под лотом: кадры фасада листаются */
.about-p__shot{position:relative}
.about-p__shot .slider{position:absolute}
@media (max-width:700px){.about-p__shot{aspect-ratio:4/3}}

/* ── печать лота: «PDF» = напечатать страницу в файл ──
   Остаются заголовок, текущий вид, характеристики и панель с ценой;
   шапка, вкладки, похожие лоты и подвал — нет. */
/* Печатный лист лота — отдельная вёрстка, на экране скрыт (Артём, 23.09) */
.psheet{display:none}

@media print{
  body{background:#fff;color:#111}
  .bar,.menu,.scrim,.lot__tabs,.lot__tools,.plans,.fin,.foot,.pre,.slider__nav,.lot__second,.btn{display:none !important}
  .lot__grid{display:block}
  .lot__main,.lot__panel{background:none;padding:0;color:#111}
  .lot__views{aspect-ratio:auto;height:auto;margin:7mm 0}
  .lot__view{display:none;position:static}
  .lot__view._is-on{display:block}
  .lot__view--photo img{position:static;width:100%;height:auto;filter:none}
  .slider{position:static}
  .slider__track{transform:none !important;display:block}
  .slider__track > *:not(:first-child){display:none}
  .lot__price strong,.lot__row strong,.lot__specs dd{color:#111}
  .lot__crumbs,.lot__sub,.lot__perm,.lot__note,.lot__row span,.lot__specs dt{color:#555}

  /* На печать идёт только карточка лота: план, характеристики, цена.
     Остальные экраны страницы (цифры лота, дом, калькулятор, карта, вопросы,
     похожие лоты, куки) в PDF не нужны и раньше наезжали друг на друга —
     они анимированные, а анимации в печати не проигрываются (Артём, 23.09). */
  .manifest,.about-p,.calc,.map,.talk,.plans,.ruler,.dot,.agree,.office,
  .lot__crumbs,.back,.lot__head{display:none !important}

  /* лист собирается из трёх частей: шапка с ценой, кадры со страницы, сводка */
  body{display:flex;flex-direction:column}
  .psheet{display:block}
  .psheet--a{order:1} .lot{order:2} .psheet--b{order:3}
  .bar,.fin,.foot,.lot__bar{order:9}

  .psheet__top{display:flex;justify-content:space-between;align-items:flex-start;
    padding-bottom:3mm;border-bottom:1px solid #ddd}
  .psheet__logo{width:38mm;filter:invert(1)}
  .psheet__from{text-align:right;font-size:9pt;line-height:1.35}
  .psheet__from b{display:block;font-weight:500}
  .psheet__from span{color:#777}
  .psheet__h1{font-size:24pt;margin:5mm 0 2mm}
  .psheet__price{display:flex;align-items:baseline;gap:5mm;margin-bottom:2mm}
  .psheet__price strong{font-size:19pt;font-weight:400;color:#75412B}
  .psheet__price span{font-size:9.5pt;color:#777}

  .psheet__facts{display:grid;grid-template-columns:1fr 1fr;gap:0 8mm;margin:4mm 0 0}
  .psheet__facts > div{display:flex;justify-content:space-between;gap:4mm;
    padding:1.8mm 0;border-bottom:1px solid #eee;font-size:9.5pt}
  .psheet__facts dt{color:#777}
  .psheet__facts dd{margin:0;text-align:right}

  .psheet__map{margin-top:5mm;break-inside:avoid}
  .psheet__map img{width:100%;height:42mm;object-fit:cover;border:1px solid #ddd}
  .psheet__map p{margin:1mm 0 0;font-size:7pt;color:#999;text-align:right}

  .psheet__foot{display:flex;justify-content:space-between;align-items:center;gap:6mm;
    margin-top:5mm;padding-top:3mm;border-top:1px solid #ddd}
  .psheet__foot b{display:block;font-size:11pt;font-weight:500}
  .psheet__foot span{font-size:8.5pt;color:#777}
  .psheet__qr{width:20mm;height:20mm}

  /* кадры со страницы: план квартиры крупно, этаж и фасад рядом */
  .lot__views{display:grid !important;grid-template-columns:1.25fr 1fr;gap:5mm;margin:5mm 0 0}
  .lot__view{display:block !important;position:static;margin:0;break-inside:avoid}
  .lot__view[hidden]{display:none !important}
  /* слева крупно план квартиры, справа план этажа и фасад */
  .lot__view[data-v="furn"]{order:1;grid-row:span 2}
  /* у домов, где плана самой квартиры ещё нет, план этажа и фасад идут в ряд */
  .lot__views--nofurn{grid-template-columns:1fr 1fr}
  .lot__views--nofurn .lot__view{height:52mm}
  .lot__views--nofurn .lot__view[data-v="floor"] img{max-height:52mm}
  .lot__view[data-v="floor"]{order:2}
  .lot__view[data-v="house"]{order:3}
  /* «Интерьер» — пример отделки другой квартиры, в документе о лоте он путает */
  .lot__view[data-v="int"]{display:none !important}
  /* листалка в печати: один кадр, без абсолютного позиционирования —
     иначе снимок вылезал из ячейки и накрывал план этажа */
  .lot__view--photo .slider,.lot__view--photo .slider__track,
  .lot__view--photo .slider__track > *,.lot__view--photo picture{
    position:static !important;display:block !important;
    width:100% !important;height:100% !important;transform:none !important;
  }
  .lot__view--photo img{position:static !important;width:100% !important;height:100% !important;object-fit:cover}
  /* у плана этажа метраж уже написан под планом квартиры — не повторяем;
     у фасада подпись не нужна, адрес стоит в шапке листа */
  .lot__view[data-v="floor"] figcaption b{display:none}
  .lot__view--photo figcaption{display:none}
  .lot__view--vector svg,.lot__view--plan img{max-height:none;height:auto;width:100%}
  .lot__view[data-v="furn"] svg,.lot__view[data-v="furn"] img{max-height:92mm}
  .lot__view--vector img.lot__svg{position:static}
  .lot__view[data-v="floor"] svg,.lot__view[data-v="floor"] img{max-height:44mm}
  .lot__view--photo{height:44mm}
  .lot__view--photo img{height:100%;object-fit:cover}
  /* сброс появления: блоки стоят сдвинутыми до анимации, в печати так и остаются */
  .mask > span,.say span,[data-anim]{transform:none !important;opacity:1 !important;clip-path:none !important}
  /* печатаем по белому: у секций и карточек свои тёмные фоны, а браузер
     печатает их как есть, и текст выходил тёмным по тёмному */
  html,body,section,.lot,.lot__grid,.lot__main,.lot__panel,.lot__head,.lot__views{background:#fff !important}
  h1,h2,h3,.lot__title,.cell__val,.lot__row strong,.lot__pay,.lot__pay *{color:#111 !important}
  .lot__pay .lot__row{border-color:#ddd !important;background:#fff !important}
  .eyebrow,.lot__crumbs,.back{color:#777 !important}
  /* поля печатаем сами: в диалоге Chrome поля можно выставить «нет»,
     и тогда @page игнорируется, а контент упирается в край (Артём, 23.09) */
  .psheet,.lot{padding:0 11mm !important}
  .psheet--a{padding-top:6mm !important}
  .psheet--b{padding-bottom:6mm !important}
  .lot__panel{display:none !important}
  /* план печатаем как есть — светлая гамма для бумаги и так подходит */
  .lot__view--plan{background:#E1E1E1 !important}
  .lot__view figcaption{position:static;background:none;color:#555;padding:3mm 0 0;max-width:none}
  .lot__view--photo._can-zoom::after,.lot__view--plan._can-zoom::after{display:none}
}
@page{margin:8mm}

/* цифры лота — экран между карточкой лота и блоком дома */
.manifest--lot{padding-top:clamp(56px,7vw,120px)}
.manifest--lot .cell__val{white-space:nowrap}

/* планы на странице лота — целиком, с полями, без обрезки (Артём, 16.09) */
.lot__view--plan{background:#E1E1E1}
.lot__view--plan img{object-fit:contain;padding:clamp(14px,2.4vw,36px);filter:none}
.lot__view--plan figcaption{max-width:60%}

/* ── страница лота: блок дома крупно, как «История этого дома» ── */
.about-p--big{padding:var(--sec-pt) var(--pad) var(--sec-pb)}
.about-p--big .about-p__card{grid-template-columns:minmax(0,1fr) minmax(0,1.3fr);background:none;gap:clamp(24px,4vw,80px);align-items:center}
.about-p--big .about-p__body{padding:0;justify-content:center}
.about-p--big .about-p__title{font-size:var(--h2);line-height:var(--h2-lh);letter-spacing:-.04em}
.about-p--big .about-p__type{font-size:clamp(13px,1.05vw,16px);margin-top:clamp(12px,1.4vw,20px)}
.about-p--big .about-p__text{font-size:clamp(14px,1.15vw,18px);line-height:1.55;max-width:44ch}
.about-p--big .about-p__shot{aspect-ratio:4/3;min-height:0}
@media (max-width:900px){.about-p--big .about-p__card{grid-template-columns:1fr}.about-p--big .about-p__shot{order:-1}}

/* ── липкая полоса с ценой на телефоне ── */
.lot__bar{display:none}
@media (max-width:700px){
  .lot__bar{
    position:fixed;left:0;right:0;bottom:0;z-index:40;
    display:flex;align-items:center;justify-content:space-between;gap:12px;
    padding:10px var(--pad) calc(10px + env(safe-area-inset-bottom));
    background:rgba(11,11,11,.94);border-top:1px solid var(--hair);
    transform:translateY(110%);transition:transform .4s var(--e);
  }
  .lot__bar._is-on{transform:none}
  .lot__bar-price{display:flex;flex-direction:column;gap:2px;min-width:0}
  .lot__bar-price strong{font-weight:400;font-size:18px;color:var(--accent);white-space:nowrap}
  .lot__bar-price span{font-size:11px;color:var(--muted);white-space:nowrap}
  .lot__bar .btn{padding:12px 16px;white-space:nowrap}
}
@media print{.lot__bar,.map,.talk,.calc{display:none !important}}

/* Планы — на фирменном светло-сером (#E1E1E1): выбор клиента из трёх
   вариантов, 23.09. Сама гамма зашита в чертёж (scripts/pdfplan2svg.py),
   здесь только подложка, подпись и значок «на весь экран». */
.lot__view--plan figcaption{background:rgba(225,225,225,.88);color:rgba(11,11,11,.55)}
.lot__view--plan figcaption b{color:var(--ink)}
.lot__view--plan._can-zoom::after{
  background:rgba(225,225,225,.85)
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23101010' stroke-width='1.3'%3E%3Cpath d='M6 2H2v4M10 2h4v4M6 14H2v-4M10 14h4v-4'/%3E%3C/svg%3E")
    center / 16px 16px no-repeat;
  color:var(--ink);
}

/* ── план на весь экран ── */
.lot__view--photo._can-zoom,
.lot__view--vector._can-zoom{cursor:zoom-in}
.lot__view--photo._can-zoom::after,
.lot__view--plan._can-zoom::after{
  content:'На весь экран ↗';position:absolute;right:12px;top:12px;z-index:2;
  padding:8px 12px;background:rgba(8,8,8,.7);font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--fg);
}
/* векторный план в полноэкранном просмотре: те же переменные, что в карточке */
/* Высоту задаём самому чертежу, ширину он берёт по пропорции из viewBox:
   в гриде svg растягивался на всю ячейку и рисовался мелким в углу */
.lightbox__svg{display:flex;align-items:center;justify-content:center;max-width:100%}
/* без этой строки display:grid перебивает атрибут hidden, и при листании
   чертёж остаётся под фотографией (Артём, 23.09) */
.lightbox__svg[hidden]{display:none}
/* переменные ставим на сам svg: у чертежа в собственном <style> есть правило
   svg{--ink:...} со светлыми значениями, на родителе его не перебить */
.lightbox__svg{background:#E1E1E1;padding:clamp(12px,2vw,32px)}
.lightbox__svg svg{width:auto;max-width:100%;height:calc(100vh - clamp(90px,13vw,150px))}

/* ── карточка видов на телефоне (Артём, 23.09) ──
   16:11 на узком экране — низкая полоса: фасад резался по высоте, а подпись
   с метражом лежала поверх плана. Делаем окно чуть выше, подпись уводим под
   него (место под неё резервирует margin-bottom), «на весь экран» — иконкой. */
@media (max-width:700px){
  .lot__views{aspect-ratio:4/3;overflow:visible;margin-bottom:66px}
  .lot__view figcaption,
  .lot__view--photo figcaption,
  .lot__view--plan figcaption,
  .lot__view--vector figcaption,
  .lot__view--photo .slider + figcaption{
    position:absolute;top:100%;left:0;right:0;max-width:none;
    background:none;padding:10px 0 0;line-height:1.35;
  }
  /* значок рисуем svg-фоном: символ ⤢ есть не во всех системных шрифтах
     и на части телефонов вместо него пустое место */
  .lot__view--photo._can-zoom::after,
  .lot__view--plan._can-zoom::after{
    content:'';right:8px;top:8px;width:32px;height:32px;padding:0;
    background:rgba(8,8,8,.7)
      url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23F1F1F1' stroke-width='1.3'%3E%3Cpath d='M6 2H2v4M10 2h4v4M6 14H2v-4M10 14h4v-4'/%3E%3C/svg%3E")
      center / 16px 16px no-repeat;
  }
}
.lightbox{
  position:fixed;inset:0;z-index:400;display:none;place-items:center;
  background:rgba(8,8,8,.96);padding:clamp(16px,4vw,48px);cursor:zoom-out;
}
.lightbox._is-on{display:grid}
body._lightbox{overflow:hidden}
.lightbox__fig{margin:0;max-width:100%;max-height:100%;display:flex;flex-direction:column;align-items:center;gap:12px;cursor:default}
.lightbox__fig img{max-width:100%;max-height:calc(100vh - clamp(80px,12vw,140px));width:auto;height:auto;object-fit:contain}
/* и картинку, и чертёж прячем явно: в лайтбоксе показывается что-то одно,
   иначе при листании остаток предыдущего кадра висит вторым (Артём, 23.09) */
.lightbox__fig img[hidden]{display:none}
.lightbox__fig figcaption{font-size:12px;color:var(--muted);text-align:center}
.lightbox__close{
  position:absolute;right:clamp(12px,2vw,28px);top:clamp(12px,2vw,28px);
  width:44px;height:44px;display:grid;place-items:center;
  background:var(--surface-2);color:var(--fg);font-size:26px;line-height:1;cursor:pointer;
}
.lightbox__close:hover{background:var(--terra);color:var(--light)}

.lightbox__arrow{
  position:absolute;top:50%;transform:translateY(-50%);z-index:2;display:none;
  width:48px;height:48px;place-items:center;background:var(--surface-2);color:var(--fg);font-size:18px;cursor:pointer;
}
.lightbox._is-many .lightbox__arrow{display:grid}
.lightbox__arrow--prev{left:clamp(8px,2vw,28px)}
.lightbox__arrow--next{right:clamp(8px,2vw,28px)}
.lightbox__arrow:hover{background:var(--terra);color:var(--light)}
@media (max-width:700px){.lightbox__arrow{top:auto;bottom:16px;transform:none}}
.lightbox__fig img._plan{background:var(--surface-2);padding:clamp(10px,2vw,28px)}
.lightbox__fig img._plan._svg{background:#E1E1E1;height:calc(100vh - clamp(90px,13vw,150px))}

/* ═══ СТРАНИЦЫ «О КОМПАНИИ» И «УПРАВЛЕНИЕ» (scripts/build-pages.mjs) ═══════
   Свои блоки: первый экран, путь по годам, экосистема, разворот текст+кадр,
   три довода, наблюдения, две столицы, люди, цитата, финал. Остальное —
   готовые блоки главной и страниц дома. */

/* первый экран: текст слева, кадр справа раскрывается срезом сверху вниз */
.pg-hero{
  position:relative;z-index:1;background:var(--bg);
  display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.1fr);gap:clamp(24px,4vw,80px);align-items:end;
  min-height:calc(100svh - var(--bar));padding:calc(var(--bar) + clamp(24px,3vw,48px)) var(--pad) clamp(40px,5vw,80px);
}
.pg-hero__text{display:flex;flex-direction:column;justify-content:flex-end;min-width:0}
.pg-hero__title{
  margin:clamp(18px,2vw,30px) 0 0;font-weight:300;letter-spacing:-.04em;
  font-size:clamp(34px,4.6vw,78px);line-height:1.0;
}
.pg-hero__title em{font-style:normal;color:var(--muted)}
.pg-hero__title .mask{display:block}
.pg-hero .lede{margin-top:clamp(20px,2.4vw,36px);max-width:46ch}
.pg-hero__geo{display:flex;align-items:center;gap:10px;margin:clamp(18px,2vw,30px) 0 0;font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
.pg-hero__geo i{width:7px;height:7px;border-radius:50%;background:var(--accent)}
.pg-hero__act{display:flex;flex-wrap:wrap;gap:12px;margin-top:clamp(22px,2.6vw,40px)}
.pg-hero__shot{
  /* кадр 4:3, как на «Управлении» (Артём, 17.09: «побольше») */
  margin:0;position:relative;aspect-ratio:4/3;max-height:calc(100svh - var(--bar) - clamp(64px,8vw,128px));overflow:hidden;
  clip-path:inset(0 0 100% 0);animation:pgReveal 1.4s var(--e) .2s forwards;
}
.pg-hero__shot img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;transform:scale(1.08);animation:pgZoom 2.4s var(--e) .2s forwards}
@keyframes pgReveal{to{clip-path:inset(0 0 0 0)}}
@keyframes pgZoom{to{transform:none}}

/* кредо: второй абзац отделён */
.pg-credo__second{margin-top:clamp(16px,1.8vw,26px)}

/* цифры в четыре колонки */
.dataline--four{grid-template-columns:repeat(4,1fr)}
.pg-numbers .dataline--four .cell__val{font-size:clamp(28px,3.4vw,60px);white-space:nowrap}
.pg-numbers .dataline--sub{margin-top:0}
/* цифры под первым экраном «Управления»: без своей верхней линии и линии
   следующего блока — оставалась только линия строки данных (Артём, 17.09) */
.pg-numbers--mgmt{padding-top:0;padding-bottom:clamp(40px,5vw,80px);border-top:0}
.pg-numbers--mgmt .dataline{margin-top:0}
.pg-numbers--mgmt + .manifest{border-top:0;padding-top:clamp(24px,3vw,48px)}
@media (max-width:1000px){.dataline--four{grid-template-columns:repeat(2,1fr)}}

/* путь: год закреплён слева, события едут справа */
.tl{position:relative;z-index:1;background:var(--bg);border-top:1px solid var(--hair);padding:0 var(--pad)}
.tl__stage{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.1fr);gap:clamp(24px,4vw,90px);align-items:start}
.tl__side{position:sticky;top:0;height:100svh;display:flex;flex-direction:column;justify-content:center;gap:clamp(14px,1.6vw,24px)}
.tl__year{margin:0;font-weight:300;letter-spacing:-.05em;font-size:clamp(96px,16vw,260px);line-height:.9;color:var(--fg);font-variant-numeric:tabular-nums;transition:opacity .3s var(--e)}
.tl__year._is-swap{opacity:0}
/* «сегодня» длиннее года и залезало на колонку событий — кегль по ширине колонки */
.tl__year._is-word{font-size:clamp(56px,7.6vw,132px);line-height:1;letter-spacing:-.03em}
.tl__lead{margin:0;max-width:40ch;font-size:clamp(14px,1.15vw,18px);line-height:1.5;color:var(--muted)}
.tl__list{list-style:none;margin:0;padding:38svh 0 45svh}
.tl__item{position:relative;padding:clamp(24px,3vw,44px) 0 clamp(24px,3vw,44px) clamp(24px,3vw,48px);border-top:1px solid var(--hair);opacity:.35;transition:opacity .5s var(--e)}
.tl__item._is-on{opacity:1}
.tl__item::before{content:'';position:absolute;left:0;top:calc(clamp(24px,3vw,44px) + .55em);width:8px;height:8px;background:var(--hair);transition:background .4s var(--e)}
.tl__item._is-on::before{background:var(--accent)}
.tl__y{display:block;font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);margin-bottom:10px}
.tl__item p{margin:0;font-size:clamp(17px,1.6vw,26px);line-height:1.35;font-weight:300;max-width:34ch}
.tl__item--credo{border-top:0}
.tl__item--credo::before{display:none}
.tl__credo{color:var(--fg);font-size:clamp(20px,2vw,32px) !important}

/* экосистема: четыре панели, под курсором панель шире */
.eco{position:relative;z-index:1;background:var(--bg);border-top:1px solid var(--hair);padding:var(--sec-pt) var(--pad) var(--sec-pb)}
.eco__head{max-width:min(1180px,92vw);margin-bottom:clamp(28px,3.4vw,54px)}
.eco__row{display:flex;gap:6px;height:clamp(420px,62vh,640px)}
.eco__i{
  position:relative;flex:1;min-width:0;overflow:hidden;background:var(--surface);
  transition:flex .8s var(--e);color:var(--fg);
}
.eco__i:hover{flex:2.2}
.eco__i img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;filter:brightness(.6) grayscale(.15);transition:filter .8s var(--e),transform 1.2s var(--e)}
.eco__i:hover img{filter:brightness(.82) grayscale(0);transform:scale(1.04)}
.eco__body{position:absolute;left:0;right:0;bottom:0;padding:clamp(16px,2vw,30px);background:linear-gradient(180deg,rgba(8,8,8,0),rgba(8,8,8,.82) 55%)}
.eco__k{display:block;font-size:clamp(20px,2vw,32px);font-weight:300;letter-spacing:-.02em;margin-bottom:10px}
.eco__body p{margin:0;font-size:13px;line-height:1.5;color:rgba(241,241,241,.8);max-width:34ch;max-height:0;opacity:0;overflow:hidden;transition:max-height .8s var(--e),opacity .6s var(--e) .15s}
.eco__i:hover .eco__body p{max-height:200px;opacity:1}
.eco__credo{margin:clamp(28px,3vw,48px) 0 0;font-size:clamp(18px,1.8vw,28px);font-weight:300;letter-spacing:-.02em;max-width:40ch}
@media (max-width:900px){
  .eco__row{flex-direction:column;height:auto}
  .eco__i{flex:none;aspect-ratio:16/9}
  .eco__i:hover{flex:none}
  .eco__body p{max-height:none;opacity:1}
}

/* разворот: кадр и текст */
.pg-split{
  position:relative;z-index:1;background:var(--bg);border-top:1px solid var(--hair);
  display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:clamp(24px,5vw,100px);align-items:center;
  padding:var(--sec-pt) var(--pad) var(--sec-pb);
}
.pg-split__shot{margin:0;aspect-ratio:4/3;overflow:hidden}
.pg-split__shot img{width:100%;height:100%;object-fit:cover}
.pg-split__text .lede{margin-top:clamp(18px,2vw,30px)}
.pg-split--flip{grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);align-items:start}   /* цифры начинаются на уровне заголовка (30.09) */
.pg-split__facts{display:grid;gap:clamp(20px,2.4vw,40px)}
.pg-split__facts .cell__val{font-size:clamp(40px,5vw,88px)}

/* три довода */
.trio{position:relative;z-index:1;background:var(--bg);display:grid;grid-template-columns:repeat(3,1fr);gap:1px;padding:0 var(--pad) var(--sec-pb);border-top:1px solid var(--hair)}
.trio__i{padding:clamp(24px,3vw,48px) clamp(18px,2vw,36px) 0;border-left:1px solid var(--hair)}
.trio__i:first-child{border-left:0;padding-left:0}
.trio__k{display:block;font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);margin-bottom:14px}
.trio__i p{margin:0;font-size:clamp(17px,1.6vw,26px);font-weight:300;line-height:1.35;letter-spacing:-.01em}

/* наблюдения: заголовок слева закреплён, строки справа */
.insight{
  position:relative;z-index:1;background:var(--bg);border-top:1px solid var(--hair);
  display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:clamp(24px,5vw,100px);
  padding:var(--sec-pt) var(--pad) var(--sec-pb);align-items:start;
}
.insight__side{position:sticky;top:calc(var(--bar) + 24px)}
.insight__side .lede{margin-top:clamp(18px,2vw,30px)}
.insight__side .btn{margin-top:clamp(20px,2.4vw,36px)}
.insight__list{list-style:none;margin:0;padding:0}
.insight__list li{padding:clamp(18px,2.2vw,34px) 0;border-top:1px solid var(--hair);font-size:clamp(20px,2.4vw,40px);font-weight:300;letter-spacing:-.02em;line-height:1.15}
.insight__list li:first-child{border-top:0;padding-top:0}
.insight__sum{color:var(--muted);font-size:clamp(16px,1.4vw,22px) !important;line-height:1.4 !important}

/* две столицы */
.cities{position:relative;z-index:1;background:var(--bg);border-top:1px solid var(--hair);padding:var(--sec-pt) var(--pad) var(--sec-pb)}
.cities__head{max-width:min(1180px,92vw);margin-bottom:clamp(28px,3.4vw,54px)}
.cities__row{display:grid;grid-template-columns:1fr 1fr;gap:clamp(6px,1vw,16px)}
.cities__i{position:relative;overflow:hidden;aspect-ratio:4/3;background:var(--surface)}
.cities__i img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;filter:brightness(.72);transition:transform 1.2s var(--e),filter .8s var(--e)}
.cities__i:hover img{transform:scale(1.04);filter:brightness(.85)}
.cities__body{position:absolute;left:0;right:0;bottom:0;padding:clamp(18px,2.4vw,40px);background:linear-gradient(180deg,rgba(8,8,8,0),rgba(8,8,8,.85) 60%)}
.cities__body h3{margin:0 0 10px;font-weight:300;font-size:clamp(24px,2.6vw,42px);letter-spacing:-.03em}
.cities__body p{margin:0;max-width:44ch;font-size:clamp(13px,1.05vw,16px);line-height:1.5;color:rgba(241,241,241,.85)}

/* люди */
.people{
  position:relative;z-index:1;background:var(--bg);border-top:1px solid var(--hair);
  display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);gap:clamp(24px,5vw,100px);align-items:center;
  padding:var(--sec-pt) var(--pad) var(--sec-pb);
}
.people__text .lede{margin-top:clamp(18px,2vw,30px)}
.people__ceo{margin:0;max-width:380px;justify-self:end}
.people__ceo img{width:100%;height:auto;aspect-ratio:3/4;object-fit:cover;filter:grayscale(.2) brightness(.92)}
.people__ceo figcaption{display:flex;flex-direction:column;gap:5px;margin-top:14px}

/* цитата */
.quote{position:relative;z-index:1;background:var(--bg);border-top:1px solid var(--hair);padding:var(--sec-pt) var(--pad) var(--sec-pb);max-width:none}
.quote__text{margin:clamp(20px,2.4vw,36px) 0 0;max-width:min(1100px,92vw)}
.quote__text p{margin:0 0 clamp(16px,1.8vw,26px);font-size:clamp(20px,2.4vw,40px);font-weight:300;line-height:1.25;letter-spacing:-.02em}
.quote__author{display:flex;flex-direction:column;gap:5px;margin:clamp(20px,2.4vw,36px) 0 0}

/* финал: манифест на кадре */
.final{position:relative;z-index:1;min-height:min(90svh,860px);display:grid;align-items:end;overflow:hidden;background:var(--bg);border-top:1px solid var(--hair)}
.final__shot{position:absolute;inset:0;margin:0}
.final__shot img{width:100%;height:100%;object-fit:cover;filter:brightness(.55)}
.final__shot::after{content:'';position:absolute;inset:0;background:linear-gradient(180deg,rgba(8,8,8,.1),rgba(8,8,8,.75) 70%)}
.final__text{position:relative;padding:clamp(40px,6vw,100px) var(--pad);max-width:min(1100px,92vw)}
.final__title{margin:clamp(14px,1.6vw,24px) 0 0;font-weight:300;letter-spacing:-.04em;font-size:clamp(30px,4.2vw,70px);line-height:1.02}
.final__title em{font-style:normal;color:var(--muted)}
.final__title .mask{display:block}
.final__sub{margin:clamp(16px,1.8vw,26px) 0 clamp(22px,2.6vw,40px);font-size:clamp(13px,1.1vw,17px);color:rgba(241,241,241,.8)}
.final__act{display:flex;flex-wrap:wrap;align-items:center;gap:14px 24px}

/* собственнику: сетка обязанностей */
.owner{position:relative;z-index:1;background:var(--bg);border-top:1px solid var(--hair);padding:var(--sec-pt) var(--pad) var(--sec-pb)}
.owner__head{max-width:min(1180px,92vw);margin-bottom:clamp(28px,3.4vw,54px)}
.owner__grid{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--hair);border:1px solid var(--hair)}
.owner__grid li{background:var(--bg);padding:clamp(22px,2.6vw,44px) clamp(16px,1.8vw,30px);font-size:clamp(16px,1.5vw,24px);font-weight:300;letter-spacing:-.01em}
.owner__grid li span{display:block}
.owner__credo{margin:clamp(28px,3vw,48px) 0 0;font-size:clamp(20px,2vw,32px);font-weight:300;letter-spacing:-.02em;max-width:36ch}
/* восемь тактов истории — больше прокрутки */
.story--long{height:760svh}
@media (max-width:1000px){.owner__grid{grid-template-columns:repeat(2,1fr)}}

@media (max-width:900px){
  .pg-hero,.pg-split,.pg-split--flip,.insight,.people{grid-template-columns:1fr}
  .pg-hero{min-height:0;align-items:start}
  .pg-hero__shot{aspect-ratio:4/3;max-height:none}
  .pg-split__shot{order:-1}
  .pg-split--flip .pg-split__facts{grid-template-columns:1fr 1fr}
  .tl__stage{grid-template-columns:1fr}
  /* телефон: крупный год закреплён под шапкой, события проезжают под ним */
  .tl__stage{gap:0;padding-top:var(--sec-pt)}
  .tl__side{display:contents}
  .tl__year{font-size:clamp(72px,22vw,120px);position:sticky;top:var(--bar);z-index:2;background:var(--bg);padding:14px 0 12px;margin:0 calc(var(--pad) * -1);padding-inline:var(--pad);border-bottom:1px solid var(--hair)}
  .tl__lead{padding:14px 0 6px}
  /* при смене года гаснет только цифра, плашка с фоном стоит на месте */
  .tl__year{transition:color .3s var(--e)}
  .tl__year._is-swap{opacity:1;color:transparent}
  /* мелкий год дублировал крупный — на телефоне только крупный */
  .tl__y{display:none}
  .tl__list{padding:10px 0 var(--sec-pb)}
  .insight__side{position:static}
  .trio{grid-template-columns:1fr}
  .trio__i{border-left:0;padding-left:0}
  .cities__row{grid-template-columns:1fr}
  .people__ceo{justify-self:start}
  .final__act .ghost{margin-left:0}
}


/* ссылка «назад» на страницах дома и лота — только на телефоне вместо крошек */
.back{display:none}

/* ── всплывающая заявка ── */
.modal{
  position:fixed;inset:0;z-index:420;display:grid;place-items:center;padding:clamp(12px,3vw,32px);
  background:rgba(8,8,8,.78);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
  opacity:0;visibility:hidden;transition:opacity .35s var(--e),visibility .35s;
}
.modal._is-on{opacity:1;visibility:visible}
body._modal{overflow:hidden}
.modal__panel{
  position:relative;width:min(560px,100%);max-height:100%;overflow:auto;
  background:var(--graphite);border:1px solid var(--hair);padding:clamp(24px,3vw,44px);
  transform:translateY(24px);transition:transform .45s var(--e);
}
.modal._is-on .modal__panel{transform:none}
.modal__close{
  position:absolute;right:12px;top:12px;width:40px;height:40px;display:grid;place-items:center;
  background:var(--surface-2);color:var(--fg);font-size:24px;line-height:1;cursor:pointer;
}
.modal__close:hover{background:var(--terra);color:var(--light)}
.modal__form{opacity:1;transform:none}
/* подпись объекта («Заявка · Смарт-квартира, 16 м² · адрес») не заходит
   под кнопку закрытия: справа поле на её ширину, длинная — переносится (Артём, 17.09) */
.modal__form .fin__head{padding-right:64px;overflow-wrap:anywhere}
.modal__form .fin__title{margin-top:10px;font-size:clamp(22px,2.2vw,34px)}
.modal__form .fin__title span{display:block}
.modal__form .fin__note{margin:12px 0 clamp(18px,2vw,28px)}
.modal .field__input{color:var(--fg)}
@media (max-width:700px){
  .modal{padding:0;align-items:end}
  .modal__panel{width:100%;max-height:92svh;border-left:0;border-right:0;border-bottom:0;padding:22px var(--pad) calc(22px + env(safe-area-inset-bottom))}
}

/* длинное кредо (страница «Управление») — в несколько строк по правому краю,
   а не одной строкой во всю ширину (Артём, 17.09) */
.pg-credo .credo{white-space:normal;max-width:34ch;line-height:1.4;justify-self:end}
.owner__grid li.owner__credo-cell{color:var(--accent);font-size:clamp(15px,1.3vw,21px);line-height:1.35}


/* ══ ПЕРВЫЙ ЭКРАН ДОМА: текст сверху, кадр из-под маски (Артём, 17.09) ══
   Прежний слайдер поверх фото остался в разметке страниц дома закомментированным
   и в css выше — откат см. scripts/build-houses.mjs, HERO_LAYOUT.
   Механика: .hero-run даёт экран прокрутки, внутри sticky-экран; --leave
   (main.js) растит маску .hero__photo от остатка экрана до полного, сам кадр
   стоит во весь экран и не масштабируется. Текст на кадре не лежит —
   ни вуали, ни фильтра. */
.hero-run{height:200svh;position:relative;z-index:0}
.hero--mask{
  position:sticky;top:0;height:100svh;min-height:0;
  transform:none;                        /* параллакс ухода не нужен: держит маска */
  --th:calc(56svh - var(--bar));
  padding-top:calc(var(--bar) + 1px);
}
.hero--mask .hero__top{
  position:relative;z-index:1;
  height:var(--th);
  display:grid;grid-template-columns:7fr 5fr;
  opacity:calc(1 - var(--leave,0) * 1.1);   /* гаснет, когда его накрывает кадр */
}
.hero--mask .hero__lead{
  justify-content:flex-start;
  padding:clamp(20px,2.4vw,36px) var(--pad) clamp(22px,2.6vw,40px);
  border-right:1px solid var(--hair);
}
.hero--mask .obj-hero__crumbs{
  margin:0;font-size:12px;letter-spacing:.14em;line-height:1.6;
  color:rgba(241,241,241,.78);
}
.hero--mask .obj-hero__crumbs a{border-bottom-color:rgba(241,241,241,.3)}
.hero--mask .obj-hero__crumbs a:hover{color:var(--accent);border-color:var(--accent)}
.hero--mask .hero__title{
  margin-top:auto;
  font-size:clamp(28px,3.6vw,62px);
  text-shadow:none;
}
/* подстрочник под адресом: продукт или довод, мелким кеглем */
.hero--mask .hero__sub{
  margin-top:clamp(10px,1.1vw,18px);
  font-family:"Manrope",sans-serif;font-weight:300;
  font-size:clamp(14px,1.2vw,19px);line-height:1.35;letter-spacing:0;
  color:var(--muted);
}
.hero--mask .hero__aside{display:flex;flex-direction:column;min-width:0}
/* вместо слов-переключателей — числа 01–03, у активного бежит полоса */
.switch--nums{
  display:flex;gap:clamp(18px,2vw,32px);border:0;
  padding:clamp(14px,1.6vw,24px) var(--pad) 0;
}
.switch--nums .switch__item{
  min-height:0;min-width:clamp(44px,4vw,64px);padding:0 0 10px;border:0;
  font-family:"Manrope",sans-serif;font-weight:400;
  font-size:10.5px;letter-spacing:.14em;line-height:1;
  color:var(--muted);text-shadow:none;
  font-variant-numeric:tabular-nums;
}
.switch--nums .switch__item::after{height:1px;bottom:0;background:var(--hair);transform:none}
.switch--nums .switch__item._is-active{color:var(--fg)}
.switch--nums .switch__item._is-active::after{background:var(--accent);transform-origin:left}
.hero--mask .panels{margin-top:auto;border-top:1px solid var(--hair)}
.hero--mask .panel{width:50%;border-left:0;text-shadow:none}
.hero--mask .panel + .panel{border-left:1px solid var(--hair)}
.hero--mask .panel__num{font-size:clamp(34px,3.4vw,52px)}
.hero--mask .panel__sub{min-height:0}
.hero--mask .hero__geo{
  /* поля как у панелей с цифрами (20px): точка и координаты стоят
     по одной вертикали с подписями и стрелками (Артём, 17.09) */
  width:auto;padding:14px 20px;
  border-top:1px solid var(--hair);
  position:relative;
}
/* координаты — от левого края второй панели, по одной вертикали с её цифрами;
   разделитель продолжает линию между панелями (Артём, 17.09) */
.hero--mask .hero__geo-num{
  --pad-l:20px;
  position:absolute;left:50%;top:0;bottom:0;margin-left:0;
  display:flex;align-items:center;
  padding-left:var(--pad-l);border-left:1px solid var(--hair);
}
/* маска: растёт от остатка экрана под текстом до полного экрана */
.hero--mask .hero__photo{
  position:absolute;left:0;right:0;bottom:0;z-index:2;overflow:hidden;
  height:calc(100svh - var(--bar) - var(--th) + var(--leave,0) * (var(--th) + var(--bar)));
  border-top:1px solid var(--hair);
}
/* кадр стоит на месте во весь экран, маска только открывает его */
.hero--mask .hero__stage{top:auto;bottom:0;height:100svh}
.hero--mask .hero__stage::after,.hero--mask .hero__veil,.hero--mask .hero__dim{display:none}
.hero--mask .shot img{filter:none}

/* ═══════════════════════════════════════════════════════════════
   СТРАНИЦЫ «АГЕНТАМ», «ВЫКУП ОБЪЕКТОВ», «СЛУЖБА ЗАБОТЫ» (18.09.2026)
   Тексты клиента. Блоки собраны на тех же приёмах, что «О компании»
   и «Управление»: заголовок с масками, сетка с волосяными линиями,
   финальный экран с кадром на весь экран.
   ═══════════════════════════════════════════════════════════════ */

/* кнопка прямо в первом экране страницы-раздела */
.pg-hero__act{margin:clamp(18px,2.2vw,32px) 0 0}

/* сетка доводов: 3 колонки на десктопе, 2 на планшете, 1 на телефоне */
.why{position:relative;z-index:1;background:var(--bg);border-top:1px solid var(--hair);
  padding:var(--sec-pt) var(--pad) var(--sec-pb)}
.why__head{max-width:min(1180px,92vw);margin-bottom:clamp(26px,3.2vw,50px)}
.why__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--hair)}
.why__i{background:var(--bg);padding:clamp(22px,2.6vw,40px) clamp(18px,2vw,32px)}
.why__k{display:block;font-family:Onest,sans-serif;font-size:clamp(17px,1.5vw,21px);
  font-weight:400;letter-spacing:-.01em;margin-bottom:10px}
.why__i p{margin:0;font-size:14px;line-height:1.55;color:var(--muted)}
/* на планшете две колонки, на телефоне одна — иначе сетка распирает экран */
@media (max-width:900px){ .why__grid{grid-template-columns:repeat(2,1fr)} }
@media (max-width:620px){ .why__grid{grid-template-columns:1fr} }

/* контакты раздела в карточке офиса у формы заявки: партнёрские продажи,
   выкуп объектов, служба заботы. Отдельной полосой смотрелось мелко
   и чужеродно (Артём 18.09) — перенесено сюда, к адресу и часам. */
.sales__dept{margin-top:clamp(16px,1.8vw,26px);padding-top:clamp(14px,1.6vw,22px);
  border-top:1px solid var(--hair)}
.sales__dept-k{display:block;font-size:11px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--muted);margin-bottom:8px}
.sales__dept-v{display:block;font-family:Onest,sans-serif;font-size:clamp(19px,1.7vw,24px);
  font-weight:300;letter-spacing:-.02em;color:var(--fg);text-decoration:none;
  transition:color .5s var(--e)}
.sales__dept-v:hover{color:var(--accent)}
.sales__dept-tg{display:inline-block;margin-top:8px;font-size:14px;color:var(--accent);
  text-decoration:none;border-bottom:1px solid rgba(179,101,66,.35);padding-bottom:1px}
.sales__dept-sub{display:block;margin-top:8px;font-size:13px;color:var(--muted)}

/* шесть панелей доводов на странице агентов: подписи длиннее, чем
   в экосистеме на четыре панели, поэтому кегль мельче и перенос разрешён */
.eco--why .eco__k{font-size:clamp(15px,1.15vw,19px);line-height:1.18;margin-bottom:8px;
  hyphens:auto;overflow-wrap:anywhere}
.eco--why .eco__body p{font-size:12.5px}
.eco--why .eco__i{flex:1}
.eco--why .eco__i:hover{flex:2.6}
/* Штатное правило .eco на ≤900px ставит колонку, и flex-basis начинает
   считаться от высоты — панели схлопывались в ноль. Поэтому здесь явно
   возвращаем строку: на планшете две панели в ряд, на телефоне одна. */
@media (max-width:900px){
  .eco--why .eco__row{flex-direction:row;flex-wrap:wrap;height:auto}
  .eco--why .eco__i{flex:1 1 calc(50% - 6px);aspect-ratio:3/4;height:auto}
  .eco--why .eco__i:hover{flex:1 1 calc(50% - 6px)}
  .eco--why .eco__body p{max-height:200px;opacity:1}
}
@media (max-width:560px){
  .eco--why .eco__i,
  .eco--why .eco__i:hover{flex:1 1 100%;aspect-ratio:16/10}
}

/* ═══ «Служба заботы»: три разворота вместо мелкой сетки (Артём 18.09) ═══
   Кадр и текст во всю ширину, стороны чередуются — тот же приём, что
   в разворотах «О компании», но с номерами, как у шагов. */
.care{position:relative;z-index:1;background:var(--bg);border-top:1px solid var(--hair);
  padding:var(--sec-pt) var(--pad) var(--sec-pb)}
.care__head{max-width:min(1180px,92vw);margin-bottom:clamp(28px,3.6vw,60px)}
.care__i{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:clamp(20px,4vw,72px);align-items:center;
  padding:clamp(26px,3.2vw,52px) 0;border-top:1px solid var(--hair)}
.care__i:last-child{border-bottom:1px solid var(--hair)}
.care__i--flip .care__shot{order:2}
.care__shot{margin:0;overflow:hidden}
.care__shot img{width:100%;height:auto;display:block;
  transition:transform 1.2s var(--e)}
.care__i:hover .care__shot img{transform:scale(1.03)}
.care__n{display:block;font-family:Manrope,sans-serif;font-size:12px;letter-spacing:.16em;
  color:var(--accent);margin-bottom:clamp(12px,1.4vw,20px)}
.care__text h3{font-family:Onest,sans-serif;font-weight:300;
  font-size:clamp(23px,2.6vw,40px);letter-spacing:-.025em;line-height:1.1;margin:0 0 14px}
.care__text p{margin:0;color:var(--muted);max-width:46ch;
  font-size:clamp(14px,1.05vw,16px);line-height:1.6}
@media (max-width:800px){
  .care__i{grid-template-columns:1fr;gap:18px}
  .care__i--flip .care__shot{order:0}
}

/* ═══ Первый экран страницы дома: больше воздуха (Артём 18.09) ═══
   Панели цифр и строка с адресом и координатами были поджаты друг
   к другу и к кадру, при том что сверху, под переключателями 01–03,
   оставалась пустота. Разводим: панели выше, строка координат просторнее. */
.hero--mask .panel{padding:clamp(22px,2.4vw,34px) 20px clamp(20px,2.2vw,30px)}
.hero--mask .panel{gap:clamp(10px,1.1vw,16px)}
.hero--mask .hero__geo{padding:clamp(18px,2vw,28px) 20px}
.hero--mask .switch--nums{padding-top:clamp(18px,2vw,30px)}

/* ссылка после ответа в блоке вопросов (страницы лота, 22.09) */
.talk__more{color:var(--accent);text-decoration:none;border-bottom:1px solid rgba(179,101,66,.5)}
.talk__more:hover{border-bottom-color:var(--accent)}

/* ==================== ПРАВКИ 22.09.2026 ==================== */
/* «Служба заботы»: нумерация 01/02/03 снята (клиент, 22.09) */
.care__n{display:none}
/* плашка «150+» в ленте реализованных (клиент, 22.09) */
.cat--total h3{font-family:Onest,sans-serif;font-weight:300;font-size:clamp(44px,4.6vw,72px);line-height:1;letter-spacing:-.05em;margin:0 0 10px}
.cat--total{background:var(--surface-2,#1c1b1a)}
/* кука-баннер (22.09): узкая полоса у нижней кромки, не перекрывает контент надолго */
/* компактная карточка в левом нижнем углу, не на всю ширину; появляется после первого экрана (Артём, 22.09) */
.cookies{
  position:fixed;left:20px;bottom:20px;z-index:90;width:min(360px,calc(100vw - 40px));
  display:flex;flex-direction:column;gap:12px;
  padding:16px 18px;background:rgba(16,16,16,.96);border:1px solid var(--hair);
  backdrop-filter:blur(10px);transform:translateY(16px);opacity:0;pointer-events:none;
  transition:transform .5s,opacity .5s;
}
.cookies._is-on{transform:none;opacity:1;pointer-events:auto}
.cookies p{margin:0;font-size:12px;line-height:1.5;color:var(--muted)}
.cookies a{color:var(--fg);text-decoration:underline;text-underline-offset:3px}
.cookies__ok{align-self:flex-start;padding:9px 16px;font-size:13px}
@media (max-width:700px){.cookies{left:10px;bottom:10px;width:calc(100vw - 20px)}}
/* подписи панелей первого экрана («Проектов», «Локация») — белым, серый не читался на кадре (Артём, 22.09) */
.panel__label{color:rgba(241,241,241,.92)}
.panel header i{color:rgba(241,241,241,.7)}
/* пояснение под шкалой окупаемости (22.09) */
.tape__note{margin:clamp(8px,.8vw,12px) 0 0;font-size:clamp(11px,.85vw,13px);line-height:1.5;color:var(--muted);max-width:52ch}
/* «Метр стоит» и сумма — в одну строку, компактнее (Артём, 22.09) */
.metres__pair{margin-top:clamp(14px,1.6vw,22px);padding-top:clamp(12px,1.3vw,18px)}
.metres__one{flex-direction:row;align-items:baseline;justify-content:space-between;gap:12px}
.metres__one .calc__label{margin:0}
.metres__one .metres__val{font-size:clamp(20px,1.9vw,30px)}
/* описание при наведении — не выше места, которое освобождает снимок: иначе карточка
   растёт и весь ряд дёргается (Артём, 22.09). Две строки помещаются при любой ширине. */
.cat__drop p{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
/* Дёрганье ряда при наведении (Артём, 22.09): фото сжималось по aspect-ratio, а описание
   раскрывалось по своей высоте — в каждый кадр анимации суммы не совпадали, карточка
   меняла высоту, и соседи по ряду подстраивались. Теперь обе высоты считаются от ширины
   карточки (cqw): фото 100 → 80, описание 0 → 20, сумма постоянна в любой момент. */
.cat{container-type:inline-size}
.cat__img{aspect-ratio:auto;height:100cqw;transition:height .45s var(--e)}
.cat:hover .cat__img,.cat:focus-within .cat__img{aspect-ratio:auto;height:80cqw}
.cat__drop{display:block;height:0;overflow:hidden;transition:height .45s var(--e),opacity .3s var(--e)}
.cat:hover .cat__drop,.cat:focus-within .cat__drop{height:20cqw;opacity:1}
.cat__drop p{padding-top:9px}
.cat:hover .cat__drop p,.cat:focus-within .cat__drop p{padding-top:9px}
.cat--promo{container-type:normal}

/* ==================== О КОМПАНИИ — КРЕДО И КОМАНДА (22.09, вечер) ==================== */
/* кредо: текст слева, кадр справа во всю силу, без вуали */
.pg-credo--split{display:grid;grid-template-columns:1fr 1fr;gap:clamp(24px,4vw,72px);align-items:center}
.pg-credo--split .manifest__head,.pg-credo--split .manifest__foot{grid-column:1}
.pg-credo--split .manifest__foot{margin-top:clamp(20px,2.4vw,36px)}
.pg-credo__shot{grid-column:2;grid-row:1/3;margin:0;aspect-ratio:4/5;overflow:hidden}
.pg-credo__shot img{width:100%;height:100%;object-fit:cover}
@media (max-width:900px){.pg-credo--split{grid-template-columns:1fr}.pg-credo__shot{grid-column:1;grid-row:auto;aspect-ratio:16/10}}
/* команда: лента крупных портретов со стрелками, как лента каталога */
.team{padding:var(--sec-pt) 0 var(--sec-pb);background:var(--bg);overflow:hidden}
.team__head{display:flex;align-items:flex-end;justify-content:space-between;gap:24px;padding:0 var(--pad);margin-bottom:clamp(24px,3vw,44px)}
.team__arrows{margin-top:0}
/* scroll-snap прилипает к началу контейнера и съедает отступ трека —
   первая карточка вставала вплотную к краю (Артём, 23.09) */
.team__rail{overflow-x:auto;scroll-snap-type:x mandatory;scroll-padding-left:var(--pad);scrollbar-width:none;-ms-overflow-style:none}
.team__rail::-webkit-scrollbar{display:none}
.team__track{list-style:none;margin:0;padding:0 var(--pad);display:flex;gap:clamp(14px,1.6vw,28px);width:max-content}
.team__i{flex:none;width:clamp(240px,22vw,320px);scroll-snap-align:start;display:flex;flex-direction:column;gap:6px}
/* ── карточка сотрудника ──
   Подпись лежит НЕ на фотографии, а на своей полосе под ней: сплошной
   тёмный фон, никаких градиентов — размытый край читался как брак печати
   (Артём, 23.09). Высота полосы заложена в карточку отступом снизу,
   поэтому при наведении полоса растёт вверх и наезжает на кадр, а сама
   карточка не меняет размер и соседей не двигает. */
.team__shot{
  position:relative;overflow:hidden;isolation:isolate;
  --cap:clamp(76px,6vw,96px);
  padding-bottom:var(--cap);background:var(--card);
  /* карточку не масштабируем: при дробном scale её левый край попадал
     между пикселями и вдоль полосы просвечивала фотография (Артём, 23.09).
     Движение даёт наезд самого кадра внутри. */
  transition:box-shadow .7s var(--e);
}
.team__i:hover .team__shot,
.team__i:focus-visible .team__shot,
.team__i._is-open .team__shot{box-shadow:0 18px 50px rgba(0,0,0,.45)}
.team__i picture,.team__i img{
  display:block;width:100%;aspect-ratio:3/4;object-fit:cover;
  filter:grayscale(.15) brightness(.94);
  transform-origin:50% 40%;
  transition:filter .5s var(--e),transform .8s var(--e);
}
/* кадр медленно наезжает, текст выходит быстрее — движение читается как одно */
.team__i:hover img,.team__i:focus-visible img,.team__i._is-open img{filter:none;transform:scale(1.05)}

/* ── мини-интервью (Анастасия, Figma 23.09) ── */
.team__intro{
  /* на пиксель за край: карточка под курсором масштабируется, и на
     дробных координатах между полосой и кадром просвечивала фотография
     (Артём, 23.09). Лишнее срезает overflow:hidden у .team__shot */
  position:absolute;inset:auto -2px -2px -2px;
  display:flex;flex-direction:column;justify-content:flex-end;gap:3px;
  min-height:var(--cap);
  padding:clamp(12px,1.1vw,18px) clamp(14px,1.4vw,22px) clamp(14px,1.3vw,20px);
  /* фон один и тот же в покое и под курсором — просто чуть светлее
     страницы, чтобы полоса не сливалась с фоном (Артём, 23.09) */
  background:var(--card);
  transition:padding-top .5s var(--e);
}
.team__i:hover .team__intro,
.team__i:focus-visible .team__intro,
.team__i._is-open .team__intro{padding-top:clamp(18px,1.6vw,26px)}
.team__intro .team__name{margin:0;font-size:clamp(14px,1.1vw,17px);line-height:1.3;color:var(--light)}
.team__intro .team__role{
  font-size:clamp(11px,.9vw,13px);line-height:1.4;color:var(--muted);
}
/* реплика схлопнута по высоте — полоса растёт вверх плавно */
.team__q,.team__intro .team__a{
  max-height:0;opacity:0;overflow:hidden;margin:0;transform:translateY(14px);
  transition:max-height .55s var(--e),opacity .4s var(--e),margin .55s var(--e),transform .55s var(--e);
}
/* ответ трогается чуть позже вопроса — текст «разворачивается», а не возникает */
.team__intro .team__a{transition-delay:.08s}
.team__q{
  font-size:clamp(10px,.8vw,11.5px);letter-spacing:.05em;text-transform:uppercase;
  color:var(--accent);
}
.team__intro .team__a{
  font-family:"Onest",system-ui,sans-serif;font-weight:300;
  font-size:clamp(13px,1.05vw,15.5px);line-height:1.35;letter-spacing:-.01em;color:var(--light);
}
.team__i:hover .team__q,
.team__i:focus-visible .team__q,
.team__i._is-open .team__q{max-height:44px;opacity:1;margin-top:11px;transform:none}
.team__i:hover .team__intro .team__a,
.team__i:focus-visible .team__intro .team__a,
.team__i._is-open .team__intro .team__a{max-height:140px;opacity:1;transform:none}

/* кому движение мешает — только проявление, без наездов и сдвигов */
@media (prefers-reduced-motion:reduce){
  .team__i img{transition:filter .3s linear}
  .team__i:hover img{transform:none}
  .team__shot,.team__i:hover .team__shot{transform:none;transition:none}
  .team__q,.team__intro .team__a{transform:none;transition:opacity .2s linear,max-height .2s linear}
}

@media (hover:none){
  .team__i{cursor:pointer}
  /* подсказка, что карточка раскрывается: плюс в верхнем правом углу */
  .team__shot::after{
    content:'';position:absolute;right:10px;top:10px;width:26px;height:26px;
    background:rgba(8,8,8,.6) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23F1F1F1' stroke-width='1.4'%3E%3Cpath d='M8 3v10M3 8h10'/%3E%3C/svg%3E") center / 13px 13px no-repeat;
    opacity:.9;transition:opacity .3s var(--e);
  }
  .team__i._is-open .team__shot::after{opacity:0}
}
.team__name{margin-top:12px;font-size:clamp(15px,1.15vw,18px);line-height:1.3;color:var(--fg)}
.team__role{font-size:clamp(12px,.95vw,14px);line-height:1.4;color:var(--muted)}

/* кредо: текст двумя колонками, кадр раскрывается из маски на весь экран по скроллу (22.09) */
.pg-credo--reveal{display:block;padding-bottom:0}
.pg-credo__row{display:grid;grid-template-columns:1fr 1fr;gap:clamp(24px,4vw,72px);align-items:end;margin-bottom:clamp(28px,4vw,64px)}
.pg-credo__row .manifest__foot{margin-top:0}
.reveal-run{height:180svh;position:relative;margin:0 calc(-1 * var(--pad))}
.reveal-stage{position:sticky;top:0;height:100svh;margin:0;display:grid;place-items:center;overflow:hidden}
/* --p 0 → 1: маска растёт от узкого окна в центре до всего экрана; кадр стоит на месте */
.reveal-mask{
  width:calc(56% + var(--p,0) * 44%);height:calc(46svh + var(--p,0) * 54svh);
  overflow:hidden;position:relative;
}
.reveal-mask img{position:absolute;left:50%;top:50%;width:100vw;height:100svh;transform:translate(-50%,-50%);object-fit:cover}
@media (max-width:900px){.pg-credo__row{grid-template-columns:1fr}.reveal-mask{width:calc(84% + var(--p,0) * 16%)}}

/* кредо, вариант 3 (22.09): три вертикальных кадра лентой, параллакс по скроллу */
.pg-credo--strip{display:block}
.credo-strip{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(14px,1.6vw,28px);align-items:start;padding-top:clamp(8px,1vw,16px)}
.credo-strip__i{margin:0;aspect-ratio:3/4;overflow:hidden;transform:translateY(var(--y,0));will-change:transform}
.credo-strip__i:nth-child(2){margin-top:clamp(40px,6vw,96px)}
.credo-strip__i:nth-child(3){margin-top:clamp(16px,3vw,48px)}
.credo-strip__i img{width:100%;height:100%;object-fit:cover;filter:grayscale(.1) brightness(.96)}
@media (max-width:700px){.credo-strip{grid-template-columns:1fr 1fr}.credo-strip__i:nth-child(3){display:none}}
/* кредо: заголовок и абзац по верхнему краю (Артём, 22.09) */
.pg-credo__row{align-items:start}
.pg-credo__row .manifest__foot .lede{margin-top:0}
/* кредо: надзаголовок над всей строкой, заголовок и абзац начинаются с одной линии (22.09) */
.pg-credo__row .say{margin-top:0}
.pg-credo__row .manifest__foot{display:block;padding-bottom:0}
.pg-credo__row .lede{margin:0;padding-top:.35em}

/* ==================== СТАТЬ ЧАСТЬЮ КОМАНДЫ (22.09) ==================== */
.vac{padding:var(--sec-pt) var(--pad) var(--sec-pb);background:var(--bg)}
.vac__head{margin-bottom:clamp(24px,3vw,44px)}
.vac__list{list-style:none;margin:0;padding:0;border-top:1px solid var(--hair)}
.vac__i{display:grid;grid-template-columns:1fr auto auto;gap:clamp(16px,3vw,48px);align-items:center;padding:clamp(16px,1.8vw,26px) 0;border-bottom:1px solid var(--hair)}
.vac__title{font-size:clamp(17px,1.5vw,24px);font-weight:300;color:var(--fg)}
.vac__meta{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
.vac__go{color:var(--accent);text-decoration:none;white-space:nowrap;border-bottom:1px solid rgba(179,101,66,.5)}
.vac__go:hover{border-bottom-color:var(--accent)}
@media (max-width:700px){.vac__i{grid-template-columns:1fr;gap:6px}}
/* Панель заявки в подвале: длинная форма (HR — 6 полей) не помещалась в экран и резала
   кнопку (Артём, 22.09). Панель прокручивается внутри себя, тонкая полоса в цвет линий,
   форма прижата к верху, когда не влезает, и по центру, когда влезает. */
/* внутренняя прокрутка панели — только на десктопе: на телефоне она ловила касание и страница дальше не листалась (Артём, 22.09) */
@media (min-width:701px){.fin__panel{justify-content:safe center;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:rgba(241,241,241,.22) transparent}}
.fin__panel::-webkit-scrollbar{width:4px}
.fin__panel::-webkit-scrollbar-thumb{background:rgba(241,241,241,.22);border-radius:2px}
.fin__panel::-webkit-scrollbar-track{background:transparent}
.fin__panel .fin__form{flex:none}
/* бронь на карточке лота (аудит 22.09) */
.tag--hold{background:var(--terra);color:var(--light);border:1px solid var(--terra)}

/* ==================== БЛОГ (22.09) ==================== */
.pg-hero--blog{grid-template-columns:1fr}
.pg-hero--blog .pg-hero__text{max-width:70ch}
.pg-hero__title--sm{font-size:clamp(28px,3.6vw,56px)}
.posts{padding:0 var(--pad) var(--sec-pb);background:var(--bg)}
.posts__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(20px,2.6vw,40px) clamp(14px,1.6vw,28px)}
.post{min-width:0}
.post--big{grid-column:1/-1;display:grid}
.post--big .post__link{display:grid;grid-template-columns:1.4fr 1fr;gap:clamp(20px,3vw,48px);align-items:end}
.post--big .post__shot{grid-row:1/5}
.post__link{display:flex;flex-direction:column;gap:10px;color:inherit;text-decoration:none}
.post__shot{margin:0;aspect-ratio:16/10;overflow:hidden}
.post__shot img{width:100%;height:100%;object-fit:cover;filter:grayscale(.12) brightness(.95);transition:transform .7s var(--e),filter .4s var(--e)}
.post__link:hover .post__shot img{transform:scale(1.03);filter:none}
.post__meta{display:flex;gap:14px;margin:6px 0 0;font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
.post__title{margin:0;font-weight:300;font-size:clamp(17px,1.5vw,24px);line-height:1.2;letter-spacing:-.02em}
.post--big .post__title{font-size:clamp(24px,2.6vw,40px)}
.post__lede{margin:0;font-size:clamp(12px,.95vw,14px);line-height:1.55;color:var(--muted);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.post--big .post__lede{-webkit-line-clamp:4}
.post__go{color:var(--accent);font-size:13px}
@media (max-width:900px){.posts__grid{grid-template-columns:1fr 1fr}.post--big .post__link{grid-template-columns:1fr}.post--big .post__shot{grid-row:auto}}
@media (max-width:600px){.posts__grid{grid-template-columns:1fr}}
/* планировка в карточке лота — целиком, с полями, на своём тёмном фоне #101010 (Артём, 22.09):
   до краёв она сливалась с соседями в кашу */
/* План в карточке не должен подлезать под плашки города и адреса,
   поэтому сверху отступ больше (Артём, 23.09) */
.cat__ph--plan{
  object-fit:contain;background:#E1E1E1;filter:none;
  padding:clamp(44px,3.6vw,54px) clamp(16px,1.8vw,26px) clamp(18px,1.8vw,26px);
}
.cat:hover .cat__ph--plan{filter:none}
/* Единое наведение для всех кнопок (Артём, 22.09): рыжая заливка, светлый текст и светлая стрелка.
   Раньше «Купить» оставляла рыжую стрелку на рыжем фоне, а призрачные кнопки («Весь каталог»)
   заливались светлым с тёмным текстом. */
.cat__act a:hover i,.btn:hover i,.btn--ghost:hover i,.promo__btn:hover i,.arrow:hover{color:var(--light)}
/* Залитые кнопки уже стоят на терракоте, и «наведение в терракоту» ничего
   не меняло — состояние выглядело мёртвым (Артём, 23.09). На наведении
   светлеем до акцентного тона, у призрачных остаётся заливка. */
.btn--ghost:hover{background:var(--terra);border-color:var(--terra);color:var(--light)}
.btn:hover{background:var(--accent);border-color:var(--accent);color:var(--light)}
.arrow:hover,.arrow:active,.arrow:focus-visible{background:var(--terra);color:var(--light);border-color:var(--terra)}
.promo__btn:hover{background:var(--accent);color:var(--light)}
/* длинные ответы в вопросах — списком мелким кеглем (Артём, 22.09) */
.talk__text--list{font-size:clamp(15px,1.25vw,20px);line-height:1.45;letter-spacing:-.01em;display:grid;gap:.6em;max-width:60ch}
.talk__text--list .ln{padding-left:1.4em;position:relative}
.talk__text--list .ln::before{content:'';position:absolute;left:0;top:.72em;width:.7em;height:1px;background:var(--accent)}
.talk__text--list .ln--head::before,.talk__text--list .ln:only-child::before{display:none}
.talk__text--list .ln--head,.talk__text--list .ln:only-child{padding-left:0}
.talk__text--list .ln--head{color:var(--muted)}


/* ==================== БЛОГ (22.09, вечер): полноэкранный кадр, разброс, шаблон статьи ==================== */
/* первый экран блога и статьи: текст на тёмном (заголовок слева, подводка и содержание справа),
   ниже — кадр во весь экран без наложенного текста (Артём, 22.09) */
.ptop{position:relative;z-index:1;background:var(--bg);display:grid;grid-template-columns:1.2fr 1fr;gap:clamp(24px,5vw,90px);align-items:end;min-height:calc(72svh - var(--bar));padding:calc(var(--bar) + clamp(24px,3vw,48px)) var(--pad) clamp(32px,4vw,64px)}
.ptop__title{margin:clamp(14px,1.6vw,24px) 0 0;font-weight:300;font-size:clamp(34px,4.6vw,78px);line-height:1.0;letter-spacing:-.04em}   /* тот же кегль, что h1 на остальных страницах */
.ptop__title em{font-style:normal;color:var(--muted)}
.ptop__title--post{font-size:clamp(28px,3.6vw,60px);line-height:1.04}
.ptop__aside{display:flex;flex-direction:column;gap:clamp(18px,2vw,30px);max-width:56ch}
.ptop__lede{margin:0;font-size:clamp(14px,1.15vw,18px);line-height:1.55;color:rgba(241,241,241,.85)}
.ptop__latest{display:flex;flex-direction:column;gap:6px;padding:16px 18px;border:1px solid var(--hair);color:inherit;text-decoration:none;transition:background .3s var(--e)}
.ptop__latest:hover{background:var(--surface)}
.ptop__latest-k{font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--accent)}
.ptop__latest-t{font-size:clamp(14px,1.1vw,17px);line-height:1.3}
.ptop__toc{margin:0;padding:0;list-style:none;counter-reset:toc;border-top:1px solid var(--hair)}
.ptop__toc li{counter-increment:toc;border-bottom:1px solid var(--hair)}
.ptop__toc a{display:grid;grid-template-columns:32px 1fr;gap:10px;padding:10px 0;color:var(--muted);text-decoration:none;font-size:clamp(13px,1vw,15px);transition:color .3s var(--e)}
.ptop__toc a::before{content:counter(toc,decimal-leading-zero);color:var(--accent);font-size:11px;letter-spacing:.08em;padding-top:2px}
.ptop__toc a:hover{color:var(--fg)}
.pshot{position:relative;z-index:1;margin:0;height:100svh;overflow:hidden;background:var(--ink)}
.pshot img{width:100%;height:100%;object-fit:cover}
@media (max-width:900px){.ptop{grid-template-columns:1fr;min-height:0;align-items:start}.pshot{height:70svh}}
/* оглавление в статье — ссылки, активный раздел подсвечен */
.art__nav a{color:inherit;text-decoration:none;transition:color .3s var(--e)}
.art__nav li._is-on{color:var(--fg)}
.art__nav li._is-on::before{background:var(--fg)}
.art__nav a:hover{color:var(--fg)}
.art__body h2{scroll-margin-top:calc(var(--bar) + 24px)}
/* разброс карточек на сетке из 12 колонок: у каждой своя колонка, ширина и сдвиг */
.scatter{padding:var(--sec-pt) var(--pad) var(--sec-pb);background:var(--bg);position:relative}
.scatter::before{content:'';position:absolute;inset:0;pointer-events:none;background:repeating-linear-gradient(90deg,var(--hair-soft) 0 1px,transparent 1px calc(100% / 12));opacity:.7}
.scatter__head{position:relative;margin-bottom:clamp(24px,3vw,48px)}
.scatter__grid{position:relative;display:grid;grid-template-columns:repeat(12,1fr);gap:clamp(56px,7vw,120px) clamp(14px,1.6vw,28px)}
/* сдвиг карточки — отступом, а не transform: иначе нижняя строка наезжала на верхнюю (Артём, 22.09) */
.scat{grid-column:var(--c) / span var(--w);margin-top:var(--y,0);min-width:0}
.scat__link{display:flex;flex-direction:column;gap:10px;color:inherit;text-decoration:none}
.scat__shot{margin:0;aspect-ratio:16/10;overflow:hidden}
.scat__shot img{width:100%;height:100%;object-fit:cover;filter:grayscale(.15) brightness(.94);transition:transform .9s var(--e),filter .4s var(--e)}
.scat__link:hover .scat__shot img{transform:scale(1.04);filter:none}
.scat__title{margin:6px 0 0;font-weight:300;font-size:clamp(18px,1.7vw,28px);line-height:1.15;letter-spacing:-.025em}
.scat[style*="--w:6"] .scat__title{font-size:clamp(22px,2.3vw,38px)}
.scat__title em{font-style:normal;color:var(--muted)}
.scat__lede{margin:0;font-size:clamp(12px,.95vw,14px);line-height:1.5;color:var(--muted);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;max-width:52ch}
.scatter--more{padding-top:clamp(40px,5vw,80px);border-top:1px solid var(--hair)}
.scatter__grid--row .scat{margin-top:0}
@media (max-width:900px){.scatter::before{display:none}.scatter__grid{grid-template-columns:1fr 1fr;row-gap:clamp(28px,5vw,48px)}.scat{grid-column:auto / span 1;margin-top:0}.scat:nth-child(3n+1){grid-column:auto / span 2}}
@media (max-width:600px){.scatter__grid{grid-template-columns:1fr}.scat,.scat:nth-child(3n+1){grid-column:auto / span 1}}
/* шаблон статьи */
.art{padding:var(--sec-pt) var(--pad) var(--sec-pb);background:var(--bg)}
.art__grid{display:grid;grid-template-columns:240px minmax(0,72ch);gap:clamp(24px,5vw,100px)}
.art__side{position:sticky;top:calc(var(--bar) + 24px);align-self:start}
.art__nav{list-style:none;margin:0 0 20px;padding:0;display:grid;gap:8px;font-size:13px;color:var(--muted)}
.art__nav li{padding-left:14px;position:relative}
.art__nav li::before{content:'';position:absolute;left:0;top:.6em;width:7px;height:1px;background:var(--accent)}
.art__src{font-size:12px;color:var(--muted)}
.art__src a,.art__foot a{color:var(--accent);text-decoration:none;border-bottom:1px solid rgba(179,101,66,.5)}
.art__lede{margin:0 0 clamp(24px,2.6vw,40px);font-size:clamp(18px,1.6vw,26px);line-height:1.35;font-weight:300;letter-spacing:-.015em;color:var(--fg)}
.art__body>p{margin:0 0 clamp(14px,1.4vw,20px);font-size:clamp(15px,1.15vw,18px);line-height:1.65;color:rgba(241,241,241,.86)}
.art__body h2{margin:clamp(28px,3vw,48px) 0 12px;font-weight:300;font-size:clamp(22px,2.2vw,36px);line-height:1.12;letter-spacing:-.025em}
.art__body h3{margin:clamp(20px,2vw,32px) 0 8px;font-weight:400;font-size:clamp(17px,1.4vw,22px)}
.art__body ul,.art__body ol{margin:0 0 clamp(16px,1.6vw,24px);padding:0 0 0 1.4em;font-size:clamp(15px,1.1vw,17px);line-height:1.6;color:rgba(241,241,241,.86)}
.art__body ul{list-style:none;padding-left:0}
.art__body ul li{position:relative;padding-left:1.4em;margin:0 0 8px}
.art__body ul li::before{content:'';position:absolute;left:0;top:.75em;width:.7em;height:1px;background:var(--accent)}
.art__body ol li{margin:0 0 8px;padding-left:.3em}
.art__body ol li::marker{color:var(--accent)}
.art__quote{margin:clamp(24px,2.8vw,44px) 0;padding:0 0 0 clamp(18px,2vw,32px);border-left:2px solid var(--terra)}
.art__quote p{margin:0 0 10px;font-family:Onest,sans-serif;font-weight:300;font-size:clamp(19px,1.8vw,30px);line-height:1.3;letter-spacing:-.02em;color:var(--fg)}
.art__quote cite{font-style:normal;font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:var(--accent)}
.art__img{margin:clamp(24px,2.8vw,44px) 0}
.art__img img{width:100%;height:auto;display:block}
.art__img figcaption{margin-top:10px;font-size:12px;line-height:1.5;color:var(--muted)}
/* «широкий» кадр остаётся в колонке текста — вылезать под липкое оглавление он не должен (Артём, 22.09) */
.art__img--wide{width:100%;margin-left:0}
.art__stats{list-style:none;margin:clamp(24px,2.8vw,44px) 0;padding:0;display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:0;border-top:1px solid var(--hair);border-bottom:1px solid var(--hair)}
.art__stats li{padding:clamp(14px,1.6vw,24px) clamp(12px,1.4vw,20px) clamp(14px,1.6vw,24px) 0;border-right:1px solid var(--hair);display:flex;flex-direction:column;gap:6px}
.art__stats li:last-child{border-right:0}
.art__stats b{font-family:Onest,sans-serif;font-weight:300;font-size:clamp(24px,2.4vw,40px);line-height:1;letter-spacing:-.04em;color:var(--fg)}
.art__stats span{font-size:12px;line-height:1.4;color:var(--muted)}
.art__note{margin:clamp(24px,2.8vw,44px) 0;padding:clamp(18px,2vw,30px);background:var(--surface-2);border-left:2px solid var(--accent)}
.art__note p{margin:0;font-size:clamp(15px,1.15vw,18px);line-height:1.55;color:var(--fg)}
.art__steps{list-style:none;margin:clamp(24px,2.8vw,44px) 0;padding:0;display:grid;gap:0;border-top:1px solid var(--hair)}
.art__steps li{display:grid;grid-template-columns:56px 1fr;gap:16px;padding:clamp(14px,1.6vw,22px) 0;border-bottom:1px solid var(--hair)}
.art__step-n{font-family:Onest,sans-serif;font-weight:300;font-size:clamp(20px,2vw,32px);color:var(--accent);letter-spacing:-.03em}
.art__steps b{display:block;font-weight:400;font-size:clamp(16px,1.3vw,20px);margin-bottom:6px}
.art__steps p{margin:0;font-size:clamp(14px,1.05vw,16px);line-height:1.55;color:var(--muted)}
.art__foot{margin:clamp(28px,3vw,48px) 0 0;padding-top:16px;border-top:1px solid var(--hair);font-size:13px;line-height:1.5;color:var(--muted)}
@media (max-width:900px){.art__grid{grid-template-columns:1fr}.art__side{position:static}}
/* документ (src/blocks/doc.tsx): на телефоне оглавление уже в первом экране — боковое не повторяем */
@media (max-width:900px){.art--doc .art__side{display:none}}
/* лента кадров внутри статьи — элемент шаблона, а не отдельный блок под статьёй (Артём, 22.09) */
.art__strip{margin:clamp(24px,2.8vw,44px) 0}
.art__strip-track{display:flex;gap:12px;overflow-x:auto;scroll-snap-type:x mandatory;scrollbar-width:none;padding-bottom:4px}
.art__strip-track::-webkit-scrollbar{display:none}
.art__strip-i{flex:none;width:min(420px,70%);margin:0;scroll-snap-align:start}
.art__strip-i img{width:100%;aspect-ratio:16/10;object-fit:cover;display:block}
.art__strip-i figcaption{margin-top:8px;font-size:12px;color:var(--muted)}
.art__strip-cap{margin-top:10px;font-size:12px;color:var(--muted)}
/* ряд цифр в статье — по сетке текста, не больше трёх в ряд (Артём, 22.09) */
.art__stats{grid-template-columns:repeat(3,1fr);width:100%;margin-left:0}
.art__stats b{white-space:nowrap;font-size:clamp(22px,2.1vw,34px)}
@media (max-width:600px){.art__stats{grid-template-columns:1fr}.art__stats li{border-right:0;border-bottom:1px solid var(--hair)}}
.art__strip-track{user-select:none;-webkit-user-select:none;touch-action:pan-x pan-y}
.art__strip-i img{pointer-events:none}

/* ══ КАРТА КАТАЛОГА ══════════════════════════════════════════════════
   Клиент (23.09) попросил показать все проекты на карте. Свёрнута по
   умолчанию: в каталоге главное — выдача, карта не должна её отодвигать. */
.cmap{margin:clamp(18px,2.4vw,30px) 0 0}
.cmap__toggle{
  display:flex;align-items:center;gap:10px;width:100%;
  padding:14px 16px;background:var(--surface);border:1px solid var(--hair);
  color:var(--fg);font-size:13px;letter-spacing:.02em;text-align:left;
  transition:background .3s var(--e),border-color .3s var(--e);
}
.cmap__toggle:hover{background:var(--surface-2);border-color:rgba(241,241,241,.24)}
.cmap__toggle i{
  width:16px;height:16px;flex:0 0 16px;position:relative;
}
/* значок — метка на карте, рисуем линиями, без шрифтовых символов */
.cmap__toggle i::before{
  content:'';position:absolute;inset:1px 3px 5px;border:1.4px solid var(--accent);
  border-radius:50% 50% 50% 50%/55% 55% 45% 45%;
}
.cmap__toggle i::after{
  content:'';position:absolute;left:50%;bottom:1px;width:1.4px;height:5px;
  margin-left:-.7px;background:var(--accent);
}
.cmap__toggle em{margin-left:auto;font-style:normal;color:var(--muted);font-size:12px}
.cmap__box{height:clamp(320px,46vh,520px);margin-top:10px;background:var(--surface)}
.cmap__box .leaflet-container{width:100%;height:100%;background:var(--ink)}

/* метка объекта: цена плашкой — как просил клиент, «в дизайне карточки» */
.cmap-pin{
  display:flex;flex-direction:column;align-items:center;gap:4px;
  transform:translate(-50%,-100%);cursor:pointer;
}
.cmap-pin__label{
  padding:5px 9px;background:rgba(8,8,8,.88);border:1px solid rgba(241,241,241,.16);
  font:500 11px/1.2 "Onest",system-ui,sans-serif;color:var(--fg);white-space:nowrap;
  transition:background .25s var(--e),border-color .25s var(--e);
}
.cmap-pin__label b{display:block;font-weight:500;color:var(--accent)}
.cmap-pin__label span{display:block;font-size:10px;color:var(--muted)}
.cmap-pin__dot{width:9px;height:9px;background:var(--accent);border:2px solid var(--ink);border-radius:50%}
.cmap-pin:hover .cmap-pin__label{background:var(--terra);border-color:var(--terra)}
.cmap-pin:hover .cmap-pin__label b,.cmap-pin:hover .cmap-pin__label span{color:var(--light)}
@media (max-width:700px){
  .cmap__box{height:min(64vh,420px)}
  .cmap-pin__label{font-size:10px;padding:4px 7px}
}
/* группа близких объектов на карте каталога */
.cmap-pin--group .cmap-pin__group{
  display:grid;place-items:center;width:38px;height:38px;border-radius:50%;
  background:var(--terra);border:1px solid rgba(241,241,241,.2);
  font:500 13px/1 "Onest",system-ui,sans-serif;color:var(--light);
}
.cmap-pin--group:hover .cmap-pin__group{background:var(--accent)}
.cmap-pin--group .cmap-pin__dot{display:none}

/* Тёмная карта из светлых тайлов OpenStreetMap: инверсия с разворотом тона.
   CARTO, откуда брались готовые тёмные тайлы, с сентября 2026 требует ключ
   и печатает поверх карты «API KEY REQUIRED» (Артём, 23.09). */
.map__box .leaflet-tile-pane,
.cmap__box .leaflet-tile-pane{
  filter:invert(1) hue-rotate(180deg) brightness(.82) contrast(.92) saturate(.45);
}
/* подписи Leaflet не инвертируем — они вне tile-pane и остаются читаемыми */
.map__box .leaflet-control-attribution,
.cmap__box .leaflet-control-attribution{
  background:rgba(8,8,8,.7);color:var(--muted);font-size:10px;
}
.map__box .leaflet-control-attribution a,
.cmap__box .leaflet-control-attribution a{color:var(--muted)}

/* Калькулятор на странице лота: стоимость объекта задана самим лотом.
   Ползунок остаётся на месте — без него блок выглядел обрубленным
   (Артём, 23.09), — но он приглушён и не двигается: бегунок стоит
   на цене лота и показывает её место в общей вилке цен. */
.calc__sum--fixed .calc__range{cursor:default;opacity:.55}
.calc__sum--fixed .calc__range::-webkit-slider-runnable-track{
  background:linear-gradient(90deg,
    var(--grey) 0 var(--fill,0%), var(--hair) var(--fill,0%) 100%);
}
.calc__sum--fixed .calc__range::-moz-range-track{background:var(--hair)}
.calc__sum--fixed .calc__range::-moz-range-progress{background:var(--grey)}
.calc__sum--fixed .calc__range::-webkit-slider-thumb{background:var(--grey);cursor:default}
.calc__sum--fixed .calc__range::-moz-range-thumb{background:var(--grey);cursor:default}
.calc__sum--fixed .calc__ends{opacity:.55}

/* ── Блог, правки Анастасии 23.09: почта для СМИ, источник материала, «Похожие статьи» тремя в ряд ── */
.ptop__pr{margin:clamp(18px,2vw,28px) 0 0;font-size:13px;line-height:1.5;color:var(--muted)}
.ptop__pr a{color:var(--fg);text-decoration:none;border-bottom:1px solid var(--hair)}
.ptop__pr a:hover{border-color:currentColor}
.art__media{margin:clamp(36px,4vw,64px) 0 0;padding:clamp(20px,2vw,28px);border:1px solid var(--hair);display:flex;flex-direction:column;align-items:flex-start;gap:12px}
.art__media-k{margin:0;font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--accent)}
.art__media-t{margin:0;font-size:14px;line-height:1.5;color:var(--muted)}
.art__media .btn{margin-top:6px}
.more3{padding:clamp(40px,5vw,80px) var(--pad) var(--sec-pb);border-top:1px solid var(--hair);background:var(--bg)}
.more3__title{margin:0 0 clamp(20px,2.4vw,36px);font-weight:300;font-size:clamp(24px,2.4vw,40px);line-height:1.1;letter-spacing:-.03em}
.more3__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(16px,1.8vw,28px)}
.more3__i{min-width:0}
.more3__i .scat__link{gap:8px}
.more3__t{margin:4px 0 0;font-weight:300;font-size:clamp(16px,1.25vw,20px);line-height:1.2;letter-spacing:-.02em}
.more3__t em{font-style:normal;color:var(--muted)}
.more3__lede{margin:0;font-size:13px;line-height:1.5;color:var(--muted);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
@media (max-width:900px){.more3__grid{grid-template-columns:1fr 1fr}.more3__i:nth-child(3){display:none}}
@media (max-width:600px){.more3__grid{grid-template-columns:1fr}.more3__i:nth-child(3){display:block}}

/* Подпись под цифрами первого экрана («от 6,8 млн ₽», «годовых») — светлая:
   рыжая на фото не читалась, особенно на телефоне (Анастасия, Артём 24.09) */
.stat__price{color:rgba(241,241,241,.82)}

/* кнопка под слайдером форматов (коммерция, «Доминанта» 25.09): колонка
   растягивала её на всю ширину и прижимала к индикатору тактов */
.story__cta{align-self:flex-start;justify-self:start;width:auto;margin-top:clamp(22px,2.6vw,40px)}
/* кнопка под текстом блока «текст + цифры» (условия покупки) — не впритык к абзацу */
.pg-split__cta{align-self:flex-start;margin-top:clamp(22px,2.6vw,40px)}
/* «Доминанта» (25.09): подводка под заголовком слайдера и гармошки, подзаголовок такта,
   кнопка в развороте — тексты ТЗ дословно, поэтому им нужно своё место в блоке */
.story__intro{margin:clamp(14px,1.6vw,24px) 0 clamp(20px,2.4vw,36px);max-width:46ch;font-size:clamp(14px,1.05vw,16px);line-height:1.55;color:var(--muted)}
.story__sub{margin:0 0 8px !important;color:var(--fg) !important}
.story__step p + p{margin-top:8px}
.eco__lede{max-width:62ch;margin-top:clamp(14px,1.6vw,24px)}
.care__text p + p{margin-top:10px}
.care__cta{align-self:flex-start;margin-top:clamp(18px,2vw,28px)}
/* цифры проекта внутри блока «О проекте» («Доминанта», 25.09) */
.obj-about__nums{margin-top:clamp(40px,5vw,90px)}
/* «Доминанта»: в слайдере форматов крупный заголовок — сам формат, отступ до подзаголовка */
.story--formats .story__step h3.story__lead{margin:0 0 clamp(16px,1.8vw,26px);font-size:var(--h2);font-weight:300;letter-spacing:-.03em;line-height:1.05}
/* такты форматов длиннее тактов «Истории дома» — высоту держит самый длинный,
   иначе индикатор ложится на текст (Артём, 25.09): все такты в одной ячейке сетки */
.story--formats .story__steps{display:grid;min-height:0}
.story--formats .story__step{position:relative;inset:auto;grid-area:1/1}
/* «Показать ещё» под лотами дома: у .clg__reset свой display, он перебивал hidden */
#planMore[hidden]{display:none}

/* ── Правки 30.09 (Figma, «Доминанта») ── */
/* «Репутация. Команда. Продукт.» серым, «Адрес.» белым */
.say--flip > .mask:first-child span{color:var(--muted)}
.say--flip em{color:var(--light)}
/* единица после цифры: у крупных цифр word-spacing отрицательный, тонкий пробел съедался */
.cell__u{margin-left:.16em}
/* слова в ячейке цифр («Во двор») — обычный межсловный пробел */
.cell__val--text{word-spacing:0}
/* «Архитектура и реновация»: текст в три абзаца — колонка шире и отступ под меню,
   иначе шапка закреплённого экрана уезжала вверх под шапку сайта («тут уехал текст») */
.gal--biz .gal__stage{padding-top:var(--bar)}
.gal--biz .gal__head{grid-template-columns:minmax(0,1fr) minmax(0,1.25fr)}
.gal--biz .gal__note{max-width:74ch}
/* «До/после» на главной: раньше ширина 100% при потолке 62svh давала окно ~2,5:1
   и срезала преображение сверху и снизу (Анастасия, 30.09) */
@media (min-width:701px){
  /* на всю ширину, но выше: кадр занимает экран под шапкой сайта, фото 3:2 режется меньше (Артём, 30.09) */
  .ba__stage{aspect-ratio:auto;width:100%;max-height:none;height:min(calc(100svh - var(--bar) - 24px),calc((100vw - 2 * var(--pad)) / 1.5))}
}

/* ── Интервью руководителя — окно по клику на карточку (клиент, 30.09) ──
   Тот же язык, что у окна заявки: затемнение, графитовая панель, квадратная кнопка закрытия */
.team__i--bio{cursor:pointer}
.team__more{display:inline-flex;gap:6px;margin-top:10px;font-size:12px;letter-spacing:.04em;color:var(--terra-lit)}
.bio{
  position:fixed;inset:0;z-index:420;display:grid;place-items:center;padding:clamp(12px,3vw,32px);
  background:rgba(8,8,8,.78);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
  opacity:0;visibility:hidden;transition:opacity .35s var(--e),visibility .35s;
}
.bio._is-on{opacity:1;visibility:visible}
.bio__panel{
  position:relative;width:min(760px,100%);max-height:calc(100svh - 2 * clamp(12px,3vw,32px));display:flex;flex-direction:column;
  background:var(--graphite);border:1px solid var(--hair);
  transform:translateY(24px);transition:transform .45s var(--e);
}
.bio._is-on .bio__panel{transform:none}
.bio__close{
  position:absolute;right:12px;top:12px;z-index:1;width:40px;height:40px;display:grid;place-items:center;
  background:var(--surface-2);color:var(--fg);font-size:24px;line-height:1;cursor:pointer;
}
.bio__close:hover{background:var(--terra);color:var(--light)}
.bio__head{display:flex;gap:clamp(14px,2vw,24px);align-items:center;padding:clamp(20px,2.6vw,36px);padding-right:64px;border-bottom:1px solid var(--hair)}
.bio__shot{flex:none;width:clamp(72px,8vw,104px)}
.bio__shot img{display:block;width:100%;aspect-ratio:3/4;object-fit:cover}
.bio__name{margin:0;font-size:clamp(20px,1.9vw,28px);letter-spacing:-.02em;color:var(--light)}
.bio__role{margin:6px 0 0;font-size:13px;color:var(--muted)}
.bio__text{overflow:auto;overscroll-behavior:contain;padding:clamp(20px,2.6vw,36px)}
.bio__text p{margin:0 0 1em;font-size:clamp(14px,1.05vw,16px);line-height:1.65;color:var(--fg);max-width:64ch}
.bio__text p:last-child{margin-bottom:0}

/* ── «Написать нам» (30.09): свой список темы и загрузка файлов, без системных контролов ── */
.modal__panel--write{width:min(620px,100%)}
/* тема — поле в рамке, без нижней линии (Артём, 30.09); свой класс, а не .pick:
   тот занят фильтрами каталога, и его рамка с подсветкой попадала сюда случайно */
.topic{position:relative;padding:12px 16px 4px;border:1px solid var(--hair);transition:border-color .3s var(--e)}
.topic:focus-within,.topic._is-open{border-color:rgba(179,101,66,.55)}
.topic__btn{display:flex;align-items:center;justify-content:space-between;gap:12px;text-align:left;cursor:pointer;color:rgba(241,241,241,.5);border-bottom:0 !important}
.topic._is-set .topic__btn{color:var(--fg)}
.topic__btn i{width:9px;height:9px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:translateY(-3px) rotate(45deg);transition:transform .3s var(--e)}
.topic._is-open .topic__btn i{transform:translateY(2px) rotate(-135deg)}
.topic__list{position:absolute;left:-1px;right:-1px;top:100%;z-index:3;margin:4px 0 0;padding:6px 0;list-style:none;
  /* фон сплошной: --surface-2 полупрозрачный, сквозь список читались поля формы (Артём, 30.09) */
  background:#1A1A1A;border:1px solid rgba(241,241,241,.16);max-height:260px;overflow:auto;box-shadow:0 18px 40px rgba(0,0,0,.6)}
.topic__list li{padding:10px 16px;font-size:15px;color:var(--fg);cursor:pointer;outline:0}
.topic__list li:hover,.topic__list li:focus{background:rgba(241,241,241,.06)}
.topic__list li[aria-selected=true]{color:var(--terra-lit)}
.field__area{resize:vertical;min-height:72px;line-height:1.5}
.files{margin:0 0 clamp(16px,2vw,24px)}
.files__k{margin:0 0 6px;font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
.files__note{margin:0 0 12px;font-size:13px;line-height:1.5;color:var(--muted)}
.files__btn{display:flex;align-items:center;justify-content:space-between;padding:13px 16px;border:1px solid var(--hair);
  font-size:14px;color:var(--fg);cursor:pointer;transition:border-color .3s var(--e)}
.files__btn:hover,.files__btn:focus-within{border-color:var(--terra-lit)}
.files__btn input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.files__btn i{font-style:normal;color:var(--terra-lit)}
.files__list{margin:8px 0 0;padding:0;list-style:none}
.files__list li{display:flex;align-items:center;gap:10px;padding:8px 0;border-bottom:1px solid var(--hair);font-size:13px}
.files__list span{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.files__list small{color:var(--muted)}
.files__list button{width:26px;height:26px;background:none;border:0;color:var(--muted);font-size:18px;cursor:pointer}
.files__list button:hover{color:var(--fg)}
.files__err{margin:8px 0 0;font-size:13px;color:#D0735A}

/* ── Подвал и меню, 30.09: «Написать нам», соцсети иконками, награда ── */
.menu__cta--line{background:none;border-color:var(--hair)}
.menu__soc,.foot__soc{gap:8px;align-items:center}
.menu__soc a.soc,.foot__soc a.soc{display:grid;place-items:center;width:40px;height:40px;border:1px solid var(--hair);
  color:var(--muted);transition:color .3s var(--e),border-color .3s var(--e)}
.menu__soc a.soc:hover,.foot__soc a.soc:hover{color:var(--fg);border-color:var(--terra-lit)}
a.soc svg{width:20px;height:20px}
.foot__award{display:flex;align-items:center;gap:16px;padding:clamp(18px,2vw,26px) var(--pad);border-top:1px solid var(--hair);
  color:var(--muted);transition:color .3s var(--e)}
.foot__award svg{flex:none;width:52px;height:52px;color:var(--terra-lit)}
.foot__award-t{display:flex;flex-direction:column;gap:4px;font-size:13px;line-height:1.45}
.foot__award-t b{font-weight:400;font-size:15px;color:var(--fg);letter-spacing:.02em}
.foot__award:hover{color:var(--fg)}
/* кнопка «Подобрать недвижимость» под заголовком первого экрана (30.09) */
.hero__foot > .hero__cta{grid-column:1;justify-self:start;margin-top:clamp(18px,2vw,30px)}
.hero__foot:has(.hero__cta) > .panels{grid-row:1 / span 2}

/* ── PDF, второй лист «Персональное предложение» (ТЗ Немица, 29.09) ──
   те же поля, шрифт и цвета, что на первом листе; блоки разделены,
   фото крупные и равные, контакты и QR компактно внизу */
@media print{
  .psheet--c{order:4;break-before:page;page-break-before:always;padding-top:6mm !important;padding-bottom:4mm !important;color:#111}
  .poffer__k{margin:5mm 0 0;font-size:24pt;font-weight:300;letter-spacing:-.02em;color:#111}
  .poffer__boxes{display:grid;grid-template-columns:repeat(3,1fr);gap:4mm;margin-top:6mm}
  .poffer__box{border:1px solid #ddd;padding:4mm 4mm 3mm;break-inside:avoid}
  .poffer__box h3,.poffer__ex h3{margin:0 0 3mm;font-size:10.5pt;font-weight:500;color:#75412B !important;letter-spacing:.01em}
  .poffer__box ul{margin:0;padding:0;list-style:none}
  .poffer__box li{position:relative;padding:1.2mm 0 1.2mm 3.5mm;font-size:9pt;line-height:1.35;border-top:1px solid #eee}
  .poffer__box li:first-child{border-top:0}
  .poffer__box li::before{content:"";position:absolute;left:0;top:2.8mm;width:1.4mm;height:1.4mm;background:#75412B}
  .poffer__ex{margin-top:7mm;break-inside:avoid}
  .poffer__pics{display:grid;grid-template-columns:1fr 1fr;gap:4mm}
  .poffer__pics img{display:block;width:100%;aspect-ratio:3/2;object-fit:cover}
  .poffer__ex p{margin:2.5mm 0 0;font-size:8pt;line-height:1.4;color:#777}
  .poffer__contacts{display:flex;justify-content:space-between;align-items:flex-end;gap:6mm;margin-top:7mm;padding-top:4mm;border-top:1px solid #ddd}
  .poffer__contacts div{display:flex;flex-direction:column;gap:1mm}
  .poffer__h{margin:0;font-size:8pt;letter-spacing:.12em;text-transform:uppercase;color:#777}
  .poffer__contacts b{font-size:13pt;font-weight:500}
  .poffer__contacts span{font-size:9pt;color:#444}
  .poffer__legal{margin:4mm 0 0;font-size:7.5pt;line-height:1.4;color:#999}
}
/* «Подобрать недвижимость»: прозрачная, тонкая светлая обводка; цвет — только на наведении (Артём, 30.09) */
.hero__cta{background:transparent;border-color:rgba(241,241,241,.45);color:var(--light);
  -webkit-backdrop-filter:none;backdrop-filter:none}
.hero__cta i{color:var(--light)}
.hero__cta:hover{background:var(--terra);border-color:var(--terra);color:var(--light)}
.hero__cta:hover i{color:var(--light)}

/* пока скрипт не нарисовал карточки, список держит место — иначе фильтры и подвал прыгают вниз (CLS в PageSpeed) */
#catItems:empty{min-height:100vh}
