/* =====================================================================
   REFORMA — Landing (Hero section)
   Plain CSS. Palette: RED / BLACK / WHITE. Red #C50022 is the only accent.
   Structure grouped by component so more sections can be added below.
   ===================================================================== */

/* ---------------------------------------------------------------------
   1. DESIGN TOKENS
   --------------------------------------------------------------------- */
:root {
  /* brand colours */
  --red:   #C50022;               /* the single accent */
  --red-2: #E10E2E;               /* brighter — hover / glow */
  --black: #050506;
  --bg:    #0B0A0C;               /* near-black hero base */
  --surface: #141216;
  --white: #FFFFFF;
  --cream: #F4F1EA;
  --muted: rgba(255, 255, 255, .62);
  --line:  rgba(255, 255, 255, .12);

  /* type */
  --font-display: 'Oswald', sans-serif;
  --font-body:    'Inter', sans-serif;

  /* layout */
  --container: 1280px;
  --gutter: clamp(1.1rem, 4vw, 2.5rem);
  --header-h: 84px;

  /* motion */
  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
}

/* ---------------------------------------------------------------------
   2. RESET / BASE
   --------------------------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; }

html { -webkit-text-size-adjust: 100%; }

body {
  margin: 0;
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.55;
  color: var(--white);
  background: var(--bg);
  overflow-x: hidden;                 /* never allow horizontal page scroll */
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

img { display: block; max-width: 100%; height: auto; }

a { color: inherit; text-decoration: none; }

ul { list-style: none; margin: 0; padding: 0; }

h1, p { margin: 0; }

button { font: inherit; color: inherit; cursor: pointer; }

/* Visible focus states on every interactive element */
a:focus-visible,
button:focus-visible {
  outline: 2px solid var(--red-2);
  outline-offset: 3px;
  border-radius: 2px;
}

/* Custom scroll progress bar — replaces the native scrollbar with a thin
   red strip that fills top-down as the page scrolls (see js/main.js for the
   scrollY -> scaleY math). Decorative/non-interactive: native wheel,
   keyboard and touch scrolling all still work exactly as normal, only the
   visual scrollbar itself is replaced. */
html { scrollbar-width: none; }               /* Firefox */
html::-webkit-scrollbar { display: none; }     /* Chrome / Safari / Edge */

.scroll-progress {
  position: fixed;
  top: 0; right: 0; bottom: 0;
  width: 4px;
  z-index: 110;                     /* above the header (100) and mobile menu (90) */
  background: var(--line);          /* faint track for the full page height */
  pointer-events: none;
}
.scroll-progress__fill {
  position: absolute;
  inset: 0;
  transform: scaleY(var(--scroll-progress, 0));
  transform-origin: top;
  background: linear-gradient(var(--red-2), var(--red));
  /* БЕЗ transition: значение --scroll-progress пишется из rAF (модуль 2b),
     то есть ровно раз в кадр. Транзишен здесь только перезапускался ~60 раз
     в секунду и добавлял работы компоновщику на каждом тике скролла. */
}

/* ---------------------------------------------------------------------
   3. UTILITIES
   --------------------------------------------------------------------- */
.container {
  width: 100%;
  max-width: var(--container);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

/* Широкая полоса: тот же контейнер, но шире обычных 1280px и с ТЕМИ ЖЕ
   боковыми var(--gutter) — на средних экранах контент не липнет к краям,
   на больших читается как блок во всю ширину сайта.
   Сейчас используется витриной лотов (#auctions). */
.container--wide { max-width: 1600px; }

/* Блокировка скролла фона — ОДНА на всю страницу.
   Класс вешает/снимает только lockScroll()/unlockScroll() в main.js (счётчик
   вложенности), потребители: мобильное меню и модалка заявки. Второй такой
   механизм заводить не нужно — иначе закрытие одного оверлея разблокирует
   фон под другим. Нативный скроллбар на лендинге спрятан -> без прыжка. */
body.scroll-locked { overflow: hidden; }

/* Правило .ph (плейсхолдер реквизитов — токен-метка в пунктирной
   красной рамке) удалено: все реквизиты подставлены, незаполненных токенов
   на сайте и в юридических документах не осталось. Если когда-нибудь появится
   новый неподставленный реквизит — заводи метку заново вместе с правилом. */

/* Honeypot — поле-приманка для спам-ботов (по одному в каждой из трёх форм:
   квиз #calc, обратный звонок #contacts, модалка заявки).
   Прячем ИМЕННО так, а не display:none / visibility:hidden / type="hidden":
   часть ботов эти признаки распознаёт и поле пропускает, а увод за левый край
   выглядит для них как обычное видимое поле.
   Человека это поле не касается: за экраном, вне таб-порядка (tabindex="-1"
   в разметке), скрыто от скринридера (aria-hidden на обёртке), не ловит клики.
   Проверку заполненности делает общий слой заявок в js/main.js (модуль 0).
   left — отрицательный: справа/снизу появился бы горизонтальный скролл. */
.form-trap {
  position: absolute;
  left: -9999px;
  top: 0;
  width: 1px;
  height: 1px;
  overflow: hidden;
  opacity: 0;
  pointer-events: none;
}

/* Buttons ------------------------------------------------------------- */
.btn {
  --btn-bg: transparent;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .55em;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: .95rem;
  letter-spacing: .02em;
  text-transform: uppercase;
  line-height: 1;
  padding: .95em 1.6em;
  border: 1px solid transparent;
  border-radius: 3px;
  background: var(--btn-bg);
  white-space: nowrap;
  transition: transform .3s var(--ease-out),
              background-color .25s ease,
              border-color .25s ease,
              box-shadow .3s ease;
}

.btn--primary {
  --btn-bg: var(--red);
  color: var(--white);
  box-shadow: 0 6px 18px -10px rgba(197, 0, 34, .8);
}
.btn--primary:hover {
  --btn-bg: var(--red-2);
  transform: translateY(-2px);
  box-shadow: 0 14px 34px -10px rgba(225, 14, 46, .65);
}

.btn--ghost {
  color: var(--white);
  border-color: var(--line);
  background: rgba(255, 255, 255, .02);
}
.btn--ghost:hover {
  border-color: var(--red);
  transform: translateY(-2px);
}

.btn__arrow { transition: transform .3s var(--ease-out); }
.btn:hover .btn__arrow { transform: translateX(4px); }

/* ---------------------------------------------------------------------
   4. HEADER
   --------------------------------------------------------------------- */
.site-header {
  position: fixed;
  inset: 0 0 auto 0;
  z-index: 100;
  /* backdrop-filter НАМЕРЕННО не анимируется: анимация блюра — самое дорогое,
     что есть у шапки, и она перезапускалась на каждом переключении .scrolled.
     Сам эффект остался (см. .scrolled ниже), появляется мгновенно. */
  transition: background-color .3s ease, border-color .3s ease;
  border-bottom: 1px solid transparent;
}
/* Permanent top scrim: keeps nav text (Контакты / phone) legible over the
   LIGHT, misty part of the hero photo BEFORE any scroll. Fades to transparent
   below the bar so it never reads as a hard band; on the dark left side it's
   invisible (dark-on-dark). The .scrolled solid bar supersedes it. */
.site-header::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 150px;
  z-index: -1;
  pointer-events: none;
  background: linear-gradient(180deg, rgba(5, 5, 6, .88) 0%, rgba(5, 5, 6, .55) 46%, rgba(5, 5, 6, 0) 100%);
  transition: opacity .3s ease;
}
/* solid dark bg once scrolled past 40px (toggled from JS) */
.site-header.scrolled {
  background: rgba(11, 10, 12, .82);
  border-bottom-color: var(--line);
  backdrop-filter: blur(12px) saturate(140%);
  -webkit-backdrop-filter: blur(12px) saturate(140%);
}
.site-header.scrolled::before { opacity: 0; }   /* solid bar takes over */

/* Телефоны/планшеты: НИКАКОГО backdrop-filter у шапки.
   Блюр под fixed-элементом заставляет браузер каждый кадр скролла заново
   снимать и размывать подложку во всю ширину экрана — на мобильных GPU это
   основной источник «дёрганого» скролла. Вместо полупрозрачности с блюром —
   непрозрачный фон секций: визуально шапка та же, стоимость нулевая.
   Десктоп (>900px) блюр сохраняет — см. правило выше. */
@media (max-width: 900px) {
  .site-header.scrolled {
    background: var(--bg);
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }
}

.site-header__inner {
  display: flex;
  align-items: center;
  gap: 2rem;
  height: var(--header-h);
}

.site-header__logo { flex: 0 0 auto; display: inline-flex; }
.site-header__logo img { height: 38px; width: auto; }   /* ~34–40px, keeps aspect */

/* nav sits between logo and actions */
.nav { margin-inline: auto; }
.nav__list { display: flex; gap: clamp(0.9rem, 1.6vw, 1.7rem); }
.nav__link {
  position: relative;
  font-size: .95rem;
  color: var(--muted);
  padding-block: .4rem;
  white-space: nowrap;            /* each item stays on a single line */
  transition: color .2s ease;
}
/* animated red underline on hover */
.nav__link::after {
  content: "";
  position: absolute;
  left: 0; bottom: 0;
  width: 100%; height: 2px;
  background: var(--red);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform .28s var(--ease-out);
}
.nav__link:hover { color: var(--white); }
.nav__link:hover::after { transform: scaleX(1); }

.site-header__actions {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  gap: 1.25rem;
}
/* small red diagonal accent tick */
.site-header__tick {
  width: 3px;
  height: 20px;
  background: var(--red);
  transform: skewX(-20deg);
  box-shadow: 0 0 12px -1px rgba(197, 0, 34, .8);
}
.site-header__phone {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 1.02rem;
  letter-spacing: .01em;
  white-space: nowrap;
  transition: color .2s ease;
}
.site-header__phone:hover { color: var(--red-2); }

/* Burger (hidden on desktop) ----------------------------------------- */
.burger {
  display: none;
  flex: 0 0 auto;
  margin-left: auto;              /* pin to the right whenever it is shown */
  width: 44px; height: 44px;
  padding: 10px;
  background: transparent;
  border: 1px solid var(--line);
  border-radius: 4px;
}
.burger span {
  display: block;
  height: 2px;
  width: 100%;
  margin-block: 4px;
  background: var(--white);
  border-radius: 2px;
  transition: transform .3s var(--ease-out), opacity .2s ease;
}
/* burger -> X when menu open */
body.menu-open .burger span:nth-child(1) { transform: translateY(6px) rotate(45deg); }
body.menu-open .burger span:nth-child(2) { opacity: 0; }
body.menu-open .burger span:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }

/* Mobile menu overlay ------------------------------------------------- */
.mobile-menu {
  position: fixed;
  inset: var(--header-h) 0 0 0;
  z-index: 90;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  gap: 2rem;
  padding: 2rem var(--gutter) 3rem;
  overflow-y: auto;               /* фон заблокирован -> длинное меню скроллит себя само */
  background: rgba(8, 7, 9, .97);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  border-top: 1px solid var(--line);
  /* hidden by default */
  opacity: 0;
  visibility: hidden;
  transform: translateY(-12px);
  transition: opacity .3s ease, transform .35s var(--ease-out), visibility .3s;
}
body.menu-open .mobile-menu {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}
.mobile-menu__nav { display: flex; flex-direction: column; gap: .35rem; margin-top: 1rem; }
.mobile-menu__link {
  font-family: var(--font-display);
  font-size: 1.6rem;
  text-transform: uppercase;
  letter-spacing: -.01em;
  padding: .55rem 0;
  border-bottom: 1px solid var(--line);
  transition: color .2s ease, padding-left .2s ease;
}
.mobile-menu__link:hover { color: var(--red-2); padding-left: .4rem; }
.mobile-menu__footer { display: flex; flex-direction: column; gap: 1rem; }
.mobile-menu__phone {
  font-family: var(--font-display);
  font-size: 1.4rem;
  color: var(--white);
}
.mobile-menu .btn { width: 100%; }

/* Оверлей начинается ровно под шапкой (inset: var(--header-h) ...) — там же,
   где стоит бегущая строка, и она просвечивала сквозь полупрозрачный фон
   меню. Гасим тикер на время меню: visibility (не display) не трогает поток,
   поэтому вёрстка под оверлеем не дёргается и --header-h ни при чём. */
body.menu-open .ticker { visibility: hidden; }

/* ---------------------------------------------------------------------
   4b. TICKER — бегущая строка
   Full-bleed dark strip that sits BELOW the fixed header (margin-top pushes
   it clear of the floating header). Content is duplicated in the markup, so a
   -50% translateX loops seamlessly. Edge fade masks + pause-on-hover.

   ЭТОТ ЖЕ КОМПОНЕНТ переиспользует шапка страницы stock.html (блок 10n):
   там он стоит внутри секции .stock, поэтому модификатор .ticker--inline
   снимает margin-top под fixed-шапку, а класс .anim-off на .stock ставит
   анимацию на паузу, пока строка за экраном. Правите разметку/классы
   тикера — проверьте обе страницы.
   --------------------------------------------------------------------- */
.ticker {
  margin-top: var(--header-h);        /* sit below the fixed header */
  position: relative;
  overflow: hidden;                   /* clip the marquee -> no horizontal page scroll */
  background: var(--black);
  border-block: 1px solid var(--line);
  padding-block: .7rem;
  /* fade items into the edges */
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
}
.ticker__track {
  display: inline-flex;
  align-items: center;
  white-space: nowrap;
  will-change: transform;
  animation: tickerScroll 38s linear infinite;
}
@keyframes tickerScroll {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }   /* content duplicated -> one full set */
}
.ticker:hover .ticker__track { animation-play-state: paused; }

.ticker__item {
  font-family: var(--font-display);
  font-size: .8rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--muted);
  font-weight: 500;
  padding-inline: 1.1rem;
}
.ticker__item b { color: var(--white); font-weight: 600; }
.ticker__sep { color: var(--red); font-size: .7rem; }

/* Телефоны: маску снимаем. mask-image заставляет браузер держать для тикера
   ОТДЕЛЬНУЮ render-surface и композитить её каждый кадр бесконечной прокрутки
   строки. Затухание по краям делаем двумя псевдоэлементами — обычный градиент
   поверх непрозрачного фона выглядит так же (фон тикера = var(--black)),
   но рисуется бесплатно. Десктоп маску сохраняет. */
