/* ==========================================================================
   PRO Estate — агентство недвижимости. Тема поверх локального Bootstrap 5.3.3.
   Стили сайта: только локальные шрифты и никаких внешних CDN.
   ========================================================================== */

/* --- шрифты: только файлы сайта (без CDN и без системных) ---
   Текстовые шрифты — переменные woff2 (ось веса), поэтому любой вес рисуется самим шрифтом,
   а не подделкой браузера. Кириллица, латиница и вся типографика текстов (₽, «», —, ·, ², №)
   уже внутри файлов: браузер ничего не добирает из системы, вид не зависит от ОС и браузера.
   Эмодзи — цветной шрифт из файла сайта: на Windows, macOS и Linux значки одинаковые.

   font-display:block — а не swap. При swap браузер сначала рисует текст системным шрифтом,
   а когда файл доедет, подменяет: текст на глазах «прыгает» (другие ширина и высота строки,
   строки переливаются). При block места букв занимает тот же шрифт, поэтому подмены и прыжка
   нет: текст появляется уже своим шрифтом. Файл начинают грузить сразу с разметкой
   (preload в base.html), поэтому ожидание короткое. Запасной вариант на случай, если файл
   так и не доехал, — запасные шрифты ниже. */
@font-face{font-family:'Inter';font-style:normal;font-weight:100 900;font-display:block;
  src:url('/static/vendor/fonts/inter-var-cyr-lat.woff2?v=2') format('woff2')}
@font-face{font-family:'Manrope';font-style:normal;font-weight:200 800;font-display:block;
  src:url('/static/vendor/fonts/manrope-var-cyr-lat.woff2?v=2') format('woff2')}
@font-face{font-family:'Meridian Mono';font-style:normal;font-weight:100 700;font-display:block;
  src:url('/static/vendor/fonts/mono-var-cyr-lat.woff2?v=1') format('woff2')}
@font-face{font-family:'Meridian Emoji';font-style:normal;font-weight:400;font-display:swap;
  src:url('/static/vendor/fonts/meridian-emoji.ttf?v=7') format('truetype')}

/* --- запасные шрифты: пока файл едет, буквы рисует системный, но С ТЕМИ ЖЕ МЕРКАМИ.
   Почему: файл шрифта начинает грузиться только после разбора app.css, а до него браузер
   рисует системным. У системного другие ширина и высота строки — при подмене текст
   «прыгает»: строки переливаются, абзац меняет высоту, заголовок — ширину. Здесь запасному
   шрифту заданы мерки Inter/Manrope/Mono (доля ширины size-adjust и верх/низ строки),
   поэтому подмена меняет только рисунок букв, а не расположение текста.
   Числа измерены, а не выдуманы: ширина строки текста и верх/низ строки каждого шрифта
   сняты в браузере (см. docs/шрифты-без-прыжка.md). Опорный шрифт — Arial (в системе место
   него может стоять Helvetica или Liberation Sans: они совпадают с Arial по меркам). */
@font-face{font-family:'Inter Fallback';font-style:normal;font-weight:100 900;font-display:swap;
  src:local('Arial'),local('Helvetica'),local('Liberation Sans');
  size-adjust:107%;ascent-override:90.65%;descent-override:22.43%;line-gap-override:0%}
@font-face{font-family:'Manrope Fallback';font-style:normal;font-weight:200 800;font-display:swap;
  src:local('Arial'),local('Helvetica'),local('Liberation Sans');
  size-adjust:100.9%;ascent-override:105.55%;descent-override:29.73%;line-gap-override:0%}
@font-face{font-family:'Mono Fallback';font-style:normal;font-weight:100 700;font-display:swap;
  src:local('Courier New'),local('Liberation Mono'),local('DejaVu Sans Mono');
  size-adjust:100%;ascent-override:105%;descent-override:27%;line-gap-override:0%}