@media (max-width: 640px) {
  .ticker {
    -webkit-mask-image: none;
            mask-image: none;
  }
  .ticker::before,
  .ticker::after {
    content: "";
    position: absolute;
    top: 0; bottom: 0;
    width: 42px;
    z-index: 1;
    pointer-events: none;
  }
  .ticker::before { left: 0;  background: linear-gradient(90deg,  #050506, rgba(5, 5, 6, 0)); }
  .ticker::after  { right: 0; background: linear-gradient(270deg, #050506, rgba(5, 5, 6, 0)); }
}

@media (prefers-reduced-motion: reduce) {
  .ticker__track { animation: none; }
}

/* ---------------------------------------------------------------------
   5. HERO — layout
   --------------------------------------------------------------------- */
.hero {
  position: relative;
  min-height: 100vh;
  /* svh, а НЕ dvh: dvh пересчитывается в реальном времени, пока схлопывается
     адресная строка мобильного браузера, — высота hero (а с ней и всего
     документа) плывёт прямо во время скролла и вызывает релэйаут при каждой
     смене направления. svh зафиксирован на «маленьком» вьюпорте и не меняется. */
  min-height: 100svh;
  display: flex;
  align-items: center;
  /* header clearance is now provided by the ticker's margin-top above the hero,
     so the hero only needs a small breathing gap (avoids a double top offset) */
  padding-top: clamp(0.9rem, 3vh, 2rem);
  padding-bottom: clamp(1.5rem, 4vh, 3rem);
  background: var(--bg);
  overflow: hidden;                    /* clip glows / shards / parallax */
  isolation: isolate;
}

/* Text lives in the normal flow (left column); the car is positioned
   absolutely over the hero so it can be large and low without stretching
   the section. .hero align-items:center keeps this block vertically centred. */
.hero__inner {
  position: relative;
  z-index: 4;                 /* text sits above the white plane (z2) */
  width: 100%;
}

/* ---------------------------------------------------------------------
   6. HERO — background layers (red/black liquid-marble over black)
   --------------------------------------------------------------------- */
.hero__bg { position: absolute; inset: 0; z-index: 0; pointer-events: none; }

/* large soft red glow — kept on the DARK (left) side, behind the heading/CTA */
.hero__glow {
  position: absolute;
  left: 4%;    /* shifted right so it drifts visibly under the text column */
  bottom: -22%;
  width: 70vw;
  height: 70vw;
  max-width: 900px;
  max-height: 900px;
  background: radial-gradient(circle at center,
              rgba(197, 0, 34, .34) 0%,
              rgba(197, 0, 34, .15) 32%,
              rgba(197, 0, 34, 0) 62%);
  filter: blur(20px);
  /* slow ambient drift: rises up, off the top, reappears from the bottom, loops */
  animation: heroGlowDrift 26s linear infinite;
  will-change: transform;
}

@keyframes heroGlowDrift {
  from { transform: translateY(65vh); }   /* below its resting spot — entering from the bottom */
  to   { transform: translateY(-135vh); } /* drifted up and off the top of the screen */
}

/* angular red "shards" via clip-path, low opacity */
/* will-change тут НЕ нужен: шарды статичны (ничего не анимируется), а слой
   под них браузер держал бы всё время жизни страницы. */
.hero__shard {
  position: absolute;
  background: linear-gradient(135deg, var(--red) 0%, rgba(197, 0, 34, 0) 80%);
}
.hero__shard--1 {
  top: -15%; left: 42%;
  width: 45vw; height: 130%;
  opacity: .10;
  clip-path: polygon(38% 0, 62% 0, 40% 100%, 16% 100%);
  filter: blur(6px);
}
.hero__shard--2 {
  top: -10%; right: -6%;
  width: 40vw; height: 120%;
  opacity: .07;
  clip-path: polygon(60% 0, 100% 0, 78% 100%, 40% 100%);
  filter: blur(8px);
}

/* faint grain / marble — tiled, tileable feTurbulence (desaturated), ~0.06 */
.hero__grain {
  position: absolute;
  inset: 0;
  opacity: .06;
  mix-blend-mode: screen;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size: 200px 200px;
}

/* ---------------------------------------------------------------------
   6b. HERO — photo
   Раньше здесь же жила диагональная белая «плоскость» (.hero__plane) и её
   контур (.hero__lines) — от них отказались, разметка и стили удалены
   (восстанавливаются из истории git). Осталось фото.
   --------------------------------------------------------------------- */

/* Photo of a real car — plain rectangle, vertically elongated, full section
   height, flush to the right edge (no gutter). Fixed shape (not derived from
   the photo's own aspect), so object-fit:cover crops to fill it — the
   portrait source (hero-photo-v2.jpg, 896:1200) suits this tall/narrow box:
   zero vertical crop (full roofline-to-wheels height always survives), and
   at width:40% the horizontal crop is light enough that BOTH mirrors, BOTH
   headlights, the badge and BOTH wheels all stay in frame — checked against
   8 car-feature points across 375/901/1280/1440/1920/2560. Narrower widths
   would crop progressively more from the sides inward. */
.hero__photo {
  position: absolute;
  right: 0;
  top: 0;
  bottom: 0;
  width: 40%;
  border-left: 1px solid var(--line);   /* same barely-visible treatment as .scroll-cue__line */
  box-shadow: -30px 0 60px -20px rgba(0, 0, 0, .5);   /* lift off the dark background */
  z-index: 3;
  overflow: hidden;
  pointer-events: none;
}
.hero__photo img {
  width: 100%; height: 100%;
  object-fit: cover;
  object-position: center;
  display: block;
}

/* ---------------------------------------------------------------------
   7. HERO — content (text column)
   --------------------------------------------------------------------- */
.hero__content { position: relative; z-index: 2; max-width: clamp(19rem, 44vw, 38rem); }

/* kicker with short red line */
.kicker {
  display: flex;
  align-items: center;
  gap: .8rem;
  font-size: .82rem;
  font-weight: 600;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: clamp(0.55rem, 1.4vh, 1.05rem);
}
.kicker__line {
  width: 34px; height: 2px;
  background: var(--red);
  flex: 0 0 auto;
  box-shadow: 0 0 10px rgba(197, 0, 34, .7);
}
/* When the kicker is too narrow (mobile), let it break BETWEEN the two phrases
   only — each phrase stays whole, so "Без посредников" drops cleanly to line 2
   instead of splitting mid-phrase. */
.kicker__seg { white-space: nowrap; }

/* H1 — three mask-reveal lines */
.hero__title {
  font-family: var(--font-display);
  font-weight: 700;
  /* cap by BOTH width and height so long RU lines never wrap and the block
     stays short enough to keep the stats above the fold on ~768px viewports */
  font-size: clamp(2.3rem, min(5.5vw, 11.5vh), 5rem);
  line-height: 0.92;
  letter-spacing: -0.02em;
  text-transform: uppercase;
}
/* mask wrapper: clips the inner slide; padding+neg margin keeps glyphs uncut */
.line-mask {
  display: block;
  overflow: hidden;
  padding-block: 0.08em;
  margin-block: -0.08em;
}
/* без will-change: mask-reveal проигрывается ОДИН раз при загрузке, а слой
   висел бы вечно (три строки заголовка = три лишних композитных слоя) */
.line-inner { display: block; }
.line-inner--red { color: var(--red); }

/* red accent bar that wipes in under line 3 */
.hero__bar {
  display: block;
  width: clamp(120px, 17vw, 220px);
  height: 5px;
  margin-top: clamp(0.6rem, 1.4vh, 1rem);
  background: var(--red);
  border-radius: 2px;
  transform-origin: left center;
  box-shadow: 0 0 18px -2px rgba(197, 0, 34, .8);
}

.hero__sub {
  max-width: 46ch;
  margin-top: clamp(0.7rem, 1.7vh, 1.2rem);
  color: var(--muted);
  font-size: clamp(1rem, 1.15vw, 1.15rem);
  line-height: 1.6;
  text-wrap: pretty;   /* avoids ugly single-word orphans when it wraps */
}

.hero__cta {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
  margin-top: clamp(0.9rem, 2vh, 1.5rem);
}

/* trust stats */
.stats {
  display: flex;
  flex-wrap: wrap;
  gap: clamp(1.1rem, 2.6vw, 2.2rem);
  margin-top: clamp(1rem, 2.4vh, 1.8rem);
  padding-top: clamp(0.9rem, 1.8vh, 1.4rem);
  border-top: 1px solid var(--line);
}
/* on phones force a clean, filled 2×2 (was 3 items → dangling empty cell) */
@media (max-width: 620px) {
  .stats {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 1.1rem 1.4rem;
  }
}
.stat { display: flex; flex-direction: column; gap: .25rem; min-width: 0; }
.stat__num {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.7rem, 2.6vw, 2.4rem);
  line-height: 1;
  letter-spacing: -.01em;
  color: var(--white);
}
/* словесный стат («Проверка») — как .trust__metric-word в TRUST: чуть мельче
   цифр, потому что слово не переносится и в узкой колонке 1/4 вылезло бы
   за пределы ячейки. Цвет не меняем — в строке из 4 статов красный акцент
   перетянул бы на себя внимание. */
.stat__word {
  font-size: clamp(1.45rem, 2vw, 1.85rem);
  text-transform: uppercase;
  letter-spacing: 0;
}
.stat__label {
  font-size: .82rem;
  color: var(--muted);
  letter-spacing: .01em;
}

/* ---------------------------------------------------------------------
   8. НОМЕР СВОБОДЕН (был «HERO — media»: PNG-авто + свечение + тень +
   параллакс от курсора, .hero__media / .hero__parallax / .hero__car*).
   Блок отключили ещё в вёрстке, теперь удалили вместе с JS-модулем 4;
   восстанавливается из истории git. Нумерацию соседей не сдвигали.
   --------------------------------------------------------------------- */

/* ---------------------------------------------------------------------
   9. SCROLL CUE
   --------------------------------------------------------------------- */
.scroll-cue {
  position: absolute;
  /* align with the container's content edge (dark side), clear of the plane */
  left: max(var(--gutter), calc((100% - var(--container)) / 2 + var(--gutter)));
  bottom: clamp(1.1rem, 3vh, 2rem);
  z-index: 5;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: .7rem;
  color: var(--muted);
}
.scroll-cue__line {
  position: relative;
  width: 1px;
  height: 46px;
  background: var(--line);
  overflow: hidden;
}
/* bright red segment travelling down the line */
.scroll-cue__line::after {
  content: "";
  position: absolute;
  top: -40%;
  left: 0;
  width: 100%;
  height: 40%;
  background: var(--red-2);
  box-shadow: 0 0 8px var(--red-2);
  animation: cue-travel 1.9s var(--ease-out) infinite;
}
.scroll-cue__label {
  font-size: .68rem;
  letter-spacing: .28em;
  text-transform: uppercase;
}
@keyframes cue-travel {
  0%   { transform: translateY(0);    opacity: 0; }
  25%  { opacity: 1; }
  100% { transform: translateY(115px); opacity: 0; }
}

/* ---------------------------------------------------------------------
   10. TRUST — metric counters + animated import route map
   --------------------------------------------------------------------- */
.trust {
  position: relative;
  padding-block: clamp(3.5rem, 9vh, 6.5rem);
  background: var(--bg);
  border-top: 1px solid var(--line);
  overflow: hidden;                    /* safety: clip any decorative bleed */
  isolation: isolate;                  /* own stacking context for the decor layer */
}
/* content sits above the decorative background */
.trust > .container { position: relative; z-index: 1; }

/* --- decorative background (echoes the hero: drifting glow + red shards) --- */
.trust__bg { position: absolute; inset: 0; z-index: 0; pointer-events: none; overflow: hidden; }

/* slow floating red circle — drifts up the section and loops */
.trust__glow {
  position: absolute;
  left: 4%;
  bottom: -14%;
  width: 46vw; height: 46vw;
  max-width: 640px; max-height: 640px;
  border-radius: 50%;
  background: radial-gradient(circle at center,
              rgba(197, 0, 34, .22) 0%,
              rgba(197, 0, 34, .09) 34%,
              rgba(197, 0, 34, 0) 64%);
  filter: blur(26px);
  animation: trustGlowDrift 34s linear infinite;
  will-change: transform;
}
@keyframes trustGlowDrift {
  from { transform: translateY(55%); }    /* low in the section */
  to   { transform: translateY(-210%); }  /* drifts up and out, then loops */
}

/* angular red shards (same treatment as the hero shards) */
.trust__shard {
  position: absolute;
  background: linear-gradient(135deg, var(--red) 0%, rgba(197, 0, 34, 0) 80%);
  filter: blur(8px);
  pointer-events: none;
}
.trust__shard--1 {
  top: -6%; right: 3%;
  width: 34vw; height: 78%;
  opacity: .07;
  clip-path: polygon(58% 0, 100% 0, 80% 100%, 40% 100%);
}
.trust__shard--2 {
  bottom: -8%; left: -5%;
  width: 30vw; height: 70%;
  opacity: .05;
  clip-path: polygon(40% 0, 64% 0, 42% 100%, 16% 100%);
}

/* eyebrow — same red-tick + spaced caps treatment as the hero kicker */
.trust__eyebrow {
  display: flex;
  align-items: center;
  gap: .8rem;
  font-size: .82rem;
  font-weight: 600;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: clamp(1.4rem, 3.5vh, 2.4rem);
}
.trust__eyebrow-line {
  width: 34px; height: 2px;
  background: var(--red);
  flex: 0 0 auto;
  box-shadow: 0 0 10px rgba(197, 0, 34, .7);
}

/* --- Part A · counters ------------------------------------------------ */
.trust__metrics {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: clamp(1.4rem, 3vw, 2.5rem);
  padding-bottom: clamp(2.6rem, 6vh, 4.5rem);
  margin-bottom: clamp(2.6rem, 6vh, 4.5rem);
  border-bottom: 1px solid var(--line);
}
.trust__metric {
  display: flex;
  flex-direction: column;
  gap: .5rem;
  padding-left: 1rem;
  border-left: 2px solid var(--red);   /* small red accent per palette */
}
.trust__metric-num {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(2.4rem, 5vw, 3.8rem);
  line-height: 1;
  letter-spacing: -.02em;
  color: var(--white);
  font-variant-numeric: tabular-nums;  /* stops width jitter while counting */
}
/* word-based metric ("Договор") — a touch smaller so it aligns with the digits
   and never overflows its 1/4 grid cell; red accent to read as a guarantee. */
.trust__metric-word {
  font-size: clamp(1.6rem, 3.2vw, 2.5rem);
  text-transform: uppercase;
  letter-spacing: 0;
  color: var(--red-2);
}
.trust__metric-label {
  font-size: clamp(.82rem, 1.4vw, .95rem);
  color: var(--muted);
  letter-spacing: .01em;
}

/* --- Part B · map heading -------------------------------------------- */
.trust__map-head { margin-bottom: clamp(1.2rem, 3vh, 1.8rem); }
.trust__heading {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.7rem, 3.4vw, 2.6rem);
  line-height: 1.02;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0;
}
.trust__lede {
  margin-top: .6rem;
  max-width: 46ch;
  color: var(--muted);
  font-size: clamp(.95rem, 1.15vw, 1.1rem);
}

/* --- Part B · map panel (vector map, top crop + animated routes) --- */
.trust__map {
  position: relative;
  width: 100%;
  aspect-ratio: 2316 / 1400;           /* top crop of the 2316x2292 vector map */
  border: 1px solid var(--line);
  border-radius: 6px;
  overflow: hidden;
  isolation: isolate;
  background: var(--surface);
}
/* the vector map (image (5).svg) — transparent ocean over near-black; width
   fills the panel and it's top-aligned, so the panel shows the top crop
   (Russia + China/Korea/Japan + a little of India) where the routes live. */
.trust__map-img {
  position: absolute;
  inset: 0;
  z-index: 0;
  background: #0a0a0e url("../assets/map.svg") center top / 100% auto no-repeat;
}
/* gentle vignette: fade the far edges into the section, keep the routes clear */
.trust__map::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background: radial-gradient(150% 150% at 55% 44%, transparent 54%, rgba(11, 10, 12, .5) 100%);
}
.trust__svg {
  position: absolute;
  inset: 0;
  width: 100%; height: 100%;
  display: block;
  z-index: 2;
}

/* ROUTES — dashed red line, uncovered once by a mask (draw-on), then the
   dashes flow along it forever. The mask's white "reveal" stroke grows from
   the source to the city (stroke-dashoffset 100 -> 0), revealing the route. */
.trust__route {
  fill: none;
  stroke: var(--red-2);
  stroke-width: 1.2;                         /* thin, so many lines don't blob together */
  vector-effect: non-scaling-stroke;         /* constant px line at ANY map scale (mobile too) */
  stroke-linecap: round;
  stroke-dasharray: 3.5 4.5;                 /* flowing dashes (screen px, non-scaling) */
  /* drop-shadow УБРАН осознанно: на линии толщиной 1.2px свечение не читается,
     а SVG-фильтр на 22 путях заставляет перерисовывать всю карту каждый кадр. */
  animation: trust-flow .9s linear infinite;
  animation-play-state: paused;              /* wakes when the section is seen */
}
@keyframes trust-flow { to { stroke-dashoffset: -8; } }   /* one dash+gap period */

.trust__reveal {
  fill: none;
  stroke: #fff;
  stroke-width: 6;                            /* scales down with the map; kept wide enough to
                                                 still cover the non-scaling route on phones */
  stroke-linecap: round;
  stroke-dasharray: 100;                      /* pathLength=100 -> single full-length dash */
  stroke-dashoffset: 100;                     /* start fully hidden */
  animation: trust-draw 1.25s var(--ease-out) forwards;
  animation-delay: var(--dl, 0s);
  animation-play-state: paused;
}
@keyframes trust-draw { to { stroke-dashoffset: 0; } }

/* destination dots — pop in as their route arrives */
.trust__dot {
  fill: var(--white);
  transform-box: fill-box;
  transform-origin: center;
  opacity: 0;
  transform: scale(0);
  /* без drop-shadow (см. .trust__route): 17 точек x SVG-фильтр — та же
     перерисовка карты, а разницы на белой точке r=3.5 глазом не видно */
  animation: trust-dot-in .5s var(--ease-out) forwards;
  animation-delay: var(--dl, 1.2s);
  animation-play-state: paused;
}
@keyframes trust-dot-in { to { opacity: 1; transform: scale(1); } }

/* routes/dots wake up only once the MAP itself scrolls into view (JS adds
   .map-in via a separate IntersectionObserver on .trust__map) */
.trust.map-in .trust__route,
.trust.map-in .trust__reveal,
.trust.map-in .trust__dot { animation-play-state: running; }

/* --- Part B · overlay (flags at sources + crisp city labels) ---------- */
.trust__labels { position: absolute; inset: 0; z-index: 3; pointer-events: none; }

/* circular flag badge, centred on its source node */
.trust__flag {
  position: absolute;
  transform: translate(-50%, -50%);
  width: 30px; height: 30px;
  border-radius: 50%;
  overflow: hidden;
  border: 1.5px solid rgba(255, 255, 255, .85);
  box-shadow: 0 0 0 3px rgba(197, 0, 34, .30), 0 2px 8px rgba(0, 0, 0, .55);
  background: var(--surface);
}
.trust__flag img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* soft red pulse ring behind each flag */
.trust__flag::before {
  content: "";
  position: absolute; inset: -3px;
  border-radius: 50%;
  border: 1.5px solid var(--red-2);
  opacity: 0;
}
.trust.map-in .trust__flag::before { animation: trust-pulse 3s ease-out infinite; }
@keyframes trust-pulse {
  0%   { transform: scale(.7); opacity: .55; }
  70%  { opacity: 0; }
  100% { transform: scale(2.4); opacity: 0; }
}

/* СТОП-КРАН для бесконечных анимаций карты.
   Класс .anim-off вешает JS (общий хелпер pauseWhenOffscreen в main.js), пока
   секция за экраном ИЛИ вкладка неактивна. Без него поток пунктира по 22
   маршрутам и три пульсации флагов крутились всё время жизни страницы —
   браузер перерисовывал SVG-карту даже когда она в трёх экранах отсюда.
   Правило стоит ПОСЛЕ .trust.map-in ... (та же специфичность) — выигрывает
   порядком, поэтому его нельзя поднимать выше.
   Тормозим ТОЛЬКО бесконечные анимации: .trust__reveal / .trust__dot играют
   один раз (~2 с) и гаснут сами — их пауза дала бы только «полунарисованные»
   маршруты при быстром пролистывании. */
.trust.anim-off .trust__route,
.trust.anim-off .trust__flag::before { animation-play-state: paused; }

/* Текстовые подписи городов (.trust__city) с карты убраны — в разметке их
   больше нет, стили удалены. Названия городов несёт легенда под картой. */

/* --- Part B · legend (flags + per-country counts) -------------------- */
.trust__legend {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .55rem .7rem;
  margin-top: clamp(1.1rem, 3vh, 1.7rem);
  font-size: clamp(.85rem, 1.3vw, .98rem);
  color: var(--muted);
}
.trust__legend-item { display: inline-flex; align-items: center; gap: .45em; color: var(--white); }
.trust__legend-flag {
  width: 22px; height: 16px;
  border-radius: 2px;
  object-fit: cover;
  box-shadow: 0 0 0 1px var(--line);
}
.trust__legend-item b { font-family: var(--font-display); font-weight: 700; color: var(--red-2); margin-left: .1em; font-variant-numeric: tabular-nums; }
/* soft flash each time the live counter ticks */
.trust__legend-live { transition: color .3s ease, text-shadow .3s ease; }
.trust__legend-live.is-tick { color: var(--white); text-shadow: 0 0 10px rgba(225, 14, 46, .7); }
.trust__legend-sep { color: var(--line); }
.trust__legend-arrow { color: var(--red-2); margin-inline: .1rem; font-weight: 700; }

/* --- reveal on scroll (JS adds .is-visible via IntersectionObserver) -- */
.js .trust__eyebrow,
.js .trust__metric,
.js .trust__map-head,
.js .trust__map,
.js .trust__legend {
  opacity: 0;
  transform: translateY(22px);
  transition: opacity .7s ease, transform .7s var(--ease-out);
}
.trust.is-visible .trust__eyebrow,
.trust.is-visible .trust__metric,
.trust.is-visible .trust__map-head,
.trust.is-visible .trust__map,
.trust.is-visible .trust__legend { opacity: 1; transform: none; }

/* stagger: eyebrow -> the four metrics -> heading -> map -> legend */
.trust.is-visible .trust__eyebrow            { transition-delay: .00s; }
.trust.is-visible .trust__metric:nth-child(1){ transition-delay: .08s; }
.trust.is-visible .trust__metric:nth-child(2){ transition-delay: .16s; }
.trust.is-visible .trust__metric:nth-child(3){ transition-delay: .24s; }
.trust.is-visible .trust__metric:nth-child(4){ transition-delay: .32s; }
.trust.is-visible .trust__map-head           { transition-delay: .30s; }
.trust.is-visible .trust__map                { transition-delay: .40s; }
.trust.is-visible .trust__legend             { transition-delay: .52s; }

/* ---------------------------------------------------------------------
   10b. HOW — process timeline (как мы работаем)
   Two columns on desktop (red car panel | 6-step timeline), stacks on
   mobile. Steps reveal staggered on scroll; the dashed connector fills red
   as they appear; badge line-icons draw on (stroke-dashoffset). Hidden
   pre-reveal states are gated behind html.js so no-JS users see it all.
   --------------------------------------------------------------------- */
.how {
  position: relative;
  padding-block: clamp(3.5rem, 9vh, 6.5rem);
  background: var(--bg);
  border-top: 1px solid var(--line);
  overflow: hidden;
  isolation: isolate;
}

/* --- decorative red glow + shard background (mirrors HERO / TRUST) --- */
.how__bg { position: absolute; inset: 0; z-index: 0; pointer-events: none; overflow: hidden; }
.how > .container { position: relative; z-index: 1; }

/* slow floating red circle — set to the RIGHT, drifts up and loops */
.how__glow {
  position: absolute;
  right: -6%;
  top: 20%;
  width: 48vw; height: 48vw;
  max-width: 660px; max-height: 660px;
  border-radius: 50%;
  background: radial-gradient(circle at center,
              rgba(197, 0, 34, .24) 0%,
              rgba(197, 0, 34, .10) 36%,
              rgba(197, 0, 34, 0) 66%);
  filter: blur(28px);
  animation: howGlowDrift 38s linear infinite;
  will-change: transform;
}
@keyframes howGlowDrift {
  from { transform: translateY(40%); }
  to   { transform: translateY(-180%); }
}

/* angular red shards (same treatment as the hero / trust shards) */
.how__shard {
  position: absolute;
  background: linear-gradient(135deg, var(--red) 0%, rgba(197, 0, 34, 0) 80%);
  filter: blur(8px);
  pointer-events: none;
}
.how__shard--1 {
  top: -6%; right: 6%;
  width: 32vw; height: 74%;
  opacity: .07;
  clip-path: polygon(58% 0, 100% 0, 80% 100%, 40% 100%);
}
.how__shard--2 {
  bottom: -8%; left: -4%;
  width: 28vw; height: 66%;
  opacity: .05;
  clip-path: polygon(40% 0, 64% 0, 42% 100%, 16% 100%);
}

/* heading — same red-tick eyebrow + Oswald heading as TRUST (centred) */
.how__head { margin-bottom: clamp(2rem, 5vh, 3.4rem); text-align: center; }
.how__eyebrow {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: .8rem;
  font-size: .82rem;
  font-weight: 600;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: clamp(.9rem, 2vh, 1.3rem);
}
.how__eyebrow-line {
  width: 34px; height: 2px;
  background: var(--red);
  flex: 0 0 auto;
  box-shadow: 0 0 10px rgba(197, 0, 34, .7);
}
.how__heading {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.7rem, 3.4vw, 2.6rem);
  line-height: 1.02;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0;
}

/* single centred column — the steps timeline (photo column removed) */
.how__grid { display: block; }

/* --- timeline, centred on the page -------------------------------- */
.how__timeline { position: relative; max-width: 640px; margin-inline: auto; }
.how__steps { display: flex; flex-direction: column; gap: clamp(1.6rem, 3.6vh, 2.5rem); }

/* dashed connector running through the badge centres (badge = 56px, so its
   centre sits at 28px from the left) — echoes the dashed import routes */
.how__track {
  position: absolute;
  left: 26px;
  top: 28px;
  bottom: 28px;
  width: 4px;
  z-index: 0;
  display: block;
  overflow: visible;
}
/* svg fills the (correctly top/bottom-sized) track box — a bare positioned
   <svg> would collapse to its viewBox intrinsic height instead of stretching */
.how__flow-svg { display: block; width: 100%; height: 100%; overflow: visible; }
.how__flow {
  fill: none;
  stroke: var(--red-2);
  stroke-width: 4;
  stroke-dasharray: 18 16;
  stroke-linecap: butt;
  animation: howFlow 1.1s linear infinite;
}
/* progressive reveal: clip the line to the revealed fraction (JS sets
   --how-progress 0->1); full line when no JS */
.js .how__track {
  clip-path: inset(0 0 calc((1 - var(--how-progress, 0)) * 100%) 0);
  transition: clip-path .6s var(--ease-out);
}
/* dashes flow downward one full cycle (18+16 = 34), looping seamlessly */
@keyframes howFlow { to { stroke-dashoffset: -34; } }
/* та же пауза, что у карты в TRUST: класс .anim-off вешает JS, пока секция
   за экраном или вкладка неактивна (хелпер pauseWhenOffscreen в main.js) */
.how.anim-off .how__flow { animation-play-state: paused; }

/* a step row: circular icon badge + text block */
.how__step {
  position: relative;
  display: grid;
  grid-template-columns: auto 1fr;
  gap: clamp(1rem, 2vw, 1.5rem);
  align-items: start;
}
.how__badge {
  position: relative;
  z-index: 1;
  width: 56px; height: 56px;
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  border-radius: 50%;
  border: 2px solid var(--red);
  background: rgba(197, 0, 34, .10);
  color: var(--white);
}
.how__icon { width: 26px; height: 26px; display: block; overflow: visible; }

.how__index {
  display: block;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: .78rem;
  letter-spacing: .16em;
  color: var(--red-2);
}
.how__step-title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(1.2rem, 2vw, 1.5rem);
  line-height: 1.05;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: var(--white);
  margin: .15rem 0 .4rem;
}
.how__step-desc {
  color: var(--muted);
  font-size: clamp(.95rem, 1.1vw, 1.02rem);
  line-height: 1.6;
  max-width: 46ch;
  text-wrap: pretty;
}
/* работает и на <a>, и на <button> (кнопка открывает модалку заявки —
   это действие, а не переход, поэтому сбрасываем дефолты кнопки) */
.how__link {
  display: inline-block;
  margin-top: .55rem;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: .9rem;
  letter-spacing: .02em;
  text-transform: uppercase;
  text-align: left;
  color: var(--red-2);
  background: none;
  border: 0;
  border-bottom: 1px solid rgba(225, 14, 46, .45);
  padding: 0 0 1px;
  transition: color .2s ease, border-color .2s ease;
}
.how__link:hover { color: var(--white); border-color: var(--white); }

.how__cta { margin-top: clamp(2rem, 5vh, 3rem); padding-left: calc(56px + clamp(1rem, 2vw, 1.5rem)); }

/* --- reveal on scroll (JS adds .is-visible per step; stagger via --i) --- */
.js .how__step {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity .7s ease, transform .7s var(--ease-out);
  transition-delay: calc(var(--i, 0) * 90ms);
}
.how__step.is-visible { opacity: 1; transform: none; }

/* draw-on line icons (echoes the TRUST route draw): the geometry starts
   fully offset and un-draws to 0 once its step is visible */
.js .how__icon path,
.js .how__icon circle {
  stroke-dasharray: 100;
  stroke-dashoffset: 100;
  transition: stroke-dashoffset .9s var(--ease-out);
  transition-delay: calc(var(--i, 0) * 90ms + 220ms);
}
.how__step.is-visible .how__icon path,
.how__step.is-visible .how__icon circle { stroke-dashoffset: 0; }

/* --- responsive: timeline is a single centred column at all widths --- */
@media (max-width: 480px) {
  .how__badge { width: 48px; height: 48px; }
  .how__icon { width: 22px; height: 22px; }
  .how__track { left: 22px; top: 24px; bottom: 24px; width: 4px; }
  .how__cta { padding-left: 0; }
  .how__cta .btn { width: 100%; }
}

/* --- reduced motion: everything in its final, static state ------------ */
@media (prefers-reduced-motion: reduce) {
  .js .how__step { opacity: 1; transform: none; }
  .js .how__icon path,
  .js .how__icon circle { stroke-dashoffset: 0; }
  .how__flow { animation: none; }
  .js .how__track { clip-path: none; }
  .how__glow { animation: none; }
}

/* ---------------------------------------------------------------------
   10c. AUCTIONS — доступ к аукционам (ЖИВАЯ витрина лотов)
   Витрина вшита в страницу: НЕТ «окна приложения» (top-bar, рамка вокруг
   всего блока) и НЕТ внутреннего вертикального скролла — карточки лежат в
   обычном потоке. Заголовок идёт в .container, а фильтр + сетка лотов — в
   .container--wide (.auctions__wide, до 1600px). Сетка: 4 / 3 / 2 / 1
   колонки по мере сужения.

   Данные приходят из /api/lots (JS-модуль 7). Сетка в разметке ПУСТАЯ,
   карточки клонируются из <template id="lotCardTpl">. Состояний четыре:
   скелетоны (.auctions__grid--loading), пусто, ошибка, готово.
   Прежние .lot--hidden / .lot--folded (клиентский фильтр по демо-лотам)
   удалены вместе с демо-карточками — фильтрует теперь бэкенд.
   No-JS: фильтр, сетка и «Показать ещё» скрыты, виден <noscript>.
   --------------------------------------------------------------------- */
.auctions {
  position: relative;
  padding-block: clamp(3.5rem, 9vh, 6.5rem);
  background: var(--bg);
  border-top: 1px solid var(--line);
  overflow: hidden;
  isolation: isolate;
}
.auctions > .container { position: relative; z-index: 1; }

/* --- decorative red glow + shards (mirrors TRUST / HOW) --- */
.auctions__bg { position: absolute; inset: 0; z-index: 0; pointer-events: none; overflow: hidden; }
.auctions__glow {
  position: absolute;
  left: -6%;
  top: 12%;
  width: 46vw; height: 46vw;
  max-width: 640px; max-height: 640px;
  border-radius: 50%;
  background: radial-gradient(circle at center,
              rgba(197, 0, 34, .22) 0%,
              rgba(197, 0, 34, .09) 34%,
              rgba(197, 0, 34, 0) 64%);
  filter: blur(28px);
  animation: auctionsGlowDrift 40s linear infinite;
  will-change: transform;
}
@keyframes auctionsGlowDrift {
  from { transform: translateY(30%); }
  to   { transform: translateY(-190%); }
}
.auctions__shard {
  position: absolute;
  background: linear-gradient(135deg, var(--red) 0%, rgba(197, 0, 34, 0) 80%);
  filter: blur(8px);
  pointer-events: none;
}
.auctions__shard--1 {
  top: -6%; left: 4%;
  width: 30vw; height: 72%;
  opacity: .06;
  clip-path: polygon(58% 0, 100% 0, 80% 100%, 40% 100%);
}
.auctions__shard--2 {
  bottom: -8%; right: -4%;
  width: 28vw; height: 64%;
  opacity: .05;
  clip-path: polygon(40% 0, 64% 0, 42% 100%, 16% 100%);
}

/* --- heading (same eyebrow + Oswald heading as TRUST / HOW) --- */
.auctions__head { margin-bottom: clamp(2rem, 5vh, 3.2rem); max-width: 60ch; }
.auctions__eyebrow {
  display: flex;
  align-items: center;
  gap: .8rem;
  font-size: .82rem;
  font-weight: 600;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: clamp(.9rem, 2vh, 1.3rem);
}
.auctions__eyebrow-line {
  width: 34px; height: 2px;
  background: var(--red);
  flex: 0 0 auto;
  box-shadow: 0 0 10px rgba(197, 0, 34, .7);
}
.auctions__heading {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.7rem, 3.4vw, 2.6rem);
  line-height: 1.02;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0 0 clamp(.8rem, 2vh, 1.2rem);
}
.auctions__lede {
  color: var(--muted);
  font-size: clamp(.98rem, 1.2vw, 1.08rem);
  line-height: 1.6;
  text-wrap: pretty;
  margin: 0;
}

/* --- широкая полоса витрины (фильтр + сетка) --- */
.auctions__wide { position: relative; z-index: 1; }

/* --- панель фильтров: страна / поля / статус --------------------------
       Вертикальный стек, снизу тонкая линия — тот же ритм секций, что был
       у прежнего фильтра по странам. --- */
.auctions__filter {
  display: flex;
  flex-direction: column;
  gap: clamp(.9rem, 2vh, 1.25rem);
  padding-bottom: clamp(.9rem, 2vh, 1.2rem);
  margin-bottom: clamp(1.4rem, 3.4vh, 2.2rem);
  border-bottom: 1px solid var(--line);
}

/* country tabs */
.auctions__tabs {
  display: flex;
  gap: .5rem;
  flex-wrap: wrap;
}
.auctions__tab {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  padding: .5rem .85rem;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: rgba(255, 255, 255, .02);
  color: var(--muted);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: .88rem;
  letter-spacing: .02em;
  text-transform: uppercase;
  cursor: pointer;
  transition: color .2s ease, border-color .2s ease, background-color .2s ease;
}
.auctions__tab:hover { border-color: var(--red); color: var(--white); }
.auctions__tab.is-active {
  color: var(--white);
  border-color: var(--red);
  background: rgba(197, 0, 34, .12);
}
.auctions__tab-flag {
  width: 22px; height: 16px;
  border-radius: 2px;
  display: block;
  flex: 0 0 auto;
}

/* поля фильтра */
.auctions__controls {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(168px, 1fr));
  gap: .7rem .8rem;
  align-items: end;
}
.auctions__control { min-width: 0; }
.auctions__control[hidden] { display: none; }
.auctions__control--action { display: flex; align-items: flex-end; }
.auctions__control-label {
  display: block;
  margin-bottom: .35rem;
  font-size: .68rem;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--muted);
}
.auctions__select,
.auctions__input {
  width: 100%;
  min-width: 0;
  height: 2.5rem;
  padding: 0 .6rem;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: rgba(255, 255, 255, .03);
  color: var(--white);
  font-family: var(--font-body);
  font-size: .88rem;
  line-height: 1.2;
  /* нативные виджеты (список select, стрелки number) — в тёмной теме */
  color-scheme: dark;
  transition: border-color .2s ease, background-color .2s ease;
}
.auctions__select:hover:not(:disabled),
.auctions__input:hover:not(:disabled) { border-color: rgba(255, 255, 255, .3); }
.auctions__select:disabled,
.auctions__input:disabled { opacity: .42; cursor: not-allowed; }
/* список выпадашки браузер рисует сам — задаём ему цвета явно */
.auctions__select option { background: var(--surface); color: var(--white); }
.auctions__pair { display: flex; align-items: center; gap: .35rem; }
.auctions__pair-dash { color: var(--muted); flex: 0 0 auto; }
.auctions__reset {
  height: 2.5rem;
  padding: 0 .9rem;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: transparent;
  color: var(--muted);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: .8rem;
  letter-spacing: .06em;
  text-transform: uppercase;
  white-space: nowrap;
  cursor: pointer;
  transition: color .2s ease, border-color .2s ease;
}
.auctions__reset:hover { border-color: var(--red); color: var(--white); }

.auctions__hint {
  margin: 0;
  color: var(--muted);
  font-size: .78rem;
}
.auctions__hint[hidden] { display: none; }

/* статус: сколько показано · кеш · оговорка про валюту */
.auctions__statusbar {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: .3rem 1.2rem;
}
/* СКОЛЬКО НАЙДЕНО — главная строка панели фильтров, а не подпись мелким
   шрифтом: заказчик должен видеть размер выдачи сразу. Отсюда дисплейный
   шрифт, белый цвет и красная точка-маркер.
   Прятать пустой счётчик через display:none НЕЛЬЗЯ: это live-region
   (role=status), а скринридер не объявляет изменения в скрытом элементе.
   Поэтому у пустого просто убирается точка, сам <p> остаётся в потоке
   (места он не занимает — соседей сдвигает только gap). */
.auctions__count {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  margin: 0;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(.95rem, 1.6vw, 1.08rem);
  letter-spacing: .02em;
  color: var(--white);
}
.auctions__count::before {
  content: "";
  width: 7px; height: 7px;
  border-radius: 50%;
  background: var(--red);
  flex: 0 0 auto;
  box-shadow: 0 0 10px rgba(197, 0, 34, .7);
}
.auctions__count:empty::before { content: none; }
/* «Ищем лоты…» / «Ничего не найдено» — тот же слот, но приглушённо */
.auctions__count--muted { color: var(--muted); font-weight: 500; }
.auctions__stale {
  display: inline-flex;
  align-items: center;
  gap: .45rem;
  margin: 0;
  color: var(--muted);
  font-size: .78rem;
}
.auctions__stale::before {
  content: "";
  width: 6px; height: 6px;
  border-radius: 50%;
  background: var(--red);
  flex: 0 0 auto;
}
.auctions__stale[hidden] { display: none; }

/* ЗДЕСЬ БЫЛА .auctions__pricenote — оговорка «цена в валюте страны, без
   доставки, таможни и комиссии» справа в статус-панели. Удалена по
   требованию заказчика вместе с разметкой. Не возвращать.
   (Ровно так же раньше убрали .stock__pricenote на stock.html.) */

/* Оговорка про оферту — под витриной. Приглушённый тон подписи, по центру,
   потому что закрывает всю выдачу, а не отдельную карточку. Это ДРУГОЙ
   текст, не удалённая .auctions__pricenote. Видна во всех состояниях. */
.auctions__offernote {
  margin: clamp(1rem, 2.4vh, 1.5rem) auto 0;
  max-width: 68ch;
  text-align: center;
  color: var(--muted);
  font-size: .78rem;
  line-height: 1.5;
  text-wrap: pretty;
}

/* --- сетка лотов: без своего скролла, число колонок задано явно --- */
.auctions__grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: clamp(.9rem, 1.6vw, 1.6rem);
}
.auctions__grid:empty { display: none; }
/* Пульсация на ВРЕМЯ ЗАГРУЗКИ. Одна анимация на всю сетку, а не по одной
   на каждый скелетон — бюджет бесконечных анимаций в проекте жёсткий
   (см. блок 12b, там она вдобавок выключена на телефоне). */
.auctions__grid--loading { animation: auctionsSkeletonPulse 1.5s ease-in-out infinite; }
@keyframes auctionsSkeletonPulse {
  0%, 100% { opacity: .9; }
  50%      { opacity: .55; }
}

/* --- a lot card --- */
.lot {
  position: relative;                /* якорь для растянутого .lot__open::after */
  display: flex;
  flex-direction: column;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--surface);
  overflow: hidden;
  transition: border-color .2s ease, transform .2s var(--ease-out);
}
.lot:hover { border-color: rgba(197, 0, 34, .55); transform: translateY(-2px); }

.lot__media {
  position: relative;
  aspect-ratio: 16 / 10;
  display: grid;
  place-items: center;
  background:
    radial-gradient(120% 90% at 50% 12%, rgba(197, 0, 34, .10) 0%, rgba(197, 0, 34, 0) 60%),
    linear-gradient(160deg, #17151a 0%, #0d0c0f 100%);
  border-bottom: 1px solid var(--line);
  color: rgba(255, 255, 255, .28);
  overflow: hidden;
}
.lot__photo {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  z-index: 0;
}
.lot__photo[hidden] { display: none; }
/* подпись под пустым местом фото: видна, только пока фото нет */
.lot__nophoto {
  font-size: .72rem;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, .22);
}
.lot__nophoto[hidden] { display: none; }
.lot__flag {
  position: absolute;
  top: 8px; left: 8px;
  line-height: 0;
  z-index: 1;
}
.lot__flag[hidden] { display: none; }
.lot__flag img {
  width: 26px; height: 19px;
  border-radius: 3px;
  display: block;
  box-shadow: 0 1px 4px rgba(0, 0, 0, .5);
}
/* красная пилюля справа сверху: теперь это аукционная оценка (только Япония) */
.lot__badge {
  position: absolute;
  top: 8px; right: 8px;
  z-index: 1;
  display: inline-flex;
  align-items: center;
  padding: .18em .5em;
  border-radius: 999px;
  background: var(--red);
  color: var(--white);
  font-family: var(--font-display);
  font-weight: 700;
  font-size: .62rem;
  letter-spacing: .12em;
}
.lot__badge[hidden] { display: none; }

/* САНКЦИОННЫЙ АВТОМОБИЛЬ — та же пилюля, но КОНТУРНАЯ и в нижнем левом
   углу медиа: с красной оценкой (верх справа) и флагом (верх слева) не
   пересекается ни при каких данных. Заливки нет намеренно — это факт о
   лоте, а не предупреждение; красный на сайте означает акцент, и отдавать
   его сюда нельзя. Палитра прежняя: чёрный фон + белый контур и текст. */
.lot__badge--sanction {
  top: auto;
  right: auto;
  bottom: 8px;
  left: 8px;
  background: rgba(5, 5, 6, .78);
  border: 1px solid rgba(255, 255, 255, .55);
  color: var(--white);
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  max-width: calc(100% - 16px);
}

.lot__body {
  flex: 1 1 auto;
  padding: .8rem .85rem 1rem;
  display: flex;
  flex-direction: column;
  gap: .2rem;
}
.lot__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 1.06rem;
  line-height: 1.1;
  letter-spacing: -.01em;
  color: var(--white);
  margin: 0;
}
/* ОТКРЫТЬ ПОДРОБНУЮ КАРТОЧКУ (<dialog id="lotModal">).
   Настоящая <button> внутри <h3>: её ::after растянут на всю .lot, поэтому
   кликается вся карточка, а в Tab-порядке остаётся одна точка входа.
   Витрина «Авто в наличии» (stock.html) переиспользует .lot / .lot__title,
   но своей кнопки .lot__open в шаблоне не имеет — её эти правила не касаются. */
.lot__open {
  display: block;
  width: 100%;
  padding: 0;
  border: 0;
  background: none;
  color: inherit;
  font: inherit;
  letter-spacing: inherit;
  text-align: left;
  cursor: pointer;
  transition: color .2s ease;
}
.lot__open::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  cursor: pointer;
}
.lot:hover .lot__open { color: var(--red-2); }
/* Кольцо фокуса рисуем на всей карточке, а не на строке заголовка:
   кликается-то вся карточка, и фокус должен показывать именно её. */
.lot__open:focus-visible { outline: none; }
.lot__open:focus-visible::after {
  outline: 2px solid var(--red-2);
  outline-offset: -3px;
  border-radius: 9px;
}

.lot__meta {
  color: var(--muted);
  font-size: .82rem;
  margin: 0 0 .5rem;
}
.lot__price { display: flex; flex-direction: column; gap: .1rem; margin: 0; }
.lot__price-label {
  font-size: .64rem;
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--muted);
}
.lot__price-val {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 1.1rem;
  color: var(--white);
}
.lot__price-val--na {
  font-size: .95rem;
  font-weight: 500;
  color: var(--muted);
}
/* второстепенная строка цены: сюда уезжает цена площадки, когда придёт
   рублёвая сумма «под ключ» (lot.price_turnkey) */
.lot__price-sub {
  font-size: .74rem;
  color: var(--muted);
}
.lot__price-sub[hidden] { display: none; }
.lot__source {
  margin: .55rem 0 .9rem;
  font-size: .72rem;
  letter-spacing: .04em;
  color: var(--muted);
}
/* Кнопка квиза лежит ВЫШЕ растянутого слоя .lot__open::after (z-index 1),
   иначе клик по ней открывал бы подробную карточку. Всплытие гасит модуль 7. */
.lot__cta {
  position: relative;
  z-index: 2;
  margin-top: auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: .55rem .7rem;
  border: 1px solid rgba(197, 0, 34, .5);
  border-radius: 8px;
  background: rgba(197, 0, 34, .1);
  color: var(--white);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: .78rem;
  letter-spacing: .06em;
  text-transform: uppercase;
  text-decoration: none;
  text-align: center;
  transition: background-color .2s ease, border-color .2s ease;
}
.lot__cta:hover { background: var(--red); border-color: var(--red); }

/* --- скелетон загрузки: та же геометрия, что у карточки --- */
.lot--skeleton { pointer-events: none; }
.lot__skel {
  display: block;
  border-radius: 4px;
  background: rgba(255, 255, 255, .07);
}
.lot__skel--title { height: 1.1rem; width: 70%; margin-bottom: .5rem; }
.lot__skel--meta  { height: .8rem;  width: 50%; margin-bottom: 1.1rem; }
.lot__skel--price { height: 1.6rem; width: 62%; margin-bottom: 1.4rem; }
.lot__skel--cta   { height: 2.1rem; width: 100%; margin-top: auto; }

/* --- пусто / ошибка --- */
.auctions__note {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .9rem;
  padding: clamp(1.6rem, 4vh, 2.6rem) 1rem;
  border: 1px dashed var(--line);
  border-radius: 12px;
  text-align: center;
}
.auctions__note[hidden] { display: none; }
.auctions__note-text {
  margin: 0;
  max-width: 46ch;
  color: var(--muted);
  font-size: .95rem;
  line-height: 1.55;
}
.auctions__note--error { border-color: rgba(197, 0, 34, .45); }

/* «Показать ещё» — единственная кнопка под витриной. Блок .auctions__outro
   с дублирующим CTA «Получить доступ» убран по просьбе заказчика вместе
   со своим правилом; номер соседей не трогали. */
.auctions__more {
  display: flex;
  justify-content: center;
  margin-top: clamp(1.6rem, 3.4vh, 2.4rem);
}
.auctions__more[hidden] { display: none; }

/* --- без JS: витрину нечем наполнить, показываем только текст --- */
.no-js .auctions__filter,
.no-js .auctions__grid,
.no-js .auctions__more { display: none; }
.auctions__noscript {
  margin: 0;
  padding: 1.4rem 1rem;
  border: 1px dashed var(--line);
  border-radius: 12px;
  text-align: center;
  color: var(--muted);
  font-size: .95rem;
}
.auctions__noscript a { color: var(--white); }

/* --- reveal on scroll (JS adds .is-visible on the section) --- */
.js .auctions__wide {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity .7s ease, transform .7s var(--ease-out);
}
.auctions.is-visible .auctions__wide { opacity: 1; transform: none; }

/* --- responsive: 4 → 3 → 2 → 1 колонки --- */
@media (max-width: 1100px) {
  .auctions__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 780px) {
  .auctions__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 520px) {
  .auctions__grid { grid-template-columns: minmax(0, 1fr); }
  .auctions__controls { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .auctions__control--action { grid-column: 1 / -1; }
  .auctions__reset { width: 100%; }
  .auctions__tab { font-size: .8rem; padding: .45rem .7rem; }
  .auctions__more .btn { width: 100%; }
}

/* --- reduced motion: без дрейфа свечения и без reveal-сдвига --- */
@media (prefers-reduced-motion: reduce) {
  .auctions__glow { animation: none; }
  .auctions__grid--loading { animation: none; }
  .js .auctions__wide { opacity: 1; transform: none; }
  .lot:hover { transform: none; }
}

/* ---------------------------------------------------------------------
   10d. GUIDE — как не ошибиться (лид-магнит)
   Two-column lead-magnet: intro (eyebrow + heading + lede + red-check list +
   CTA) | branded "guide cover" card (shapes only). Stacks below ~900px.
   Palette: red / black / white only.
   --------------------------------------------------------------------- */
.guide {
  position: relative;
  padding-block: clamp(3.5rem, 9vh, 6.5rem);
  background: var(--bg);
  border-top: 1px solid var(--line);
  overflow: hidden;
  isolation: isolate;
}
.guide > .container { position: relative; z-index: 1; }

/* single soft red glow so the block isn't too dark */
.guide__bg { position: absolute; inset: 0; z-index: 0; pointer-events: none; overflow: hidden; }
.guide__glow {
  position: absolute;
  right: -4%;
  top: 30%;
  width: 42vw; height: 42vw;
  max-width: 560px; max-height: 560px;
  border-radius: 50%;
  background: radial-gradient(circle at center,
              rgba(197, 0, 34, .18) 0%,
              rgba(197, 0, 34, .07) 36%,
              rgba(197, 0, 34, 0) 66%);
  filter: blur(30px);
}

.guide__grid {
  display: grid;
  grid-template-columns: 1.05fr .95fr;
  gap: clamp(2rem, 5vw, 4rem);
  align-items: center;
}

/* --- LEFT · intro --- */
.guide__eyebrow {
  display: flex;
  align-items: center;
  gap: .8rem;
  font-size: .82rem;
  font-weight: 600;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: clamp(.9rem, 2vh, 1.3rem);
}
.guide__eyebrow-line {
  width: 34px; height: 2px;
  background: var(--red);
  flex: 0 0 auto;
  box-shadow: 0 0 10px rgba(197, 0, 34, .7);
}
.guide__heading {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.7rem, 3.4vw, 2.6rem);
  line-height: 1.02;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0 0 clamp(.8rem, 2vh, 1.2rem);
}
.guide__accent { color: var(--red); }
.guide__lede {
  color: var(--muted);
  font-size: clamp(.98rem, 1.2vw, 1.08rem);
  line-height: 1.6;
  text-wrap: pretty;
  max-width: 52ch;
  margin: 0 0 clamp(1.4rem, 3.5vh, 2rem);
}