/* --- стек шрифтов: одинаковый во всех браузерах --- */
:root{
  --font-text:'Inter','Inter Fallback','Meridian Emoji',system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;
  --font-head:'Manrope','Manrope Fallback','Inter','Inter Fallback','Meridian Emoji',system-ui,sans-serif;
  --font-mono:'Meridian Mono','Mono Fallback','Inter','Inter Fallback','Meridian Emoji',ui-monospace,SFMono-Regular,Menlo,monospace;
  --font-emoji:'Meridian Emoji',var(--font-text);
  --ink:#0f172a; --ink-2:#334155; --muted:#64748b; --line:#e5eaf2;
  --bg:#f5f7fb; --card:#ffffff;
  --brand-900:#0b1a3a; --brand-800:#122a5e; --brand-700:#1b3a8f;
  --brand:#1e40af; --brand-400:#3b82f6; --sky:#0ea5e9; --teal:#14b8a6;
  --warn:#b45309; --danger:#b91c1c; --ok:#15803d;
  --r-lg:18px; --r-md:14px; --r-sm:10px;
  --sh-1:0 1px 2px rgba(15,23,42,.06), 0 1px 3px rgba(15,23,42,.04);
  --sh-2:0 10px 24px -12px rgba(15,23,42,.22), 0 2px 6px rgba(15,23,42,.05);
  --sh-3:0 24px 60px -24px rgba(11,26,58,.45);
  --grad:linear-gradient(135deg,#16337a 0%,#1e40af 55%,#0ea5e9 100%);
  --grad-soft:linear-gradient(135deg,#eef4ff 0%,#e8f6ff 60%,#eafaf7 100%);
  /* ---------------------------------------------- узоры поверх заливок
     Бледная сетка точек и наклонных линий: одна плитка 22–34 px, повтор. Прозрачность
     зашита в саму SVG, поэтому узор можно положить первым слоем фона под градиент и он
     не спорит с текстом. Голые градиенты без узора читались мёртво: одинаковые заливки
     на шапке, первом экране, полосе заявки и в подвале (16.10.2026). */
  --pat-dots:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22'%3E%3Ccircle cx='1.5' cy='1.5' r='1.1' fill='%23ffffff' fill-opacity='.085'/%3E%3C/svg%3E");
  --pat-dots-lg:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='34' height='34'%3E%3Ccircle cx='2' cy='2' r='1.3' fill='%23ffffff' fill-opacity='.07'/%3E%3C/svg%3E");
  --pat-lines:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Cpath d='M0 16L16 0' stroke='%23ffffff' stroke-opacity='.055' stroke-width='1'/%3E%3C/svg%3E");
  --pat-dots-ink:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='26' height='26'%3E%3Ccircle cx='1.5' cy='1.5' r='1.1' fill='%230f172a' fill-opacity='.05'/%3E%3C/svg%3E");
}

html{-webkit-text-size-adjust:100%}
body{
  min-height:100dvh; display:flex; flex-direction:column;
  background:
    radial-gradient(1200px 600px at 100% -10%, #e8f1ff 0%, rgba(232,241,255,0) 60%),
    radial-gradient(900px 500px at -10% 10%, #e9fbf7 0%, rgba(233,251,247,0) 55%),
    var(--bg);
  color:var(--ink);
  font-family:var(--font-text);
  font-size:15px; line-height:1.55;
}
main{flex:1 0 auto; padding:26px 0 56px}
h1,h2,h3,h4,.display{font-family:var(--font-head);font-weight:800;letter-spacing:-.02em;color:var(--ink)}
h1{font-size:clamp(24px,2.4vw,32px);margin:0 0 8px}
h2{font-size:clamp(19px,1.8vw,24px);margin:30px 0 14px}
h3{font-size:17px;margin:22px 0 10px}
a{color:var(--brand);text-decoration:none}
a:hover{color:var(--brand-700)}
.text-muted-2{color:var(--muted)!important}
.small-2{font-size:13px}
.section-head{display:flex;align-items:baseline;justify-content:space-between;gap:16px;flex-wrap:wrap;margin:30px 0 14px}
.section-head h2{margin:0}
/* Название раздела ВНУТРИ панели (карточка объекта: фото, файлы, контакты и прочие):
   без пустого места сверху — над названием раньше оставался отступ .section-head (30 px),
   из-за него в панелях над каждым заголовком висел «воздух». И само название крупнее. */
.panel > .section-head{margin:0 0 10px;align-items:center}
.panel > .section-head h2{font-size:20px;font-weight:700;line-height:1.25}
.head-side{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
/* Скрытое поле выбора файлов: кнопка «добавить» в строке названия — это label для него */
.file-hidden{position:absolute;width:1px;height:1px;opacity:0;overflow:hidden;pointer-events:none}
main > .container > h1 + .lead, main > .container > p.muted{margin-bottom:18px}

/* --- верхняя навигация --- */
.navbar-realty{
  position:sticky; top:0; z-index:1030;
  /* мягкий вертикальный градиент: тёмный верх, чуть светлее к низу; поверх — точки */
  background-image:var(--pat-dots),
    radial-gradient(680px 200px at 78% -40%, rgba(14,165,233,.22), transparent 70%),
    linear-gradient(180deg,#0c1b3d 0%,#152c60 58%,#1d3c81 100%);
  backdrop-filter:saturate(140%) blur(10px);
  border-bottom:1px solid rgba(255,255,255,.08);
  transition:background .28s ease, box-shadow .28s ease, border-color .28s ease;
}
/* после прокрутки шапка становится немного полупрозрачной — контент читается под ней */
.navbar-realty.is-scrolled{
  background-image:var(--pat-dots),
    linear-gradient(180deg,rgba(12,27,61,.74),rgba(29,60,129,.68));
  backdrop-filter:saturate(150%) blur(14px);
  border-bottom-color:rgba(255,255,255,.12);
  box-shadow:0 12px 30px -22px rgba(6,15,36,.95);
}
.navbar-realty .navbar-brand{display:flex;align-items:center;gap:11px;color:#fff}
.brand-mark{
  width:40px;height:40px;border-radius:12px;background:var(--grad);
  display:grid;place-items:center;box-shadow:inset 0 1px 0 rgba(255,255,255,.35),0 6px 16px -8px rgba(14,165,233,.9);
  flex:0 0 auto;
}
.brand-mark svg{width:24px;height:24px;display:block}
/* Логотип компании (его ставит глобальный администратор): крупно и без подложки — на
   прозрачном фоне шапки (16.10.2026: «логотип больше в два раза и без плашки на прозрачном
   фоне»). Прежние 42 px умножены на два, белая плашка снята: она была нужна тёмным
   логотипам, но закрывала половину картинки. Вместо неё мягкая тень — иначе край светлого
   логотипа теряется на тёмном фоне. */
.brand-logo{max-height:84px;max-width:430px;background:none;border-radius:0;padding:0;
  box-shadow:none;object-fit:contain;filter:drop-shadow(0 3px 12px rgba(4,12,32,.55))}
.brand-logo-footer{max-height:56px;max-width:300px}
.brand-text{display:flex;flex-direction:column;line-height:1.05}
.brand-name{font-family:var(--font-head);font-weight:800;font-size:17px;letter-spacing:.10em;text-transform:uppercase}
.brand-sub{font-size:9.5px;letter-spacing:.20em;text-transform:uppercase;color:#9db4dd}
.navbar-realty .nav-link{color:#dbe6f7;font-weight:600;font-size:14.5px;padding:.55rem .85rem;border-radius:9px}
.navbar-realty .nav-link:hover{color:#fff;background:rgba(255,255,255,.08)}
.navbar-realty .nav-link.active{color:#fff;background:rgba(255,255,255,.13)}
.navbar-realty .navbar-toggler{border-color:rgba(255,255,255,.25)}
.navbar-realty .navbar-toggler-icon{filter:invert(1) grayscale(1) brightness(1.7)}
/* Вставить код объекта из буфера обмена — кнопка вместо поля ввода кода.
   Поле убрано 15.10.2026: код в шапке не набирают руками, его копируют из карточки. */
.btn-code-paste{
  display:inline-flex;align-items:center;gap:7px;
  background:rgba(255,255,255,.10); border:1px solid rgba(255,255,255,.16); color:#fff;
  border-radius:10px; padding:.42rem .68rem; font-size:14px; font-weight:600; line-height:1.35;
  transition:background .18s ease,border-color .18s ease
}
.btn-code-paste:hover{background:rgba(255,255,255,.18); border-color:rgba(125,211,252,.6); color:#fff}
.btn-code-paste:focus-visible{outline:0; box-shadow:0 0 0 .22rem rgba(14,165,233,.25)}
.btn-code-paste .em{font-size:.95em; margin-right:0}
.btn-code-paste.is-busy{opacity:.55; pointer-events:none}
.btn-code-paste.is-empty{border-color:rgba(245,158,11,.8)}
.user-chip{display:flex;align-items:center;gap:9px;color:#dbe6f7;font-size:14px}
/* Кружок пользователя: логина в шапке нет — только он. Внутри буква имени, а если человек
   поставил фото, то фото (16.10.2026: «логин пользователя не выводи, добавь пользователям
   возможность указания фото, если оно есть выводи его в кружочке»). Снимок обрезаем в круг,
   по краю — тонкое кольцо: иначе светлое фото сливается с тёмной шапкой. */
.user-chip .avatar{
  width:36px;height:36px;border-radius:50%;background:var(--grad);display:grid;place-items:center;
  color:#fff;font-weight:700;font-size:14px;text-transform:uppercase;overflow:hidden;
  box-shadow:0 0 0 2px rgba(255,255,255,.22)
}
.user-chip .avatar img{width:100%;height:100%;object-fit:cover;display:block}
/* Тот же кружок крупно — на странице профиля: фото рассматривают перед загрузкой. */
.avatar-lg{width:96px;height:96px;border-radius:50%;background:var(--grad);display:grid;place-items:center;
  color:#fff;font-weight:700;font-size:34px;text-transform:uppercase;overflow:hidden;flex:0 0 auto;
  box-shadow:0 0 0 3px rgba(47,111,237,.14)}
.avatar-lg img{width:100%;height:100%;object-fit:cover;display:block}
.navbar-realty .dropdown-menu{border:1px solid var(--line);border-radius:12px;box-shadow:var(--sh-2);font-size:14px}
.navbar-realty .dropdown-item.active{background:var(--brand);color:#fff}
/* Шапка крупнее (16.10.2026: «сам хидер надо переделать, сделать его побольше») */
.navbar-realty{padding:11px 0}
.navbar-realty .navbar-brand{padding:.15rem 0}
.brand-mark{width:47px;height:47px;border-radius:13px}
.brand-mark svg{width:28px;height:28px}
.brand-name{font-size:19px}
.brand-sub{font-size:10px;letter-spacing:.22em}
.navbar-realty .nav-link{font-size:15.5px;padding:.6rem .9rem}
.btn-code-paste{padding:.5rem .8rem;font-size:14.5px}
/* Пока шапка липкая и человек в выдаче, направление видно всегда — и на телефоне тоже. */
@media (max-width:991.98px){
  .what-btn.is-set .wb-tx b{font-size:18px}
}
/* На телефоне логотип вдвое меньшего роста: шапка там липкая, и 84 px съедали бы пол-экрана. */
@media (max-width:767.98px){
  .brand-logo{max-height:52px;max-width:200px}
}
/* ------------------------------------------------------------------ направление в шапке
   Выбор человека (тип недвижимости + сделка) здесь главный ответ на вопрос «где я»: он крупнее
   пунктов меню, со значком раздела и словом сделки в её тоне (16.10.2026: «тип недвижимости
   и аренда-продажа нужно написать там как-то красиво и мощно»). Остаётся кнопкой-меню. */
/* Кнопка-меню растёт одинаково в обоих состояниях: иначе шапка «прыгает» между главной и
   выдачей, и переход читается как подмена страницы. Высоту держим min-height, а не padding:
   у выбранного направления внутри три строки разного роста (значок, название, сделка). */
.navbar-realty .nav-what .what-btn{
  display:inline-flex; align-items:center; gap:.5rem; min-height:58px; border-radius:15px;
  border:1px solid rgba(255,255,255,.18); background:rgba(255,255,255,.07); font-size:15.5px;
  font-weight:600; color:#fff
}
.navbar-realty .nav-what .what-btn:hover,
.navbar-realty .nav-what .what-btn:focus-visible{
  border-color:rgba(255,255,255,.42); background:rgba(255,255,255,.12); color:#fff
}
.what-btn.is-set{
  display:flex; align-items:center; gap:12px; padding:.3rem .85rem .3rem .5rem;
  text-decoration:none; transition:border-color .18s ease, background .18s ease
}
.what-btn.is-set::after{margin-left:2px; vertical-align:middle}
.what-btn.is-set .wb-em{
  width:46px;height:46px;border-radius:13px;display:grid;place-items:center;flex:0 0 auto;
  font-family:var(--font-emoji);font-size:27px;line-height:1;
  background:rgba(255,255,255,.14); box-shadow:inset 0 1px 0 rgba(255,255,255,.28)
}
.what-btn.is-set .wb-tx{display:flex;flex-direction:column;line-height:1.1;min-width:0}
.what-btn.is-set .wb-tx b{font-family:var(--font-head);font-size:20px;font-weight:800;color:#fff;
  letter-spacing:-.01em;white-space:nowrap}
.what-btn.is-set .wb-tx span{font-size:11.5px;font-weight:700;letter-spacing:.18em;
  text-transform:uppercase;margin-top:4px;white-space:nowrap}
.what-btn.is-set .wb-arrow{font-size:13px;opacity:.75}
/* тон сделки тот же, что у клеток меню: аренда голубая, продажа зелёная */
.what-btn.is-set.what-rent{border-color:rgba(96,165,250,.5);
  background:linear-gradient(135deg,rgba(59,130,246,.34),rgba(37,99,235,.14))}
.what-btn.is-set.what-rent .wb-tx span{color:#a8ccff}
.what-btn.is-set.what-sale{border-color:rgba(74,222,128,.45);
  background:linear-gradient(135deg,rgba(34,197,94,.34),rgba(21,128,61,.14))}
.what-btn.is-set.what-sale .wb-tx span{color:#a9efc4}
.what-btn.is-set:hover{border-color:rgba(255,255,255,.42); color:#fff}
@media (max-width:575.98px){
  .what-btn.is-set{gap:9px}
  .what-btn.is-set .wb-em{width:40px;height:40px;font-size:23px}
  .what-btn.is-set .wb-tx b{font-size:17px}
}

/* --- кнопки --- */
.btn{border-radius:10px;font-weight:600;padding:.55rem 1.05rem;font-size:14.5px}
.btn-brand{background:var(--grad);border:none;color:#fff;box-shadow:0 10px 22px -12px rgba(30,64,175,.85)}
.btn-brand:hover{color:#fff;filter:brightness(1.07);box-shadow:0 14px 28px -14px rgba(30,64,175,.95)}
.btn-outline-brand{border:1px solid rgba(30,64,175,.35);color:var(--brand);background:#fff}
.btn-outline-brand:hover{background:var(--brand);border-color:var(--brand);color:#fff}
.btn-ghost-light{border:1px solid rgba(255,255,255,.35);color:#fff;background:transparent}
.btn-ghost-light:hover{background:rgba(255,255,255,.14);color:#fff}
.btn-sm{padding:.35rem .7rem;font-size:13.5px;border-radius:9px}

/* --- шапка страницы (вместо верхней плашки) --- */
.page-head{
  display:flex;align-items:flex-end;justify-content:space-between;gap:22px;flex-wrap:wrap;
  padding:2px 0 18px;border-bottom:1px solid var(--line);margin-bottom:22px
}
.page-head h1{margin:0 0 6px;font-size:clamp(25px,2.9vw,36px);line-height:1.1}
.page-sub{margin:0;color:var(--muted);font-size:14.5px}

/* --- иконки типов (свои SVG) --- */
.ti{width:24px;height:24px;display:inline-block;vertical-align:-4px;flex:0 0 auto}
.ti-xs{width:14px;height:14px;vertical-align:-2px}
.ti-lg{width:30px;height:30px}
.ti-xl{width:40px;height:40px}
/* Эмодзи раздела — часть самого названия: полоса плиток сверху снята, и значок больше не лежит
   на отдельной градиентной плашке слева от заголовка. Эмодзи, а не линейная иконка (.ti):
   в мелком размере линейные силуэты типов не различались (16.10.2026). */
.h1-em{font-family:var(--font-emoji);font-size:27px;line-height:1;vertical-align:-2px;margin-right:11px}
.di-ic{width:26px;height:26px;border-radius:8px;display:grid;place-items:center;background:#eef4ff;color:var(--brand);flex:0 0 auto}
.di-ic .ti{width:16px;height:16px}
.tag-ic .ti{width:13px;height:13px}
.ph-ic{display:grid;place-items:center;color:#8ea6cf}
.ph-ic .ti{width:46px;height:46px}

/* --- карточка поиска --- */
.search-card{
  position:relative;background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);
  box-shadow:var(--sh-2);padding:22px 20px 18px;overflow:hidden
}
.search-card::before{content:"";position:absolute;left:0;right:0;top:0;height:3px;background:var(--grad)}
.search-card h2{margin:0 0 14px;font-size:18px}
.search-card .form-label{font-size:12px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;margin-bottom:5px}

/* --- статистика: плитки в кабинетах (сотрудник, клиент, администратор, выгрузка) --- */
.stat-grid{display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(170px,1fr))}
.stat-card{
  display:block;background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);
  padding:14px 16px;box-shadow:var(--sh-1);color:inherit
}
a.stat-card{transition:transform .16s ease,box-shadow .16s ease,border-color .16s ease}
a.stat-card:hover{transform:translateY(-2px);box-shadow:var(--sh-2);border-color:#cfdcf3;color:inherit}
.stat-card .n{font-family:var(--font-head);font-weight:800;font-size:26px;line-height:1.1;color:var(--brand-800)}
.stat-card .l{font-size:12.5px;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}
.stat-card .ic{color:var(--sky);font-size:18px;margin-bottom:6px;display:block}

/* --- разделы витрины: плитка «иконка типа + название» в одну строку (без цифр) --- */
.type-grid{display:grid;gap:14px;grid-template-columns:repeat(4,minmax(0,1fr))}
@media (max-width:640px){.type-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
.type-tile{
  position:relative;display:flex;flex-direction:row;align-items:center;justify-content:center;gap:10px;
  padding:17px 18px;background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);
  box-shadow:var(--sh-1);color:var(--ink);overflow:hidden;
  transition:transform .18s ease, box-shadow .18s ease, border-color .18s ease
}
.type-tile::before{
  content:"";position:absolute;inset:0;pointer-events:none;opacity:0;transition:opacity .18s ease;
  background:radial-gradient(130% 95% at 50% -25%,rgba(30,64,175,.16),transparent 70%)
}
.type-tile > *{position:relative;z-index:1}
.type-tile:hover{transform:translateY(-4px);box-shadow:var(--sh-2);border-color:#c9d8f4;color:var(--ink)}
.type-tile:hover::before{opacity:1}
.type-tile .tt-ic{color:var(--brand-400);display:block;transition:color .18s ease}
.type-tile .tt-cap{
  font-family:var(--font-head);font-size:14px;font-weight:700;letter-spacing:-.01em;
  color:var(--ink);white-space:nowrap
}
.type-tile .tt-ic .ti{width:26px;height:26px}
.type-tile.active{background:var(--grad);border-color:transparent;box-shadow:var(--sh-3)}
.type-tile.active .tt-ic{color:#bfe4ff}
.type-tile.active .tt-cap{color:#eaf2ff}
.type-grid-sm .type-tile{padding:14px 14px;gap:8px}
/* плитка выбора типа объекта (шаг «что создаём»): под названием — сколько свойств у типа */
.type-tile .tc-note{display:block;font-size:11.5px;color:var(--muted);font-weight:500}
.type-grid-sm .type-tile{flex-wrap:wrap}
.type-grid-sm .type-tile .tt-cap{font-size:12.5px}
.type-grid-sm .type-tile .tt-ic .ti{width:21px;height:21px}

/* --- карточки объектов --- */
.obj-grid{display:grid;gap:18px;grid-template-columns:repeat(auto-fill,minmax(280px,1fr))}
.obj-card{
  display:flex;flex-direction:column;background:var(--card);border:1px solid var(--line);
  border-radius:10px;overflow:hidden;box-shadow:var(--sh-1);transition:transform .16s ease, box-shadow .16s ease, border-color .16s ease;height:100%
}
.obj-card:hover{transform:translateY(-4px);box-shadow:var(--sh-2);border-color:#cfdcf3}
.obj-photo{
  position:relative;height:186px;display:grid;place-items:center;color:#8ea6cf;overflow:hidden;
  background:
    radial-gradient(120% 85% at 82% -10%,#e9f2ff 0%,rgba(233,242,255,0) 62%),
    linear-gradient(135deg,#eef4fd,#d9e6f8)
}
.obj-photo::after{
  content:"";position:absolute;inset:0;pointer-events:none;opacity:.55;
  background-image:linear-gradient(rgba(30,64,175,.07) 1px,transparent 1px),linear-gradient(90deg,rgba(30,64,175,.07) 1px,transparent 1px);
  background-size:30px 30px;
  mask-image:radial-gradient(115% 90% at 50% 8%,#000 12%,transparent 78%)
}
.obj-photo > *{position:relative;z-index:1}
/* Снимок списка: картинка внутри <picture> лежит «поверх» (position:absolute),
   поэтому без размера у самого <picture> блок схлопывается в ноль и снимка не видно. */
.obj-photo > picture{position:absolute;inset:0;display:block}
.obj-photo.ph-viewable{cursor:zoom-in}
/* Нижняя полоса-затенение снимка: слева тип и комментарий кадра, справа — счётчик.
   Счётчик больше не в своей тёмной плашке: он стоит на том же затенении и того же
   размера, что подпись (просьба владельца 24.10.2026). */
.obj-photo .ph-shade{position:absolute;left:0;right:0;bottom:0;z-index:2;pointer-events:none;
  display:flex;align-items:baseline;justify-content:space-between;gap:.6rem;
  padding:1.2rem .6rem .4rem;color:#fff;font-size:11.5px;line-height:1.25;
  background:linear-gradient(0deg,rgba(9,13,20,.74),rgba(9,13,20,0))}
.obj-photo .ph-cap{display:flex;gap:.4rem;align-items:baseline;min-width:0;font-size:11.5px;color:#fff}
.obj-photo .ph-cap[hidden]{display:none}
.obj-photo .ph-more{display:inline-flex;align-items:center;gap:4px;white-space:nowrap;opacity:.92;
  font-variant-numeric:tabular-nums}
.obj-photo .ph-more i{font-size:.95em;opacity:.85}
.obj-photo .ph-cap b{font-weight:600}
.obj-photo .ph-cap i{font-style:normal;opacity:.9;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* листание снимков прямо в плитке: стрелки по краям */
.obj-photo .ph-nav{position:absolute;top:50%;transform:translateY(-50%);z-index:4;width:28px;height:28px;
  display:flex;align-items:center;justify-content:center;border-radius:50%;cursor:pointer;
  background:rgba(9,13,20,.55);color:#fff;font-size:14px;opacity:.62;transition:opacity .18s ease}
.obj-photo .ph-nav:hover{background:rgba(9,13,20,.8)}
.obj-photo .ph-prev{left:6px}
.obj-photo .ph-next{right:6px}
.obj-card:hover .obj-photo .ph-nav,.obj-photo:hover .ph-nav,.obj-photo:focus-within .ph-nav{opacity:1}
@media (hover:none){.obj-photo .ph-nav{opacity:.86}}   /* на телефоне наведения нет — стрелки видны всегда */
.obj-photo.no-photo{background:var(--grad-soft)}
.obj-photo .corner-tags{position:absolute;top:10px;left:10px;display:flex;gap:6px;flex-wrap:wrap}
/* Звёздочка «в избранное» — левый верхний угол снимка (просьба владельца 24.10.2026).
   Плашка «выгодное предложение» в том же углу, поэтому у промо-карточек она уезжает ниже. */
.obj-photo .fav-corner{position:absolute;top:10px;left:10px;z-index:3}
.obj-photo:has(.fav-corner) .corner-tags{top:52px}
.obj-body{padding:13px 15px 15px;display:flex;flex-direction:column;gap:7px;flex:1}
.obj-price{font-family:var(--font-head);font-weight:800;font-size:21px;color:var(--ink)}
.obj-price small{font-family:var(--font-text);font-weight:500;font-size:12.5px;color:var(--muted)}
/* Площадь — второе ключевое свойство: тем же шрифтом, что цена, но на светло-серой
   плашке и прижата вправо (24.10.2026: «площадь давай на плашку светло-серую и вправо») */
.obj-area{font-family:var(--font-head);font-weight:800;font-size:18px;color:var(--ink);
  white-space:nowrap;flex:0 0 auto;margin-left:auto;
  background:#f1f5f9;border:1px solid var(--line);border-radius:8px;padding:2px 10px;
  transition:color .18s ease,background .18s ease}
.obj-card:hover .obj-area{color:var(--brand-800)}
@media (max-width:400px){.obj-price{font-size:18px}.obj-area{font-size:16px}}
.obj-addr{font-size:13.5px;color:var(--ink-2);display:flex;gap:7px;align-items:flex-start}
.obj-addr i{color:var(--sky);margin-top:2px}
.obj-meta{display:flex;gap:12px;flex-wrap:wrap;font-size:13px;color:var(--muted)}
.obj-meta span{display:flex;align-items:center;gap:5px}
.obj-card .btn{margin-top:auto}
.tag{display:inline-flex;align-items:center;gap:5px;background:#eef4ff;color:#1e3a8a;border-radius:999px;padding:3px 10px;font-size:12px;font-weight:600}
.tag.sky{background:#e6f6fe;color:#075985}
.tag.teal{background:#e6faf5;color:#0f766e}
.tag.gray{background:#f1f5f9;color:#475569}
.tag.gold{background:#fef6e7;color:#92400e}

/* --- панели, таблицы, формы --- */
.panel{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);padding:18px;box-shadow:var(--sh-1)}
.panel + .panel{margin-top:16px}
.panel-tight{padding:14px}
.table-realty{background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;margin:0}
.table-realty > :not(caption) > * > *{padding:.62rem .8rem;font-size:14px;vertical-align:top;border-color:var(--line)}
.table-realty thead th{background:#f7f9fd;font-size:11.5px;letter-spacing:.06em;text-transform:uppercase;color:#64748b;font-weight:700;white-space:nowrap}
.table-realty tbody tr:hover{background:#fafcff}
.table-wrap{overflow-x:auto;border-radius:var(--r-md)}
.kv-grid{display:grid;grid-template-columns:minmax(160px,230px) 1fr;gap:3px 16px;font-size:14.5px;align-items:baseline}
.kv-grid .k{color:var(--muted);display:flex;align-items:center;gap:8px}
.kv-grid .v{color:var(--ink);font-weight:500}
.kv-grid .v b{font-family:inherit;font-weight:inherit}
@media (max-width:576px){.kv-grid{grid-template-columns:1fr;gap:2px 0}.kv-grid .v{margin-bottom:10px}}

.form-control,.form-select{border-color:#dbe3ef;border-radius:10px;font-size:14.5px;padding:.5rem .75rem}
/* Окно формы. Рамка занимает почти весь экран, содержимое — на всю её высоту (за вычетом
   заголовка окна): иначе форма выше рамки и кнопки «Сохранить»/«Отмена» уезжают за край,
   а поля выглядят огромными в низком окне. Кнопки формы приклеены к низу окна
   (.form-actions) — длинная форма их не прячет. */
#formModal .modal-dialog{max-height:94vh;margin:3vh auto}
#formModal .modal-content{max-height:94vh}
#formModal .modal-body{padding:0;overflow:hidden}
.form-actions{position:sticky;bottom:0;z-index:2;background:#fff;
              padding:.65rem 0 .25rem;border-top:1px solid #eef2f8}

.form-control:focus,.form-select:focus{border-color:var(--sky);box-shadow:0 0 0 .2rem rgba(14,165,233,.18)}
.form-label{font-size:12.5px;font-weight:600;color:var(--ink-2);margin-bottom:5px}
.badge-soft{border-radius:999px;padding:.32em .7em;font-size:12px;font-weight:600;background:#f1f5f9;color:#475569}
.badge-soft.ok{background:#dcfce7;color:#166534}
.badge-soft.warn{background:#fef3c7;color:#92400e}
.badge-soft.err{background:#fee2e2;color:#991b1b}
.badge-soft.info{background:#e0f2fe;color:#075985}
.badge-soft.brand{background:#e7edff;color:#1e3a8a}
.alert{border-radius:var(--r-md);border:1px solid transparent;font-size:14.5px}
.alert-ok{background:#e8f9ee;border-color:#c4ecd2;color:#166534}
.alert-err{background:#fdecec;border-color:#f6cfcf;color:#991b1b}
.empty-state{background:var(--card);border:1px dashed #cfdaeb;border-radius:var(--r-lg);padding:34px 22px;text-align:center;color:var(--muted)}
.empty-state i{font-size:34px;color:#9db4dd;display:block;margin-bottom:10px}
.pager{display:flex;align-items:center;gap:12px;margin-top:18px;flex-wrap:wrap}

/* --- прочее --- */
.photo-placeholder{
  position:relative;border-radius:var(--r-md);height:clamp(220px,34vw,380px);background:var(--grad-soft);
  display:grid;place-items:center;color:#7c8ba6;text-align:center;border:1px solid var(--line)
}
.photo-placeholder i{font-size:40px;color:#9db4dd;display:block;margin-bottom:8px}
.price-xl{font-family:var(--font-head);font-weight:800;font-size:clamp(24px,2.6vw,32px);color:var(--ink)}
.chip-row{display:flex;gap:8px;flex-wrap:wrap}
.breadcrumb{font-size:13px;--bs-breadcrumb-divider-color:#a9b7cc}
.breadcrumb a{color:var(--muted)}
.link-arrow{font-weight:600;font-size:14px;display:inline-flex;align-items:center;gap:6px}
.mono-code{font-family:var(--font-mono);font-size:12.5px;background:#f1f5f9;border:1px solid var(--line);border-radius:8px;padding:1px 7px;color:#334155}
.login-wrap{max-width:430px;margin:6vh auto 0}
.login-card{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);padding:28px;box-shadow:var(--sh-2)}
.login-brand{display:flex;align-items:center;gap:12px;margin-bottom:20px}

/* --- подвал --- */
.site-footer{
  flex-shrink:0;margin-top:auto;
  /* тот же градиент, что в шапке, но узор другого шага и свечение снизу слева:
     подвал не выглядит копией шапки, хотя заливка родственная */
  background-image:var(--pat-dots-lg),
    radial-gradient(760px 340px at 14% 0%, rgba(14,165,233,.16), transparent 64%),
    radial-gradient(620px 300px at 92% 100%, rgba(20,184,166,.12), transparent 66%),
    linear-gradient(180deg,#152c60 0%,#0f2249 45%,#0a1730 100%);
  color:#c2d2ea;border-top:1px solid rgba(255,255,255,.07);font-size:14px
}
.site-footer a{color:#c2d2ea}
.site-footer a:hover{color:#fff}
.site-footer .footer-top{padding:38px 0 26px}
.site-footer h6{
  font-family:var(--font-head);color:#fff;font-size:12.5px;letter-spacing:.14em;text-transform:uppercase;margin-bottom:14px
}
.site-footer ul{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:9px}
.site-footer .footer-brand .brand-mark{width:44px;height:44px}
.site-footer .footer-about{color:#9db4dd;font-size:13.5px;max-width:34ch}
.site-footer .contact-line{display:flex;gap:10px;align-items:flex-start;margin-bottom:10px}
.site-footer .contact-line i{color:#7dd3fc;font-size:16px;margin-top:2px}
.site-footer .footer-bottom{
  border-top:1px solid rgba(255,255,255,.09);padding:16px 0;font-size:12.5px;color:#8ea6c9;
  display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap
}
.footer-note{background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.09);border-radius:12px;padding:12px 14px;font-size:12.5px;color:#a9bede}
.up-link{position:fixed;right:20px;bottom:20px;z-index:1040;width:44px;height:44px;border-radius:50%;
  border:0;cursor:pointer;
  display:grid;place-items:center;background:var(--grad);color:#fff;box-shadow:var(--sh-2);opacity:0;visibility:hidden;transition:.2s}
.up-link.show{opacity:1;visibility:visible}

/* --- печать объявления (кнопка «Печать» на странице лота) ---------------------------
   На бумаге нужен сам объект: фото, цена, адрес, характеристики, описание и связь.
   Меню, кнопки, формы, карта (она интерактивная — на бумаге пустой прямоугольник),
   лента миниатюр и подвал не печатаются. Сетку разворачиваем в одну колонку: на A4
   правый столбец иначе уезжает в узкую полосу. */
@media print{
  .navbar-realty,.lotbar-act,.site-footer,.up-link,.btn,.gal-strip,.gal-zoom,.gal-cap,
  .share-modal,.map-block,.vid-grid,.doc-list,.toast,.up-btn,form,.alert,
  nav[aria-label="breadcrumb"],.tabbar,.no-print,#mortPanel{display:none!important}
  /* вместо кнопок и формы — то, что можно набрать: телефон, ссылка, номер объявления */
  .print-only{display:block!important;margin-top:8px;padding-top:6px;border-top:1px solid #cbd5e1;
    font-size:10.5pt}
  .print-line{display:flex;gap:16px;flex-wrap:wrap}
  .pl-phone{font-weight:700}
  .print-hours{color:#475569;font-size:9.5pt;margin-top:2px}
  body{background:#fff}
  main{padding-top:0!important}
  .panel{box-shadow:none!important;border:0!important;padding:0!important;margin:0 0 10px!important}
  .row{display:block!important}
  .col-lg-8,.col-lg-4,.col-md-6,.col-lg-6{width:100%!important;max-width:100%!important;flex:0 0 100%!important}
  .lotbar{background:#fff!important;border-bottom:1px solid #cbd5e1;color:#0f172a;
    position:static!important;padding:0 0 6px}
  .lotbar-in{padding:0!important;gap:10px}
  .lotbar-kind,.lotbar-deal,.lotbar-code,.lotbar-brand{color:#0f172a!important}
  .lotbar-deal{background:#e5eaf2!important;border:1px solid #cbd5e1!important}
  .lotbar-deal::before{background:#475569!important;box-shadow:none!important}
  .lotbar-code{border:1px solid #94a3b8!important;background:none!important}
  .lotbar-brand .brand-name,.lotbar-brand .brand-sub{color:#0f172a!important}
  .lotbar-facts,.lotbar-facts .lf-addr,.lotbar-facts .lf-metro,.lp-sum,.lp-note{color:#0f172a!important}
  .lotbar-facts > span + span::before{background:#94a3b8!important}
  .lotbar-head{border-left-color:#cbd5e1!important}
  .lotbar-price{align-items:flex-start}
  .gal-main img{max-height:78mm;width:auto;object-fit:contain}
  .price-xl{font-size:22pt}
  .desc,.kv-grid,.addr-levels{font-size:10.5pt}
  .kv-grid{break-inside:avoid}
  a{color:#0f172a;text-decoration:none}
  a[href^="http"]::after{content:" (" attr(href) ")";font-size:8.5pt;color:#475569}
  .similar-item::after,.doc-item::after{content:""!important}
}

/* --- адреса, не подтверждённые выгрузкой ГАР --- */
.addr-stale{color:#b91c1c !important;text-decoration:line-through;text-decoration-thickness:1px}
.addr-stale{text-decoration:none}
.text-warn{color:#92400e}
.hint-box{display:flex;flex-direction:column;gap:6px;max-height:320px;overflow:auto}
.hint{text-align:left;background:#fff;border:1px solid var(--line);border-radius:10px;padding:9px 12px;
  font-size:14px;color:var(--ink);transition:.15s}
.hint:hover{border-color:#c7d7f5;background:#f6f9ff}
.chosen{background:#eff6ff;border:1px solid #c7d7f5;border-radius:10px;padding:10px 12px;font-size:14px}
.list-clean{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px}
.list-clean li{display:flex;gap:8px;align-items:baseline;font-size:14px}
.alert-warn{background:#fff8e6;border-color:#f7e2b0;color:#92400e}


/* ==========================================================================
   Витрина: разделы жилое/нежилое, фильтры из реестра, карта, группы карточки.
   ========================================================================== */

/* --- разделы витрины переключаются плитками .type-tile (см. выше) --- */

/* --- карточка в списке: дополнения --- */
.obj-sub{font-size:13px;color:var(--ink-2);font-weight:600}
.obj-sub .year{color:var(--muted);font-weight:500}
.obj-meta .m{background:#f6f8fc;border:1px solid var(--line);border-radius:999px;padding:2px 9px}
.obj-tags{display:flex;gap:6px;flex-wrap:wrap}
.obj-grid-list{grid-template-columns:repeat(auto-fill,minmax(320px,1fr))}
.tag.ok{background:#e7f7ee;color:#166534}
.tag.warn{background:#fef6e7;color:#92400e}

/* --- строка фильтров в начале выдачи --------------------------------------------
   Базовые фильтры (цена, площадь, район) стоят горизонтально в начале страницы, полный
   набор (сотни фильтров, от лифта до ГПЗУ) прячется за кнопкой «Доп. фильтры». Панель
   слева снята: выдача занимает всю ширину (16.10.2026: «фильтры разместить стильно в начале
   страницы горизонтально; первая строка — базовые: площадь, цена, район, и кнопка доп.
   фильтров»). */
.filters-bar{padding:14px 18px;margin:16px 0 18px}
.fb-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:14px 18px}
.fb-field{display:flex;flex-direction:column;gap:5px;min-width:0;position:relative}
.fb-field > .filter-row{margin-bottom:0}
.fb-field .hint{display:none}
.fb-lb{font-size:11.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
.fb-range{display:flex;align-items:center;gap:7px}
.fb-range .form-control{width:96px}
/* дата в строке фильтров: у поля type=date своя ширина под «дд.мм.гггг» и календарь —
   96 px от числового поля её обрезают (Focal 1006) */
.fb-range input[type=date]{width:138px}
.fb-range .dash{color:var(--muted)}
.fb-district .form-select{min-width:230px;max-width:320px}
.fb-actions{margin-left:auto;display:flex;gap:10px;align-items:center}
.fb-full{margin-top:16px;padding-top:16px;border-top:1px solid var(--line)}
.fb-full[hidden]{display:none}
/* Полный набор — сотни фильтров: держим его в окне прокрутки, чтобы «Доп. фильтры» не
   растягивали страницу на три экрана вниз, а кнопки оставались рядом. */
.fb-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:6px 26px;
  max-height:min(58vh,620px);overflow-y:auto;overscroll-behavior:contain;padding:2px 10px 2px 2px}
.fb-col{min-width:0}
.fb-col > .filter-group-title{margin-bottom:10px}
@media (max-width:767.98px){
  .fb-row{gap:12px}
  .fb-range .form-control{width:80px}
  .fb-actions{margin-left:0;width:100%}
  .fb-actions .btn{flex:1 1 auto}
  .fb-district .form-select{min-width:0;width:100%}
}

/* --- строка выдачи: сделка словом, число найденного, вид и сброс ----------------
   Названия типа здесь нет — оно в шапке крупно (16.10.2026). */
.search-head{display:flex;align-items:center;justify-content:space-between;gap:14px;
  flex-wrap:wrap;margin:0 0 14px}
.sh-line{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.sh-deal{font-family:var(--font-head);font-weight:800;font-size:20px;letter-spacing:-.01em}
.sh-deal.is-rent{color:#1d4ed8}
.sh-deal.is-sale{color:#15803d}
.sh-count{font-size:14.5px;color:var(--muted)}
.sh-count b{color:var(--ink);font-family:var(--font-head)}
.sh-note{font-size:13px;color:var(--muted);background:#f1f5fb;border:1px solid var(--line);
  border-radius:999px;padding:3px 10px}

/* --- расширенный поиск: фильтры --- */
.filters-panel{position:sticky;top:82px;max-height:calc(100dvh - 100px);overflow-y:auto;padding:0}
.filters-head{
  display:flex;align-items:center;justify-content:space-between;gap:10px;padding:14px 18px;
  border-bottom:1px solid var(--line);background:#f8fafd;border-radius:var(--r-lg) var(--r-lg) 0 0;
  font-family:var(--font-head);font-weight:800;position:sticky;top:0;z-index:2
}
.filters-body{padding:16px 18px 18px}
.filter-row{margin-bottom:14px}
.filter-row:last-child{margin-bottom:0}
.filter-group{border-top:1px solid var(--line);padding:12px 0;margin-top:4px}
.filter-group-title{
  font-family:var(--font-head);font-weight:800;font-size:13.5px;color:var(--brand-800);
  letter-spacing:.01em;display:flex;align-items:center;justify-content:space-between;
  cursor:pointer;margin-bottom:12px
}
details.filter-group[open] .filter-group-title i{transform:rotate(180deg)}
.filter-group-title i{transition:transform .16s ease;color:var(--muted)}
.filter-group .filter-row:last-child{margin-bottom:4px}
.range-pair,.num-pair{display:flex;align-items:center;gap:8px}
.range-pair .dash{color:var(--muted)}
.num-pair select{flex:0 0 44%;}
.unit{color:var(--muted);font-weight:500}
.multi-box{
  max-height:210px;overflow-y:auto;border:1px solid var(--line);border-radius:var(--r-sm);
  padding:8px 10px;background:#fcfdff;display:flex;flex-direction:column;gap:2px
}
.multi-item{display:flex;align-items:center;gap:8px;font-size:13.5px;padding:2px 0;cursor:pointer}
.multi-item .n{margin-left:auto;color:var(--muted);font-size:12px}
.seg{display:inline-flex;border:1px solid #dbe3ef;border-radius:10px;overflow:hidden}
.seg .seg-item{
  padding:.36rem .7rem;font-size:13.5px;cursor:pointer;background:#fff;color:var(--ink-2);
  border-right:1px solid #dbe3ef
}
.seg .seg-item:last-child{border-right:0}
.seg .btn-check:checked + .seg-item{background:var(--grad);color:#fff}
.seg .btn-check:focus-visible + .seg-item{outline:2px solid var(--sky);outline-offset:-2px}
.chips{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.chip{
  border:1px solid var(--line);background:#f8fafd;border-radius:999px;padding:3px 10px;
  font-size:12.5px;color:var(--ink-2);cursor:pointer
}
.chip:hover{border-color:#cfdcf3;background:#eef4ff}
.chip .n{color:var(--muted);font-size:11.5px}
.addr-row{position:relative}
.suggest-box{
  position:absolute;z-index:6;left:0;right:0;top:100%;background:#fff;border:1px solid var(--line);
  border-radius:var(--r-md);box-shadow:var(--sh-2);max-height:260px;overflow-y:auto
}
.suggest-item{
  display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:none;border:0;
  padding:9px 12px;font-size:13.5px;color:var(--ink);cursor:pointer;border-bottom:1px solid #f1f5f9
}
.suggest-item:last-child{border-bottom:0}
.suggest-item:hover,.suggest-item.active{background:#eff6ff}
.suggest-item .lv{font-size:11px;color:var(--muted);background:#f1f5f9;border-radius:6px;padding:1px 6px}
.suggest-item .nm{font-weight:600}
.suggest-item .ct{margin-left:auto;color:var(--muted);font-size:12px}
.filters-toggle{display:none}

/* --- карточка объекта: уровни адреса, группы, карта --- */
.addr-levels{display:flex;flex-direction:column;gap:8px;font-size:14px}
.addr-levels .lvl{
  display:inline-block;min-width:118px;font-size:12px;color:var(--muted);
  text-transform:none;letter-spacing:.01em
}
.desc{font-size:15px;line-height:1.6;color:var(--ink-2);white-space:pre-line;max-width:72ch}
.price-sub{display:flex;flex-direction:column;gap:2px;font-size:14px;color:var(--ink-2);font-weight:600}
.price-sub .year{color:var(--muted);font-weight:500;font-size:13px}
.map-block{border-top:1px solid var(--line);padding-top:14px}
.map-switch{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px}
.map-tab{
  border:1px solid var(--line);background:#f8fafd;border-radius:999px;padding:4px 12px;
  font-size:13px;font-weight:600;color:var(--ink-2);cursor:pointer
}
.map-tab.active{background:var(--grad);color:#fff;border-color:transparent}
.map-holder{position:relative;border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;min-height:230px;background:var(--grad-soft)}
.map-stub{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:28px 16px;text-align:center;color:#7c8ba6}
.map-stub i{font-size:32px;color:#9db4dd}
.map-frame{width:100%;height:260px;border:0;display:block}
/* --- формы сотрудника: объекты и клиенты --- */
.panel-h{font-size:15px;font-weight:600;color:#12305f;margin:0 0 12px;display:flex;align-items:center;gap:8px}
.panel-h .em{font-size:.85em}
.grp-h3{font-size:13px;font-weight:600;color:#2f6fed;margin:16px 0 8px;display:flex;gap:6px;align-items:center}
.grp-h3 .em{font-size:.85em}
.req{color:#c0392b}
.sticky-side{position:sticky;top:84px}
.form-text{font-size:12px;color:var(--muted)}
.obj-form .form-control,.obj-form .form-select{font-size:14px}
@media (max-width:991px){.sticky-side{position:static}}
.map-links{display:flex;flex-direction:column;gap:6px;margin-top:10px}
.map-links .link-arrow[hidden]{display:none}

/* --- карта выдачи: все типы карт, точки объявлений, фильтр по области --- */
.view-switch{display:inline-flex;border:1px solid var(--line);border-radius:10px;overflow:hidden;background:#fff}
.view-tab{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;font-size:13px;color:#4a5a75;text-decoration:none;border-right:1px solid var(--line)}
.view-tab:last-child{border-right:0}
.view-tab:hover{background:var(--grad-soft);color:#12305f}
.view-tab.active{background:var(--grad);color:#fff}
.map-view{margin-bottom:18px}
/* Шапка карты: слева группа «чья карта», справа группа «что показывать», затем кнопки.
   Это два разных выбора, поэтому и две группы, а не один ряд кнопок. */
.map-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.map-types{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.map-group{display:inline-flex;border:1px solid var(--line);border-radius:10px;overflow:hidden;background:#fff}
.map-group[aria-label="Слой карты"]{margin-left:auto}
.map-type{border:0;background:transparent;padding:6px 13px;font-size:13px;color:#4a5a75;border-right:1px solid var(--line);cursor:pointer}
.map-type:last-child{border-right:0}
.map-type:hover{background:var(--grad-soft);color:#12305f}
.map-type.active{background:var(--grad);color:#fff}
/* Слоя, которого у карты нет (у 2ГИС и OSM — снимков, у Яндекса и 2ГИС — топоосновы),
   кнопка гаснет и не нажимается: пустая карта хуже понятной подсказки. */
.map-type:disabled{opacity:.4;cursor:default;background:#f6f8fc;color:#8a97ad}
.map-type:disabled:hover{background:#f6f8fc;color:#8a97ad}
/* Знак карты (Яндекс, 2ГИС, Google, OSM) и значок слоя (🗺 Схема, 🛰 Гибрид, ⛰ Топографическая)
   в кнопках шапки карты: что человек выбирает, видно до нажатия, а не только по подписи.
   Знаки нарисованы с разным полем внутри рамки: у Google буква занимает её целиком, у Яндекса
   и 2ГИС рисунок был 20 из 24 — потому при одном размере они выглядели мельче. Пустое поле
   у этих двух срезано в самих файлах (viewBox 2 2 20 20), поэтому размер в разметке почти
   одинаковый; Google на 2 px меньше (сплошная широкая буква читается крупнее), OSM на 1 px
   больше (тонкие штрихи без заливки). По вертикали знак опущен на пиксель: при выравнивании
   по базовой линии он садился выше строки текста на 0,5–1 px, что видно глазом. */
.map-type .mb{width:18px;height:18px;margin-right:6px;vertical-align:-4.5px}
.map-type .mb-google{width:16px;height:16px;vertical-align:-3.5px}
.map-type .mb-osm{width:19px;height:19px;vertical-align:-5px}
.map-type .me{font-family:var(--font-emoji);font-size:17px;margin-right:5px;line-height:1;vertical-align:-1px}
.map-type:disabled .mb,.map-type:disabled .me{filter:grayscale(1)}
/* Метка скопления: сколько объектов сошлось в одной точке. Прямоугольник со скруглёнными
   углами, вытягивается под число и остаётся центром на самой точке (translate от нулевого
   якоря — иначе при растяжении цифра уезжала бы вбок). Одиночная точка — обычная булавка. */
.map-badge-wrap{background:none;border:0}
.map-badge{position:absolute;left:0;top:0;transform:translate(-50%,-50%);
  display:inline-flex;align-items:center;justify-content:center;
  min-width:32px;height:24px;padding:0 8px;border-radius:7px;
  background:var(--grad);color:#fff;font-weight:600;font-size:13px;line-height:1;
  border:1px solid #fff;box-shadow:0 2px 6px rgba(18,48,95,.35);
  white-space:nowrap;cursor:pointer}
/* Список объектов, собравшихся в одной точке: панель поверх карты справа. */
.map-side{position:absolute;top:0;right:0;bottom:0;width:340px;max-width:88%;
  display:flex;flex-direction:column;background:#fff;border-left:1px solid var(--line);
  box-shadow:-6px 0 20px rgba(18,48,95,.12);z-index:800}
.map-side[hidden]{display:none}
.map-side-head{display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:9px 12px;border-bottom:1px solid var(--line);font-weight:600;font-size:13.5px;color:var(--ink)}
.map-side-btns{display:inline-flex;gap:6px}
.map-side-btn{border:1px solid #d3d9e2;background:#fff;border-radius:8px;width:28px;height:28px;
  display:inline-flex;align-items:center;justify-content:center;color:#4a5a75;cursor:pointer}
.map-side-btn:hover{background:var(--grad-soft);color:#12305f}
.map-side-list{overflow:auto;padding:6px}
.map-side-row{display:block;padding:8px 10px;border-radius:10px;text-decoration:none;color:inherit}
.map-side-row + .map-side-row{border-top:1px solid #eef1f6}
.map-side-row:hover{background:var(--grad-soft)}
.msr-title{display:block;font-weight:600;font-size:13.5px;color:#12305f}
.msr-price{display:block;font-family:var(--font-mono);font-size:13.5px;color:#12305f}
.msr-sub{display:block;font-size:12px;color:var(--muted)}
.map-side-more{padding:9px 10px 4px;font-size:12px;color:var(--muted)}
.map-tools{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.map-canvas{height:min(72vh,620px);min-height:340px;border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;background:var(--grad-soft);z-index:1}
.map-note{margin-top:8px}
.map-note:empty{display:none}
.map-legend{display:flex;gap:16px;flex-wrap:wrap;margin-top:8px}
.map-legend .lg{display:inline-flex;align-items:center;gap:6px}
.lg-dot{width:11px;height:11px;border-radius:50%;display:inline-block}
.lg-dot.exact{background:#2f6fed}
.lg-dot.approx{background:#ffd166;border:2px solid #b8860b}
/* Карточка объекта: свой дом и похожие рядом. Метка самого объекта — кольцо с заливкой,
   поверх скоплений; соседи — обычные точки и счётчики карты. */
.lg-dot.me{background:#e0384f;border:2px solid #fff;box-shadow:0 0 0 2px #e0384f}
.lg-dot.near{background:#2f6fed}
.map-me-wrap{background:none;border:0}
.map-me{position:absolute;left:0;top:0;width:24px;height:24px;transform:translate(-50%,-50%);
        border-radius:50%;background:rgba(224,56,79,.28);
        box-shadow:inset 0 0 0 3px #e0384f,0 0 0 2px #fff;
        animation:map-me-pulse 2.4s ease-out infinite}
@keyframes map-me-pulse{0%{box-shadow:inset 0 0 0 3px #e0384f,0 0 0 2px #fff,0 0 0 0 rgba(224,56,79,.5)}
                       70%{box-shadow:inset 0 0 0 3px #e0384f,0 0 0 2px #fff,0 0 0 18px rgba(224,56,79,0)}
                       100%{box-shadow:inset 0 0 0 3px #e0384f,0 0 0 2px #fff,0 0 0 0 rgba(224,56,79,0)}}
.map-pop-me .mp-note{color:#e0384f;font-weight:600}
.map-pop{min-width:190px;font-size:13px;line-height:1.35}
.map-pop .mp-title{font-weight:600;color:#12305f;margin-bottom:2px}
.map-pop .mp-price{font-family:var(--font-mono);font-size:15px;color:#12305f}
.map-pop .mp-area,.map-pop .mp-addr,.map-pop .mp-metro{color:#5a6b86}
.map-pop .mp-note{color:#9a6a00;font-size:12px;margin-top:4px}
.map-pop .mp-link{display:inline-block;margin-top:8px;font-weight:600;color:#2f6fed;text-decoration:none}
.map-pop .mp-link:hover{text-decoration:underline}
.leaflet-container{font-family:var(--font-sans);background:#e9eef5}
.marker-cluster-small,.marker-cluster-medium,.marker-cluster-large{background:rgba(47,111,237,.28)}
.marker-cluster-small div,.marker-cluster-medium div,.marker-cluster-large div{background:var(--grad);color:#fff;font-weight:600}
@media (max-width:640px){
  .map-canvas{height:60vh}
  /* на телефоне список объектов занимает низ карты: боковая панель 340px тут не влезает */
  .map-side{width:100%;max-width:none;top:auto;height:58%;border-left:0;
    border-top:1px solid var(--line)}
  .view-tab,.map-type{padding:6px 9px;font-size:12px}
}

/* --- похожие объекты --- */
.similar-list{display:flex;flex-direction:column;gap:10px}
.similar-item{
  display:flex;flex-direction:column;gap:2px;padding:10px 12px;border:1px solid var(--line);
  border-radius:var(--r-sm);background:#fcfdff;color:var(--ink)
}
.similar-item:hover{border-color:#cfdcf3;background:#f7faff;color:var(--ink)}
.similar-item .p{font-family:var(--font-head);font-weight:800;font-size:15px}
.similar-item .a{font-size:13px;color:var(--ink-2)}
.similar-item .m{font-size:12.5px;color:var(--muted)}

@media (max-width:991px){
  .filters-panel{position:static;max-height:none;overflow:visible;padding:0}
  .filters-body{display:none}
  .filters-panel.open .filters-body{display:block}
  .filters-toggle{display:inline-flex}
  .filters-head{position:static;border-radius:var(--r-lg)}
}

/* --- код объекта: короткий код для диктовки по телефону --- */
/* код объекта — плашка в правом верхнем углу фотографии; клик копирует код */
.feed-box {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  background: var(--surface-2, #f6f7f9); border: 1px solid var(--line, #e3e6ea);
  border-radius: 12px; padding: 14px 16px;
}
.feed-box .code-plate { font-size: 13px; letter-spacing: 0; }

.code-plate {
  position:absolute;top:8px;right:8px;z-index:2;
  display:inline-flex;align-items:center;padding:4px 12px;border-radius:5px;
  font-family:var(--font-mono);font-weight:400;font-size:11px;letter-spacing:.06em;color:#12305f;
  background:rgba(255,255,255,.55);
  border:1px solid rgba(30,64,175,.30);
  backdrop-filter:blur(8px) saturate(150%);
  box-shadow:0 10px 22px -16px rgba(11,26,58,.8);
  cursor:pointer;user-select:none;-webkit-tap-highlight-color:transparent;
  transition:background .2s ease, border-color .2s ease, transform .12s ease
}
.code-plate:hover{background:rgba(255,255,255,.78);border-color:rgba(30,64,175,.5)}
/* На снимке карточки плашка кода стоит в углу кадра: backdrop-filter размывал и
   пересыщал кусок фото под ней — «уголок искажается». Размытия нет, а подложка
   полупрозрачная, чтобы кадр сквозь неё читался (просьба владельца 24.10.2026). */
.obj-photo .code-plate{background:rgba(255,255,255,.55);backdrop-filter:none}
.obj-card:hover .obj-photo .code-plate{background:rgba(255,255,255,.68)}
.code-plate:active{transform:scale(.97)}
.code-plate:focus-visible{outline:2px solid var(--brand-800);outline-offset:2px}
.obj-card:hover .code-plate{background:rgba(255,255,255,.74);border-color:rgba(30,64,175,.42)}
.code-plate-lg{top:12px;right:12px;padding:6px 14px;border-radius:6px;font-size:13px}
/* подтверждение копирования */
.code-plate.copied::after,
.code-plate.copy-fail::after{
  position:absolute;inset:0;display:grid;place-items:center;border-radius:inherit;
  color:#fff;font-family:var(--font-text);font-weight:600;font-size:9.5px;letter-spacing:.02em;
  white-space:nowrap;overflow:hidden
}
.code-plate-lg.copied::after,.code-plate-lg.copy-fail::after{font-size:11.5px}
.code-plate.copied{border-color:rgba(22,163,74,.85)}
.code-plate.copied::after{content:"скопировано";background:rgba(22,163,74,.94)}
/* буфер недоступен — код выделен, копируем вручную */
.code-plate.copy-fail{border-color:rgba(217,119,6,.85)}
.code-plate.copy-fail::after{content:"Ctrl+C";background:rgba(217,119,6,.94);font-size:10px}
/* окно ручной вставки кода: буфер недоступен (страница по http или браузер не дал доступ) */
.paste-window{position:fixed;inset:0;z-index:1080;display:none;align-items:flex-start;
  justify-content:center;background:rgba(8,17,38,.5)}
.paste-window.open{display:flex}
.paste-card{
  margin:11vh 14px 0;width:min(430px,100%);background:#fff;border-radius:var(--r-md);
  box-shadow:var(--sh-3);padding:18px 18px 16px
}
.paste-card h6{font-family:var(--font-head);font-weight:800;margin:0 0 6px;font-size:17px}
.paste-card p{margin:0 0 12px;color:var(--muted);font-size:13.5px}
.paste-card .form-control{font-family:var(--font-head);font-weight:800;letter-spacing:.1em;
  text-transform:uppercase}
.paste-card .row-actions{display:flex;gap:8px;margin-top:12px}
.paste-card .err{color:var(--danger);font-size:13px;margin-top:8px}

.code-input{font-family:var(--font-head);font-weight:800;letter-spacing:.1em;text-transform:uppercase;font-size:18px;max-width:240px}
.near-list{display:flex;flex-direction:column;gap:8px}
.near-item{
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:10px 14px;border:1px solid var(--line);
  border-radius:var(--r-sm);background:#fcfdff
}
.near-item:hover{border-color:#cfdcf3;background:#f7faff}
.near-item .val{font-family:var(--font-head);font-weight:800;letter-spacing:.08em;color:#12305f;font-size:17px}
.near-item .d{font-size:13px;color:var(--ink-2)}
.near-item .diff{margin-left:auto;font-size:12px;color:var(--muted)}
.code-help{border-top:1px dashed var(--line);padding-top:14px}
.code-help .h{font-weight:700;margin-bottom:8px}
.code-help .tag{margin-right:4px;font-weight:800;letter-spacing:.08em}


/* ==========================================================================
   Полировка витрины: анимации появления, живые карточки, акценты.
   ========================================================================== */
@keyframes rise{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}

.type-grid .type-tile{animation:rise .34s cubic-bezier(.22,.7,.3,1) backwards}
.type-grid .type-tile:nth-child(2){animation-delay:.05s}
.type-grid .type-tile:nth-child(3){animation-delay:.10s}
.type-grid .type-tile:nth-child(4){animation-delay:.15s}

.obj-grid .obj-card{animation:rise .40s cubic-bezier(.22,.7,.3,1) backwards}
.obj-grid .obj-card:nth-child(2){animation-delay:.05s}
.obj-grid .obj-card:nth-child(3){animation-delay:.10s}
.obj-grid .obj-card:nth-child(4){animation-delay:.15s}
.obj-grid .obj-card:nth-child(5){animation-delay:.20s}
.obj-grid .obj-card:nth-child(6){animation-delay:.25s}
.obj-grid .obj-card:nth-child(n+7){animation-delay:.30s}

/* карточка объекта: чуть живее */
.obj-card{border-color:#e3e9f4}
.obj-card:hover .obj-photo .ph-ic{transform:scale(1.06) translateY(-2px)}
.ph-ic{transition:transform .28s cubic-bezier(.22,.7,.3,1)}
.obj-card:hover .obj-price{color:var(--brand-800)}
.obj-price{transition:color .18s ease}
.obj-addr{line-height:1.45}

/* шапка: тонкий акцент под навбаром */
.navbar-realty{box-shadow:0 10px 30px -22px rgba(11,26,58,.9)}
.navbar-realty .btn-code-paste{white-space:nowrap}

/* теги и кнопки */
.tag{transition:background .15s ease,color .15s ease}
.tag:hover{background:#e3edff}
.tag.gray:hover{background:#e8eef6}
.tag.sky:hover{background:#d9f1fe}
.pager a.btn{margin-left:auto}
.section-head .tag{white-space:nowrap}

/* «Что есть в разделе» */
.chip-row .tag{padding:5px 12px;font-size:12.5px}

/* подвал: акцентная линия */
.site-footer{position:relative}
.site-footer::before{content:"";position:absolute;left:0;right:0;top:0;height:2px;background:var(--grad);opacity:.85}

/* планшет/мобильный */
@media (max-width:768px){
  .page-head{align-items:flex-start}
  .type-tile{padding:13px 12px;gap:8px}
  .type-tile .tt-cap{font-size:12.5px}
  .type-tile .tt-ic .ti{width:21px;height:21px}
  .section-head{margin-top:22px}
  .search-card{padding:18px 16px 16px}
}
@media (prefers-reduced-motion:reduce){
  *{animation:none!important;transition:none!important}
}

/* эмодзи раздела перед названием (карточки объектов, тег на карточке объекта) */
.em{font-family:var(--font-emoji);
    font-size:1em;line-height:1;margin-right:5px;vertical-align:-1px}
.tag .em{font-size:.85em;margin-right:4px}

/* заголовки групп в карточке объекта: эмодзи + линия-разделитель — текст читается легче */
.grp-h{
  display:flex;align-items:center;gap:9px;font-size:18.5px;line-height:1.25;
  margin:18px 0 8px
}
.grp-h .em{font-size:.85em;margin-right:0}
.grp-h2{display:flex;align-items:center;gap:9px}
.grp-h2 .em{font-size:.85em;margin-right:0}

/* таблица параметров: компактные строки, без разделительных линий */
.kv-grid .k{color:var(--muted)}
.kv-grid .v{font-weight:400}
@media (max-width:576px){ .grp-h{font-size:17.5px;margin-top:14px} }

/* длинный текст описания: ограничиваем строку и разносим абзацы */
.desc{max-width:72ch}
.desc + .desc{margin-top:10px}

/* ======================================================== CRM: задачи, воронка
   Рабочее место агента: строки задач с просрочкой, канбан сделок, история. */

.badge-soft.danger{background:#fee2e2;color:#991b1b}

/* строка задачи: главное слева, кнопки справа; просрочка подсвечена полосой */
.task-row{display:flex;gap:12px;align-items:flex-start;justify-content:space-between;
  background:var(--card);border:1px solid var(--line);border-left:3px solid transparent;
  border-radius:var(--r-md);padding:11px 13px;margin-bottom:8px;box-shadow:var(--sh-1)}
.task-row.is-overdue{border-left-color:#dc2626;background:#fff7f7}
.task-row:last-child{margin-bottom:0}
.task-main{min-width:0;flex:1}
.task-title{font-weight:600;color:var(--ink);display:flex;flex-wrap:wrap;gap:7px;align-items:center;line-height:1.35}
.task-actions{display:flex;gap:6px;align-items:center;flex-wrap:wrap;flex-shrink:0}
@media (max-width:768px){ .task-row{flex-direction:column} .task-actions{width:100%} }

/* канбан воронки: горизонтальная прокрутка колонок-этапов */
.kanban{display:flex;gap:14px;overflow-x:auto;padding-bottom:8px;align-items:flex-start}
.kcol{min-width:262px;width:262px;background:#f7f9fd;border:1px solid var(--line);
  border-radius:var(--r-lg);padding:12px;flex-shrink:0}
.kcol.is-won{background:#f2fbf5;border-color:#c9ecd6}
.kcol.is-lost{background:#fafafa;opacity:.92}
.kcol-head{display:flex;align-items:center;justify-content:space-between;gap:8px;
  font-size:14.5px;color:#12305f;margin-bottom:2px}
.kcard{display:block;background:#fff;border:1px solid var(--line);border-radius:var(--r-md);
  padding:10px 11px;margin-bottom:8px;color:inherit;text-decoration:none;transition:.15s}
.kcard:hover{border-color:#cfdcf3;box-shadow:var(--sh-2);transform:translateY(-2px)}
.kcard-title{font-weight:650;color:var(--ink);margin-bottom:4px;line-height:1.3}
.kcard-sum{font-family:var(--font-head);font-weight:800;font-size:16px;color:var(--ink);margin-top:6px}

/* история взаимодействий: вертикальная лента с отметкой времени */
.tl{position:relative;padding-left:16px}
.tl::before{content:"";position:absolute;left:4px;top:4px;bottom:4px;width:2px;background:var(--line)}
.tl-item{position:relative;padding:0 0 14px 8px}
.tl-item::before{content:"";position:absolute;left:-16px;top:5px;width:9px;height:9px;border-radius:50%;
  background:#fff;border:2px solid var(--brand)}
.tl-when{font-size:12px;color:var(--muted);margin-bottom:2px}
.tl-body{font-size:13.5px;color:var(--ink-2);line-height:1.4}

/* блок ответа клиента в публичной подборке */
.sel-answer{margin-top:auto;padding-top:9px;border-top:1px dashed var(--line)}
.sel-answer .btn{font-size:12.5px;padding:.32rem .4rem}


/* ---------------------------------------------------- фотографии объектов
   Галерея на витрине: главный кадр + полоса миниатюр. Сетка в кабинете:
   карточки с подписью и кнопками (главная, показ, порядок, удаление). */
.ph-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:0}
.gal{position:relative}
/* «В избранное» — звёздочка в левом верхнем углу снимка (просьба владельца 24.10.2026);
   у объекта без снимков она стоит там же — на заглушке «фотографии появятся» */
.gal .fav-star,.photo-placeholder .fav-star{position:absolute;left:12px;top:12px;z-index:3}
/* Рамка галереи фиксированная: пропорции берём у главного снимка (--gal-ratio),
   иначе кадры разного размера меняли высоту блока — он «прыгал» при листании. */
/* Кадр — не кнопка (25.10.2026): курсор обычный, крупный просмотр — кнопкой «развернуть»
   в правом нижнем углу кадра. Кнопка на всю площадь снимка убрана. */
.gal .gal-main{position:relative;display:block;padding:0;border:1px solid var(--line,#e5eaf2);width:100%;text-align:left;cursor:default;
  border-radius:8px;overflow:hidden;background:#eef2f8;
  aspect-ratio:var(--gal-ratio, 4 / 3);max-height:560px}
.gal .gal-main picture{display:block;height:100%}
.gal .gal-main img{display:block;width:100%;height:100%;object-fit:contain}
.gal .gal-cap{position:absolute;left:0;right:0;bottom:0;display:flex;flex-wrap:wrap;gap:.45rem;align-items:baseline;padding:1.6rem 8.5rem .5rem .85rem;color:#fff;font-size:.9rem;line-height:1.35;background:linear-gradient(0deg,rgba(9,13,20,.74),rgba(9,13,20,0))}
.gal .gal-cap b{font-weight:600;letter-spacing:.01em}
.gal .gal-cap span{opacity:.92}
.gal .gal-open{position:absolute;right:.6rem;bottom:.6rem;display:inline-flex;align-items:center;gap:.35rem;
  padding:.3rem .6rem;border:0;border-radius:8px;background:rgba(12,16,24,.62);color:#fff;
  font-family:var(--font-text);font-size:.8rem;line-height:1;cursor:pointer;backdrop-filter:blur(2px)}
.gal .gal-open:hover{background:rgba(12,16,24,.82)}
.gal .gal-open:focus-visible{outline:2px solid #fff;outline-offset:2px}
.gal .gal-zoom{position:absolute;right:.6rem;top:.6rem;padding:.18rem .45rem;border-radius:8px;background:rgba(12,16,24,.55);color:#fff;font-size:.8rem}
.gal .gal-strip{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px;padding-bottom:2px}
.gal .gal-thumb{position:relative;padding:0;border:2px solid var(--line,#e5eaf2);border-radius:6px;background:none;cursor:pointer;flex:0 0 auto}
.gal .gal-thumb img{display:block;width:96px;height:72px;object-fit:cover;border-radius:4px}
.gal .gal-thumb.is-cur{border-color:var(--brand,#2f6fed)}
.gal .gal-thumb-t{position:absolute;left:4px;bottom:4px;max-width:84px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 5px;border-radius:6px;background:rgba(12,16,24,.62);color:#fff;font-size:.66rem}
/* окно просмотра снимков: открывается поверх страницы, листается */
body.gal-lock{overflow:hidden}
.gal-box{position:fixed;inset:0;z-index:1090;display:flex;align-items:center;justify-content:center}
.gal-box[hidden]{display:none}
.gal-box-bg{position:absolute;inset:0;background:rgba(8,11,17,.93)}
.gal-box-win{position:relative;display:flex;align-items:center;justify-content:center}
.gal-box-fig{margin:0;display:flex;flex-direction:column;align-items:center;gap:.55rem}
/* Рамка окна просмотра тоже постоянная: иначе окно, стрелки и подпись двигались
   вслед за размерами кадра при каждом листании. */
.gal-box-img{width:min(96vw,1180px);height:min(78vh,760px);object-fit:contain;
  border-radius:10px;background:#10141c;box-shadow:0 18px 48px rgba(0,0,0,.55)}
.gal-box-cap{display:flex;flex-wrap:wrap;gap:.7rem;align-items:baseline;justify-content:center;max-width:96vw;padding:0 .5rem;color:#e8ecf4;font-size:.95rem;text-align:center}
.gal-box-n{opacity:.7;font-variant-numeric:tabular-nums}
.gal-box-t{font-weight:600;color:#fff;border:1px solid rgba(255,255,255,.28);border-radius:8px;padding:.02rem .45rem}
.gal-box-t[hidden],.gal-box-m[hidden],.gal-box-n[hidden]{display:none}
.gal-box-m{opacity:.9}
.gal-box-link{display:inline-flex;align-items:center;margin-top:.15rem;padding:.3rem .85rem;border-radius:9px;
  background:rgba(255,255,255,.14);color:#fff;font-size:.9rem;text-decoration:none}
.gal-box-link:hover{background:rgba(255,255,255,.26);color:#fff}
.gal-box-btn{position:absolute;z-index:2;border:0;border-radius:50%;width:44px;height:44px;display:flex;align-items:center;justify-content:center;background:rgba(22,29,40,.78);color:#fff;font-size:1.1rem;cursor:pointer}
.gal-box-btn:hover{background:rgba(44,58,78,.92)}
.gal-box-x{top:.9rem;right:.9rem}
.gal-box-prev{left:.9rem;top:50%;transform:translateY(-50%)}
.gal-box-next{right:.9rem;top:50%;transform:translateY(-50%)}
@media (max-width:576px){
  .gal-box-btn{width:38px;height:38px}
  .gal-box-x{top:.5rem;right:.5rem}
  .gal-box-prev{left:.35rem}
  .gal-box-next{right:.35rem}
  /* на телефоне рамка ниже: широкий кадр занимает почти весь экран по ширине */
  .gal-box-img{height:min(58vh,420px)}
}
.ph-drop{border:1px dashed #cdd8ea;border-radius:var(--r-md);background:#f8fafd;padding:12px 14px}
.ph-drop-note{color:var(--muted);font-size:12.5px;margin-top:6px}
.ph-up{color:var(--brand);font-size:13px}
.ph-up:not(:empty){margin-top:6px}
/* Ход передачи файлов: слова и полоса. Ролик на сотни мегабайт без этого выглядит как «зависло». */
.up-bar{display:block;height:6px;border-radius:3px;background:#e6eaf0;margin:6px 0 2px;
  max-width:520px;overflow:hidden}
.up-bar-in{display:block;height:100%;width:0;border-radius:3px;
  background:linear-gradient(90deg,#7ba0dd,#3b6ec9);transition:width .15s linear}
.up-bar.is-unknown .up-bar-in{width:35%;animation:up-run 1.1s ease-in-out infinite}
@keyframes up-run{0%{margin-left:-35%}100%{margin-left:100%}}
.ph-group{margin-top:18px}
/* Линии между группами нет — заказчик попросил убрать (13.10.2026): группы разделяет отступ. */
.ph-group + .ph-group{padding-top:14px}
.ph-group-h{font-family:var(--font-head);font-size:15px;font-weight:700;margin:0 0 10px}
.ph-hint{font-family:var(--font-text);font-weight:400;color:var(--muted);font-size:12.5px;margin-left:8px}
.ph-empty{color:var(--muted);font-size:13px}
/* Снимок и его правка — одна строка списка: кадр слева, подписи и кнопки справа.
   Не активный снимок затеняем: он остаётся в карточке, но на витрину не идёт. */
/* Строки раздела идут по две в ряд: в каждой строке — переключатели, под ними раздел,
   под ним комментарий одной строкой, под ним описание (правило интерфейса 12).
   Одна строка на все разделы: фотографии, видео и файлы выглядят одинаково, отличается
   только содержимое миниатюры (кадр снимка, первый кадр ролика, значок типа файла). */
.ph-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.ph-row{display:flex;gap:12px;align-items:flex-start;padding:10px;border:1px solid #e6ecf5;
        border-radius:var(--r-md);background:#fff;min-width:0}
@media (max-width:1199.98px){.ph-grid{grid-template-columns:1fr}}
.ph-row.is-off{opacity:.55;background:#f7f9fc}
/* Миниатюра и подпись под ней — одним столбиком: размер кадра и вес стоят ровно под
   снимком по центру, а сам снимок мельче, чем был (заказчик, 13.10.2026). */
.ph-left{flex:0 0 auto;display:flex;flex-direction:column;align-items:center;gap:6px}
.ph-left .ph-thumb,.ph-left .ph-thumb-doc{flex:0 0 auto}
/* Подпись под кадром мельче подписи строки: размер кадра и вес — справка, а не текст
   (заказчик: «текст размеров сделать ещё мельче», 13.10.2026). */
.ph-cap{font-size:10.5px;color:#8b95a5;text-align:center;line-height:1.25;
        padding:0 2px;word-break:break-word}
.ph-row.is-off .ph-thumb img{filter:grayscale(.55)}
.ph-thumb{flex:0 0 160px;display:block;background:#eef2f8;border-radius:var(--r-sm);overflow:hidden;
          border:1px solid #d3d9e2}
.ph-thumb img{display:block;width:160px;height:auto}
.ph-body{flex:1 1 auto;min-width:0}
.ph-switch{display:flex;align-items:center;gap:6px;margin:0;padding-left:0;min-height:0}
/* Переключатель и его подпись — одной строкой по центру: у Bootstrap подпись плывёт
   относительно тумблера, а тут важно, чтобы «Активное» стояло ровно по его центру. */
.ph-switch .form-check-input{float:none;margin:0;position:static;flex:0 0 auto}
.ph-switch .form-check-label{margin:0;line-height:1}
@media (max-width:640px){
  .ph-row{flex-direction:column}
  .ph-left{width:100%}
  .ph-thumb,.ph-thumb img{width:100%;flex-basis:auto}
}
.ph-top{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:8px}
.ph-top .badge-soft{font-size:11.5px}
.ph-sw-lb{font-size:12.5px;color:#4a5a74;line-height:1.15}
.ph-top .btn{font-size:14px;padding:.3rem .55rem;line-height:1.2}
.ph-flex{flex:1 1 auto}
.ph-form{display:flex;flex-direction:column;gap:7px}
.ph-form .form-select-sm,.ph-form .form-control-sm{font-size:12.5px;padding:.25rem .5rem;height:auto}
.ph-form textarea.form-control-sm{min-height:46px;line-height:1.35;resize:vertical}
.ph-note-row{display:flex;gap:6px;align-items:center}
.ph-note-row .form-control{flex:1 1 auto;min-width:0}
.ph-save{flex:0 0 auto;padding:.3rem .55rem;font-size:14px;line-height:1.2}
.ph-bottom{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.ph-desc{color:var(--muted);font-size:12.5px;display:flex;gap:6px;align-items:center;flex-wrap:wrap;
         min-width:0;word-break:break-word}
.ph-desc a{color:#2b3a55;font-weight:600;text-decoration:none}
.ph-desc a:hover{text-decoration:underline}
.ph-poster{position:relative;display:block}
.ph-play{position:absolute;inset:0;display:grid;place-items:center;font-size:20px;color:#fff;
         text-shadow:0 2px 10px rgba(0,0,0,.55);
         background:linear-gradient(180deg,rgba(9,16,32,.04),rgba(9,16,32,.34))}
.ph-meta{display:flex;gap:6px;align-items:center;flex-wrap:wrap;margin-bottom:6px}
.ph-note{margin-bottom:4px;word-break:break-word}
.ph-meta-form .form-select-sm,.ph-meta-form .form-control-sm{font-size:12.5px;padding:.2rem .45rem;height:auto}
.ph-meta-form .btn{font-size:12.5px}
.ph-actions{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.ph-thumb-doc{display:grid;place-items:center;flex:0 0 160px;width:160px;min-height:120px;
  background:#eef2f8;border:1px solid #d3d9e2}
.ph-row-doc .ph-thumb-doc{flex-basis:160px}
.ph-doc-ext{font-size:12px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muted);padding:0 6px;text-align:center;word-break:break-all}
.ph-row.is-off .ph-thumb-doc{opacity:.7}
@media (max-width:575.98px){
  .ph-thumb-doc{flex-basis:auto;width:100%;min-height:56px}
}
/* Обводка служебных кнопок раздела — светло-серая (13.10.2026): чёрная и красная рамка на белом
   фоне бьёт по глазам. Тёмные остаются только значки ▲▼, иначе их не видно на светлом фоне.
   Красный возвращается на наведении у корзины — как подсказка, что кнопка убирает файл. */
.ph-top .btn,.ph-save,.ph-note-row .btn,#photos .head-side .btn,#videos .head-side .btn,
#files .head-side .btn{
  --bs-btn-border-color:#d3d9e2;--bs-btn-color:#4b5563;--bs-btn-hover-color:#39404c;
  --bs-btn-hover-border-color:#9aa4b2;--bs-btn-active-border-color:#9aa4b2;
  --bs-btn-active-color:#39404c;--bs-btn-disabled-border-color:#e8ecf2;
  --bs-btn-disabled-color:#b4bcc8;
}
.ph-top .btn-outline-danger,#files .ph-top .btn-outline-danger{
  --bs-btn-hover-bg:#fdf1f2;--bs-btn-hover-border-color:#b32b36;--bs-btn-hover-color:#b32b36;
  --bs-btn-active-bg:#fdf1f2;--bs-btn-active-border-color:#b32b36;--bs-btn-active-color:#b32b36;
}
/* Ролик в окне просмотра: своя рамка и чёрное поле, чтобы кадр не прыгал. */
.gal-box-vid{width:min(96vw,1180px);height:min(78vh,760px);background:#000;border-radius:10px;
  display:block}
.gal-box-vid[hidden]{display:none}
@media (max-width:640px){.gal-box-vid{height:min(58vh,420px)}}
/* Документы в карточке объекта на витрине: активные и публичные файлы (app/propfile.py). */
/* Видео объекта в карточке на витрине: превью первого кадра, нажатие открывает ролик. */
.vid-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.vid-item{display:block;text-decoration:none;color:inherit}
.vid-shot{position:relative;display:block;border-radius:var(--r-sm);overflow:hidden;background:#0e1526;
          aspect-ratio:16 / 9}
.vid-shot img{display:block;width:100%;height:100%;object-fit:cover}
.vid-play{position:absolute;inset:0;display:grid;place-items:center;font-size:26px;color:#fff;
          text-shadow:0 2px 12px rgba(0,0,0,.6);
          background:linear-gradient(180deg,rgba(9,16,32,.04),rgba(9,16,32,.38))}
.vid-t{display:block;margin-top:6px;font-size:13px;font-weight:600}
@media (max-width:640px){.vid-grid{grid-template-columns:1fr}}
.doc-list{display:flex;flex-direction:column;gap:8px}
.doc-item{display:flex;align-items:center;gap:10px;padding:9px 12px;border:1px solid #e6ecf5;
  border-radius:var(--r-sm);background:#fbfcfe;text-decoration:none;color:inherit}
.doc-item:hover{border-color:var(--brand);background:#f4f8ff}
.doc-item .bi{font-size:18px;color:var(--brand)}
.doc-t{font-weight:600}
.doc-m{color:var(--muted);font-size:12.5px;margin-left:auto;text-align:right}

/* Крупная карта: тот же холст разворачивается в модальном окне на весь экран.
   Сам слой Bootstrap выше панелей Leaflet, поэтому карта в нём остаётся рабочей. */
[data-map-modal] .modal-content {height: 100vh}
[data-map-modal] .modal-body {flex: 1 1 auto; padding: 0; overflow: hidden}
[data-map-modal] .map-canvas {height: 100%; min-height: 0; border: 0; border-radius: 0}
.map-canvas.map-canvas-big {position: fixed; inset: 0; z-index: 1050; border-radius: 0}
[data-map-modal] .map-types .map-type {font-size: 13px}

/* Подсказка под полем телефона при вводе: что это за номер — городской или сотовый */
.form-text.text-ok {color: var(--ok, #1a7f4b)}
.form-text.text-warn {color: var(--warn, #a15c00)}

/* «＋ добавить поле»: пустые поля в форме не показываем, их достают выбором из списка */
.extra-add{margin-top:14px}
.extra-add select{max-width:340px;border-style:dashed;color:#6b7a90;font-size:13px}

/* Ипотечный калькулятор: строки с числами в правой колонке карточки.
   Крупная цифра — только платёж: остальное читается как справка, поэтому обычным весом. */
.mort-out{border-top:1px solid var(--line, #d3d9e2);padding-top:10px;display:flex;flex-direction:column;gap:6px}
.mort-row{display:flex;align-items:baseline;justify-content:space-between;gap:10px;font-size:13.5px}
.mort-row span{color:var(--muted)}
.mort-row b{font-weight:600;color:var(--ink);white-space:nowrap}
.mort-row:first-child b{font-size:16px}
#mortWarn:not(:empty){color:#b45309}

/* перенос данных файлом: список колонок прокручивается, чтобы окно не разрасталось */
.imp-map{max-height:380px;overflow:auto;border:1px solid #e6eaf1;border-radius:10px;padding:4px 8px}
.imp-map thead th{position:sticky;top:0;background:#fff;z-index:1;font-size:12.5px;color:var(--muted)}
.imp-map select{max-width:100%}

/* неделя задач: полоса по дням — видно, где густо, а где пусто */
.week-strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr));gap:8px}
.week-day{border:1px solid #d3d9e2;border-radius:10px;padding:8px;background:#fff;min-height:78px}
.week-day.is-today{border-color:#c9a227;background:#fffdf4}
.week-day.is-late{border-color:#e3b0b0;background:#fff7f7}
.week-head{display:flex;align-items:center;justify-content:space-between;gap:6px;
  margin-bottom:6px;font-size:12.5px;color:var(--muted)}
.week-task{display:flex;align-items:baseline;gap:6px;font-size:12.5px;line-height:1.35;
  padding:2px 0;border-top:1px dashed #eef1f6}
.week-task:first-of-type{border-top:0}
.week-time{color:var(--muted);flex:0 0 auto}
.week-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
@media (max-width:700px){.week-strip{grid-template-columns:1fr 1fr}}

/* чек-лист этапа воронки: пункт = тумблер + подпись, отметка гасит подпись (не исчезает) */
.chk-row{display:flex;align-items:center;gap:8px;padding:5px 0;border-top:1px dashed #eef1f6}
.chk-row:first-of-type{border-top:0}
.chk-row .btn{padding:1px 6px;line-height:1.2}
.chk-title{font-size:13px;line-height:1.35}
.chk-title.chk-done{color:var(--muted);text-decoration:line-through}
.chk-note{border:1px solid #e6d3a3;background:#fffdf4;border-radius:10px;padding:8px 10px;
  font-size:13px;color:#8a6d1f}
.chk-missing{color:#8a6d1f}
.text-ok-2{color:var(--ok, #1a7f4b)}

/* единое окно переписки: диалоги списком слева, лента справа */
.dlg-row{display:flex;align-items:flex-start;gap:6px;padding:7px 0;border-top:1px dashed #eef1f6}
.dlg-row:first-of-type{border-top:0}
.dlg-row.is-open{background:#f7f9fc;border-radius:10px;padding:7px 8px}
.dlg-main{flex:1 1 auto;min-width:0;color:inherit}
.dlg-top{display:flex;align-items:center;gap:6px;font-size:13.5px}
.dlg-top b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dlg-note{font-size:12.5px;color:var(--ink);opacity:.75;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;margin-top:2px}
.dlg-when{font-size:11.5px;color:var(--muted);margin-top:2px}
.dlg-act{flex:0 0 auto}
.msg-feed{display:flex;flex-direction:column;gap:8px;max-height:520px;overflow:auto;padding:2px}
.msg-row{display:flex}
.msg-row.is-out{justify-content:flex-end}
.msg-bubble{border:1px solid #e6eaf1;background:#fff;border-radius:12px;padding:7px 10px;
  max-width:min(78%,620px)}
.msg-row.is-out .msg-bubble{background:#f2f7ff;border-color:#d7e3f5}
.msg-subj{font-weight:600;font-size:13px;margin-bottom:3px}
.msg-body{font-size:13.5px;line-height:1.42;white-space:pre-wrap;word-break:break-word}
.msg-meta{font-size:11.5px;color:var(--muted);margin-top:4px}

/* ---------- кабинет агента на телефоне: нижнее меню и «нет связи» ---------- */
.tabbar{display:none}
@media (max-width:991.98px){
  /* на телефоне разделы кабинета — внизу: до них дотягивается большой палец */
  .tabbar{position:fixed;left:0;right:0;bottom:0;z-index:1030;display:flex;
    background:#fff;border-top:1px solid #d3d9e2;
    padding-bottom:env(safe-area-inset-bottom,0)}
  .tabbar .tab{flex:1 1 0;display:flex;flex-direction:column;align-items:center;gap:2px;
    padding:7px 2px 6px;font-size:11px;color:var(--muted);text-decoration:none;line-height:1.1}
  .tabbar .tab i{font-size:19px}
  .tabbar .tab.active{color:var(--brand,#1e40af)}
  .tabbar .tab.active i{transform:translateY(-1px)}
  body.has-tabbar{padding-bottom:calc(58px + env(safe-area-inset-bottom,0))}
}
.offline-page{min-height:100vh;display:flex;align-items:center;justify-content:center;
  background:#f5f7fb;padding:24px}
.offline-box{max-width:420px;background:#fff;border:1px solid #d3d9e2;border-radius:16px;
  padding:26px 22px;text-align:center}
.offline-box h1{font-size:20px;margin:6px 0 10px}
.offline-box p{color:var(--ink);font-size:14px;line-height:1.45}
.offline-icon{font-size:34px;line-height:1}

/* подсказка про ярлык на телефоне: на компьютере не нужна */
.pwa-hint{display:none}
@media (max-width:991.98px){
  .pwa-hint{display:flex;gap:10px;align-items:flex-start;background:#eef4ff;border:1px solid #c9d8f6;
    border-radius:12px;padding:10px 12px;margin:10px 0 4px;font-size:13px;color:#1e3a8a;line-height:1.4}
  .pwa-hint i.bi-phone{font-size:20px;line-height:1.1}
  .pwa-hint .btn{flex:0 0 auto}
}

/* Подпись точки на мелком масштабе: ориентир, а не карточка */
.map-pop-short .mp-title { font-weight: 600; }
.map-pop-short { min-width: 0; max-width: 220px; }

/* ============================================================================
   Главная витрины: первый экран с выбором направления, цифры, услуги, блок для
   собственников и форма заявки. Числа на странице — из web.site_counter
   (ночной пересчёт, tools/site_counters.py): живых подсчётов по базе здесь нет.
   Здесь же меню «Что ищете?» в шапке и полоса доверия в подвале.
   ========================================================================= */

/* --- меню «Что ищете?»: матрица «тип × сделка» под кнопкой шапки --- */
.what-btn{ display:inline-flex; align-items:center; background:linear-gradient(135deg,#1e40af 0%,#0ea5e9 100%);
  border-radius:999px; font-weight:700; color:#fff!important; box-shadow:0 10px 22px -14px rgba(14,165,233,.95) }
.what-btn:hover{ background:linear-gradient(135deg,#16337a 0%,#0ea5e9 100%); color:#fff!important }
/* направление уже выбрано: кнопка показывает «Коммерческая: аренда» вместо вопроса,
   но остаётся кнопкой — щелчок снова открывает матрицу */
.what-btn.is-set{ white-space:nowrap; background:linear-gradient(135deg,#0f2c6b 0%,#0284c7 100%);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.35), 0 10px 22px -14px rgba(14,165,233,.95) }
/* Меню «Что ищете?» — тот же набор мер, что у матрицы на главной (правила 26–27):
   слово действия крупно и чёрным, счётчик при нём мелким, клетки узкие.
   16.10.2026: «типы чуть крупнее, снять/купить чёрным а не серым и крупнее, количество мельче,
   ширину столбцов снять и купить уже в 2,5 раза» — было 11 px серым и число 20 px жирным,
   то есть главным в клетке читалось число, а не действие; ширина клетки 300 px → 120 px,
   вместе с ней сузилось и само меню, иначе две узкие клетки висели бы в пустой полосе 980 px.
   Сделка различается не значком, а цветом клетки: аренда голубоватая, продажа зеленоватая
   (16.10.2026: «у аренды-продажи убери эмодзи, сделай аренда голубоватым градиент, а продажа
   зеленоватым»). Цвет — слабая заливка под чёрным текстом, а не насыщенный фон: слово должно
   читаться первым, а тон — подсказывать сделку, не споря со словами. */
.what-menu{ width:min(700px, calc(100vw - 2rem)); margin-top:8px; padding:14px 18px 12px;
  border:0; border-radius:16px; background:#fff; box-shadow:var(--sh-3); color:var(--ink) }
.wm-row{ display:grid; grid-template-columns:1fr 120px 120px; gap:8px; align-items:stretch;
  padding:7px 0; border-bottom:1px dashed var(--line) }
.wm-row:last-of-type{ border-bottom:0 }
.wm-t{ display:flex; align-items:center; gap:12px; padding:.3rem .2rem }
/* значок типа крупнее клеток: он ведёт строку, по нему и находят раздел (16.10.2026: «иконки
   типов крупнее»). 44 px и 25 px — те же меры, что у матрицы на главной */
.wm-ic{ width:44px; height:44px; border-radius:13px; display:grid; place-items:center; flex:0 0 auto;
  background:#eef4ff; color:var(--brand); font-family:var(--font-emoji); font-size:25px; line-height:1 }
/* название типа и число под ним — одной связкой: line-height 1.1 и margin 0 вместо
   унаследованного 1.55, иначе между строкой типа и подписью набегала лишняя пустота
   (16.10.2026: «расстояние между типом и количеством объектов под ним меньше») */
.wm-tx{ display:block; line-height:1.1 }
.wm-tx b{ display:block; margin:0; font-family:var(--font-head); font-size:20px; line-height:1.15;
  letter-spacing:-.01em }
.wm-tx span{ display:block; margin:3px 0 0; font-size:12.5px; line-height:1.15; color:var(--muted) }
.wm-c{ display:flex; flex-direction:column; justify-content:center; gap:2px; padding:8px 10px;
  border:1px solid var(--line); border-radius:12px; background:#fff; color:var(--ink); text-decoration:none;
  transition:border-color .15s ease, background .15s ease }
/* тон сделки: аренда — голубоватый градиент, продажа — зеленоватый */
/* Тон сделки: аренда голубоватая, продажа зеленоватая. Заливка спокойная — слово читается
   первым, тон только подсказывает сделку. Слева цветной полосы нет: она осталась только
   у активной клетки (16.10.2026: «давай левая линия обводки только у активной»), иначе
   восемь цветных корешков спорили с той клеткой, которую надо найти глазами.
   Стрелка «›» у правого края — из варианта 6 эскиза, она говорит, что клетка ведёт дальше. */
.wm-c.wm-rent{ background:linear-gradient(135deg,#f7fbff 0%,#e8f2ff 100%); border-color:#dce8fa }
.wm-c.wm-sale{ background:linear-gradient(135deg,#f7fdfa 0%,#e6f8ee 100%); border-color:#d8eede }
.wm-c.wm-rent:hover{ background:linear-gradient(135deg,#eef6ff 0%,#d9e9ff 100%); border-color:#bdd5f5 }
.wm-c.wm-sale:hover{ background:linear-gradient(135deg,#effaf3 0%,#d5f2e2 100%); border-color:#aee0c4 }
.wm-c:hover{ color:var(--ink) }
.wm-c .k{ display:flex; align-items:center; gap:6px; font-family:var(--font-head); font-weight:700;
  font-size:13px; letter-spacing:.05em; text-transform:uppercase; color:var(--ink) }
/* Стрелка «›» у правого края: клетка ведёт на выдачу (16.10.2026: «стрелка-то не у активных
   куда делась?» — у обычных клеток она нужна). У активной вместо неё точка слева: там стрелка
   значила бы «пойдёшь отсюда», а человек уже здесь. У пустой пары стрелки нет — вести некуда. */
.wm-c .k::after{ content:"›"; margin-left:auto; font-size:16px; line-height:1; color:#94a3b8;
  letter-spacing:0 }
.wm-c.is-empty .k::after, .wm-c.is-cur .k::after{ content:none }
/* Число набрано тем же стилем, что счётчик объектов под названием типа (`.wm-tx span`):
   Inter 400, 12,5 px, приглушённый (16.10.2026: «счётчики в аренде/продаже сделать таким же
   стилем что и у типов»). Мелкий текст на странице один: и подпись у типа, и числа в клетках
   набраны одинаково, поэтому строка меню читается одним набором.
   В матрице на главной у числа не был задан `font-family` — он наследовался от страницы (Inter),
   и цифры стояли другим набором, чем слово; теперь и там `var(--font-head)`.
   Счётчики прижаты к правому краю клетки (16.10.2026: «счётчики выравнивание сделаем вправо»):
   тогда числа в клетках одного ряда стоят по одной вертикали и сравниваются на глаз, а не
   висят под словом со случайным отступом. */
.wm-c .n{ font-weight:400; font-size:12.5px; letter-spacing:normal;
  line-height:1.15; color:var(--muted); text-align:right }
/* мало предложений (например, аренда квартир — 3 объекта): не гасим до нуля, но и не
   выдаём за равный выбор — число меньше, подпись «мало» в подсказке. Тон сделки остаётся:
   цвет клетки рассказывает про сделку, а размер числа — про то, сколько есть */
.wm-c.is-thin .n{ font-size:12.5px }
/* пустой пары в базе нет: клетка на месте, не ссылка, подписана честно */
.wm-c.is-empty{ border-style:dashed; cursor:default }
.wm-c.is-empty .k{ color:#7c8ba3 }
.wm-c.is-empty .n{ font-size:12px; font-weight:600; color:#7c8ba3 }
/* Та клетка, в которой человек уже находится.
   Признак ровно один и он слева: цветная линия по левому краю и точка перед словом
   (16.10.2026: «у активной только слева линия появляется, а не все по периметру» — рамка по
   периметру и внешняя тень сняты; «вместо стрелки справа — точка слева»). Клетка не «выделена
   рамкой», а помечена с той стороны, с которой читается ряд. */
.wm-c.is-cur.wm-rent{ background:linear-gradient(135deg,#e3efff 0%,#c6dcff 100%);
  border-left:5px solid #1d4ed8; color:#1d4ed8 }
.wm-c.is-cur.wm-sale{ background:linear-gradient(135deg,#e3f8ed 0%,#c4efd8 100%);
  border-left:5px solid #15803d; color:#15803d }
.wm-c.is-cur .k{ color:currentColor }
.wm-c.is-cur .k::before{ content:""; width:7px; height:7px; border-radius:50%; flex:0 0 auto;
  margin-right:6px; background:currentColor }
.wm-c.is-cur .n{ color:var(--ink); font-weight:700 }
@media (max-width:991.98px){
  .what-menu{ width:100%; margin-top:4px; box-shadow:none; padding:10px 2px 4px }
  .wm-row{ grid-template-columns:1fr 1fr }
  .wm-t{ grid-column:1 / -1 }
}

/* ---------------------------------------------------------------- главная
   Один ритм на всю страницу: одна мера отступа (.mh-sec), одна карточка (радиус 16,
   одна тень), одна иконка (44 → 13), один заголовок секции (.mh-eyebrow + h2 + .sub).
   Фон чередуется так, что двух одинаковых полос подряд нет:
   тёмный → белый → мягкий → белый → тёмный. Раньше на одной странице было пять
   радиусов, четыре размера иконок и три разных правила на заголовок секции — отсюда
   и «разбитый» вид (пересборка 16.10.2026). */

/* --- первый экран: заголовок, матрица «тип × сделка», полоса обещаний --- */
.mh-hero{ position:relative; overflow:hidden; color:#fff; padding:36px 0 0;
  background-image:var(--pat-dots),
    radial-gradient(1000px 460px at 88% -8%, rgba(20,184,166,.20), transparent 62%),
    linear-gradient(150deg,#0b1a3a 0%,#152c60 52%,#1d3c81 100%) }
.mh-hero::before{ content:""; position:absolute; inset:0;
  background:radial-gradient(900px 420px at 10% -12%, rgba(14,165,233,.30), transparent 62%) }
.mh-hero .mh-grid{ position:absolute; inset:0; pointer-events:none;
  background-image:linear-gradient(rgba(255,255,255,.05) 1px, transparent 1px),
                   linear-gradient(90deg, rgba(255,255,255,.05) 1px, transparent 1px);
  background-size:44px 44px;
  -webkit-mask-image:linear-gradient(180deg, rgba(0,0,0,.75), transparent 80%);
  mask-image:linear-gradient(180deg, rgba(0,0,0,.75), transparent 80%) }
.mh-hero .mh-wrap{ position:relative; z-index:1 }
.mh-hero h1{ font-family:var(--font-head); font-weight:800; font-size:clamp(25px,3vw,40px);
  letter-spacing:-.025em; margin:0 0 20px; color:#fff }
.mh-mx{ display:flex; flex-direction:column }
/* строка матрицы: подпись типа и две клетки-кнопки. Строки разделены пунктиром — как в
   таблице, поэтому видно, что нажимается только клетка, а подпись типа — просто подпись.
   До 16.10.2026 подпись стояла на такой же плашке, что и клетки, и по ней хотелось щёлкнуть. */
.mh-row{ display:grid; grid-template-columns:1.15fr 1fr 1fr; gap:10px; align-items:stretch;
  padding:12px 0 }
.mh-row + .mh-row{ border-top:1px dashed rgba(255,255,255,.13) }
.mh-row:first-child{ padding-top:2px }
.mh-row:last-child{ padding-bottom:2px }
.mh-t{ display:flex; align-items:center; gap:14px; padding:0 .25rem 0 0;
  background:none; border:0 }
/* подложка под иконку типа: сам svg в разметке тоже с классом .ti, поэтому
   коробку зовём иначе, иначе правила коробки попадут на svg */
.mh-t .mh-ic{ width:44px; height:44px; border-radius:13px; display:grid; place-items:center; flex:0 0 auto;
  background:rgba(255,255,255,.10); color:#fff; font-family:var(--font-emoji); font-size:25px; line-height:1 }
.mh-t b{ display:block; font-family:var(--font-head); font-size:18px; color:#fff; letter-spacing:-.01em }
.mh-t span{ font-size:12.5px; color:#a9bede }
/* Счётчик под названием типа чуток отодвинут вниз (16.10.2026: «счётчики объектов у типов
   чуток отодвинуть вниз от самих типов»): вплотную он читался как вторая строка названия,
   а не как подпись к нему. Тот же зазор в меню и в матрице — вход в выбор один и тот же. */
.mh-t b + span{ display:block; margin-top:3px }
/* Клетка — кнопка: слова «Снять» и «Купить» крупно (по ним и щёлкают), счётчик при них
   мелким: цифра отвечает на вопрос «а есть ли вообще», а не кричит первой (16.10.2026). */
.mh-hero a.mh-c{ display:flex; flex-wrap:wrap; align-items:baseline; justify-content:space-between;
  gap:6px 10px; border-radius:16px; padding:14px 16px; min-height:64px;
  text-decoration:none; color:#fff;
  background:rgba(255,255,255,.07); border:1px solid rgba(255,255,255,.13);
  transition:transform .16s ease, background .16s ease, border-color .16s ease }
.mh-hero a.mh-c:hover{ transform:translateY(-2px); background:rgba(255,255,255,.13);
  border-color:rgba(125,211,252,.6); color:#fff }
/* Клетка направления: слово со стрелкой, число — следующей строкой (16.10.2026: «у аренда и
   продажа стрелки добавь, количество на следующую строку»). Манера та же, что в меню
   «Что ищете?»: стрелка справа от слова, откликается на наведение. */
.mh-hero a.mh-c .k{ flex-basis:100%; display:flex; gap:9px; align-items:center;
  font-family:var(--font-head); font-weight:800; font-size:16px; letter-spacing:.01em;
  text-transform:uppercase; color:#fff }
.mh-hero a.mh-c .k::after{ content:"›"; margin-left:auto; font-size:17px; line-height:1;
  color:rgba(255,255,255,.5); transition:transform .16s ease, color .16s ease }
.mh-hero a.mh-c:hover .k::after{ transform:translateX(3px); color:#fff }
.mh-hero a.mh-c .n{ flex-basis:100%; margin-top:3px; font-family:var(--font-mono); font-size:15px;
  font-weight:600; letter-spacing:normal; color:#e7eefc; line-height:1.2 }
.mh-hero a.mh-c .h{ flex-basis:100%; font-size:12.5px; color:#9db4dd }
.mh-hero a.mh-c.is-thin{ background:rgba(255,255,255,.03); border-style:dashed }
.mh-hero a.mh-c.is-thin .n{ font-size:12.5px; color:#cbd9ee }
.mh-hero .mh-no{ display:flex; flex-wrap:wrap; align-items:baseline; justify-content:space-between;
  gap:6px 10px; border-radius:16px; padding:14px 16px; min-height:64px;
  background:rgba(255,255,255,.03); border:1px dashed rgba(255,255,255,.16) }
.mh-hero .mh-no .k{ display:flex; gap:9px; align-items:center; font-family:var(--font-head); font-weight:800;
  font-size:16px; letter-spacing:.01em; text-transform:uppercase; color:#8fa6c8 }
.mh-hero .mh-no .n{ font-size:12.5px; font-weight:400; letter-spacing:normal; color:#93a9c9 }
@media (max-width:860px){
  .mh-row{ grid-template-columns:1fr }
}

/* --- стык шапки и первого экрана ---
   Между шапкой и экраном выбора оставалась белая полоса от `main{padding:26px 0 56px}` —
   26 px сверху и 56 px перед подвалом: на тёмном фоне это читалось как обрыв, будто
   страница склеена из кусков. На главной отступы сняты (класс `main-flush` на `main`),
   а сам стык разделяет тонкая объёмная линия: светлая кромка сверху, тень снизу —
   «фальц» между шапкой и экраном (16.10.2026). */
main.main-flush{ padding:0 }
.mh-hero::after{ content:""; position:absolute; left:0; right:0; top:0; height:3px; z-index:2;
  pointer-events:none;
  background:linear-gradient(180deg, rgba(255,255,255,.34), rgba(255,255,255,.10) 46%, rgba(3,10,26,.55));
  box-shadow:0 1px 0 rgba(255,255,255,.12), 0 2px 8px -2px rgba(3,10,26,.5) }

/* --- обещания: светлый блок под первым экраном ---
   Были низом тёмного экрана во всю ширину окна — четыре пункта терялись по краям, а сам
   блок читался как часть экрана выбора. 16.10.2026: «не на всю ширину, а в светлый блок
   ниже». Теперь это своя секция шириной с содержимое страницы и белая карточка внутри. */
.mh-sec-trust{ padding:26px 0 0 }
.mh-trust{ display:grid; grid-template-columns:repeat(auto-fit,minmax(230px,1fr)); gap:20px;
  background:#fff; border:1px solid var(--line); border-radius:18px; padding:22px 24px;
  box-shadow:var(--sh-1) }
.mh-trust .v{ display:flex; gap:12px; align-items:flex-start }
.mh-trust .ic{ width:40px; height:40px; border-radius:12px; display:grid; place-items:center; flex:0 0 auto;
  background:var(--grad-soft); color:var(--brand); font-size:19px }
.mh-trust b{ display:block; font-family:var(--font-head); font-size:15.5px; margin-bottom:2px; color:var(--ink) }
.mh-trust .v span span{ font-size:13px; color:var(--muted) }

/* --- общий каркас секций: один отступ, один заголовок --- */
.mh-sec{ padding:60px 0 }
.mh-sec h2{ font-family:var(--font-head); font-weight:800; font-size:clamp(22px,2.5vw,30px);
  margin:0 0 8px; letter-spacing:-.02em }
.mh-sec .sub{ color:var(--muted); font-size:15px; margin:0 0 26px; max-width:72ch }
.mh-eyebrow{ font-size:12px; letter-spacing:.16em; text-transform:uppercase; color:var(--brand);
  font-weight:700; margin-bottom:8px }
.mh-soft{ background-image:var(--pat-dots-ink), linear-gradient(180deg,#f7f9fd,#eef3fa);
  border-top:1px solid var(--line); border-bottom:1px solid var(--line) }
.mh-dark{ color:#fff;
  background-image:var(--pat-lines),
    radial-gradient(760px 360px at 92% 6%, rgba(14,165,233,.20), transparent 64%),
    linear-gradient(150deg,#0b1a3a 0%,#152c60 55%,#1d3c81 100%) }
.mh-dark h2{ color:#fff }
.mh-dark .mh-eyebrow{ color:#7dd3fc }

/* --- что мы можем --- */
.mh-svc{ display:grid; grid-template-columns:repeat(3,1fr); gap:16px; grid-auto-rows:1fr }
@media (max-width:900px){ .mh-svc{ grid-template-columns:repeat(2,1fr) } }
@media (max-width:620px){ .mh-svc{ grid-template-columns:1fr } }
.mh-svc .it{ display:flex; flex-direction:column; background:#fff; border:1px solid var(--line);
  border-radius:16px; padding:18px 20px; box-shadow:var(--sh-1);
  transition:transform .18s ease, box-shadow .18s ease }
.mh-svc .it:hover{ transform:translateY(-3px); box-shadow:var(--sh-2) }
.mh-svc .ic{ width:44px; height:44px; border-radius:13px; display:grid; place-items:center;
  background:var(--grad); color:#fff; font-size:20px; margin-bottom:12px }
.mh-svc b{ display:block; font-family:var(--font-head); font-size:17px; margin-bottom:6px }
.mh-svc p{ color:var(--muted); font-size:14px; margin:0 0 12px }
.mh-svc a{ margin-top:auto; font-size:14px; font-weight:600; color:var(--brand); text-decoration:none }
.mh-svc a:hover{ color:var(--brand-700) }

/* --- собственникам: текст слева, отчёт справа белой карточкой на мягком фоне --- */
.mh-own{ display:grid; grid-template-columns:1.1fr .9fr; gap:26px; align-items:start }
@media (max-width:900px){ .mh-own{ grid-template-columns:1fr } }
.mh-own p{ color:var(--muted); font-size:15px; margin:0 0 18px; max-width:60ch }
.mh-own .adv{ list-style:none; padding:0; margin:0; display:flex; flex-direction:column; gap:12px }
.mh-own .adv li{ display:flex; gap:11px; align-items:flex-start; font-size:14.5px; color:var(--ink-2) }
.mh-own .adv i{ color:var(--brand-400); font-size:16px; margin-top:2px }
.mh-own .acts{ display:flex; gap:10px; flex-wrap:wrap; margin-top:20px }
.mh-own .acts a.p{ background:var(--grad); color:#fff; border-radius:999px; padding:.66rem 1.3rem;
  font-weight:700; font-size:14.5px; text-decoration:none }
.mh-own .acts a.s{ border:1px solid var(--line); background:#fff; color:var(--ink-2); border-radius:999px;
  padding:.64rem 1.2rem; font-weight:600; font-size:14.5px; text-decoration:none }
.mh-own .acts a.s:hover{ border-color:var(--brand-400); color:var(--brand) }
.mh-own .report{ background:#fff; border:1px solid var(--line); border-radius:16px; padding:18px;
  box-shadow:var(--sh-1) }
.mh-own .report .ttl{ font-family:var(--font-head); font-weight:800; font-size:15.5px; margin-bottom:10px }
.mh-own .report .r{ display:flex; justify-content:space-between; gap:12px; padding:9px 0;
  border-bottom:1px dashed var(--line); font-size:13.5px; color:var(--muted) }
.mh-own .report .rows .r:last-child{ border-bottom:0 }
.mh-own .report .r b{ color:var(--ink); text-align:right }
.mh-own .report .legal{ font-size:12px; color:var(--muted); margin-top:8px; line-height:1.5 }

/* --- как проходит работа: линия с точками, без четвёртой коробки подряд --- */
.mh-steps{ display:grid; grid-template-columns:repeat(4,1fr); gap:0 }
@media (max-width:900px){ .mh-steps{ grid-template-columns:1fr; gap:20px } }
.mh-step{ position:relative; padding:0 22px 0 0 }
.mh-step::before{ content:""; position:absolute; left:0; top:15px; right:22px; height:2px; background:var(--line) }
.mh-step:last-child::before{ display:none }
@media (max-width:900px){ .mh-step::before{ display:none } }
.mh-step .d{ width:32px; height:32px; border-radius:50%; background:#fff; border:2px solid var(--brand-400);
  display:grid; place-items:center; font-family:var(--font-head); font-weight:800; font-size:13px;
  color:var(--brand); position:relative; z-index:1 }
.mh-step b{ display:block; font-family:var(--font-head); font-size:16.5px; margin:12px 0 4px }
.mh-step span{ color:var(--muted); font-size:13.5px }

/* --- заявка: тёмная полоса, форма белой карточкой --- */
.mh-form{ display:grid; grid-template-columns:.85fr 1.15fr; gap:28px; align-items:start }
@media (max-width:860px){ .mh-form{ grid-template-columns:1fr } }
.mh-form .side h2{ font-family:var(--font-head); font-weight:800; font-size:clamp(22px,2.5vw,30px);
  margin:0 0 10px; color:#fff }
.mh-form .side p{ color:#a9bede; font-size:15px; margin:0 0 18px }
.mh-form .side .ln{ display:flex; gap:11px; align-items:flex-start; margin-bottom:12px;
  font-size:14.5px; color:#dbe6f7 }
.mh-form .side .ln i{ color:#7dd3fc; font-size:17px; margin-top:2px }
.mh-form .side .ln a{ color:#fff; font-weight:600 }
.mh-card{ background:#fff; border:1px solid var(--line); border-radius:16px; padding:20px;
  box-shadow:0 26px 50px -30px rgba(2,10,30,.55) }
.mh-card .h{ font-family:var(--font-head); font-weight:800; font-size:18px; margin-bottom:4px; color:var(--ink) }
.mh-card .s{ color:var(--muted); font-size:13px; margin-bottom:14px }
.mh-card label{ display:block; font-size:12.5px; color:#475569; margin-bottom:4px }
.mh-card .consent{ display:flex; gap:9px; align-items:flex-start; margin-top:12px; font-size:12.5px; color:var(--muted) }
.mh-card .btn-brand{ background:var(--grad); border:0; color:#fff; font-weight:800; border-radius:11px; padding:.62rem 1.15rem }


/* --- полоса доверия в подвале (подвал А) --- */
.fa-trust{ display:grid; grid-template-columns:repeat(auto-fit,minmax(240px,1fr)); gap:12px; padding:22px 0 2px }
.fa-trust .it{ display:flex; gap:12px; align-items:flex-start; background:rgba(255,255,255,.055);
  border:1px solid rgba(255,255,255,.09); border-radius:14px; padding:13px 15px }
.fa-trust .ic{ width:36px; height:36px; border-radius:11px; display:grid; place-items:center; flex:0 0 auto;
  background:rgba(125,211,252,.14); color:#7dd3fc; font-size:17px }
.fa-trust b{ display:block; color:#fff; font-family:var(--font-head); font-size:14.5px }
.fa-trust span span{ font-size:12.8px; color:#9db4dd }

/* ================================================ шапка объявления (страница лота)
   У объявления своя шапка: слева логотип агентства, в середине — крупно тип объекта
   и сделка, рядом номер на плашке, справа — печать и отправка. Меню разделов здесь
   не нужно: человек пришёл на конкретный объект. В той же тёмной гамме, что шапка
   витрины, чтобы страница не выглядела чужой (просьба владельца 16.10.2026). */
.lotbar{
  position:relative;z-index:1030;
  background-image:var(--pat-dots),
    radial-gradient(760px 230px at 84% -50%, rgba(14,165,233,.26), transparent 72%),
    linear-gradient(180deg,#0b1a3a 0%,#142a5c 56%,#1c3a7d 100%);
  border-bottom:1px solid rgba(255,255,255,.10);
  color:#fff;box-shadow:0 18px 40px -30px rgba(6,15,36,.95);
}
.lotbar::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:1px;
  background:linear-gradient(90deg,transparent,rgba(125,211,252,.45),transparent)}
.lotbar-in{display:flex;flex-direction:column;gap:11px;padding:11px 12px 13px}
.lotbar-r1{display:flex;align-items:center;gap:20px;min-width:0}
.lotbar-r2{display:flex;align-items:center;gap:18px;flex-wrap:wrap;row-gap:9px}
.lotbar-r2 .lotbar-act{margin-left:auto}
.lotbar-brand{display:flex;align-items:center;gap:11px;color:#fff;text-decoration:none;flex:0 0 auto}
.lotbar-brand:hover{color:#fff;opacity:.92}
.lotbar-brand .brand-logo{max-height:52px;max-width:300px}
.lotbar-head{display:flex;align-items:center;gap:14px;min-width:0;flex:0 1 auto;
  padding-left:20px;border-left:1px solid rgba(255,255,255,.14)}
.lotbar-kind{
  font-family:var(--font-head);font-weight:800;font-size:27px;line-height:1.06;letter-spacing:-.02em;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;
}
.lotbar-deal{
  display:inline-flex;align-items:center;gap:.42rem;
  font-family:var(--font-head);font-weight:700;font-size:12.5px;line-height:1;
  text-transform:uppercase;letter-spacing:.10em;white-space:nowrap;color:#fff;
  background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.22);
  border-radius:999px;padding:.44rem .8rem .44rem .68rem;
}
.lotbar-deal::before{content:"";width:7px;height:7px;border-radius:50%;background:#7dd3fc;
  box-shadow:0 0 0 3px rgba(125,211,252,.18)}
.lotbar.is-rent .lotbar-deal{background:rgba(134,239,172,.14);border-color:rgba(134,239,172,.34)}
.lotbar.is-rent .lotbar-deal::before{background:#86efac;box-shadow:0 0 0 3px rgba(134,239,172,.18)}
.lotbar-code{position:static;font-size:12.5px;padding:6px 12px;border-radius:6px;white-space:nowrap;
  letter-spacing:.06em;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.16)}
/* Цена — правое крыло первой строки: крупное число, под ним тихая цена метра. */
.lotbar-price{margin-left:auto;display:flex;flex-direction:column;align-items:flex-end;gap:3px;
  text-align:right;flex:0 0 auto}
/* Площадь и цена — одним шрифтом в одну строку: два ключевых свойства (24.10.2026) */
.lotbar-price .lp-sums{display:flex;gap:.75rem;align-items:baseline;justify-content:flex-end;flex-wrap:wrap}
.lp-sum{font-family:var(--font-head);font-weight:800;font-size:29px;line-height:1.02;
  letter-spacing:-.025em;color:#fff;white-space:nowrap}
.lp-note{font-size:12.5px;color:#9db4d8;white-space:nowrap}
/* Вторая строка: факты слева, светлым и через точки; кнопки — справа. */
.lotbar-facts{display:flex;align-items:center;gap:15px;flex-wrap:wrap;row-gap:6px;
  font-size:14px;color:#c3d3ee;min-width:0}
.lotbar-facts > span{display:inline-flex;align-items:center;gap:7px;white-space:nowrap}
.lotbar-facts > span + span::before{content:"";width:4px;height:4px;border-radius:50%;
  background:rgba(255,255,255,.28)}
.lotbar-facts .lf-addr{color:#e8f0fc;font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis}
.lotbar-facts .lf-metro{color:#a9c4ea}
.lotbar-facts i{font-size:13px;opacity:.72}
.lotbar-act{display:flex;align-items:center;gap:8px;flex:0 0 auto}
.lotbar .btn-ghost-light{
  background:rgba(255,255,255,.10);border:1px solid rgba(255,255,255,.20);color:#fff;
  font-weight:600;border-radius:10px;padding:.4rem .72rem;display:inline-flex;align-items:center;
  line-height:1.3;text-decoration:none;
}
.lotbar .btn-ghost-light:hover{background:rgba(255,255,255,.18);color:#fff}
.lotbar .btn-brand{font-weight:700;border-radius:10px;padding:.4rem .8rem;
  box-shadow:0 8px 18px -12px rgba(14,165,233,.9)}
@media (max-width:992px){
  .lotbar-kind{font-size:22px}
  .lp-sum{font-size:24px}
  .lotbar-in{gap:9px;padding:9px 12px 11px}
  .lotbar-r1{gap:14px}
  .lotbar-head{padding-left:14px}
}
@media (max-width:768px){
  .lotbar-r1{flex-wrap:wrap;gap:8px 12px}
  .lotbar-brand{order:1}
  .lotbar-price{order:2}
  .lotbar-head{order:3;flex:1 1 100%;padding-left:0;border-left:0}
  .lotbar-kind{font-size:20px}
  .lotbar-facts{font-size:13px;gap:12px}
  .lotbar-act{margin-left:0;width:100%}
  .lotbar-act .btn span{display:none}
  .lotbar-act .btn-brand span{display:inline}
  .lotbar-act .btn{padding:.4rem .58rem}
  .lotbar-brand .brand-logo{max-height:42px;max-width:190px}
}

/* ---------------- отправка объявления себе: окно выбора канала и одного контакта ---- */
.share-modal{position:fixed;inset:0;z-index:1080;display:grid;place-items:center;padding:16px;
  background:rgba(9,17,36,.55);backdrop-filter:blur(3px)}
.share-modal[hidden]{display:none}
.share-box{position:relative;width:100%;max-width:430px;background:var(--card);
  border-radius:var(--r-lg);box-shadow:var(--sh-3);padding:22px 22px 20px}
.share-x{position:absolute;top:9px;right:9px;border:0;background:none;color:var(--muted);
  width:34px;height:34px;border-radius:9px;font-size:15px}
.share-x:hover{background:#f1f5fb;color:var(--ink)}
.share-title{font-family:var(--font-head);font-weight:800;font-size:19px;margin:0 0 4px}
.share-sub{margin:0 0 14px;font-size:13.5px;color:var(--muted)}
.share-chans{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:14px}
.share-chan{display:flex;flex-direction:column;align-items:center;gap:5px;
  background:#f6f8fc;border:1px solid var(--line);border-radius:12px;padding:9px 4px;
  font-family:var(--font-text);font-size:12px;font-weight:600;color:var(--ink-2)}
.share-chan i,.share-chan .mm{font-size:19px;line-height:1}
.share-chan .mm{font-family:var(--font-head);font-weight:800;font-size:17px}
.share-chan:hover{border-color:#c7d4ea;background:#eef3fb}
.share-chan.is-on{border-color:var(--brand);background:#e8f0ff;color:var(--brand-700);
  box-shadow:0 0 0 2px rgba(30,64,175,.12) inset}
.share-label{display:block;font-size:13px;font-weight:600;color:var(--ink-2);margin-bottom:5px}
.share-err,.share-ok{border-radius:10px;padding:8px 11px;font-size:13.5px;margin-top:10px}
.share-err{background:#fdeaea;color:#93231b;border:1px solid #f4c9c5}
.share-ok{background:#e7f7ee;color:#14532d;border:1px solid #b9e3ca}
.share-note{margin-top:9px;font-size:12.5px;color:var(--muted)}
@media (max-width:520px){ .share-chans{grid-template-columns:repeat(2,1fr)} }

/* Блок, который существует только на бумаге (телефон, ссылка, номер объявления).
   На экране его нет: там телефон кликается, а ссылку открывают, а не набирают. */
.print-only{display:none}

/* Полоса «объект снят с публикации» над выдачей: сюда приходят по ссылке на снятый
   объект, и человек должен понять, почему он видит другой список (18.10.2026). */
.notice-gone{display:flex;align-items:flex-start;gap:.4rem;padding:.6rem .9rem;
  border-left:3px solid var(--brand,#0d6efd);background:rgba(13,110,253,.06);
  font-size:.95rem;line-height:1.45}
.notice-gone .bi{color:var(--brand,#0d6efd);flex:0 0 auto;margin-top:.15rem}

/* --- посадочные страницы районов (1.0.11) --- */
.chip-link{display:inline-block;border:1px solid var(--line);background:#f8fafd;border-radius:999px;
  padding:5px 12px;font-size:13px;color:var(--ink-2);text-decoration:none;line-height:1.35}
.chip-link:hover{border-color:#cfdcf3;background:#eef4ff;color:var(--ink)}
.chip-link .n{color:var(--muted);font-size:11.5px;margin-left:4px}
.dist-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px;margin:14px 0}
.dist-stat{display:block;border:1px solid var(--line);border-radius:var(--r-md);padding:12px 14px;
  background:var(--card);text-decoration:none;color:inherit}
a.dist-stat:hover{border-color:#cfdcf3;background:#f8fafd}
.dist-stat .n{font-size:20px;font-weight:700;line-height:1.2}
.dist-stat .t{font-size:12.5px;color:var(--muted);margin-top:2px}
.dist-intro{max-width:920px;color:var(--ink-2);font-size:14.5px;line-height:1.65;margin:6px 0 4px}

/* Подсказка «расстояние измерено по прямой»: серая иконка вместо слов в строке (21.10.2026) */
.hint-i{color:#b9c0c7;font-size:.92em;cursor:help;margin-left:.15em;vertical-align:baseline}
.hint-i:hover{color:#8d959d}

/* ---------------------------------------------------------------- избранное клиента
   Звёздочка на карточке витрины, кнопка «В избранное» в объявлении, кнопка «Избранное»
   в шапке и страница со списком. Просьба владельца 23.10.2026: клиент отмечает объекты
   и отправляет по ним заявку. */
.obj-head{display:flex;align-items:flex-start;gap:8px}
.obj-head .obj-price{flex:0 1 auto;min-width:0}
/* Хинт у цены: цена метра и годовая стоимость переехали в подсказку (просьба владельца
   24.10.2026) — тем же знаком 🛈, что у «расстояние до МКАД». */
.obj-head .hint-i{font-size:15px;margin-left:.1em;flex:0 0 auto;align-self:flex-start}
/* Звёздочка — эмодзи без плашки и кружка (просьба владельца 24.10.2026).
   Символ ОДИН и тот же (⭐) в обоих состояниях: у ☆ и ⭐ разные метрики глифа, и звезда
   «прыгала» по размеру при отметке. Размер задан жёстко (width/height/line-height).
   Состояния различаются цветом, а не только плотностью (24.10.2026: «не активно почти
   не отличается — сделай не активную чёрно-белой»): не отмечено — серая (grayscale),
   отмечено — жёлтая эмодзи. Тень держит знак читаемым на любом кадре. */
.fav-star{
  flex:0 0 auto;display:block;width:27px;height:27px;line-height:27px;
  border:0;background:none;border-radius:0;padding:0;margin:0;
  font-size:25px;text-align:center;cursor:pointer;
  filter:grayscale(1) brightness(1.08) drop-shadow(0 1px 4px rgba(6,15,36,.65));
  opacity:.9;transition:filter .14s ease,opacity .14s ease
}
.fav-star .fav-ico{display:block;width:100%;height:100%;line-height:27px;
  font-family:"Apple Color Emoji","Segoe UI Emoji","Noto Color Emoji",sans-serif}
.fav-star:hover{opacity:1}
.fav-star.on{filter:drop-shadow(0 1px 5px rgba(6,15,36,.7));opacity:1}
/* Масштабирования нет: звезда не должна менять размер ни при отметке, ни под курсором
   (24.10.2026: «не нравится, что звёздочка по размерам прыгает») */
.fav-star:focus-visible{outline:2px solid var(--brand-800);outline-offset:2px}
.fav-star.busy{opacity:.55;pointer-events:none}
.fav-badge{
  display:inline-block;min-width:18px;margin-left:4px;padding:0 5px;border-radius:9px;
  background:#f0a500;color:#2a1c00;font-size:11px;font-weight:700;line-height:18px;text-align:center
}
/* страница «Избранное» */
.fav-h1{font-family:var(--font-head);font-weight:800;font-size:26px;margin:0 0 6px}
.fav-lead{color:#5b6b82;max-width:70ch;margin:0 0 16px}
.fav-actions{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin:0 0 14px}
.fav-count{font-weight:600;color:var(--ink)}
.fav-empty{
  display:flex;flex-direction:column;align-items:center;gap:12px;text-align:center;
  padding:44px 20px;border:1px dashed var(--line);border-radius:var(--r-lg);color:#5b6b82
}
.fav-empty i{font-size:34px;color:#c9d3e2}
.fav-empty p{max-width:52ch;margin:0}
.fav-gone{opacity:0;transform:translateY(-4px);transition:opacity .2s ease,transform .2s ease}
@media print{.fav-star,.fav-head{display:none!important}}

/* Обратный звонок: плавающая кнопка витрины. В левом нижнем углу — справа стоит кнопка
   «наверх» (просьба владельца 24.10.2026). Обе кнопки стоят на одном уровне от нижнего
   края (20px, как `.up-link`) и одной высоты — иначе звонок «висит» выше стрелки.
   На телефоне сжимается до значка, чтобы не закрывать выдачу. */
.cb-fab{
  position:fixed;left:20px;bottom:20px;z-index:1035;display:inline-flex;align-items:center;gap:8px;
  min-height:44px;padding:0 18px;border:0;border-radius:999px;background:var(--grad-brand,linear-gradient(135deg,#0ea5e9,#1b3a8f));
  color:#fff;font-weight:700;font-size:14px;box-shadow:0 12px 26px -12px rgba(14,90,200,.85);
  cursor:pointer;transition:transform .14s ease,box-shadow .14s ease
}
.cb-fab:hover{transform:translateY(-2px);box-shadow:0 16px 30px -12px rgba(14,90,200,.95);color:#fff}
.cb-fab:active{transform:translateY(0)}
.cb-fab:focus-visible{outline:2px solid #fff;outline-offset:2px}
.cb-fab i{font-size:17px}
@media (max-width:575.98px){
  .cb-fab{left:20px;bottom:20px;width:44px;height:44px;padding:0;border-radius:50%}
  .cb-fab span{display:none}
}
@media print{.cb-fab,#cbModal{display:none!important}}

/* «Избранное» в шапке телефона: значок со счётчиком, рядом с «бургером» */
.fav-head-sm{
  position:relative;display:inline-flex;align-items:center;justify-content:center;
  width:40px;height:40px;margin-left:auto;margin-right:6px;border-radius:11px;
  color:#fff;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.22);
  font-size:18px;text-decoration:none
}
.fav-head-sm:hover{background:rgba(255,255,255,.2);color:#fff}
.fav-head-sm .fav-badge{position:absolute;top:-5px;right:-5px;margin:0;line-height:16px;min-width:16px;font-size:10px}


/* ---------------------------------------------- плитки категорий раздела (db/207)
   «Офисы», «Склады», «Производство», «Индустриальные парки», «Light industrial»,
   «Торговые помещения», «Земельные участки», «Недвижимость под инвестиции».
   Плитка = иконка + название + число объектов; выбранная подсвечена. */
.cat-row{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(196px,1fr));gap:10px;
  margin:18px 0 22px
}
.cat-tile{
  display:flex;align-items:center;gap:11px;padding:12px 14px;border-radius:14px;
  background:#fff;border:1px solid #e6eaf1;text-decoration:none;color:inherit;
  box-shadow:0 1px 2px rgba(16,24,40,.04);
  transition:border-color .15s ease,box-shadow .15s ease,transform .15s ease
}
.cat-tile:hover{border-color:#c9d6ea;box-shadow:0 8px 20px -12px rgba(16,24,40,.35);transform:translateY(-1px)}
.cat-tile.is-on{border-color:#0e5ac8;background:#f4f8ff;box-shadow:0 0 0 1px #0e5ac8 inset}
.ct-ic{
  flex:0 0 36px;width:36px;height:36px;border-radius:11px;display:flex;align-items:center;
  justify-content:center;background:#eef3fb;color:#0e5ac8;font-size:17px
}
.cat-tile.is-on .ct-ic{background:#0e5ac8;color:#fff}
.ct-body{display:flex;flex-direction:column;min-width:0}
.ct-t{font-weight:600;font-size:14px;line-height:1.25;color:#101828}
.ct-n{font-size:12px;color:#667085;margin-top:2px}
@media (max-width:575.98px){
  .cat-row{grid-template-columns:1fr 1fr;gap:8px;margin:14px 0 18px}
  .cat-tile{padding:10px;gap:9px;border-radius:12px}
  .ct-ic{flex-basis:30px;width:30px;height:30px;font-size:15px;border-radius:9px}
  .ct-t{font-size:13px}
  .ct-n{font-size:11px}
}
@media (max-width:359.98px){ .cat-row{grid-template-columns:1fr} }


/* ------------------------------------------------ пульт объекта в карточке сотрудника
   Первый блок карточки: только тумблеры, без полей ввода (просьба владельца 25.10.2026).
   «Активно» — главный и крупный, «Витрина» — подблок с тремя переключателями.
   Форма сохраняется сама при переключении (js-switch в app.js). */
.obj-switchboard{padding:16px 18px 18px}
.obj-switchboard .sw-main{display:flex;align-items:center;gap:14px;padding-left:0;margin:0 0 14px;min-height:44px}
.obj-switchboard .sw-main .form-check-input{float:none;flex:none;margin:0;width:3.3em;height:1.65em;cursor:pointer}
.obj-switchboard .sw-main .form-check-label{font-size:23px;font-weight:700;color:#12305f;line-height:1.15;cursor:pointer}
.obj-switchboard .sw-main .sw-note{display:block;margin-top:2px;font-size:13px;font-weight:400;color:var(--muted);line-height:1.35}
.obj-switchboard .sw-block{margin-top:2px;padding:12px 14px 14px;border:1px solid var(--line);border-radius:12px;background:#f8fafc}
.obj-switchboard .sw-block-title{font-size:12px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:9px}
.obj-switchboard .form-check{display:flex;align-items:flex-start;gap:10px;padding-left:0;margin:0;min-height:34px}
.obj-switchboard .form-check .form-check-input{float:none;flex:none;margin:3px 0 0;cursor:pointer}
.obj-switchboard .form-check-label{font-size:15px;font-weight:600;color:#12305f;line-height:1.3;cursor:pointer}
.obj-switchboard .form-check-label .sw-note{display:block;margin-top:1px;font-size:12px;font-weight:400;color:var(--muted);line-height:1.35}
@media (max-width:575.98px){
  .obj-switchboard .sw-main .form-check-label{font-size:20px}
  .obj-switchboard .sw-main .form-check-input{width:2.9em;height:1.45em}
}

/* --- «Общественный транспорт»: плашки видов транспорта и номеров маршрутов -----------------
   Строка карточки должна занимать одну строку: плашки идут в ряд, а расстояние по прямой от
   объекта лежит в подсказке (атрибут title) и появляется при наведении. Цвет — по виду
   транспорта, чтобы ряд читался глазом, а не только по иконке. */
.tp-set{display:inline-flex;flex-wrap:wrap;gap:4px;vertical-align:middle}
.tp{display:inline-flex;align-items:center;gap:3px;padding:2px 7px;border-radius:7px;
    font:600 12.5px/1.5 var(--font-text);border:1px solid var(--line);background:#f8fafc;
    color:var(--ink-2);white-space:nowrap;cursor:default}
.tp-i{font-family:var(--font-emoji);font-size:13px;line-height:1}
.tp-bus{background:#eef4ff;border-color:#d6e2fb;color:#1e40af}
.tp-tram{background:#f6ecff;border-color:#e4d3fb;color:#6b21a8}
.tp-trolleybus{background:#eafaf1;border-color:#cfeddc;color:#166534}
.tp-platform{background:#f8fafc}
.tp-metro{background:#fdecec;border-color:#f7d4d4;color:#991b1b}
.tp-mcc{background:#fff3e6;border-color:#fadfc0;color:#9a3412}
.tp-mcd{background:#fff8e1;border-color:#f6e3a8;color:#854d0e}
.tp-rail{background:#f1f5f9;border-color:#dbe3ec;color:#334155}
.tp-more{background:#fff;border-style:dashed;color:var(--muted)}
.tp-none{color:var(--muted);font-size:13px}