.guide__list {
  display: flex;
  flex-direction: column;
  gap: clamp(.7rem, 1.6vh, 1rem);
  margin-bottom: clamp(1.6rem, 4vh, 2.4rem);
}
.guide__item {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: .8rem;
  align-items: start;
}
.guide__check {
  flex: 0 0 auto;
  width: 26px; height: 26px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  border: 1.5px solid var(--red);
  background: rgba(197, 0, 34, .10);
}
.guide__check svg { width: 15px; height: 15px; display: block; }
.guide__item-text {
  color: var(--white);
  font-size: clamp(.95rem, 1.1vw, 1.04rem);
  line-height: 1.45;
  padding-top: .1rem;
  text-wrap: pretty;
}
.guide__cta { margin-top: .2rem; }

/* --- RIGHT · photo lead-magnet cover --- */
.guide__cover {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 1.1rem;
  aspect-ratio: 4 / 5;
  overflow: hidden;
  padding: clamp(1.6rem, 3vw, 2.2rem);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 16px;
  box-shadow: 0 30px 70px -34px rgba(0, 0, 0, .85),
              0 0 60px -20px rgba(197, 0, 34, .45);
}
.guide__doc-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  z-index: 0;
}
.guide__cover-scrim {
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(to top,
    rgba(5, 5, 6, .9) 0%,
    rgba(5, 5, 6, .45) 45%,
    rgba(5, 5, 6, .15) 100%);
}
.guide__tag {
  position: relative;
  z-index: 2;
  margin-bottom: auto;
  align-self: flex-start;
  display: inline-flex;
  align-items: center;
  gap: .5em;
  padding: .35em .8em;
  border: 1px solid rgba(197, 0, 34, .5);
  border-radius: 999px;
  background: rgba(197, 0, 34, .10);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: .72rem;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--red-2);
}
.guide__tag-dot {
  width: 7px; height: 7px;
  border-radius: 50%;
  background: var(--red-2);
  box-shadow: 0 0 8px rgba(225, 14, 46, .8);
}
.guide__cover-title {
  position: relative;
  z-index: 2;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.5rem, 2.6vw, 2rem);
  line-height: 1.06;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0;
}
/* ЗДЕСЬ БЫЛА .guide__cover-note — подпись «Скачать одним нажатием ↓» на
   обложке. Удалена по требованию заказчика: выглядела ссылкой, но не
   кликалась. Скачивание теперь даёт сама кнопка .guide__cta — обычная
   <a download>, без модалки. Не возвращать. */

/* --- responsive: stack below ~900px (cover under the intro) --- */
@media (max-width: 900px) {
  .guide__grid { grid-template-columns: 1fr; gap: clamp(2rem, 6vw, 2.8rem); }
  .guide__cover { max-width: 460px; }
}

/* Плашка на обложке — длинный текст («Как выбрать надёжного импортера?»).
   На узких экранах ей не хватает ~6px, и она разваливается на две строки.
   Ужимаем трекинг (тот же приём, что у кикера в hero) — размер шрифта и
   стиль плашки не трогаем, текст не сокращаем. Замерено: на 360px пилюля
   занимает ~261px при доступных ~274px. */
@media (max-width: 400px) {
  .guide__tag { letter-spacing: .09em; }
}

/* ---------------------------------------------------------------------
   10e. CALC — квиз-подбор автомобиля (главный CTA)
   Two-column like GUIDE: intro (eyebrow + heading + lede + red-check list)
   | quiz card on --surface. The card shows ONE .calc__step at a time (JS
   module 8 toggles .is-active); its min-height keeps the page from jumping
   between steps. Progress bar is driven by --calc-progress (0..1) set on
   the card in JS — never by inline per-element styles.
   No-JS: every step stays visible and the wizard buttons are hidden, so
   the markup still reads as a normal form.
   Palette: red / black / white only.
   --------------------------------------------------------------------- */
.calc {
  position: relative;
  padding-block: clamp(3.5rem, 9vh, 6.5rem);
  background: var(--bg);
  border-top: 1px solid var(--line);
  overflow: hidden;
  isolation: isolate;
  scroll-margin-top: var(--header-h);   /* the three #calc links land below the fixed header */
}
.calc > .container { position: relative; z-index: 1; }

/* [hidden] must win over the display of .btn / .calc__success */
.calc [hidden] { display: none !important; }

/* screen-reader-only (radio inputs, duplicated <legend>s) — kept focusable */
.visually-hidden {
  position: absolute;
  width: 1px; height: 1px;
  margin: -1px; padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* --- decorative red glow + shards (mirrors AUCTIONS) --- */
.calc__bg { position: absolute; inset: 0; z-index: 0; pointer-events: none; overflow: hidden; }
.calc__glow {
  position: absolute;
  right: -6%;
  top: 10%;
  width: 46vw; height: 46vw;
  max-width: 640px; max-height: 640px;
  border-radius: 50%;
  background: radial-gradient(circle at center,
              rgba(197, 0, 34, .22) 0%,
              rgba(197, 0, 34, .09) 34%,
              rgba(197, 0, 34, 0) 64%);
  filter: blur(28px);
  animation: calcGlowDrift 40s linear infinite;
  will-change: transform;
}
@keyframes calcGlowDrift {
  from { transform: translateY(-30%); }
  to   { transform: translateY(190%); }
}
.calc__shard {
  position: absolute;
  background: linear-gradient(135deg, var(--red) 0%, rgba(197, 0, 34, 0) 80%);
  filter: blur(8px);
  pointer-events: none;
}
.calc__shard--1 {
  top: -6%; left: -2%;
  width: 28vw; height: 70%;
  opacity: .06;
  clip-path: polygon(58% 0, 100% 0, 80% 100%, 40% 100%);
}
.calc__shard--2 {
  bottom: -8%; right: 6%;
  width: 26vw; height: 62%;
  opacity: .05;
  clip-path: polygon(40% 0, 64% 0, 42% 100%, 16% 100%);
}

.calc__grid {
  display: grid;
  grid-template-columns: 1.05fr .95fr;
  gap: clamp(2rem, 5vw, 4rem);
  align-items: center;
}

/* --- LEFT · intro (same eyebrow/heading/lede scale as GUIDE) --- */
.calc__head { margin-bottom: clamp(1.6rem, 4vh, 2.4rem); }
.calc__eyebrow {
  display: flex;
  align-items: center;
  gap: .8rem;
  font-size: .82rem;
  font-weight: 600;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: clamp(.9rem, 2vh, 1.3rem);
}
.calc__eyebrow-line {
  width: 34px; height: 2px;
  background: var(--red);
  flex: 0 0 auto;
  box-shadow: 0 0 10px rgba(197, 0, 34, .7);
}
.calc__heading {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.7rem, 3.4vw, 2.6rem);
  line-height: 1.02;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0 0 clamp(.8rem, 2vh, 1.2rem);
}
.calc__accent { color: var(--red); }
.calc__lede {
  color: var(--muted);
  font-size: clamp(.98rem, 1.2vw, 1.08rem);
  line-height: 1.6;
  text-wrap: pretty;
  max-width: 52ch;
  margin: 0;
}

.calc__list {
  display: flex;
  flex-direction: column;
  gap: clamp(.7rem, 1.6vh, 1rem);
}
.calc__item {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: .8rem;
  align-items: start;
}
.calc__check {
  flex: 0 0 auto;
  width: 26px; height: 26px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  border: 1.5px solid var(--red);
  background: rgba(197, 0, 34, .10);
}
.calc__check svg { width: 15px; height: 15px; display: block; }
.calc__item-text {
  color: var(--white);
  font-size: clamp(.95rem, 1.1vw, 1.04rem);
  line-height: 1.45;
  padding-top: .1rem;
  text-wrap: pretty;
}

/* --- RIGHT · the quiz card --- */
.calc__card {
  position: relative;
  display: flex;
  flex-direction: column;
  min-height: 460px;                 /* steps differ in height — keep the page still */
  padding: clamp(1.4rem, 2.6vw, 2rem);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 16px;
  box-shadow: 0 30px 70px -34px rgba(0, 0, 0, .85),
              0 0 60px -26px rgba(197, 0, 34, .40);
}

/* progress */
.calc__progress { margin-bottom: clamp(1.2rem, 3vh, 1.8rem); }
.calc__progress-track {
  height: 3px;
  border-radius: 999px;
  background: rgba(255, 255, 255, .10);
  overflow: hidden;
}
.calc__progress-fill {
  display: block;
  height: 100%;
  border-radius: 999px;
  background: linear-gradient(90deg, var(--red) 0%, var(--red-2) 100%);
  transform: scaleX(var(--calc-progress, .25));
  transform-origin: left center;
  transition: transform .5s var(--ease-out);
}
.calc__progress-label {
  margin: .6rem 0 0;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: .76rem;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--muted);
}

/* ЗДЕСЬ БЫЛИ СТИЛИ .calc__picked* — красная строка «Расчёт по лоту: … ·
   Убрать» над формой квиза. Удалена по требованию заказчика вместе с
   разметкой. Механизм передачи лота в заявку это НЕ затронуло: лот
   по-прежнему живёт в setPickedLot() (js/main.js) и уезжает в extra.
   Не возвращать. */

/* form + steps */
.calc__form { display: flex; flex-direction: column; flex: 1 1 auto; }
.calc__step {
  border: 0;
  margin: 0;
  padding: 0;
  min-width: 0;                      /* fieldset default shrink-wrap fix */
  flex: 1 1 auto;
}
/* no-JS: all steps visible, wizard buttons hidden (form still readable) */
.calc__nav-wizard { display: none; }
.js .calc__nav-wizard { display: inline-flex; }
.js .calc__step { display: none; }
.js .calc__step.is-active { display: block; animation: calcStepIn .38s var(--ease-out) both; }
@keyframes calcStepIn {
  from { opacity: 0; transform: translateY(10px); }
  to   { opacity: 1; transform: none; }
}

.calc__question {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(1.15rem, 1.8vw, 1.4rem);
  line-height: 1.15;
  letter-spacing: -.005em;
  color: var(--white);
  margin: 0 0 clamp(1rem, 2.4vh, 1.4rem);
  outline: none;                     /* focused programmatically on step change */
}

/* radio options: hidden native input + styled label */
.calc__options {
  position: relative;
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: .7rem;
}
.calc__option {
  display: flex;
  align-items: center;
  min-height: 58px;
  padding: .85rem 1rem;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: rgba(255, 255, 255, .02);
  color: var(--white);
  font-family: var(--font-display);
  font-weight: 500;
  font-size: .98rem;
  line-height: 1.15;
  letter-spacing: .01em;
  cursor: pointer;
  transition: border-color .2s ease, background-color .2s ease, transform .2s var(--ease-out);
}
.calc__option:hover { border-color: rgba(197, 0, 34, .55); transform: translateY(-2px); }
.calc__input:checked + .calc__option {
  border-color: var(--red);
  background: rgba(197, 0, 34, .14);
  box-shadow: 0 0 0 1px var(--red) inset;
}
.calc__input:focus-visible + .calc__option {
  outline: 2px solid var(--red-2);
  outline-offset: 3px;
}

/* step 4 · contact fields */
.calc__fields { display: flex; flex-direction: column; gap: 1rem; }
.calc__field { display: flex; flex-direction: column; }
.calc__label {
  font-size: .74rem;
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: .45rem;
}
.calc__control {
  width: 100%;
  padding: .85rem 1rem;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: rgba(255, 255, 255, .02);
  color: var(--white);
  font-family: var(--font-body);
  font-size: 1rem;
  line-height: 1.3;
  transition: border-color .2s ease, background-color .2s ease;
}
.calc__control::placeholder { color: rgba(255, 255, 255, .34); }
.calc__control:hover { border-color: rgba(255, 255, 255, .22); }
.calc__control:focus-visible {
  outline: 2px solid var(--red-2);
  outline-offset: 2px;
  border-color: var(--red);
}
.calc__control[aria-invalid="true"] { border-color: var(--red-2); }

.calc__consent {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: .65rem;
  align-items: start;
  cursor: pointer;
}
.calc__consent-input {
  appearance: none;
  -webkit-appearance: none;
  flex: 0 0 auto;
  width: 20px; height: 20px;
  margin: 1px 0 0;
  border: 1px solid var(--line);
  border-radius: 5px;
  background: rgba(255, 255, 255, .02);
  cursor: pointer;
  position: relative;
  transition: border-color .2s ease, background-color .2s ease;
}
.calc__consent-input:checked { border-color: var(--red); background: var(--red); }
.calc__consent-input:checked::after {
  content: "";
  position: absolute;
  left: 6px; top: 2px;
  width: 5px; height: 10px;
  border: solid var(--white);
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
}
.calc__consent-input:focus-visible { outline: 2px solid var(--red-2); outline-offset: 2px; }
.calc__consent-input[aria-invalid="true"] { border-color: var(--red-2); }
.calc__consent-text { color: var(--muted); font-size: .84rem; line-height: 1.45; }
.calc__consent-link { color: var(--white); text-decoration: underline; text-underline-offset: 2px; }
.calc__consent-link:hover { color: var(--red-2); }

/* inline validation messages (empty = nothing rendered) */
.calc__error {
  margin: .4rem 0 0;
  color: var(--red-2);
  font-size: .8rem;
  line-height: 1.35;
  min-height: 0;
}
.calc__error:empty { margin: 0; }
.calc__form-error {
  margin: 0 0 .9rem;
  padding: .7rem .9rem;
  border: 1px solid rgba(197, 0, 34, .55);
  border-radius: 8px;
  background: rgba(197, 0, 34, .12);
  color: var(--white);
  font-size: .86rem;
  line-height: 1.4;
}

/* wizard navigation */
.calc__nav {
  display: flex;
  align-items: center;
  gap: .7rem;
  margin-top: clamp(1.2rem, 3vh, 1.8rem);
  padding-top: clamp(1rem, 2.4vh, 1.4rem);
  border-top: 1px solid var(--line);
}
.calc__next,
.calc__submit { margin-left: auto; }
.calc__nav .btn:disabled {
  opacity: .4;
  cursor: not-allowed;
  transform: none;
  box-shadow: none;
}

/* success screen */
.calc__success {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  flex: 1 1 auto;
}
.calc__success-icon {
  width: 44px; height: 44px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  border: 1.5px solid var(--red);
  background: rgba(197, 0, 34, .12);
  margin-bottom: 1.1rem;
}
.calc__success-icon svg { width: 24px; height: 24px; display: block; }
.calc__success-title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.5rem, 2.6vw, 2rem);
  line-height: 1.06;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0 0 .6rem;
  outline: none;
}
.calc__success-text {
  margin: 0 0 clamp(1.2rem, 3vh, 1.8rem);
  color: var(--muted);
  font-size: clamp(.95rem, 1.1vw, 1.04rem);
  line-height: 1.5;
}
.calc__summary {
  width: 100%;
  margin: 0 0 clamp(1.4rem, 3.5vh, 2rem);
  border-top: 1px solid var(--line);
}
.calc__summary-row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1rem;
  padding: .7rem 0;
  border-bottom: 1px solid var(--line);
}
.calc__summary-key {
  margin: 0;
  font-size: .74rem;
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--muted);
}
.calc__summary-val {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 1rem;
  color: var(--white);
  text-align: right;
}
.calc__restart { margin-top: auto; }

/* --- reveal on scroll (JS adds .is-visible on the section) --- */
.js .calc__card {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity .7s ease, transform .7s var(--ease-out);
}
.calc.is-visible .calc__card { opacity: 1; transform: none; }

/* --- responsive --- */
@media (max-width: 900px) {
  .calc__grid { grid-template-columns: 1fr; gap: clamp(2rem, 6vw, 2.8rem); }
  .calc__card { max-width: 560px; }
}
@media (max-width: 560px) {
  .calc__card { min-height: 0; padding: 1.1rem; }
  .calc__options { grid-template-columns: 1fr; gap: .55rem; }
  .calc__option { min-height: 52px; font-size: .94rem; }
  .calc__nav { flex-wrap: wrap; }
  .calc__nav .btn { flex: 1 1 auto; }
  .calc__restart { width: 100%; }
}

/* --- reduced motion: no step transition, no drifting decor --- */
@media (prefers-reduced-motion: reduce) {
  .calc__glow { animation: none; }
  .js .calc__step.is-active { animation: none; }
  .calc__progress-fill { transition: none; }
  .calc__option:hover { transform: none; }
  .js .calc__card { opacity: 1; transform: none; }
}

/* ---------------------------------------------------------------------
   10f. REVIEWS — фотографии выдач + живой виджет отзывов 2ГИС
   NB: в DOM секция стоит ПЕРЕД CALC (гайд -> отзывы -> заявка); нумерация
   блоков в этом файле идёт по порядку добавления, отсюда 10f после 10e.
   Композиция: центрированная заголовочная группа -> .reviews__layout из
   ДВУХ КОЛОНОК (слева .reviews__gallery — четыре фотографии выдач, справа
   .reviews__panel с виджетом + подпись .reviews__note со ссылкой на
   карточку организации).
   Правая колонка фиксирована по ширине (виджет отдаёт максимум 528px),
   левая забирает остаток — поэтому grid-template-columns: 1fr auto.
   Подложка (--surface + --line + радиус + тень, как у .calc__card) с
   заголовком-меткой делает из виджета карточку сайта; фон самого виджета
   (#141216 в assets/2gis-widget.html) равен --surface — шва нет.
   Виджет фиксирован по высоте и скроллится внутри себя; ширина 100% при
   max-width 528px, поэтому на телефоне горизонтального переполнения нет.
   ФОТОГРАФИИ: исходники разного формата (640x526 … 536x900), поэтому
   соотношение сторон задаёт КОНТЕЙНЕР (.reviews__shot), а снимок
   кадрируется object-fit: cover. width/height у <img> проставлены —
   нулевой CLS. Своих анимаций у галереи нет, только reveal-переход.
   Осознанно без звёзд/рейтингов в разметке: оценку отдаёт сам виджет.
   Палитра прежняя: красный / чёрный / белый.
   --------------------------------------------------------------------- */
.reviews {
  position: relative;
  padding-block: clamp(3.5rem, 9vh, 6.5rem);
  background: var(--bg);
  border-top: 1px solid var(--line);
  overflow: hidden;
  isolation: isolate;
  scroll-margin-top: var(--header-h);   /* ссылки #reviews из шапки/меню */
}
.reviews > .container { position: relative; z-index: 1; }

/* --- decorative red glow + shards (mirrors AUCTIONS / CALC) --- */
.reviews__bg { position: absolute; inset: 0; z-index: 0; pointer-events: none; overflow: hidden; }
.reviews__glow {
  position: absolute;
  left: -6%;
  top: 16%;
  width: 46vw; height: 46vw;
  max-width: 640px; max-height: 640px;
  border-radius: 50%;
  background: radial-gradient(circle at center,
              rgba(197, 0, 34, .20) 0%,
              rgba(197, 0, 34, .08) 34%,
              rgba(197, 0, 34, 0) 64%);
  filter: blur(28px);
  animation: reviewsGlowDrift 44s linear infinite;
  will-change: transform;
}
@keyframes reviewsGlowDrift {
  from { transform: translateY(20%); }
  to   { transform: translateY(-180%); }
}
.reviews__shard {
  position: absolute;
  background: linear-gradient(135deg, var(--red) 0%, rgba(197, 0, 34, 0) 80%);
  filter: blur(8px);
  pointer-events: none;
}
.reviews__shard--1 {
  top: -6%; right: 6%;
  width: 28vw; height: 70%;
  opacity: .06;
  clip-path: polygon(58% 0, 100% 0, 80% 100%, 40% 100%);
}
.reviews__shard--2 {
  bottom: -8%; left: -2%;
  width: 26vw; height: 62%;
  opacity: .05;
  clip-path: polygon(40% 0, 64% 0, 42% 100%, 16% 100%);
}

/* --- heading (same eyebrow / heading / lede scale as AUCTIONS, но по центру:
       заголовочная группа держит виджет, стоящий ниже по центру секции) --- */
.reviews__head {
  margin: 0 auto clamp(2rem, 5vh, 3.2rem);
  max-width: 62ch;
  text-align: center;
}
.reviews__eyebrow {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: .8rem;
  font-size: .82rem;
  font-weight: 600;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: clamp(.9rem, 2vh, 1.3rem);
}
.reviews__eyebrow-line {
  width: 34px; height: 2px;
  background: var(--red);
  flex: 0 0 auto;
  box-shadow: 0 0 10px rgba(197, 0, 34, .7);
}
.reviews__heading {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.7rem, 3.4vw, 2.6rem);
  line-height: 1.02;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0 0 clamp(.8rem, 2vh, 1.2rem);
}
.reviews__accent { color: var(--red-2); }
.reviews__lede {
  color: var(--muted);
  font-size: clamp(.98rem, 1.2vw, 1.08rem);
  line-height: 1.6;
  text-wrap: pretty;
  margin: 0;
}

/* --- две колонки: фотографии выдач | виджет 2ГИС ---------------------
   Правая колонка не тянется: её ширину задаёт сама карточка виджета
   (528px + отступы). Левая забирает остаток, поэтому 1fr auto.
   align-items: start — колонки разной высоты не растягивают друг друга. */
.reviews__layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: start;
  gap: clamp(1.4rem, 3vw, 2.6rem);
}
.reviews__col { min-width: 0; }

/* метка над галереей — тем же шрифтом и точкой, что метка карточки виджета */
.reviews__subhead {
  display: flex;
  align-items: center;
  gap: .55rem;
  margin: 0 0 clamp(.7rem, 1.6vh, 1rem);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: .78rem;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--muted);
}

/* --- галерея выдач: 2x2 ----------------------------------------------
   Соотношение сторон держит КОНТЕЙНЕР, а не картинка: исходники
   портретные и альбомные вперемешку, а сетка обязана быть ровной. */
.reviews__gallery {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(.6rem, 1.4vw, 1rem);
}
.reviews__shot {
  position: relative;
  margin: 0;
  aspect-ratio: 4 / 5;
  border: 1px solid var(--line);
  border-radius: 12px;
  overflow: hidden;
  background: var(--surface);
  transition: border-color .25s ease;
}
/* Только рамка: подъём translateY здесь конфликтовал бы с reveal-правилом
   .reviews.is-visible .reviews__shot { transform: none } — оно специфичнее. */
.reviews__shot:hover { border-color: rgba(197, 0, 34, .55); }
.reviews__shot-img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
/* подпись поверх нижнего края снимка: градиент читаемости, без цвета вне палитры */
.reviews__shot-cap {
  position: absolute;
  left: 0; right: 0; bottom: 0;
  padding: 1.6rem .7rem .55rem;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: .78rem;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--white);
  background: linear-gradient(to top, rgba(5, 5, 6, .88) 0%, rgba(5, 5, 6, 0) 100%);
  pointer-events: none;
}
.reviews__gallery-note {
  margin: clamp(.7rem, 1.6vh, 1rem) 0 0;
  color: var(--muted);
  font-size: .78rem;
  line-height: 1.5;
  text-wrap: pretty;
}

/* --- подложка-карточка под виджет: тот же рецепт, что у .calc__card ---
   Ширина = родные 528px виджета + внутренние отступы, поэтому карточка
   растёт вместе с padding и виджет всегда лежит в ней с полями.
   min() держит её в пределах контейнера на узких экранах. */
.reviews__panel {
  --reviews-pad: clamp(.75rem, 2vw, 1.15rem);
  width: min(100%, calc(528px + var(--reviews-pad) * 2 + 2px));   /* +2px — рамка карточки */
  margin-inline: auto;
  padding: var(--reviews-pad);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 18px;
  box-shadow: 0 30px 70px -34px rgba(0, 0, 0, .85),
              0 0 60px -26px rgba(197, 0, 34, .40);
}

/* метка-«шапка» карточки: даёт подложке смысл, а не просто рамку */
.reviews__panel-label {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: .55rem;
  margin: 0 0 var(--reviews-pad);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: .78rem;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--muted);
}
.reviews__panel-dot {
  width: 7px; height: 7px;
  flex: 0 0 auto;
  border-radius: 50%;
  background: var(--red);
  box-shadow: 0 0 10px rgba(197, 0, 34, .8);
}

/* --- виджет 2ГИС: свой документ в iframe (см. CSP + комментарий в index.html) ---
   Высота фиксированная: виджет скроллится ВНУТРИ себя, страница от него
   не растёт. Ширина 100% при max-width родных 528px — на узких экранах
   переполнения нет. Фон виджета равен --surface, поэтому рамки у него нет:
   он и подложка читаются как одна карточка. */
.reviews__widget {
  max-width: 528px;
  margin-inline: auto;
  border-radius: 12px;
  overflow: hidden;
  background: var(--surface);
}
.reviews__widget-frame {
  display: block;
  width: 100%;
  height: 824px;
  border: 0;
  background: var(--surface);
  color-scheme: dark;
}
/* Без JS адрес виджета так и остаётся в data-src (см. index.html), и iframe
   был бы пустым прямоугольником в 824px. Прячем его и показываем текст из
   <noscript> со ссылкой на карточку. */
.no-js .reviews__widget-frame { display: none; }
.reviews__widget-noscript {
  margin: 0;
  padding: 1.4rem 1.2rem;
  text-align: center;
  color: var(--muted);
  font-size: .95rem;
  line-height: 1.6;
}

/* --- подпись под карточкой (источник отзывов + ссылка) --- */
.reviews__note {
  margin: clamp(.9rem, 2.2vh, 1.25rem) auto 0;
  max-width: 62ch;
  text-align: center;
  color: var(--muted);
  font-size: .82rem;
  line-height: 1.55;
  text-wrap: pretty;
}
.reviews__widget-link {
  color: var(--red-2);
  text-decoration: none;
  border-bottom: 1px solid rgba(197, 0, 34, .45);
  transition: color .2s ease, border-color .2s ease;
}
.reviews__widget-link:hover,
.reviews__widget-link:focus-visible { color: var(--white); border-bottom-color: var(--white); }

/* --- reveal on scroll (JS вешает .is-visible на секцию) --- */
.js .reviews__panel {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity .7s ease, transform .7s var(--ease-out);
  transition-delay: 120ms;
}
.reviews.is-visible .reviews__panel { opacity: 1; transform: none; }

.js .reviews__note {
  opacity: 0;
  transition: opacity .7s ease;
  transition-delay: 240ms;
}
.reviews.is-visible .reviews__note { opacity: 1; }

/* Фотографии проявляются стаггером через --i в разметке (тот же приём, что
   у шагов HOW). Это ОДНОРАЗОВЫЙ transition, а не анимация — бесконечных
   анимаций на странице не прибавляется. */
.js .reviews__shot {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity .6s ease, transform .6s var(--ease-out), border-color .25s ease;
  transition-delay: calc(var(--i, 0) * 90ms);
}
.reviews.is-visible .reviews__shot { opacity: 1; transform: none; }

/* --- responsive --- */
/* ≤900px — одна колонка, фотографии первыми (как в разметке). Виджет и его
   подпись центрируются сами: у .reviews__panel уже margin-inline:auto. */
@media (max-width: 900px) {
  .reviews__layout {
    grid-template-columns: minmax(0, 1fr);
    gap: clamp(1.6rem, 4vh, 2.4rem);
  }
  .reviews__subhead { justify-content: center; }
  .reviews__gallery-note { text-align: center; }
}
@media (max-width: 640px) {
  /* 660px занимали почти весь экран телефона: палец, начавший свайп над
     виджетом, скроллил ВИДЖЕТ, а не страницу, — и это читалось как «скролл
     залип». 440px оставляют сверху и снизу по полосе страницы, за которую
     можно взяться. Плюс overscroll-behavior:contain внутри самого документа
     виджета (assets/2gis-widget.html) — докрутив его до конца, пользователь
     не «пробивает» прокрутку в страницу и наоборот. */
  .reviews__widget-frame { height: 440px; }
}

/* --- reduced motion: static decor, no reveal --- */
@media (prefers-reduced-motion: reduce) {
  .reviews__glow { animation: none; }
  .js .reviews__panel { opacity: 1; transform: none; transition: none; transition-delay: 0s; }
  .js .reviews__note { opacity: 1; transition: none; transition-delay: 0s; }
  .js .reviews__shot { opacity: 1; transform: none; transition: none; transition-delay: 0s; }
}

/* ---------------------------------------------------------------------
   10g. LEAD MODAL — единая модалка заявки (договор, гайд, обратный звонок)
   Одна на всю страницу; тексты подставляет JS из data-атрибутов триггера.
   Основа — нативный <dialog>: центрирование, фокус-трап и Esc даёт браузер,
   затемнение — ::backdrop. Карточка повторяет квиз (--surface + та же тень),
   поля/чекбокс/ошибки — 1:1 значения из блока 10e CALC, чтобы формы на
   странице выглядели одинаково.
   Мобильные: ширина не больше вьюпорта, скролл — ВНУТРИ .lead-modal__inner.
   Палитра: красный / чёрный / белый.
   --------------------------------------------------------------------- */
/* Фон не скроллим, пока открыта модалка. Правило общее — body.scroll-locked
   в блоке 3 UTILITIES (им же пользуется мобильное меню). */

.lead-modal {
  width: min(460px, calc(100vw - 2rem));
  max-width: calc(100vw - 2rem);
  max-height: calc(100vh - 2rem);
  max-height: calc(100dvh - 2rem);
  padding: 0;
  border: 1px solid var(--line);
  border-radius: 16px;
  background: var(--surface);
  color: var(--white);
  overflow: hidden;                  /* скруглённые углы обрезают внутренний скролл */
  box-shadow: 0 30px 70px -34px rgba(0, 0, 0, .85),
              0 0 60px -26px rgba(197, 0, 34, .40);
}
/* браузеры без поддержки <dialog> не должны показывать её содержимое инлайном */
.lead-modal:not([open]) { display: none; }
/* [hidden] должен побеждать display у .btn / .lead-modal__success */
.lead-modal [hidden] { display: none !important; }

.lead-modal::backdrop {
  background: rgba(5, 5, 6, .78);
  backdrop-filter: blur(2px);
  -webkit-backdrop-filter: blur(2px);
}

.lead-modal[open] { animation: leadModalIn .28s var(--ease-out) both; }
@keyframes leadModalIn {
  from { opacity: 0; transform: translateY(12px) scale(.98); }
  to   { opacity: 1; transform: none; }
}

.lead-modal__inner {
  position: relative;
  max-height: calc(100vh - 2rem);
  max-height: calc(100dvh - 2rem);
  overflow-y: auto;                  /* длинный контент скроллится внутри окна */
  -webkit-overflow-scrolling: touch;
  padding: clamp(1.4rem, 4vw, 2rem);
}

.lead-modal__close {
  position: absolute;
  top: .7rem; right: .7rem;
  width: 36px; height: 36px;
  display: grid;
  place-items: center;
  border: 1px solid var(--line);
  border-radius: 50%;
  background: rgba(255, 255, 255, .02);
  color: var(--muted);
  transition: color .2s ease, border-color .2s ease, background-color .2s ease;
}
.lead-modal__close:hover { color: var(--white); border-color: var(--red); }
.lead-modal__close svg { width: 15px; height: 15px; display: block; }

.lead-modal__title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.35rem, 4vw, 1.7rem);
  line-height: 1.06;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0 2.6rem .55rem 0;         /* место под крестик */
}
.lead-modal__text {
  margin: 0 0 clamp(1.1rem, 3vw, 1.5rem);
  color: var(--muted);
  font-size: .95rem;
  line-height: 1.5;
  text-wrap: pretty;
}

/* --- поля: значения 1:1 из .calc__ (см. блок 10e) --- */
.lead-modal__fields { display: flex; flex-direction: column; gap: 1rem; }
.lead-modal__field { display: flex; flex-direction: column; }
.lead-modal__label {
  font-size: .74rem;
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: .45rem;
}
.lead-modal__control {
  width: 100%;
  padding: .85rem 1rem;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: rgba(255, 255, 255, .02);
  color: var(--white);
  font-family: var(--font-body);
  font-size: 1rem;
  line-height: 1.3;
  transition: border-color .2s ease, background-color .2s ease;
}
.lead-modal__control::placeholder { color: rgba(255, 255, 255, .34); }
.lead-modal__control:hover { border-color: rgba(255, 255, 255, .22); }
.lead-modal__control:focus-visible {
  outline: 2px solid var(--red-2);
  outline-offset: 2px;
  border-color: var(--red);
}
.lead-modal__control[aria-invalid="true"] { border-color: var(--red-2); }

.lead-modal__consent {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: .65rem;
  align-items: start;
  cursor: pointer;
}
.lead-modal__consent-input {
  appearance: none;
  -webkit-appearance: none;
  flex: 0 0 auto;
  width: 20px; height: 20px;
  margin: 1px 0 0;
  border: 1px solid var(--line);
  border-radius: 5px;
  background: rgba(255, 255, 255, .02);
  cursor: pointer;
  position: relative;
  transition: border-color .2s ease, background-color .2s ease;
}
.lead-modal__consent-input:checked { border-color: var(--red); background: var(--red); }
.lead-modal__consent-input:checked::after {
  content: "";
  position: absolute;
  left: 6px; top: 2px;
  width: 5px; height: 10px;
  border: solid var(--white);
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
}
.lead-modal__consent-input:focus-visible { outline: 2px solid var(--red-2); outline-offset: 2px; }
.lead-modal__consent-input[aria-invalid="true"] { border-color: var(--red-2); }
.lead-modal__consent-text { color: var(--muted); font-size: .84rem; line-height: 1.45; }
.lead-modal__consent-link { color: var(--white); text-decoration: underline; text-underline-offset: 2px; }
.lead-modal__consent-link:hover { color: var(--red-2); }

/* --- сообщения об ошибках (тоже 1:1 с CALC) --- */
.lead-modal__error {
  margin: .4rem 0 0;
  color: var(--red-2);
  font-size: .8rem;
  line-height: 1.35;
  min-height: 0;
}
.lead-modal__error:empty { margin: 0; }
.lead-modal__form-error {
  margin: 0 0 .9rem;
  padding: .7rem .9rem;
  border: 1px solid rgba(197, 0, 34, .55);
  border-radius: 8px;
  background: rgba(197, 0, 34, .12);
  color: var(--white);
  font-size: .86rem;
  line-height: 1.4;
}

.lead-modal__submit {
  width: 100%;
  margin-top: clamp(1.1rem, 3vw, 1.5rem);
}
.lead-modal__submit:disabled {
  opacity: .4;
  cursor: not-allowed;
  transform: none;
  box-shadow: none;
}

/* --- экран благодарности --- */
.lead-modal__success {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}
.lead-modal__success-icon {
  width: 44px; height: 44px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  border: 1.5px solid var(--red);
  background: rgba(197, 0, 34, .12);
  margin-bottom: 1.1rem;
}
.lead-modal__success-icon svg { width: 24px; height: 24px; display: block; }
.lead-modal__success-title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.35rem, 4vw, 1.7rem);
  line-height: 1.06;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0 2.6rem .6rem 0;
  outline: none;                     /* фокусируется программно после отправки */
}
.lead-modal__success-text {
  margin: 0 0 clamp(1.2rem, 3vw, 1.6rem);
  color: var(--muted);
  font-size: .95rem;
  line-height: 1.5;
  text-wrap: pretty;
}
.lead-modal__file { width: 100%; }
.lead-modal__done { width: 100%; margin-top: .6rem; }

/* --- responsive --- */
@media (max-width: 480px) {
  .lead-modal { width: calc(100vw - 1.2rem); max-width: calc(100vw - 1.2rem); border-radius: 14px; }
  .lead-modal__inner { padding: 1.2rem 1.1rem; }
  .lead-modal__title,
  .lead-modal__success-title { margin-right: 2.4rem; }
}

/* --- reduced motion: без въезда окна и без блюра подложки --- */
@media (prefers-reduced-motion: reduce) {
  .lead-modal[open] { animation: none; }
  .lead-modal::backdrop { backdrop-filter: none; -webkit-backdrop-filter: none; }
  .lead-modal__submit:hover,
  .lead-modal__file:hover,
  .lead-modal__done:hover { transform: none; }
}

/* ---------------------------------------------------------------------
   10h. CONTACTS — способы связи + форма обратного звонка
   Две колонки: слева карточки каналов (иконка + подпись + значение),
   справа карточка с формой на --surface (та же тень и радиус, что у
   квиза и модалки). Поля, чекбокс согласия и тексты ошибок — значения
   1:1 из блока 10e CALC, чтобы все три формы страницы были одинаковыми.
   Экран благодарности JS показывает вместо формы ([hidden]).
   Палитра: красный / чёрный / белый.
   --------------------------------------------------------------------- */
.contacts {
  position: relative;
  padding-block: clamp(3.5rem, 9vh, 6.5rem);
  background: var(--bg);
  border-top: 1px solid var(--line);
  overflow: hidden;
  isolation: isolate;
  scroll-margin-top: var(--header-h);   /* 4 ссылки на #contacts приземляются под шапкой */
}
.contacts > .container { position: relative; z-index: 1; }

/* [hidden] должен побеждать display у .contacts__success */
.contacts [hidden] { display: none !important; }

/* --- decorative red glow + shards (mirrors CALC) --- */
.contacts__bg { position: absolute; inset: 0; z-index: 0; pointer-events: none; overflow: hidden; }
.contacts__glow {
  position: absolute;
  left: -8%;
  top: 12%;
  width: 46vw; height: 46vw;
  max-width: 640px; max-height: 640px;
  border-radius: 50%;
  background: radial-gradient(circle at center,
              rgba(197, 0, 34, .20) 0%,
              rgba(197, 0, 34, .08) 34%,
              rgba(197, 0, 34, 0) 64%);
  filter: blur(28px);
  animation: contactsGlowDrift 44s linear infinite;
  will-change: transform;
}
@keyframes contactsGlowDrift {
  from { transform: translateY(-30%); }
  to   { transform: translateY(190%); }
}
.contacts__shard {
  position: absolute;
  background: linear-gradient(135deg, var(--red) 0%, rgba(197, 0, 34, 0) 80%);
  filter: blur(8px);
  pointer-events: none;
}
.contacts__shard--1 {
  top: -8%; right: 2%;
  width: 26vw; height: 66%;
  opacity: .06;
  clip-path: polygon(58% 0, 100% 0, 78% 100%, 36% 100%);
}
.contacts__shard--2 {
  bottom: -8%; left: 8%;
  width: 24vw; height: 58%;
  opacity: .05;
  clip-path: polygon(40% 0, 64% 0, 42% 100%, 16% 100%);
}

/* --- head (same eyebrow / heading / lede scale as CALC) --- */
.contacts__head { margin-bottom: clamp(1.8rem, 4.5vh, 2.8rem); }
.contacts__eyebrow {
  display: flex;
  align-items: center;
  gap: .8rem;
  font-size: .82rem;
  font-weight: 600;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: clamp(.9rem, 2vh, 1.3rem);
}
.contacts__eyebrow-line {
  width: 34px; height: 2px;
  background: var(--red);
  flex: 0 0 auto;
  box-shadow: 0 0 10px rgba(197, 0, 34, .7);
}
.contacts__heading {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.7rem, 3.4vw, 2.6rem);
  line-height: 1.02;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0 0 clamp(.8rem, 2vh, 1.2rem);
}
.contacts__accent { color: var(--red); }
.contacts__lede {
  color: var(--muted);
  font-size: clamp(.98rem, 1.2vw, 1.08rem);
  line-height: 1.6;
  text-wrap: pretty;
  max-width: 52ch;
  margin: 0;
}

.contacts__grid {
  display: grid;
  grid-template-columns: 1.05fr .95fr;
  gap: clamp(2rem, 5vw, 4rem);
  align-items: start;
}

/* --- LEFT · каналы связи --- */
.contacts__list {
  display: flex;
  flex-direction: column;
  gap: clamp(.7rem, 1.6vh, 1rem);
}
.contacts__item {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 1rem;
  align-items: start;
  padding: clamp(.9rem, 2vw, 1.15rem);
  border: 1px solid var(--line);
  border-radius: 12px;
  background: rgba(255, 255, 255, .02);
  transition: border-color .2s ease, background-color .2s ease, transform .2s var(--ease-out);
}
.contacts__item:hover { border-color: rgba(197, 0, 34, .55); transform: translateY(-2px); }
.contacts__icon {
  flex: 0 0 auto;
  width: 42px; height: 42px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  border: 1.5px solid var(--red);
  background: rgba(197, 0, 34, .10);
}
.contacts__icon svg { width: 20px; height: 20px; display: block; }
.contacts__body { min-width: 0; }         /* длинная почта не растягивает сетку */
.contacts__label {
  font-size: .74rem;
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--muted);
  margin: 0 0 .35rem;
}
.contacts__value {
  display: inline-block;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(1rem, 1.3vw, 1.14rem);
  letter-spacing: .01em;
  line-height: 1.2;
  color: var(--white);
  overflow-wrap: anywhere;               /* почта/ссылка не выезжает за карточку */
}
a.contacts__value { transition: color .2s ease; }
a.contacts__value:hover { color: var(--red-2); }
.contacts__note {
  display: flex;
  align-items: center;
  gap: .45rem;
  margin: .4rem 0 0;
  color: var(--muted);
  font-size: .86rem;
  line-height: 1.45;
  text-wrap: pretty;
}
.contacts__hours-icon { flex: 0 0 auto; display: inline-flex; }
.contacts__hours-icon svg { width: 15px; height: 15px; display: block; }
.contacts__map-link {
  display: inline-block;
  margin-top: .5rem;
  color: var(--white);
  font-size: .86rem;
  text-decoration: underline;
  text-underline-offset: 2px;
  transition: color .2s ease;
}
.contacts__map-link:hover { color: var(--red-2); }

/* --- RIGHT · карточка обратного звонка (recipe = .calc__card) --- */
.contacts__card {
  position: relative;
  padding: clamp(1.4rem, 2.6vw, 2rem);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 16px;
  box-shadow: 0 30px 70px -34px rgba(0, 0, 0, .85),
              0 0 60px -26px rgba(197, 0, 34, .40);
}
.contacts__card-title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.35rem, 2.4vw, 1.7rem);
  line-height: 1.06;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0 0 .55rem;
}
.contacts__card-text {
  margin: 0 0 clamp(1.1rem, 3vh, 1.5rem);
  color: var(--muted);
  font-size: .95rem;
  line-height: 1.5;
  text-wrap: pretty;
}

/* --- поля: значения 1:1 из .calc__ (см. блок 10e) --- */
.contacts__fields { display: flex; flex-direction: column; gap: 1rem; }
.contacts__field { display: flex; flex-direction: column; }
.contacts__label-field {
  font-size: .74rem;
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: .45rem;
}
.contacts__control {
  width: 100%;
  padding: .85rem 1rem;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: rgba(255, 255, 255, .02);
  color: var(--white);
  font-family: var(--font-body);
  font-size: 1rem;
  line-height: 1.3;
  transition: border-color .2s ease, background-color .2s ease;
}
.contacts__control::placeholder { color: rgba(255, 255, 255, .34); }
.contacts__control:hover { border-color: rgba(255, 255, 255, .22); }
.contacts__control:focus-visible {
  outline: 2px solid var(--red-2);
  outline-offset: 2px;
  border-color: var(--red);
}
.contacts__control[aria-invalid="true"] { border-color: var(--red-2); }

.contacts__consent {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: .65rem;
  align-items: start;
  cursor: pointer;
}
.contacts__consent-input {
  appearance: none;
  -webkit-appearance: none;
  flex: 0 0 auto;
  width: 20px; height: 20px;
  margin: 1px 0 0;
  border: 1px solid var(--line);
  border-radius: 5px;
  background: rgba(255, 255, 255, .02);
  cursor: pointer;
  position: relative;
  transition: border-color .2s ease, background-color .2s ease;
}
.contacts__consent-input:checked { border-color: var(--red); background: var(--red); }
.contacts__consent-input:checked::after {
  content: "";
  position: absolute;
  left: 6px; top: 2px;
  width: 5px; height: 10px;
  border: solid var(--white);
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
}
.contacts__consent-input:focus-visible { outline: 2px solid var(--red-2); outline-offset: 2px; }
.contacts__consent-input[aria-invalid="true"] { border-color: var(--red-2); }
.contacts__consent-text { color: var(--muted); font-size: .84rem; line-height: 1.45; }
.contacts__consent-link { color: var(--white); text-decoration: underline; text-underline-offset: 2px; }
.contacts__consent-link:hover { color: var(--red-2); }

/* --- сообщения об ошибках (тоже 1:1 с CALC) --- */
.contacts__error {
  margin: .4rem 0 0;
  color: var(--red-2);
  font-size: .8rem;
  line-height: 1.35;
  min-height: 0;
}
.contacts__error:empty { margin: 0; }
.contacts__form-error {
  margin: 0 0 .9rem;
  padding: .7rem .9rem;
  border: 1px solid rgba(197, 0, 34, .55);
  border-radius: 8px;
  background: rgba(197, 0, 34, .12);
  color: var(--white);
  font-size: .86rem;
  line-height: 1.4;
}

.contacts__submit {
  width: 100%;
  margin-top: clamp(1.1rem, 3vh, 1.5rem);
}
.contacts__submit:disabled {
  opacity: .4;
  cursor: not-allowed;
  transform: none;
  box-shadow: none;
}
.contacts__hint {
  margin: .8rem 0 0;
  color: var(--muted);
  font-size: .82rem;
  line-height: 1.45;
  text-wrap: pretty;
}

/* --- экран благодарности --- */
.contacts__success {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}
.contacts__success-icon {
  width: 44px; height: 44px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  border: 1.5px solid var(--red);
  background: rgba(197, 0, 34, .12);
  margin-bottom: 1.1rem;
}
.contacts__success-icon svg { width: 24px; height: 24px; display: block; }
.contacts__success-title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.35rem, 2.4vw, 1.7rem);
  line-height: 1.06;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0 0 .6rem;
  outline: none;                     /* фокусируется программно после отправки */
}
.contacts__success-text {
  margin: 0;
  color: var(--muted);
  font-size: .95rem;
  line-height: 1.5;
  text-wrap: pretty;
}

/* --- reveal on scroll (JS adds .is-visible on the section; stagger via --i) --- */
.js .contacts__item,
.js .contacts__card {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity .7s ease, transform .7s var(--ease-out);
}
.contacts.is-visible .contacts__item,
.contacts.is-visible .contacts__card { opacity: 1; transform: none; }
.js .contacts__item { transition-delay: calc(var(--i, 0) * 90ms); }
.js .contacts__card { transition-delay: 140ms; }

/* --- responsive --- */
@media (max-width: 900px) {
  .contacts__grid { grid-template-columns: 1fr; gap: clamp(2rem, 6vw, 2.8rem); }
  .contacts__card { max-width: 560px; }
}
@media (max-width: 560px) {
  .contacts__card { padding: 1.1rem; }
  .contacts__item { gap: .8rem; padding: .9rem; }
  .contacts__icon { width: 38px; height: 38px; }
  .contacts__icon svg { width: 18px; height: 18px; }
  .contacts__value { font-size: 1rem; }
}

/* --- reduced motion: static decor, no reveal transform, no hover lift --- */
@media (prefers-reduced-motion: reduce) {
  .contacts__glow { animation: none; }
  .contacts__item:hover { transform: none; }
  .js .contacts__item,
  .js .contacts__card { opacity: 1; transform: none; }
}

/* ---------------------------------------------------------------------
   10i. FOOTER — подвал: бренд + навигация + связь, ниже реквизиты,
   оговорка про оферту, копирайт и политика конфиденциальности.
   Фон --black (на тон темнее секций), поэтому граница сверху читается
   как отбивка от CONTACTS. Ссылки — с запасом по высоте под палец.
   Палитра: красный / чёрный / белый.
   --------------------------------------------------------------------- */
.footer {
  position: relative;
  background: var(--black);
  border-top: 1px solid var(--line);
  padding-block: clamp(2.6rem, 6vh, 4rem) clamp(1.6rem, 4vh, 2.4rem);
}

.footer__inner {
  display: grid;
  grid-template-columns: 1.5fr .9fr .9fr;
  gap: clamp(1.8rem, 4vw, 3.5rem);
  align-items: start;
}

.footer__logo { display: inline-flex; }
.footer__logo img { height: 34px; width: auto; }
.footer__about {
  margin: 1.1rem 0 0;
  color: var(--muted);
  font-size: .92rem;
  line-height: 1.6;
  max-width: 44ch;
  text-wrap: pretty;
}

.footer__col-title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: .78rem;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0 0 .8rem;
}
.footer__links { display: flex; flex-direction: column; }
.footer__link {
  display: inline-block;
  padding-block: .45rem;
  color: var(--muted);
  font-size: .95rem;
  transition: color .2s ease;
}
.footer__link:hover { color: var(--white); }

.footer__legal {
  margin-top: clamp(2rem, 5vh, 3rem);
  padding-top: clamp(1.3rem, 3vh, 1.9rem);
  border-top: 1px solid var(--line);
}
.footer__req {
  margin: 0 0 .3rem;
  color: rgba(255, 255, 255, .45);
  font-size: .82rem;
  line-height: 1.6;
}
.footer__offer {
  margin: .7rem 0 0;
  color: var(--muted);
  font-size: .82rem;
  line-height: 1.5;
}

.footer__bottom {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: .5rem 1.5rem;
  margin-top: clamp(1.1rem, 2.6vh, 1.5rem);
  padding-top: clamp(1.1rem, 2.6vh, 1.5rem);
  border-top: 1px solid var(--line);
}
.footer__copy {
  margin: 0;
  color: rgba(255, 255, 255, .45);
  font-size: .82rem;
}
.footer__privacy {
  color: var(--muted);
  font-size: .86rem;
  text-decoration: underline;
  text-underline-offset: 2px;
  padding-block: .3rem;
  transition: color .2s ease;
}
.footer__privacy:hover { color: var(--red-2); }

/* Три юридических документа в подвале: политика · согласие · соглашение.
   Переносятся по одному, на узком экране встают колонкой (см. медиазапрос). */
.footer__docs {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .2rem 1.2rem;
}

/* --- responsive --- */
@media (max-width: 900px) {
  .footer__inner { grid-template-columns: 1fr 1fr; gap: 2rem; }
  .footer__brand { grid-column: 1 / -1; }
}
@media (max-width: 560px) {
  .footer { padding-block: 2.2rem 1.6rem; }
  .footer__inner { grid-template-columns: 1fr; gap: 1.8rem; }
  .footer__about { max-width: none; }
  .footer__link { padding-block: .55rem; }   /* удобнее попадать пальцем */
  .footer__bottom { flex-direction: column; align-items: flex-start; }
  .footer__docs { flex-direction: column; align-items: flex-start; gap: 0; }
  .footer__privacy { padding-block: .45rem; }   /* удобнее попадать пальцем */
}

/* ---------------------------------------------------------------------
   10j. ORDER — «Авто под заказ»: что входит в цену под ключ.
   ВНИМАНИЕ: в DOM секция стоит МЕЖДУ HOW и AUCTIONS (процесс -> состав
   цены -> живые лоты); в этом файле блок лежит после FOOTER, чтобы не
   перенумеровывать соседей.
   Две карточки: «Входит в цену» (красные галочки, как .guide__check) и
   «Оплачивается отдельно» (приглушённый минус — НЕ красный, чтобы не
   читался как ошибка или тревога). Ниже — блок подбора под запрос и CTA
   в квиз #calc. Ниже 900px — одна колонка, «входит» первым (порядок DOM).
   Секционные метрики (padding-block, eyebrow/heading/lede, glow+shards,
   тайминги reveal, карточка --surface + --line) взяты 1:1 из GUIDE/CALC.
   Палитра: красный / чёрный / белый.
   --------------------------------------------------------------------- */
.order {
  position: relative;
  padding-block: clamp(3.5rem, 9vh, 6.5rem);
  background: var(--bg);
  border-top: 1px solid var(--line);
  overflow: hidden;
  isolation: isolate;
  scroll-margin-top: var(--header-h);   /* две ссылки на #order из навигации */
}
.order > .container { position: relative; z-index: 1; }

/* --- decorative red glow + shards (mirrors AUCTIONS / CALC) --- */
.order__bg { position: absolute; inset: 0; z-index: 0; pointer-events: none; overflow: hidden; }
.order__glow {
  position: absolute;
  left: -6%;
  top: 14%;
  width: 46vw; height: 46vw;
  max-width: 640px; max-height: 640px;
  border-radius: 50%;
  background: radial-gradient(circle at center,
              rgba(197, 0, 34, .22) 0%,
              rgba(197, 0, 34, .09) 34%,
              rgba(197, 0, 34, 0) 64%);
  filter: blur(28px);
  animation: orderGlowDrift 40s linear infinite;
  will-change: transform;
}
@keyframes orderGlowDrift {
  from { transform: translateY(30%); }
  to   { transform: translateY(-190%); }
}
.order__shard {
  position: absolute;
  background: linear-gradient(135deg, var(--red) 0%, rgba(197, 0, 34, 0) 80%);
  filter: blur(8px);
  pointer-events: none;
}
.order__shard--1 {
  top: -6%; right: 6%;
  width: 28vw; height: 70%;
  opacity: .06;
  clip-path: polygon(58% 0, 100% 0, 80% 100%, 40% 100%);
}
.order__shard--2 {
  bottom: -8%; left: -2%;
  width: 26vw; height: 62%;
  opacity: .05;
  clip-path: polygon(40% 0, 64% 0, 42% 100%, 16% 100%);
}

/* --- heading (same eyebrow + Oswald heading as TRUST / HOW / AUCTIONS) --- */
.order__head { margin-bottom: clamp(2rem, 5vh, 3.2rem); max-width: 62ch; }
.order__eyebrow {
  display: flex;
  align-items: center;
  gap: .8rem;
  font-size: .82rem;
  font-weight: 600;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: clamp(.9rem, 2vh, 1.3rem);
}
.order__eyebrow-line {
  width: 34px; height: 2px;
  background: var(--red);
  flex: 0 0 auto;
  box-shadow: 0 0 10px rgba(197, 0, 34, .7);
}
.order__heading {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.7rem, 3.4vw, 2.6rem);
  line-height: 1.02;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0 0 clamp(.8rem, 2vh, 1.2rem);
}
.order__accent { color: var(--red); }
.order__lede {
  color: var(--muted);
  font-size: clamp(.98rem, 1.2vw, 1.08rem);
  line-height: 1.6;
  text-wrap: pretty;
  margin: 0;
}

/* --- two cards: включено | отдельно --- */
.order__grid {
  display: grid;
  grid-template-columns: 1.05fr .95fr;
  gap: clamp(1.4rem, 3vw, 2.2rem);
  align-items: start;
}
.order__card {
  padding: clamp(1.3rem, 2.6vw, 2rem);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 16px;
  box-shadow: 0 30px 70px -34px rgba(0, 0, 0, .85);
}
/* «входит» — главный блок, поэтому у него мягкий красный ореол */
.order__card--included {
  box-shadow: 0 30px 70px -34px rgba(0, 0, 0, .85),
              0 0 60px -26px rgba(197, 0, 34, .45);
}
.order__card-title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.05rem, 1.7vw, 1.3rem);
  line-height: 1.1;
  letter-spacing: .02em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0 0 .4rem;
}
.order__card-note {
  margin: 0 0 clamp(1.1rem, 2.6vh, 1.5rem);
  color: var(--muted);
  font-size: .88rem;
  line-height: 1.5;
  text-wrap: pretty;
}

.order__list {
  display: flex;
  flex-direction: column;
  gap: clamp(.7rem, 1.6vh, 1rem);
}
.order__item {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: .8rem;
  align-items: start;
}
/* красная галочка — тот же значок, что в .guide__check */
.order__mark {
  flex: 0 0 auto;
  width: 26px; height: 26px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  border: 1.5px solid var(--red);
  background: rgba(197, 0, 34, .10);
}
.order__mark svg { width: 15px; height: 15px; display: block; }
/* нейтральный минус: белый с прозрачностью, БЕЗ красного — «не входит»
   это не ошибка, а просто другая колонка */
.order__mark--no {
  border-color: var(--line);
  background: rgba(255, 255, 255, .04);
  color: rgba(255, 255, 255, .55);
}
.order__item-text {
  color: var(--white);
  font-size: clamp(.95rem, 1.1vw, 1.04rem);
  line-height: 1.45;
  padding-top: .1rem;
  text-wrap: pretty;
}

/* --- подбор под запрос (одна мысль, не пересказ шагов из HOW) --- */
.order__pick {
  margin-top: clamp(1.4rem, 3.5vh, 2.2rem);
  padding: clamp(1.1rem, 2.4vw, 1.6rem);
  border: 1px solid var(--line);
  border-radius: 14px;
  background: rgba(255, 255, 255, .02);
}
.order__pick-title {
  display: flex;
  align-items: center;
  gap: .8rem;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: .82rem;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0 0 .7rem;
}
.order__pick-line {
  width: 34px; height: 2px;
  background: var(--red);
  flex: 0 0 auto;
  box-shadow: 0 0 10px rgba(197, 0, 34, .7);
}
.order__pick-text {
  margin: 0;
  color: var(--muted);
  font-size: clamp(.95rem, 1.1vw, 1.02rem);
  line-height: 1.6;
  text-wrap: pretty;
  max-width: 76ch;
}

/* --- CTA в квиз --- */
.order__cta {
  margin-top: clamp(1.6rem, 4vh, 2.4rem);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .9rem 1.4rem;
}
.order__cta-note {
  margin: 0;
  color: var(--muted);
  font-size: .86rem;
  line-height: 1.5;
  text-wrap: pretty;
  max-width: 46ch;
}

/* --- reveal on scroll (JS adds .is-visible on the section; stagger via --i) --- */
.js .order__card,
.js .order__pick,
.js .order__cta {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity .7s ease, transform .7s var(--ease-out);
}
.js .order__card--extra { transition-delay: 120ms; }
.js .order__pick        { transition-delay: 220ms; }
.js .order__cta         { transition-delay: 300ms; }
.order.is-visible .order__card,
.order.is-visible .order__pick,
.order.is-visible .order__cta { opacity: 1; transform: none; }

.js .order__item {
  opacity: 0;
  transform: translateY(14px);
  transition: opacity .6s ease, transform .6s var(--ease-out);
  transition-delay: calc(var(--i, 0) * 70ms + 140ms);
}
.order.is-visible .order__item { opacity: 1; transform: none; }

/* --- responsive: одна колонка ниже 900px, «входит» первым (порядок DOM) --- */
@media (max-width: 900px) {
  .order__grid { grid-template-columns: 1fr; gap: clamp(1.2rem, 4vw, 1.8rem); }
}
@media (max-width: 560px) {
  .order__card { padding: 1.1rem; }
  .order__pick { padding: 1.1rem; }
  .order__cta { gap: .9rem; }
  .order__cta .btn { width: 100%; }
  .order__cta-note { max-width: none; }
}

/* --- reduced motion: static decor, no reveal transform, no stagger --- */
@media (prefers-reduced-motion: reduce) {
  .order__glow { animation: none; }
  .js .order__card,
  .js .order__pick,
  .js .order__cta,
  .js .order__item {
    opacity: 1;
    transform: none;
    transition: none;
    transition-delay: 0s;
  }
}

/* ---------------------------------------------------------------------
   10k. COOKIE BANNER — уведомление о cookie (низ экрана).
   Живёт в связке: виджет 2ГИС в #reviews -> этот баннер -> раздел 8
   в privacy.html. Разметка — в конце <body> index.html, логика —
   модуль 13 в js/main.js.

   НЕ МОДАЛКА: фокус не перехватывается, скролл фона не блокируется
   (body.scroll-locked здесь ни при чём), Esc не закрывает.

   Слои: 80 — под мобильным меню (90), шапкой (100) и полосой прогресса
   (110); <dialog> модалки заявки рисуется в top layer и всегда выше.

   Внешний слой тянется на всю ширину и НЕ ловит клики (pointer-events),
   боковые отступы даёт padding, а не left/right — так на 360px нет
   горизонтального переполнения. Карточка ограничена по ширине и
   центрируется, поэтому на десктопе это узкая плашка, а не полоса
   во весь экран. Палитра: чёрный / --surface / --line / красная кнопка.
   --------------------------------------------------------------------- */
.cookie {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 80;
  padding: 0 var(--gutter) clamp(.7rem, 2.2vw, 1.15rem);
  pointer-events: none;          /* слой прозрачен для кликов... */
}
.cookie[hidden] { display: none; }   /* [hidden] сильнее любого display ниже */

/* Пока открыто мобильное меню — гасим баннер. Оверлей меню не доходит до
   самого низа экрана, и нижняя кромка плашки подсвечивалась бы из-под него.
   Тот же приём, что у тикера (см. блок 4). visibility, а не display —
   ничего не переразмечается, вернётся на место при закрытии меню. */
body.menu-open .cookie { visibility: hidden; }

.cookie__inner {
  pointer-events: auto;          /* ...кликабельна только сама карточка */
  display: flex;
  align-items: center;
  gap: clamp(.8rem, 2vw, 1.4rem);
  max-width: 46rem;
  margin-inline: auto;
  padding: clamp(.8rem, 2vw, 1.05rem) clamp(.95rem, 2.4vw, 1.35rem);
  background: rgba(20, 18, 22, .97);            /* --surface, чуть прозрачнее */
  border: 1px solid var(--line);
  border-radius: 4px;
  box-shadow: 0 18px 44px -18px rgba(0, 0, 0, .9);
  /* Мягкое появление снизу. Стартовое скрытое состояние — только при JS:
     баннер и показывает-то один лишь JS, так что без него правило вредно. */
  opacity: 1;
  transform: none;
  transition: opacity .45s ease, transform .45s var(--ease-out);
}
.js .cookie__inner { opacity: 0; transform: translateY(14px); }
.js .cookie.is-visible .cookie__inner { opacity: 1; transform: none; }

.cookie__text {
  font-family: var(--font-body);
  font-size: .82rem;
  line-height: 1.55;
  color: var(--muted);
}
.cookie__link {
  color: var(--white);
  border-bottom: 1px solid var(--line);
  transition: border-color .25s ease, color .25s ease;
}
.cookie__link:hover { color: var(--white); border-bottom-color: var(--red); }

/* Кнопка — обычная .btn--primary, только компактнее и не сжимается,
   иначе flex ужмёт её в столбик из букв. */
.cookie__btn {
  flex: 0 0 auto;
  font-size: .8rem;
  padding: .8em 1.35em;
}

/* Узкий экран: кнопка уходит под текст. Плашка тут занимает место у
   контента, поэтому шрифт и отступы ужимаем — цель держать высоту
   заметно меньше четверти экрана, чтобы под баннером оставались видны
   кнопки форм. */
@media (max-width: 640px) {
  .cookie {
    padding-bottom: .6rem;
  }
  .cookie__inner {
    flex-direction: column;
    align-items: stretch;
    gap: .6rem;
    padding: .7rem .85rem;
  }
  .cookie__text { font-size: .74rem; line-height: 1.5; }
  .cookie__btn { width: 100%; font-size: .76rem; padding: .7em 1em; }
}

/* Reduced motion: показываем сразу, без выезда снизу. */
@media (prefers-reduced-motion: reduce) {
  .js .cookie__inner,
  .js .cookie.is-visible .cookie__inner {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

/* ---------------------------------------------------------------------
   10l. STOCK — «Авто в наличии» (ОТДЕЛЬНАЯ СТРАНИЦА stock.html)
   Единственная секция своей страницы, поэтому:
     * сверху добавлен отступ под fixed-шапку (на index.html эту работу
       делает .ticker с margin-top: var(--header-h) — тикера здесь нет);
     * заголовок — <h1>, а не <h2>;
     * content-visibility ей НЕ ставим (блок 12c): скрывать от отрисовки
       единственный экран страницы бессмысленно.
   Карточки переиспользуют классы .lot* из блока 10c (та же геометрия и
   тот же вид, что у лотов под заказ) — здесь только то, чего у лота нет:
   строка характеристик, описание и пилюля «В наличии».
   Бесконечных анимаций на странице НОЛЬ: свечение статичное, пульсация
   скелетонов живёт только во время запроса и гасится на телефоне (12b).
   --------------------------------------------------------------------- */
.stock {
  position: relative;
  /* Ровно высота fixed-шапки и ни пикселем больше: первым в секции идёт
     БЕГУЩАЯ СТРОКА, и она обязана стоять вплотную под шапкой — так же, как
     на главной (там это делает .ticker { margin-top: var(--header-h) }).
     Воздух до заголовка даёт нижний margin самой строки (блок 10n).
     Раньше здесь было + clamp(2.2rem, 6vh, 4rem) — тогда первым шёл <h1>. */
  padding-top: var(--header-h);
  padding-bottom: clamp(3.5rem, 9vh, 6.5rem);
  background: var(--bg);
  overflow: hidden;
  isolation: isolate;
  /* страница короткая — прижимаем подвал к низу окна */
  min-height: 100svh;
}
.stock > .container { position: relative; z-index: 1; }

/* Декор: одно СТАТИЧНОЕ свечение (без animation и без will-change) */
.stock__bg { position: absolute; inset: 0; z-index: 0; pointer-events: none; overflow: hidden; }
.stock__glow {
  position: absolute;
  left: -6%;
  top: -10%;
  width: 46vw; height: 46vw;
  max-width: 640px; max-height: 640px;
  border-radius: 50%;
  background: radial-gradient(circle at center,
              rgba(197, 0, 34, .22) 0%,
              rgba(197, 0, 34, .09) 34%,
              rgba(197, 0, 34, 0) 64%);
  filter: blur(28px);
}

/* --- ШАПКА СТРАНИЦЫ (правка заказчика) -------------------------------
   Раньше здесь была заголовочная группа eyebrow + <h1> + лид, а тезисы
   бегущей строкой стояли в отдельной секции .usp под витриной. Заказчик
   попросил поменять: страница открывается коротким заголовком и тезисами.
   Секция .usp удалена целиком; её стили (бегущая строка, текст про подбор
   под заказ, блок «Продать свой авто») переехали в БЛОК 10n — там же
   живёт стоп-кран анимации. Здесь остался только заголовок.
   Стилей .stock__eyebrow / .stock__eyebrow-line больше нет: eyebrow ушёл
   вместе со старой заголовочной группой. */
.stock__heading {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.9rem, 4vw, 3rem);
  line-height: 1.02;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: var(--white);
  /* Заголовок стоит ПОД бегущей строкой: сверху воздух даёт её нижний
     margin, снизу отступ до .stock__foot нужен свой. */
  margin: 0 0 clamp(1rem, 2.6vh, 1.6rem);
  max-width: 24ch;
}
/* Текст «не нашли — привезём под заказ». Стоит в .stock__foot (блок 10n),
   поэтому здесь только типографика, раскладку задаёт flex родителя. */
.stock__lede {
  flex: 1 1 30ch;
  max-width: 62ch;
  color: var(--muted);
  font-size: clamp(.92rem, 1.1vw, 1rem);
  line-height: 1.65;
  text-wrap: pretty;
  margin: 0;
}
.stock__lede-link {
  color: var(--white);
  text-decoration: underline;
  text-decoration-color: rgba(197, 0, 34, .8);
  text-underline-offset: .18em;
}
.stock__lede-link:hover { color: var(--red-2); }

/* --- широкая полоса витрины (как у #auctions) --- */
.stock__wide { position: relative; z-index: 1; }

/* --- ПАНЕЛЬ ФИЛЬТРОВ + СТАТУС ----------------------------------------
   Устроена как .auctions__filter (блок 10c): колонка «поля -> счётчик»
   с общей чертой снизу. Полей меньше — у авто в наличии нет ни страны,
   ни аукционной оценки: марка, модель, цена и год.
   Контролы приходят из живого справочника /api/stock/filters и до его
   ответа лежат в [hidden] — эндпоинта может ещё не быть (404), и тогда
   страница обязана работать как раньше, без фильтров. */
.stock__filter {
  display: flex;
  flex-direction: column;
  gap: clamp(.9rem, 2vh, 1.25rem);
  padding-bottom: clamp(.9rem, 2vh, 1.2rem);
  margin-bottom: clamp(1.4rem, 3.4vh, 2.2rem);
  border-bottom: 1px solid var(--line);
}

.stock__controls {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(168px, 1fr));
  gap: .7rem .8rem;
  align-items: end;
}
.stock__controls[hidden] { display: none; }
.stock__control { min-width: 0; }
.stock__control--action { display: flex; align-items: flex-end; }
.stock__control-label {
  display: block;
  margin-bottom: .35rem;
  font-size: .68rem;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--muted);
}
.stock__select,
.stock__input {
  width: 100%;
  min-width: 0;
  height: 2.5rem;
  padding: 0 .6rem;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: rgba(255, 255, 255, .03);
  color: var(--white);
  font-family: var(--font-body);
  font-size: .88rem;
  line-height: 1.2;
  /* нативные виджеты (список select, стрелки number) — в тёмной теме */
  color-scheme: dark;
  transition: border-color .2s ease, background-color .2s ease;
}
.stock__select:hover:not(:disabled),
.stock__input:hover:not(:disabled) { border-color: rgba(255, 255, 255, .3); }
.stock__select:disabled,
.stock__input:disabled { opacity: .42; cursor: not-allowed; }
/* список выпадашки браузер рисует сам — задаём ему цвета явно */
.stock__select option { background: var(--surface); color: var(--white); }
.stock__pair { display: flex; align-items: center; gap: .35rem; }
.stock__pair-dash { color: var(--muted); flex: 0 0 auto; }
.stock__reset {
  height: 2.5rem;
  padding: 0 .9rem;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: transparent;
  color: var(--muted);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: .8rem;
  letter-spacing: .06em;
  text-transform: uppercase;
  white-space: nowrap;
  cursor: pointer;
  transition: color .2s ease, border-color .2s ease;
}
.stock__reset:hover { border-color: var(--red); color: var(--white); }

/* статус: сколько машин в наличии / сколько нашлось по фильтрам */
.stock__statusbar {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: .3rem 1.2rem;
}
/* Счётчик — заметная строка, а не подпись мелким шрифтом (та же подача,
   что у .auctions__count). Прятать пустой через display:none НЕЛЬЗЯ:
   это live-region, скринридер не объявит изменение в скрытом элементе —
   поэтому у пустого просто убирается красная точка. */
.stock__count {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  margin: 0;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(.95rem, 1.6vw, 1.08rem);
  letter-spacing: .02em;
  color: var(--white);
}
.stock__count::before {
  content: "";
  width: 7px; height: 7px;
  border-radius: 50%;
  background: var(--red);
  flex: 0 0 auto;
  box-shadow: 0 0 10px rgba(197, 0, 34, .7);
}
.stock__count:empty::before { content: none; }
.stock__count--muted { color: var(--muted); font-weight: 500; }
/* ЗДЕСЬ БЫЛА .stock__pricenote — оговорка «цена итоговая, без доставки и
   таможни: они уже оплачены». Удалена по прямому требованию заказчика
   вместе с разметкой в stock.html. Не возвращать. */

/* --- сетка: те же 4 / 3 / 2 / 1 колонки, что у витрины лотов --- */
.stock__grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: clamp(.9rem, 1.6vw, 1.6rem);
}
.stock__grid:empty { display: none; }
/* одна анимация на всю сетку на время запроса — не по одной на скелетон */
.stock__grid--loading { animation: auctionsSkeletonPulse 1.5s ease-in-out infinite; }

/* --- то, чего нет у карточки лота --- */
.lot--stock { cursor: pointer; }          /* кликабельна вся карточка (JS-модуль 14) */
.lot__badge--stock { letter-spacing: .1em; }
.lot__specs {
  margin: 0 0 .55rem;
  font-size: .78rem;
  line-height: 1.45;
  color: rgba(255, 255, 255, .74);
}
.lot__specs[hidden] { display: none; }
.lot__desc {
  margin: .6rem 0 .9rem;
  font-size: .8rem;
  line-height: 1.5;
  color: var(--muted);
}
.lot__desc[hidden] { display: none; }

/* ДВЕ КНОПКИ ЗАЯВКИ («Заявка на кредит» + «Купить», решение заказчика).
   Стопкой, а не в ряд: в колонке сетки ~300px «Заявка на кредит» в две
   строки ломала бы высоту карточек вразнобой. margin-top:auto переехал
   с .lot__cta на обёртку — кнопки по-прежнему прижаты к низу карточки. */
.lot__actions {
  margin-top: auto;
  display: grid;
  gap: .45rem;
}
.lot__actions .lot__cta { margin-top: 0; }
/* Второстепенная кнопка: та же геометрия, приглушённая рамка. Красный —
   единственный акцент, поэтому «Купить» остаётся красной, а кредит нет. */
.lot__cta--ghost {
  border-color: var(--line);
  background: transparent;
  color: rgba(255, 255, 255, .82);
}
.lot__cta--ghost:hover {
  background: rgba(255, 255, 255, .06);
  border-color: rgba(255, 255, 255, .3);
  color: var(--white);
}
/* скелетон подгоняем под ДВЕ кнопки, иначе сетка подпрыгивает после ответа */
.stock__grid .lot__skel--cta { height: 4.75rem; }

/* --- пусто / ошибка --- */
.stock__note {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .9rem;
  padding: clamp(1.8rem, 5vh, 3.2rem) 1rem;
  border: 1px dashed var(--line);
  border-radius: 12px;
  text-align: center;
}
.stock__note[hidden] { display: none; }
.stock__note--error { border-color: rgba(197, 0, 34, .45); }
.stock__note-title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(1.15rem, 2.4vw, 1.5rem);
  line-height: 1.15;
  text-transform: uppercase;
  color: var(--white);
}
.stock__note-text {
  margin: 0;
  max-width: 52ch;
  color: var(--muted);
  font-size: .95rem;
  line-height: 1.6;
}
.stock__note-actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: .7rem;
  margin-top: .3rem;
}

/* «Показать ещё» */
.stock__more {
  display: flex;
  justify-content: center;
  margin-top: clamp(1.6rem, 3.4vh, 2.4rem);
}
.stock__more[hidden] { display: none; }

/* --- без JS: наполнять сетку и фильтры нечем, показываем только текст --- */
.no-js .stock__filter,
.no-js .stock__grid,
.no-js .stock__more { display: none; }
.stock__noscript {
  margin: 0;
  padding: 1.4rem 1rem;
  border: 1px dashed var(--line);
  border-radius: 12px;
  text-align: center;
  color: var(--muted);
  font-size: .95rem;
}
.stock__noscript a { color: var(--white); }

/* --- reveal (JS вешает .is-visible на секцию) --- */
.js .stock__wide {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity .7s ease, transform .7s var(--ease-out);
}
.stock.is-visible .stock__wide { opacity: 1; transform: none; }

/* --- responsive: 4 → 3 → 2 → 1 колонки, как у витрины лотов --- */
@media (max-width: 1100px) {
  .stock__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 780px) {
  .stock__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  /* Фильтры: два поля в ряд, кнопка сброса — во всю ширину под ними
     (та же схема, что у .auctions__controls). */
  .stock__controls { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .stock__control--action { grid-column: 1 / -1; }
  .stock__reset { width: 100%; }
}
@media (max-width: 520px) {
  .stock__grid { grid-template-columns: minmax(0, 1fr); }
  .stock__note-actions { width: 100%; flex-direction: column; }
  .stock__note-actions .btn,
  .stock__more .btn { width: 100%; }
  /* Телефон: поля в одну колонку. Пары «от–до» остаются в строку —
     два коротких числовых поля на 390px помещаются, а высота панели
     не разрастается вдвое. Высота контролов 2.5rem = 40px — палец
     попадает без промаха. */
  .stock__controls { grid-template-columns: minmax(0, 1fr); }
}

@media (prefers-reduced-motion: reduce) {
  .stock__grid--loading { animation: none; }
  .js .stock__wide { opacity: 1; transform: none; }
}

/* ---------------------------------------------------------------------
   10m. LOT MODAL — подробная карточка лота (<dialog id="lotModal">)
   Открывается кликом по карточке витрины #auctions, данные — /api/lots/{id},
   логика — JS-модуль 7b. Разметка целиком лежит в index.html.

   Устройство то же, что у 10g LEAD MODAL: нативный <dialog>, центрирование
   и ::backdrop от браузера, скролл — ВНУТРИ .lot-modal__inner, палитра
   красный / чёрный / белый, карточка на --surface с той же тенью.
   Отличие — размер: окно широкое и на десктопе двухколоночное
   (слева галерея, справа цена и характеристики), а на телефоне
   разворачивается в полноэкранную панель (см. блок «responsive» ниже).
   --------------------------------------------------------------------- */
.lot-modal {
  width: min(1080px, calc(100vw - 2.5rem));
  max-width: calc(100vw - 2.5rem);
  max-height: calc(100vh - 2.5rem);
  max-height: calc(100dvh - 2.5rem);
  padding: 0;
  border: 1px solid var(--line);
  border-radius: 16px;
  background: var(--surface);
  color: var(--white);
  overflow: hidden;                  /* скруглённые углы обрезают внутренний скролл */
  box-shadow: 0 30px 70px -34px rgba(0, 0, 0, .85),
              0 0 60px -26px rgba(197, 0, 34, .40);
}
/* браузеры без <dialog> не должны показывать содержимое окна инлайном */
.lot-modal:not([open]) { display: none; }
/* [hidden] должен побеждать display у .btn и у блоков состояний */
.lot-modal [hidden] { display: none !important; }

.lot-modal::backdrop {
  background: rgba(5, 5, 6, .82);
  backdrop-filter: blur(2px);
  -webkit-backdrop-filter: blur(2px);
}

.lot-modal[open] { animation: lotModalIn .28s var(--ease-out) both; }
@keyframes lotModalIn {
  from { opacity: 0; transform: translateY(12px) scale(.98); }
  to   { opacity: 1; transform: none; }
}

.lot-modal__inner {
  position: relative;
  max-height: calc(100vh - 2.5rem);
  max-height: calc(100dvh - 2.5rem);
  overflow-y: auto;                  /* длинный контент скроллится внутри окна */
  overscroll-behavior: contain;      /* прокрутка окна не «пробивает» в страницу */
  -webkit-overflow-scrolling: touch;
  padding: clamp(1.2rem, 3vw, 1.9rem);
}

.lot-modal__close {
  position: absolute;
  top: .7rem; right: .7rem;
  z-index: 3;                        /* поверх фото галереи */
  width: 38px; height: 38px;
  display: grid;
  place-items: center;
  border: 1px solid var(--line);
  border-radius: 50%;
  background: rgba(5, 5, 6, .72);
  color: var(--muted);
  transition: color .2s ease, border-color .2s ease, background-color .2s ease;
}
.lot-modal__close:hover { color: var(--white); border-color: var(--red); }
.lot-modal__close svg { width: 15px; height: 15px; display: block; }

/* --- состояние: загрузка ---------------------------------------------
   Скелетон, а не пустое окно. Пульсация — ОДНА анимация на весь блок
   (как у сетки витрины), на телефоне она выключена в блоке 12b. */
.lot-modal__loading {
  display: flex;
  flex-direction: column;
  gap: .8rem;
  animation: lotModalSkeletonPulse 1.5s ease-in-out infinite;
}
@keyframes lotModalSkeletonPulse {
  0%, 100% { opacity: .9; }
  50%      { opacity: .55; }
}
.lot-modal__skel {
  display: block;
  border-radius: 6px;
  background: rgba(255, 255, 255, .07);
}
.lot-modal__skel--media { aspect-ratio: 16 / 10; width: 100%; border-radius: 12px; }
.lot-modal__skel--title { height: 1.9rem; width: 62%; }
.lot-modal__skel--price { height: 2.4rem; width: 44%; }
.lot-modal__skel--line  { height: .95rem; width: 100%; }
.lot-modal__loading-note {
  margin: .2rem 0 0;
  color: var(--muted);
  font-size: .82rem;
}

/* --- состояние: ошибка --- */
.lot-modal__error {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1rem;
  padding: clamp(2rem, 6vh, 3.4rem) 1rem;
  text-align: center;
}
.lot-modal__error-text {
  margin: 0;
  max-width: 46ch;
  color: var(--muted);
  font-size: .95rem;
  line-height: 1.55;
}

/* --- содержимое: две колонки на десктопе --- */
.lot-modal__content {
  display: grid;
  grid-template-columns: minmax(0, 1.02fr) minmax(0, 1fr);
  gap: clamp(1.1rem, 2.4vw, 1.9rem);
  align-items: start;
}

/* --- ГАЛЕРЕЯ --------------------------------------------------------- */
.lot-modal__gallery { min-width: 0; }
.lot-modal__stage {
  position: relative;
  aspect-ratio: 4 / 3;
  display: grid;
  place-items: center;
  border: 1px solid var(--line);
  border-radius: 12px;
  overflow: hidden;
  background:
    radial-gradient(120% 90% at 50% 12%, rgba(197, 0, 34, .10) 0%, rgba(197, 0, 34, 0) 60%),
    linear-gradient(160deg, #17151a 0%, #0d0c0f 100%);
  /* горизонтальный свайп ведём сами, вертикальную прокрутку отдаём странице */
  touch-action: pan-y;
}
.lot-modal__photo {
  position: absolute;
  inset: 0;
  width: 100%; height: 100%;
  object-fit: contain;               /* фото у площадки разных пропорций — не режем */
  display: block;
  background: #0d0c0f;
  opacity: 1;
  transition: opacity .2s ease;
}
.lot-modal__photo[hidden] { display: none; }
/* пока грузится следующий снимок — приглушаем предыдущий, а не мигаем пустотой */
.lot-modal__stage.is-loading .lot-modal__photo { opacity: .35; }
.lot-modal__nophoto {
  padding: 0 1rem;
  font-size: .78rem;
  letter-spacing: .06em;
  text-transform: uppercase;
  text-align: center;
  color: rgba(255, 255, 255, .3);
}

.lot-modal__nav {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 2;
  width: 40px; height: 40px;
  display: grid;
  place-items: center;
  border: 1px solid var(--line);
  border-radius: 50%;
  background: rgba(5, 5, 6, .68);
  color: var(--white);
  cursor: pointer;
  transition: background-color .2s ease, border-color .2s ease;
}
.lot-modal__nav:hover { background: var(--red); border-color: var(--red); }
.lot-modal__nav svg { width: 18px; height: 18px; display: block; }
.lot-modal__nav--prev { left: .6rem; }
.lot-modal__nav--next { right: .6rem; }

.lot-modal__counter {
  position: absolute;
  left: .6rem; bottom: .6rem;
  z-index: 2;
  margin: 0;
  padding: .22em .6em;
  border-radius: 999px;
  background: rgba(5, 5, 6, .74);
  color: var(--white);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: .72rem;
  letter-spacing: .06em;
}

.lot-modal__thumbs {
  display: flex;
  gap: .45rem;
  margin-top: .55rem;
  padding-bottom: .25rem;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scrollbar-width: thin;
}
.lot-modal__thumb {
  flex: 0 0 auto;
  width: 74px; height: 56px;
  padding: 0;
  border: 1px solid var(--line);
  border-radius: 7px;
  background: #0d0c0f;
  overflow: hidden;
  cursor: pointer;
  opacity: .55;
  transition: opacity .2s ease, border-color .2s ease;
}
.lot-modal__thumb:hover { opacity: .85; }
.lot-modal__thumb.is-active { opacity: 1; border-color: var(--red); }
.lot-modal__thumb-img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* --- правая колонка --------------------------------------------------- */
.lot-modal__main { min-width: 0; }
.lot-modal__eyebrow {
  margin: 0 0 .45rem;
  font-size: .72rem;
  font-weight: 600;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--muted);
}
.lot-modal__title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.45rem, 3.2vw, 2rem);
  line-height: 1.05;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: var(--white);
  margin: 0 2.8rem 1rem 0;           /* место под крестик */
  outline: none;                     /* фокусируется программно после загрузки */
  overflow-wrap: anywhere;
}

/* Санкционный автомобиль — та же контурная пилюля, что на карточке витрины
   (.lot__badge--sanction): факт о лоте, не предупреждение, поэтому без
   красной заливки. */
.lot-modal__sanction {
  display: inline-flex;
  align-items: center;
  margin: -.4rem 0 1rem;
  padding: .22em .6em;
  border: 1px solid rgba(255, 255, 255, .55);
  border-radius: 999px;
  background: rgba(255, 255, 255, .04);
  color: var(--white);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: .68rem;
  letter-spacing: .12em;
  text-transform: uppercase;
}
.lot-modal__sanction[hidden] { display: none; }

/* --- цена «под ключ» + разбивка --- */
.lot-modal__price {
  padding: clamp(.9rem, 2vw, 1.2rem);
  border: 1px solid var(--line);
  border-radius: 12px;
  background: rgba(255, 255, 255, .02);
}
.lot-modal__price-label {
  margin: 0 0 .25rem;
  font-size: .68rem;
  font-weight: 600;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--muted);
}
/* ИТОГ — единственная крупная величина блока: всё остальное набрано мельче,
   чтобы взгляд цеплялся за сумму «под ключ», а не за строки разбивки.
   tabular-nums по всему блоку: моноширинные цифры выстраивают суммы
   ровной колонкой (в пропорциональном наборе «1» уже остальных цифр). */
.lot-modal__price-total {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.7rem, 3.6vw, 2.15rem);
  line-height: 1.02;
  letter-spacing: -.005em;
  color: var(--white);
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}
.lot-modal__price-src {
  margin: .35rem 0 0;
  font-size: .82rem;
  line-height: 1.45;
  color: var(--muted);
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}

.lot-modal__lines {
  margin: 1rem 0 0;
  padding: .9rem 0 0;
  border-top: 1px solid var(--line);
}
.lot-modal__lines:empty { display: none; }
/* Подпись и сумма — колонками: подпись переносится внутри своей доли
   (min-width: 0 разрешает перенос во flex), сумма прижата к правому краю и
   никогда не рвётся. Длинные строки вроде «СВХ, брокер, элПТС, лаборатория»
   поэтому переносятся, а не выдавливают сумму за карточку. */
.lot-modal__line {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: .9rem;
  padding: .38rem 0;
}
.lot-modal__line-key {
  min-width: 0;
  color: var(--muted);
  font-size: .85rem;
  line-height: 1.4;
  text-wrap: pretty;                 /* без «висящего» слова на второй строке */
}
/* Сумма в валюте площадки под подписью строки: тише самой подписи, чтобы
   колонка рублей осталась главной. Диапазоны Китая живут здесь же. */
.lot-modal__line-sub {
  display: block;
  margin-top: .12rem;
  color: rgba(255, 255, 255, .42);
  font-size: .76rem;
  line-height: 1.35;
  font-variant-numeric: tabular-nums;
}
.lot-modal__line-sub[hidden] { display: none; }
.lot-modal__line-val {
  margin: 0;
  flex: 0 0 auto;
  color: var(--white);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: .95rem;
  line-height: 1.4;
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}
.lot-modal__line-val--na {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: .84rem;
  color: var(--muted);
}

/* КОМИССИЯ КОМПАНИИ — отдельная строка внизу разбивки (решение заказчика).
   Отделена собственной чертой и набрана чуть крупнее строк <dl>, чтобы
   читалась как самостоятельная позиция, а не как ещё один платёж в списке.
   Цвет прежний: белый на --surface, красный сюда не отдаём. */
.lot-modal__fee {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: .8rem;
  margin: .8rem 0 0;
  padding: .7rem 0 0;
  border-top: 1px solid var(--line);
}
.lot-modal__fee[hidden] { display: none; }
.lot-modal__fee-key {
  min-width: 0;
  color: var(--white);
  font-size: .88rem;
  line-height: 1.4;
  text-wrap: pretty;
}
.lot-modal__fee-val {
  flex: 0 0 auto;
  color: var(--white);
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 1.05rem;
  line-height: 1.4;
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}
/* суммы нет (amount: null) — «уточняется» набирается как обычный текст */
.lot-modal__fee-val--na {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: .84rem;
  color: var(--muted);
}

.lot-modal__excluded {
  margin-top: .9rem;
  padding-top: .8rem;
  border-top: 1px solid var(--line);
}
.lot-modal__excluded-head {
  margin: 0 0 .4rem;
  font-size: .68rem;
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--muted);
}
.lot-modal__excluded-list { margin: 0; padding: 0; list-style: none; }
/* приглушённый минус, а не красный — ровно как в блоке 10j ORDER */
.lot-modal__excluded-item {
  position: relative;
  padding-left: 1.1rem;
  color: var(--muted);
  font-size: .85rem;
  line-height: 1.5;
}
.lot-modal__excluded-item::before {
  content: "";
  position: absolute;
  left: 0; top: .68em;
  width: 9px; height: 1.5px;
  background: rgba(255, 255, 255, .34);
}

/* Служебная строка: самый мелкий кегль блока и самый приглушённый цвет —
   она подтверждает источник курса, а не участвует в чтении сумм. */
.lot-modal__rates {
  margin: .9rem 0 0;
  font-size: .74rem;
  line-height: 1.5;
  color: rgba(255, 255, 255, .45);
  text-wrap: pretty;
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}

/* --- расчёта нет: причина + цена площадки --- */
.lot-modal__nocalc {
  padding: clamp(.9rem, 2vw, 1.2rem);
  border: 1px dashed var(--line);
  border-radius: 12px;
}
.lot-modal__nocalc-title {
  margin: 0 0 .35rem;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 1.05rem;
  letter-spacing: .01em;
  color: var(--white);
}
.lot-modal__nocalc-text {
  margin: 0;
  color: var(--muted);
  font-size: .87rem;
  line-height: 1.5;
  text-wrap: pretty;
}
.lot-modal__nocalc-price {
  margin: .7rem 0 0;
  padding-top: .7rem;
  border-top: 1px solid var(--line);
  color: var(--white);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 1.02rem;
  line-height: 1.35;
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}

/* ОГОВОРКА О ПРЕДВАРИТЕЛЬНОСТИ остаётся (в отличие от служебного
   price_calc.note, который с экрана убран): это единственный текст, который
   объясняет статус суммы, и он не про качество данных по конкретному лоту. */
.lot-modal__disclaimer {
  margin: .85rem 0 0;
  max-width: 62ch;
  font-size: .78rem;
  line-height: 1.55;
  color: var(--muted);
  text-wrap: pretty;
}

/* --- характеристики: пустых строк не бывает, их не создаёт JS --- */
.lot-modal__specs {
  margin: clamp(1.1rem, 2.6vh, 1.5rem) 0 0;
  padding-top: clamp(1.1rem, 2.6vh, 1.5rem);
  border-top: 1px solid var(--line);
}
.lot-modal__specs:empty { display: none; padding: 0; border: 0; }
.lot-modal__spec {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: .9rem;
  padding: .38rem 0;
  border-bottom: 1px solid rgba(255, 255, 255, .06);
}
.lot-modal__spec:last-child { border-bottom: 0; }
.lot-modal__spec-key {
  min-width: 0;
  color: var(--muted);
  font-size: .8rem;
  line-height: 1.4;
  letter-spacing: .04em;
  text-wrap: pretty;
}
.lot-modal__spec-val {
  margin: 0;
  color: var(--white);
  font-size: .88rem;
  line-height: 1.4;
  text-align: right;
  overflow-wrap: anywhere;
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}

.lot-modal__cta {
  width: 100%;
  margin-top: clamp(1.1rem, 3vh, 1.5rem);
}

/* --- responsive ------------------------------------------------------
   ≤900px: одна колонка. ≤780px окно перестаёт быть «окошком посреди
   экрана» и разворачивается в ПОЛНОЭКРАННУЮ ПАНЕЛЬ — на телефоне это
   единственный честный вид, а прокрутка содержимого остаётся внутри
   .lot-modal__inner. --- */
@media (max-width: 900px) {
  .lot-modal { width: min(680px, calc(100vw - 1.6rem)); max-width: calc(100vw - 1.6rem); }
  .lot-modal__content { grid-template-columns: minmax(0, 1fr); }
  .lot-modal__stage { aspect-ratio: 3 / 2; }
}
@media (max-width: 780px) {
  .lot-modal {
    width: 100%;
    max-width: 100%;
    height: 100%;
    max-height: 100%;
    margin: 0;
    border: 0;
    border-radius: 0;
    box-shadow: none;
  }
  .lot-modal__inner {
    max-height: 100%;
    height: 100%;
    padding: 1rem .9rem 1.6rem;
  }
  .lot-modal__close { top: .5rem; right: .5rem; }
  .lot-modal__title { margin-right: 2.6rem; }
  .lot-modal__thumb { width: 64px; height: 48px; }
  /* на узком экране стрелки мешают свайпу и перекрывают фото — листаем
     пальцем и миниатюрами */
  .lot-modal__nav { display: none; }

  /* ТИПОГРАФИКА РАЗБИВКИ НА ТЕЛЕФОНЕ. Подписи длинные («СВХ, брокер, элПТС,
     лаборатория»), сумма не переносится никогда — поэтому на узком экране
     подписи чуть мельче и просвет между строками чуть больше: две строки
     подписи против одной строки суммы читаются как одна позиция. */
  .lot-modal__line { gap: .7rem; padding: .42rem 0; }
  .lot-modal__line-key { font-size: .82rem; }
  .lot-modal__line-val { font-size: .92rem; }
  .lot-modal__fee { gap: .7rem; }
  .lot-modal__fee-key { font-size: .85rem; }
  .lot-modal__fee-val { font-size: 1rem; }
  .lot-modal__spec { gap: .7rem; }
}

/* --- reduced motion: без въезда окна и без блюра подложки --- */
@media (prefers-reduced-motion: reduce) {
  .lot-modal[open] { animation: none; }
  .lot-modal::backdrop { backdrop-filter: none; -webkit-backdrop-filter: none; }
  .lot-modal__loading { animation: none; }
  .lot-modal__cta:hover { transform: none; }
}

/* ---------------------------------------------------------------------
   10n. STOCK — ШАПКА СТРАНИЦЫ: тезисы бегущей строкой + «Продать свой авто»
   БЫЛО: отдельная секция .usp#usp ПОД витриной stock.html. Заказчик
   попросил поднять её содержимое наверх, вместо старой заголовочной
   группы («Автомобили, которые уже в России» + лид). Секция .usp удалена
   целиком, второго заголовка на странице нет — <h1> ровно один
   («Автомобили в наличии», стили в блоке 10l).

   Здесь: бегущая строка тезисов, текст «не нашли — привезём под заказ»
   слева и самостоятельный блок «Продать свой авто» справа. Всё это стоит
   ВНУТРИ секции .stock, между заголовком и панелью фильтров.

   БЕГУЩАЯ СТРОКА — ТОТ ЖЕ КОМПОНЕНТ .ticker ИЗ БЛОКА 4b, второго
   механизма в проекте нет. Здесь только модификатор --inline (снимает
   margin-top под fixed-шапку: отступ под шапку даёт padding-top у .stock)
   и стоп-кран анимации.

   ЭТО ЕДИНСТВЕННАЯ БЕСКОНЕЧНАЯ АНИМАЦИЯ stock.html. Она:
     * стоит на паузе, пока СТРОКА за экраном или вкладка неактивна
       (класс .anim-off вешает общий pauseWhenOffscreen на секцию .stock,
       а наблюдает он за самой строкой — секция занимает всю страницу,
       по ней пауза не сработала бы никогда; JS-модуль 15);
     * выключена целиком при prefers-reduced-motion — правилом
       .ticker__track { animation: none } в блоке 4b.
   Правило .stock.anim-off сильнее .ticker:hover (0,3,1 против 0,2,0),
   поэтому наведение мыши не «оживит» ушедшую с экрана строку.
   --------------------------------------------------------------------- */

/* --- бегущая строка --- */
.ticker--inline { margin-top: 0; }        /* строка внутри страницы, не под шапкой */
.stock__ticker {
  position: relative;
  z-index: 1;                             /* поверх свечения .stock__bg */
  /* СТРОКА — ПЕРВЫЙ ЭЛЕМЕНТ СЕКЦИИ (правка заказчика: она стоит НАД <h1>).
     Сверху отступа нет: вплотную под fixed-шапкой, как на главной —
     нужную высоту уже дал padding-top у .stock (блок 10l).
     Снизу — воздух до заголовка. Было margin-block с обеих сторон, когда
     строка стояла между <h1> и .stock__foot. */
  margin: 0 0 clamp(1.6rem, 4.5vh, 2.8rem);
}
.stock.anim-off .ticker__track { animation-play-state: paused; }

/* --- текст + предложение продать авто --- */
.stock__foot {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  justify-content: space-between;
  gap: clamp(1.2rem, 3vw, 2.6rem);
  margin-bottom: clamp(1.8rem, 4.5vh, 3rem);
}

.stock__sell {
  flex: 0 0 auto;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: .55rem;
  max-width: 24rem;
  text-align: right;
}
.stock__sell-note {
  margin: 0;
  color: var(--muted);
  /* Один размер с .stock__lede — абзацем слева в том же ряду: подпись под
     кнопкой не служебная сноска, а часть предложения (правка заказчика). */
  font-size: clamp(.92rem, 1.1vw, 1rem);
  line-height: 1.65;
}

/* Телефон/планшет: колонкой, кнопка во всю ширину — как в других блоках */
@media (max-width: 780px) {
  .stock__foot { flex-direction: column; }
  .stock__sell {
    align-items: stretch;
    text-align: left;
    max-width: none;
    width: 100%;
  }
  .stock__sell-btn { width: 100%; }
}

/* =====================================================================
   11. ENTRANCE ANIMATION
   Hidden states apply only when JS is present (html.js). Revealed by
   body.is-loaded (added after document.fonts.ready). Staggered via delay.
   ===================================================================== */

/* initial hidden states (JS on) */
.js .kicker,
.js .hero__sub,
.js .hero__cta,
.js .stats {
  opacity: 0;
  transform: translateY(16px);
  transition: opacity .7s ease, transform .7s var(--ease-out);
}
.js .line-inner {
  transform: translateY(110%);
  transition: transform .9s var(--ease-out);
}
.js .hero__bar {
  transform: scaleX(0);
  transition: transform .7s var(--ease-out);
}
.js .scroll-cue {
  opacity: 0;
  transition: opacity 1s ease;
}

/* revealed states + stagger sequence:
   kicker -> l1 -> l2 -> l3 -> bar -> sub -> cta -> stats -> scroll cue */
.is-loaded .kicker            { opacity: 1; transform: none; transition-delay: .05s; }
.is-loaded .line-inner        { transform: translateY(0); }
.is-loaded .line-mask:nth-child(1) .line-inner { transition-delay: .18s; }
.is-loaded .line-mask:nth-child(2) .line-inner { transition-delay: .30s; }
.is-loaded .line-mask:nth-child(3) .line-inner { transition-delay: .42s; }
.is-loaded .hero__bar         { transform: scaleX(1); transition-delay: .60s; }
.is-loaded .hero__sub         { opacity: 1; transform: none; transition-delay: .72s; }
.is-loaded .hero__cta         { opacity: 1; transform: none; transition-delay: .84s; }
.is-loaded .stats             { opacity: 1; transform: none; transition-delay: .96s; }
.is-loaded .scroll-cue        { opacity: 1; transition-delay: 1.15s; }

/* =====================================================================
   12. RESPONSIVE
   ===================================================================== */

/* Wide desktop only keeps the phone: below this the five long RU nav
   labels need that room to stay on one line each. */
@media (max-width: 1400px) {
  .site-header__phone,
  .site-header__tick { display: none; }
  .site-header__inner { gap: 1.5rem; }
}

/* Below ~1200px the wide RU nav can't share the row with logo + CTA,
   so collapse the whole nav into the burger menu. */
@media (max-width: 1200px) {
  .nav,
  .site-header__cta { display: none; }
  .burger { display: block; }
}

/* Routes + flags show on phones too — the vector map's cluster is wide enough,
   and the lines are non-scaling so they stay visible. Phone-specific sizing
   (smaller flags, bigger dots) lives in the <=900 / <=560 blocks below. */

/* Tablet / phone: stack the hero; the vertical photo strip becomes a
   full-width band in normal flow below the text (not a floating card —
   that read as a tiny disconnected thumbnail, see conversation). */
@media (max-width: 900px) {
  .hero {
    flex-direction: column;
    align-items: stretch;
    justify-content: center;
    text-align: left;
  }

  .hero__content { max-width: none; }

  /* .hero__photo sits BEFORE .hero__inner in the DOM (harmless on desktop,
     where it's position:absolute) — .hero is a flex column here, so `order`
     puts it visually after the text/stats without touching the markup. */
  .hero__inner { order: 1; }
  .hero__photo {
    order: 2;
    position: relative;
    inset: auto;
    right: auto; top: auto; bottom: auto;
    transform: none;
    width: 100%;
    height: clamp(240px, 48vh, 380px);
    margin-top: clamp(1.6rem, 6vw, 2.4rem);
    border: none;
    border-top: 1px solid var(--line);
    border-bottom: 1px solid var(--line);
    box-shadow: none;
  }

  /* scroll cue would fall right above the photo band -> hide it */
  .scroll-cue { display: none; }

  .stats { justify-content: flex-start; }

  /* TRUST: counters wrap to 2x2 */
  .trust__metrics { grid-template-columns: repeat(2, 1fr); }
  .trust__flag { width: 26px; height: 26px; }
  .trust__dot { r: 6; }                 /* dots scale with the map -> enlarge on small panels */
}

/* TRUST map on phones: routes + flags + nodes, sized down */
@media (max-width: 560px) {
  .trust__flag { width: 16px; height: 16px; }   /* smaller so the 3 flags don't collide */
  .trust__dot { r: 11; }

  /* Keep "Прямой импорт · Без посредников" on ONE line on phones.
     The wide .22em tracking is what forced the wrap — tighten it + the kegel a
     touch and forbid wrapping (fits comfortably down to ~320px). */
  .kicker { gap: .45rem; font-size: .7rem; letter-spacing: .04em; }
  .kicker__line { width: 22px; }
  .kicker__text { white-space: nowrap; }
}

/* Phones */
@media (max-width: 480px) {
  :root { --header-h: 70px; }

  .hero__cta { flex-direction: column; align-items: stretch; }
  .hero__cta .btn { width: 100%; }

  .stats {
    gap: 1.25rem 1.5rem;
  }
  .stat { flex: 1 0 40%; }

  .hero__glow { width: 120vw; height: 120vw; right: -30%; }
}

/* =====================================================================
   12b. МОБИЛЬНЫЙ БЮДЖЕТ ОТРИСОВКИ — только <=900px
   Причина: на телефоне страница держала ~30 бесконечных CSS-анимаций и
   ~25 blur/filter-поверхностей одновременно. Каждая из них — работа на
   каждый кадр, и именно она съедала бюджет во время скролла («экран как бы
   дёргает»). Здесь всё тяжёлое либо останавливается, либо выключается.

   ЖЁСТКОЕ ПРАВИЛО: этот блок живёт ТОЛЬКО внутри медиазапросов.
   Десктопный вид (>900px) не меняется ни на пиксель — все свечения,
   осколки, зерно и анимации маршрутов там на месте.
   ===================================================================== */
@media (max-width: 900px) {

  /* 1) Свечения секций (8 штук) остаются видимыми, но перестают дрейфовать.
        Блюр 20–28px под анимацией = пересборка большой поверхности каждый
        кадр; статичный тот же блюр браузер кеширует. will-change снимаем,
        иначе слои под них висят вечно без всякой пользы. */
  .hero__glow,
  .trust__glow,
  .how__glow,
  .auctions__glow,
  .calc__glow,
  .reviews__glow,
  .contacts__glow,
  .order__glow {
    animation: none;
    will-change: auto;
  }

  /* 2) Красные «осколки» (16 штук, blur 6–8px, до 45vw x 78% высоты секции).
        На телефоне при opacity .05–.10 они практически не видны, а стоят
        16 отдельных размываемых поверхностей. Убираем полностью. */
  .hero__shard,
  .trust__shard,
  .how__shard,
  .auctions__shard,
  .calc__shard,
  .reviews__shard,
  .contacts__shard,
  .order__shard { display: none; }

  /* 3) Зерно в hero: mix-blend-mode заставляет браузер выводить весь hero
        через медленный (не композитный) путь смешивания. Плёнка в 6%
        непрозрачности того не стоит. */
  .hero__grain { display: none; }

  /* 4) Карта TRUST — самое дорогое место страницы: 22 пути, у каждого свой
        SVG <mask> и бесконечная анимация stroke-dashoffset. SVG так не
        композитится — перерисовывается вся карта целиком, каждый кадр.
        На телефоне оставляем статичные пунктирные маршруты: mask снимаем
        (иначе линии остались бы невидимыми — их «проявляет» именно маска),
        поток пунктира и draw-on гасим. Точки городов (one-shot) остаются. */
  .trust__route {
    animation: none;
    -webkit-mask: none;
            mask: none;
    filter: none;
  }
  .trust__reveal { animation: none; }

  /* 5) Бесконечный поток пунктира по коннектору таймлайна HOW.
        Сама заливка коннектора (clip-path по --how-progress) работает. */
  .how__flow { animation: none; }

  /* 6) Пульсация скелетонов витрины лотов. Живёт только во время запроса,
        но анимирует opacity целой сетки (до 12 карточек) — на телефоне это
        лишняя композиция ровно в тот момент, когда браузер и так занят
        разбором ответа API. Скелетоны остаются, просто не мигают. */
  .auctions__grid--loading { animation: none; }
  /* то же самое для витрины «Авто в наличии» (stock.html, блок 10l) */
  .stock__grid--loading { animation: none; }
  /* и для скелетона подробной карточки лота (блок 10m) */
  .lot-modal__loading { animation: none; }
}

/* =====================================================================
   12c. CONTENT-VISIBILITY — секции ниже первого экрана
   Браузер пропускает вёрстку и отрисовку секции, пока она далеко от
   вьюпорта, и считает её высоту равной contain-intrinsic-size. Значения
   подобраны по фактической высоте секций (десктоп 1440 / телефон 390),
   ключевое слово auto означает «после первой отрисовки запомнить настоящую
   высоту» — поэтому промах оценки виден максимум один раз.

   ПОЧЕМУ НЕ ВЕЗДЕ: #hero / .ticker / #trust / #how видны или почти видны
   сразу, экономии от них нет, а #trust вдобавок содержит карту, которой
   лишний слой изоляции ни к чему.
   ===================================================================== */
#order,
#auctions,
#guide,
#reviews,
#contacts,
.footer {
  content-visibility: auto;
}
/* ВНИМАНИЕ: contain-intrinsic-size задаёт размер CONTENT-BOX. Вертикальные
   padding'ы секций (clamp(3.5rem, 9vh, 6.5rem) сверху и снизу) прибавляются
   сверх него — значения ниже уже за вычетом padding'ов и рамок.
   Десктоп, замерено на 1440x900 (content-box). */
#order     { contain-intrinsic-size: auto 1120px; }
#auctions  { contain-intrinsic-size: auto 1990px; }   /* живая витрина: фильтр + 12 карточек + оговорка про оферту (перемерено после удаления .auctions__pricenote — 1991, значение не двигали) */
#guide     { contain-intrinsic-size: auto 675px; }
#reviews   { contain-intrinsic-size: auto 1300px; }   /* две колонки: галерея выдач | виджет 2ГИС */
#contacts  { contain-intrinsic-size: auto 885px; }
.footer    { contain-intrinsic-size: auto 480px; }

/* Телефон: те же секции в одну колонку в 2–3 раза выше. Замерено на 390x844
   (content-box). Без отдельных значений оценка промахивалась примерно на
   2600px, и полоса прокрутки заметно «ехала» на первом проходе — ровно тот
   эффект, ради устранения которого всё и делается. */
@media (max-width: 900px) {
  #order     { contain-intrinsic-size: auto 1650px; }
  #auctions  { contain-intrinsic-size: auto 6470px; }   /* та же витрина в одну колонку; перемерено после удаления .auctions__pricenote (было 6510) */
  #guide     { contain-intrinsic-size: auto 1050px; }
  #reviews   { contain-intrinsic-size: auto 1510px; }   /* галерея 2x2 + виджет друг под другом */
  #contacts  { contain-intrinsic-size: auto 1465px; }
  .footer    { contain-intrinsic-size: auto 1105px; }
}

/* =====================================================================
   13. REDUCED MOTION — show everything immediately, no transforms
   ===================================================================== */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
  /* force final/visible states */
  .js .kicker,
  .js .hero__sub,
  .js .hero__cta,
  .js .stats,
  .js .scroll-cue { opacity: 1; transform: none; }
  .js .line-inner { transform: none; }
  .js .hero__bar { transform: scaleX(1); }

  /* TRUST: reveal instantly, and show a static map (no comet flow, no pulse) */
  .js .trust__eyebrow,
  .js .trust__metric,
  .js .trust__map-head,
  .js .trust__map,
  .js .trust__legend { opacity: 1; transform: none; }
  /* the global rule above snaps routes to their revealed end-state; just
     silence the flag pulse ring so nothing keeps moving */
  .trust__flag::before { display: none; }
}
