
/* ============================================================
   КАТАЛОГ — застройщики и проекты
   ============================================================ */
.cwrap{width:min(100% - var(--gutter)*2,var(--maxw));margin-inline:auto}
/* Имена проектов содержат числа («Дом 22», «Обыденский №1»): в серифе включаем
   маюскульные цифры — иначе они проваливаются ниже базовой линии. */
.chead h1,.phero h1,.pcard .h,.dev-card .h,.mrk h2,.psec > h2,.dcardbig h3,.ctable td b
  {font-variant-numeric:lining-nums;font-feature-settings:"lnum" 1}
.chead{padding:calc(var(--sp-9) + 46px) 0 var(--sp-7)}
.chead .eyebrow{margin-bottom:var(--sp-5)}
.chead h1{font-size:var(--fs-h1);max-width:19ch;line-height:1.03}
.chead .lede{max-width:62ch;color:var(--text-muted);font-size:var(--fs-lede);margin-top:var(--sp-5)}
.crumbs{display:flex;flex-wrap:wrap;gap:var(--sp-2);align-items:center;font-size:var(--fs-xs);
  letter-spacing:.06em;text-transform:uppercase;color:var(--text-faint);margin-bottom:var(--sp-5)}
.crumbs a{color:var(--text-faint);text-decoration:none;border-bottom:1px solid transparent}
.crumbs a:hover{color:var(--accent-strong);border-bottom-color:currentColor}
.crumbs .sep{opacity:.5}

/* ── счётчики шапки ── */
.cstats{display:flex;flex-wrap:wrap;gap:var(--sp-6) var(--sp-8);margin-top:var(--sp-6);
  padding-top:var(--sp-6);border-top:1px solid var(--line)}
.cstats div{display:flex;flex-direction:column;gap:2px}
.cstats b{font-family:var(--sans);font-size:clamp(1.5rem,2.6vw,2.1rem);font-weight:600;
  line-height:1.05;letter-spacing:-.02em;color:var(--text-strong);
  font-variant-numeric:tabular-nums lining-nums}
.cstats span{font-size:var(--fs-xs);letter-spacing:.08em;text-transform:uppercase;color:var(--text-faint)}

/* ── фильтры ── */
/* Шапка сайта position:fixed высотой 70px в «затвердевшем» состоянии — липкая панель
   фильтров обязана начинаться под ней, иначе они наезжают друг на друга. */
.filters{position:sticky;top:70px;z-index:20;background:color-mix(in srgb,var(--bg) 78%,transparent);
  border-block:1px solid var(--line);padding:var(--sp-4) 0;margin-bottom:var(--sp-7);
  -webkit-backdrop-filter:saturate(1.2) blur(14px);backdrop-filter:saturate(1.2) blur(14px);
  transition:background .2s var(--ease-soft),border-color .2s var(--ease-soft)}
.frow{display:flex;flex-wrap:wrap;gap:var(--sp-3);align-items:center}
.fgroup{display:flex;gap:6px;flex-wrap:wrap}
.chip{appearance:none;border:1px solid var(--line);background:transparent;color:var(--text);
  font:inherit;font-size:var(--fs-sm);padding:7px 14px;border-radius:999px;cursor:pointer;
  transition:background var(--dur-hover) var(--ease-soft),border-color var(--dur-hover) var(--ease-soft),
    color var(--dur-hover) var(--ease-soft)}
.chip:hover{border-color:var(--accent);color:var(--accent-strong)}
.chip[aria-pressed="true"]{background:var(--text-strong);border-color:var(--text-strong);color:var(--bone-0)}
.chip:focus-visible{outline:2px solid var(--focus);outline-offset:2px}
.fsel,.fsearch{appearance:none;font:inherit;font-size:var(--fs-sm);color:var(--text);
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);padding:8px 12px}
.fsel{padding-right:30px;background-image:linear-gradient(45deg,transparent 50%,var(--text-faint) 50%),
  linear-gradient(135deg,var(--text-faint) 50%,transparent 50%);
  background-position:calc(100% - 16px) 52%,calc(100% - 11px) 52%;
  background-size:5px 5px,5px 5px;background-repeat:no-repeat}
.fsearch{min-width:min(260px,60vw)}
.fsel:focus-visible,.fsearch:focus-visible{outline:2px solid var(--focus);outline-offset:1px}
.fmeta{margin-left:auto;display:flex;align-items:center;gap:var(--sp-4);font-size:var(--fs-sm);
  color:var(--text-faint)}
.fmeta output{font-variant-numeric:tabular-nums;color:var(--text)}
.freset{appearance:none;background:none;border:0;font:inherit;font-size:var(--fs-sm);
  color:var(--accent-strong);cursor:pointer;border-bottom:1px solid transparent;padding:0}
.freset:hover{border-bottom-color:currentColor}
.freset[hidden]{display:none}

/* ── мобильные фильтры: магнит в кнопку ──
   На телефоне липкая панель занимала почти половину экрана. Теперь при скролле вниз все
   контролы «улетают» в кнопку «Фильтры» у большого пальца, а наверху из фильтров остаётся
   только круглая сортировка. Разлёт считается в JS от центра каждого контрола к центру
   кнопки — иначе элементы разъезжаются кто куда, и жест не читается. */
.fbar{display:none;justify-content:flex-end;padding-top:4px}
.fsort{width:40px;height:40px;flex:none;position:relative;display:grid;place-items:center;
  border:1px solid var(--line);background:var(--surface);color:var(--text);border-radius:50%;
  cursor:pointer;transition:border-color var(--dur-hover) var(--ease-soft),
    background var(--dur-hover) var(--ease-soft)}
.fsort:hover{border-color:var(--accent);color:var(--accent-strong)}
.fsort:focus-within{outline:2px solid var(--focus);outline-offset:2px}
.fsort.on{background:var(--text-strong);border-color:var(--text-strong);color:var(--bone-0)}
.fsort > select{position:absolute;inset:0;width:100%;height:100%;opacity:0;border:0;
  -webkit-appearance:none;appearance:none;cursor:pointer;font-size:16px}
/* когда внизу полоса «перезвоним» — кнопка фильтров поднимается над ней */
body.has-cb .ffab{bottom:calc(16px + 132px + env(safe-area-inset-bottom,0px))}
.ffab{display:none;position:fixed;right:16px;bottom:calc(16px + env(safe-area-inset-bottom,0px));
  z-index:30;align-items:center;gap:9px;border:0;border-radius:999px;cursor:pointer;
  background:var(--text-strong);color:var(--bone-0);font:inherit;font-size:.92rem;font-weight:600;
  padding:13px 20px;box-shadow:0 14px 30px -12px rgba(31,27,21,.65);
  opacity:0;transform:translateY(12px) scale(.86);pointer-events:none;
  transition:opacity .26s ease .16s,transform .4s cubic-bezier(.22,1,.36,1) .16s}
.ffab-n{font-weight:500;opacity:.72;font-variant-numeric:tabular-nums}
.ffab.on{background:var(--accent-strong)}
.ffab:focus-visible{outline:2px solid var(--focus);outline-offset:3px}

@media (max-width:720px){
  .fbar{display:flex}
  /* Раскрытые фильтры на телефоне — шторка снизу, у большого пальца.
     Наверху при этом ничего не остаётся: панель уезжает вниз целиком. */
  .cat-sheet .filters{position:fixed;inset:auto 0 0 0;margin:0;max-height:84vh;overflow:auto;
    z-index:40;border-radius:16px 16px 0 0;padding:16px 0 84px;
    box-shadow:0 -18px 40px -22px rgba(31,27,21,.55);
    background:var(--bone-1);border-top:1px solid var(--line);
    backdrop-filter:none;-webkit-backdrop-filter:none}
  .cat-sheet .filters::before{content:"";display:block;width:38px;height:4px;border-radius:2px;
    background:var(--line);margin:0 auto 14px}
  .cat-sheet .filters .frow{max-height:none}
  .cat-sheet .filters .frow > *{transform:none;opacity:1}
  .cat-sheet .fbar{display:none}
  .cat-sheet .fscrim{opacity:1;pointer-events:auto}
  .cat-sheet .ffab{opacity:0;pointer-events:none}
  .cat-sheet .fmore{display:flex}
  .cat-sheet .fmore-b{display:none}
  .cat-sheet .fdone{display:flex;position:fixed;left:16px;right:16px;
    bottom:calc(16px + env(safe-area-inset-bottom,0px));z-index:41;align-items:center;
    justify-content:center;gap:8px;border:0;border-radius:12px;cursor:pointer;
    background:var(--text-strong);color:var(--bone-0);font:inherit;font-size:.95rem;
    font-weight:600;padding:15px}
  .cat-sheet .fmeta{order:-1}
  .fm-grid{grid-template-columns:1fr 1fr}
  .fm-wide{grid-column:1 / -1}
  .cat-sheet .fms-p{position:static;min-width:0;border:0;padding:8px 0 0;
    box-shadow:none;background:none}
  .cat-sheet .fms-l{max-height:34vh}
  .ffab{display:inline-flex}
  .filters .frow{max-height:60vh;transition:max-height .38s var(--ease-soft)}
  .filters .frow > *{transition:transform .52s cubic-bezier(.4,0,.25,1) var(--md,0ms),
    opacity .3s ease var(--md,0ms)}
  .cat-off .filters .frow > *{transform:translate(var(--mx,0px),var(--my,0px)) scale(.22);opacity:0}
  .cat-off .filters .frow{max-height:0;overflow:hidden;transition:max-height .34s var(--ease-soft) .3s}
  .cat-off .ffab{opacity:1;transform:none;pointer-events:auto}
  /* Свёрнутая панель не оставляет полосы: фон, рамка и отступы уходят,
     круглая сортировка просто висит над карточками. */
  .cat-off .filters{background:transparent;border-block-color:transparent;padding:0;
    backdrop-filter:none;-webkit-backdrop-filter:none;pointer-events:none;
    transition-delay:.45s}
  .cat-off .fbar{padding-top:10px;pointer-events:auto}
  .cat-off .fsort{background:var(--surface);box-shadow:0 10px 24px -12px rgba(90,62,38,.55)}
}
@media (prefers-reduced-motion:reduce){
  .filters .frow > *,.filters .frow,.ffab{transition-duration:.01ms!important}
}

/* ── переход на карту проектов ──
   Карта и список — две проекции одного каталога, поэтому кнопка стоит в той же
   строке фильтров и выглядит как действие, а не как ещё один фильтр. */
.tomap{display:inline-flex;align-items:center;gap:8px;padding:7px 15px;border-radius:999px;
  text-decoration:none;font-size:var(--fs-sm);font-weight:600;color:var(--bone-0);
  background:var(--text-strong);border:1px solid var(--text-strong);
  transition:background var(--dur-hover) var(--ease-soft),color var(--dur-hover) var(--ease-soft)}
.tomap:hover{background:var(--accent-strong);border-color:var(--accent-strong)}
.tomap:focus-visible{outline:2px solid var(--focus);outline-offset:2px}
.tomap svg{flex:none;opacity:.9}
.chead-go{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-5);margin-top:var(--sp-6)}
.cls-nav{display:inline-flex;flex-wrap:wrap;align-items:center;gap:.5em;font-size:var(--fs-sm);color:var(--text-muted)}
.cls-nav a{color:var(--accent-strong);border-bottom:1px solid var(--accent-wash);padding:14px 0 6px;margin:-14px 0 -6px;   /* тач-цель 44px без сдвига строки */
  transition:border-color var(--dur-hover) var(--ease-soft)}
.cls-nav a:hover{border-bottom-color:var(--accent)}
.cls-nav .cls-cur{color:var(--text-strong);font-weight:600}
.okr-chips span b{margin-left:.35em;color:var(--text-faint);font-weight:500}
.devlist{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:1px;background:var(--line);
  border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden}
.devlist a,.devlist>span{display:flex;justify-content:space-between;gap:12px;align-items:baseline;
  background:var(--surface);padding:14px 18px;font-size:var(--fs-sm);color:var(--text-strong);min-height:48px}
.devlist a:hover{background:var(--surface-alt);color:var(--accent-strong)}
.devlist i{font-style:normal;color:var(--text-faint);white-space:nowrap}
.fidx .fidx-g{margin-top:var(--sp-5)}
.fidx h3{font-family:var(--sans);font-size:var(--fs-xs);letter-spacing:.18em;text-transform:uppercase;
  color:var(--text-faint);font-weight:600;margin:0 0 var(--sp-3)}
.fidx .chips a,.okr-chips a{color:var(--text-strong)}
.fidx .chips a:hover,.okr-chips a:hover{color:var(--accent-strong);border-color:var(--accent)}
.fidx .chips b,.okr-chips b{margin-left:.35em;color:var(--text-faint);font-weight:500}
.fed{margin:var(--sp-4) 0 0;font-size:var(--fs-sm);color:var(--text-muted)}
.fed a{color:var(--accent-strong)}
.tomap-big{padding:13px 22px;font-size:.95rem}

/* ── расширенные фильтры ── */
.fmore-b{appearance:none;background:none;border:1px solid var(--line);border-radius:999px;
  font:inherit;font-size:var(--fs-sm);color:var(--text);padding:7px 14px;cursor:pointer;
  transition:border-color var(--dur-hover) var(--ease-soft),color var(--dur-hover) var(--ease-soft)}
.fmore-b:hover{border-color:var(--accent);color:var(--accent-strong)}
.fmore-b:focus-visible{outline:2px solid var(--focus);outline-offset:2px}
.fmore-b[aria-expanded="true"]{background:var(--text-strong);border-color:var(--text-strong);color:var(--bone-0)}
.fmore{padding-top:var(--sp-4);margin-top:var(--sp-4);border-top:1px solid var(--line);
  display:flex;flex-direction:column;gap:var(--sp-4)}
.fmore[hidden]{display:none}
.fm-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:var(--sp-3)}
.fm{display:flex;flex-direction:column;gap:5px;min-width:0}
.fm > span{font-size:var(--fs-xs);letter-spacing:.06em;text-transform:uppercase;color:var(--text-faint)}
.fm .fsel{width:100%}
.fm-chips{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-3)}
.fm-l{font-size:var(--fs-xs);letter-spacing:.06em;text-transform:uppercase;color:var(--text-faint)}

.chip .cn{opacity:.6;font-variant-numeric:tabular-nums lining-nums}
.chip.nil{opacity:.4}

/* ── суммы вводом, а не списком ──
   Порогов «до 100 млн» человеку всегда мало: бюджет входа набирают числом,
   с живыми разрядами. Метр — в рублях, бюджет — в миллионах: так его и называют. */
.fpair{display:flex;align-items:center;gap:8px}
.fpair > span{flex:none;color:var(--text-faint);font-size:var(--fs-sm)}
.fnum{flex:1 1 0;min-width:0;appearance:none;font:inherit;font-family:var(--sans);
  font-size:var(--fs-sm);font-variant-numeric:tabular-nums lining-nums;color:var(--text);
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);
  padding:8px 10px;text-align:right}
.fnum::placeholder{color:var(--text-faint);font-variant-numeric:normal}
.fnum:focus-visible{outline:2px solid var(--focus);outline-offset:1px}
.fnum.bad{border-color:var(--accent-strong);background:rgba(176,98,54,.06)}
.fhint{font-size:var(--fs-xs);color:var(--text-faint);
  font-variant-numeric:tabular-nums lining-nums}

/* ── район: несколько сразу, список сужается округом ── */
.fms{position:relative;min-width:0}
.fms-b{width:100%;display:flex;align-items:center;justify-content:space-between;gap:8px;
  appearance:none;font:inherit;font-size:var(--fs-sm);color:var(--text);text-align:left;
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);
  padding:8px 12px;cursor:pointer;
  transition:border-color var(--dur-hover) var(--ease-soft)}
.fms-b:hover{border-color:var(--accent)}
.fms-b:focus-visible{outline:2px solid var(--focus);outline-offset:1px}
.fms-b.on{border-color:var(--text-strong)}
.fms-b svg{flex:none;transition:transform .2s var(--ease-soft)}
.fms-b[aria-expanded="true"] svg{transform:rotate(180deg)}
.fms-t{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.fms-p{position:absolute;z-index:45;top:calc(100% + 6px);left:0;right:0;min-width:230px;
  background:var(--bone-1);border:1px solid var(--line);border-radius:var(--r-sm);
  box-shadow:0 22px 44px -24px rgba(31,27,21,.6);padding:10px;
  display:flex;flex-direction:column;gap:8px}
.fms-p[hidden]{display:none}
.fms-q{appearance:none;font:inherit;font-size:var(--fs-sm);color:var(--text);
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);padding:7px 10px}
.fms-q:focus-visible{outline:2px solid var(--focus);outline-offset:1px}
.fms-l{display:flex;flex-direction:column;max-height:44vh;overflow:auto;
  margin:0 -4px;padding:0 4px}
.fms-l label{display:flex;align-items:center;gap:9px;padding:7px 6px;border-radius:8px;
  font-size:var(--fs-sm);cursor:pointer}
.fms-l label:hover{background:var(--surface)}
.fms-l label[hidden]{display:none}
.fms-l label.off{opacity:.35}
.fms-l input{flex:none;width:16px;height:16px;accent-color:var(--accent-strong)}
.fms-l span{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.fms-l i{font-style:normal;font-size:var(--fs-xs);color:var(--text-faint);
  font-variant-numeric:tabular-nums lining-nums}
.fms-f{display:flex;justify-content:space-between;gap:8px;
  border-top:1px solid var(--line);padding-top:8px}
.fms-f button{appearance:none;background:none;border:0;font:inherit;font-size:var(--fs-sm);
  color:var(--accent-strong);cursor:pointer;padding:2px 4px;border-radius:6px}
.fms-f button:focus-visible{outline:2px solid var(--focus);outline-offset:2px}
.fms-f .fms-ok{color:var(--text-strong);font-weight:600}
.fms-e{margin:0;font-size:var(--fs-sm);color:var(--text-faint);padding:4px 6px}

/* ── год: промежуток на линии, а не «не позже» списком ── */
.fyr[hidden]{display:none}
.fyr-h{display:flex;align-items:baseline;justify-content:space-between;gap:10px}
.fyr-h em{font-style:normal;text-transform:none;letter-spacing:0;font-family:var(--sans);
  font-size:var(--fs-sm);color:var(--text);font-variant-numeric:tabular-nums lining-nums}
.fyr-t{position:relative;height:28px;margin-top:2px}
.fyr-t::before{content:"";position:absolute;left:0;right:0;top:12px;height:4px;
  border-radius:2px;background:var(--line)}
.fyr-f{position:absolute;top:12px;height:4px;border-radius:2px;background:var(--accent-strong)}
.fyr-t input{position:absolute;left:0;top:0;width:100%;height:28px;margin:0;padding:0;
  background:none;pointer-events:none;-webkit-appearance:none;appearance:none}
.fyr-t input:focus{outline:none}
.fyr-t input::-webkit-slider-runnable-track{background:none;border:0;height:28px}
.fyr-t input::-webkit-slider-thumb{-webkit-appearance:none;pointer-events:auto;
  width:20px;height:20px;margin-top:4px;border-radius:50%;background:var(--bone-0);
  border:2px solid var(--text-strong);cursor:grab;box-shadow:0 3px 9px -3px rgba(31,27,21,.55)}
.fyr-t input::-moz-range-track{background:none;border:0;height:28px}
.fyr-t input::-moz-range-thumb{pointer-events:auto;width:18px;height:18px;border-radius:50%;
  background:var(--bone-0);border:2px solid var(--text-strong);cursor:grab}
.fyr-t input:focus-visible::-webkit-slider-thumb{outline:2px solid var(--focus);outline-offset:2px}
.fyr-t input:focus-visible::-moz-range-thumb{outline:2px solid var(--focus);outline-offset:2px}
.fyr-sc{display:flex;justify-content:space-between;font-size:var(--fs-xs);
  color:var(--text-faint);font-variant-numeric:tabular-nums lining-nums}
.fqz{display:flex;flex-wrap:wrap;align-items:center;gap:7px;margin-top:2px}
.fqz[hidden]{display:none}

/* ── шторка фильтров на телефоне ── */
.fscrim{position:fixed;inset:0;z-index:39;background:rgba(20,16,12,.45);opacity:0;
  pointer-events:none;transition:opacity .3s var(--ease-soft)}
.fdone{display:none}

/* ── сетка карточек ── */
/* У карточки собственный display, и он сильнее браузерного правила для [hidden]:
   без этой строки фильтр «отрабатывал» — счётчик менялся, — но каталог оставался прежним. */
.pcard[hidden],.dev-card[hidden]{display:none!important}
.pgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:var(--sp-5)}
/* Один и тот же article живёт в трёх режимах (#cat.v-journal / #cat.v-list; без класса — плитка).
   Ссылка занимает всю карточку; «Сравнить» — отдельная кнопка поверх (кнопка внутри <a> недопустима). */
.pcard{position:relative;isolation:isolate;display:block;background:var(--surface);border:1px solid var(--line);
  border-radius:10px;overflow:hidden;color:inherit;box-shadow:inset 0 1px 0 #fff;
  transition:transform var(--dur-hover) var(--ease),box-shadow var(--dur-hover) var(--ease),
    border-color var(--dur-hover) var(--ease-soft)}
.pcard:hover{transform:translateY(-3px);border-color:var(--line-strong);
  box-shadow:inset 0 1px 0 #fff,0 1px 1px rgba(90,62,38,.05),0 8px 8px -6px rgba(90,62,38,.16)}
.pc-link{display:block;color:inherit;text-decoration:none;height:100%}
.pc-link:focus-visible{outline:2px solid var(--focus);outline-offset:-3px;border-radius:inherit}
.pcard .pshot{position:relative;aspect-ratio:4/3;background:var(--surface-raised);overflow:hidden;display:block}
/* Проект без снимка не должен выглядеть поломанным: вместо дыры — марка класса на плашке. */
.pcard .pshot:empty::after,.pcard .pshot.nofoto::after{content:attr(data-noimg);position:absolute;inset:0;
  display:grid;place-items:center;font-family:var(--serif);font-size:1.1rem;color:var(--text-faint);
  background:linear-gradient(160deg,var(--bone-2),var(--bone-3));text-align:center;padding:0 var(--sp-5)}
.pcard .pshot img{width:100%;height:100%;object-fit:cover;display:block;
  transition:transform .6s var(--ease),opacity .5s var(--ease),translate .5s var(--ease)}
.pcard:hover .pshot img{transform:scale(1.04)}
/* ── скелет и мягкая загрузка ──
   Пока кадр грузится, под ним дышит подложка в тонах bone (без серого); по load кадр проявляется
   с подъёмом на 8px. Уже закэшированный кадр класса .sk не получает — появляется сразу.
   Класс ставит assets/catalog-cards.js; без JS правило не срабатывает и кадр виден как обычно. */
.pshot.sk{background:linear-gradient(100deg,var(--bone-2) 30%,var(--bone-1) 50%,var(--bone-2) 70%);
  background-size:220% 100%;animation:sksweep 1.6s linear infinite}
.pshot.sk img{opacity:0;translate:0 8px}
.pshot.is-loaded img{opacity:1;translate:0 0}
@keyframes sksweep{from{background-position:120% 0}to{background-position:-120% 0}}
/* Бейдж класса — стеклянная плашка на фото: подложка видна сквозь, светлая кромка сверху. */
.badge{position:absolute;left:12px;top:12px;z-index:1;font-size:var(--fs-xs);letter-spacing:.08em;
  text-transform:uppercase;background:rgba(20,16,12,.42);color:var(--on-dark);
  padding:6px 11px;border-radius:999px;border:1px solid rgba(253,251,246,.22);
  -webkit-backdrop-filter:blur(10px) saturate(1.2);backdrop-filter:blur(10px) saturate(1.2);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.18)}
.badge.b-delux{background:rgba(43,26,16,.62)}
.badge.b-elit{background:rgba(90,52,24,.58)}
.badge.b-prem{background:rgba(20,16,12,.42)}
/* Блик за курсором: мягкий свет следует за мышью по карточке (координаты пишет pages.js) */
.pcard,.dev-card,.dcard,.dcardbig{position:relative}
.pcard::after,.dev-card::after,.dcard::after,.dcardbig::after{content:"";position:absolute;inset:0;z-index:2;
  pointer-events:none;opacity:0;border-radius:inherit;
  background:radial-gradient(260px circle at var(--mx,50%) var(--my,50%),rgba(255,255,255,.28),rgba(255,255,255,0) 62%);
  transition:opacity .35s var(--ease-soft)}
.pcard:hover::after,.dev-card:hover::after,.dcard:hover::after,.dcardbig:hover::after{opacity:1}
.pcard .pshot::before,.dev-card .pshot::before{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.35),inset 0 0 0 1px rgba(31,27,21,.06)}
@media (hover:none){.pcard::after,.dev-card::after,.dcard::after,.dcardbig::after{display:none}}

/* ── режим «Плитка» (по умолчанию) ──
   Фото во всю карточку 4:5, снизу стеклянная плашка: имя серифом и цена «от». Под курсором
   плашка приподнимается и раскрывает три факта: район · метро, класс · застройщик, этажность · срок. */
.pcard{aspect-ratio:4/5}
.pcard .pc-link{position:absolute;inset:0}
.pcard .pshot{position:absolute;inset:0;aspect-ratio:auto}
.pc-body{position:absolute;left:10px;right:10px;bottom:10px;z-index:1;display:flex;flex-direction:column;
  border-radius:6px;padding:13px 15px 12px;color:var(--text);
  background:color-mix(in srgb,var(--bone-0) 86%,transparent);border:1px solid color-mix(in srgb,var(--bone-0) 60%,transparent);
  -webkit-backdrop-filter:blur(14px) saturate(1.2);backdrop-filter:blur(14px) saturate(1.2);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.85),0 6px 14px -10px rgba(31,27,21,.35);
  transition:transform .45s var(--ease)}
/* тёмный режим: плашка из чернильного стекла, кромка гаснет */
:root[data-theme="dark"] .pc-body{box-shadow:inset 0 1px 0 rgba(255,255,255,.08),0 6px 14px -10px rgba(0,0,0,.6)}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]) .pc-body{box-shadow:inset 0 1px 0 rgba(255,255,255,.08),0 6px 14px -10px rgba(0,0,0,.6)}}
.pcard:hover .pc-body,.pcard:focus-within .pc-body{transform:translateY(-6px)}
.pc-head{display:flex;justify-content:space-between;align-items:baseline;gap:6px 12px;flex-wrap:wrap}
.pcard .h{display:block;font-family:var(--serif);font-weight:500;font-size:1.42rem;line-height:1.05;
  color:var(--text-strong);margin:0;min-width:0;text-wrap:balance}
.pcard .price{font-size:.86rem;font-weight:600;color:var(--text-strong);white-space:nowrap;
  font-variant-numeric:tabular-nums lining-nums}
.pcard .price.nodata{font-weight:500;color:var(--text-faint)}
.pc-more{display:grid;grid-template-rows:0fr;transition:grid-template-rows .45s var(--ease)}
.pc-in{overflow:hidden;min-height:0;display:flex;flex-direction:column;gap:3px;font-size:.84rem;
  line-height:1.35;color:var(--text-muted)}
.pc-in > :first-child{padding-top:9px;margin-top:9px;border-top:1px solid rgba(31,27,21,.12)}
.pcard:hover .pc-more,.pcard:focus-within .pc-more{grid-template-rows:1fr}
.pc-sub,.pc-f{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pc-sd{display:none}
.pc-facts,.pc-go{display:none}
/* на тач-экране «наведения» нет — факты видны сразу, плашка не прячет их за жестом */
@media (hover:none){.pc-more{grid-template-rows:1fr}.pcard:hover .pc-body{transform:none}}
/* «Сравнить» — стеклянная пилюля в правом верхнем углу кадра; отмеченная становится чернильной.
   Кнопка живёт только там, где есть движок сравнения (#cat.has-cmp) — без него её незачем показывать. */
.pc-cmp{display:none;position:absolute;right:12px;top:12px;z-index:3;align-items:center;gap:7px;
  min-height:34px;padding:6px 12px 6px 7px;border-radius:999px;cursor:pointer;
  font:600 var(--fs-xs)/1 var(--sans);letter-spacing:.02em;color:var(--on-dark);
  background:rgba(20,16,12,.42);border:1px solid rgba(253,251,246,.22);
  -webkit-backdrop-filter:blur(10px) saturate(1.2);backdrop-filter:blur(10px) saturate(1.2);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.18);
  transition:background var(--dur-hover) var(--ease-soft),border-color var(--dur-hover) var(--ease-soft),
    transform var(--dur-press) var(--ease-soft),opacity var(--dur-hover) var(--ease-soft)}
.has-cmp .pc-cmp{display:inline-flex}
/* Тишина: на десктопе «Сравнить» появляется только у карточки под курсором/фокусом или уже выбранной;
   на тач-устройствах — всегда, но без подписи (кружок), чтобы не спорить с бейджем класса. */
@media (hover:hover){
  .has-cmp .pcard .pc-cmp{opacity:0}
  .has-cmp .pcard:hover .pc-cmp,.has-cmp .pcard:focus-within .pc-cmp,.has-cmp .pc-cmp[aria-pressed="true"]{opacity:1}
}
@media (hover:none){
  .has-cmp .pc-cmp{padding:6px;gap:0}
  .has-cmp .pc-cmp .pc-cmp-t{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
  .has-cmp .pc-cmp[aria-pressed="true"]{padding:6px 12px 6px 7px;gap:7px}
  .has-cmp .pc-cmp[aria-pressed="true"] .pc-cmp-t{position:static;width:auto;height:auto;clip:auto}
}
.pc-cmp:hover{background:rgba(20,16,12,.62);border-color:rgba(253,251,246,.5)}
.pc-cmp:active{transform:scale(.97)}
.pc-cmp:focus-visible{outline:2px solid var(--bone-0);outline-offset:2px}
.pc-box{width:16px;height:16px;border-radius:50%;border:1px solid rgba(253,251,246,.7);display:grid;
  place-items:center;flex:none;transition:background var(--dur-hover) var(--ease-soft)}
.pc-box::after{content:"";width:7px;height:7px;border-radius:50%;background:var(--bone-0);
  transform:scale(.4);opacity:0;transition:transform .2s var(--ease),opacity .15s}
.pc-cmp[aria-pressed="true"]{background:var(--text-strong);border-color:var(--text-strong)}
.pc-cmp[aria-pressed="true"] .pc-box{border-color:currentColor}
.pc-cmp[aria-pressed="true"] .pc-box::after{transform:scale(1);opacity:1}
/* три уже выбраны — остальные кнопки гаснут, снять выбранную можно всегда */
.cmp-full .pc-cmp:not([aria-pressed="true"]){opacity:.45;cursor:not-allowed}

/* ── режим «Журнал» ──
   Один проект в строке: фото 3:2 через одну слева/справа, имя 2rem, район · метро,
   три факта ведомостью с точечным отточием и «Подробнее →». */
.v-journal .pgrid{display:flex;flex-direction:column;gap:0;border-top:1px solid var(--line)}
.v-journal .pcard{aspect-ratio:auto;display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);
  gap:0 clamp(24px,4vw,48px);align-items:start;padding:clamp(22px,3vw,34px) 0;
  border:0;border-bottom:1px solid var(--line);border-radius:0;background:transparent;box-shadow:none;
  overflow:visible}
.v-journal .pcard:hover{transform:none;box-shadow:none}
.v-journal .pcard::after{display:none}
.v-journal .pc-link{position:static;display:grid;grid-template-columns:subgrid;grid-column:1/-1;grid-row:1;
  align-items:start;height:auto}   /* row 1 явно: иначе автоплейсмент уводит ссылку под кнопку «Сравнить» */
.v-journal .pc-link:focus-visible{outline-offset:6px;border-radius:6px}
.v-journal .pshot{position:relative;inset:auto;grid-column:1;aspect-ratio:3/2;border-radius:6px}
.v-journal .pcard:nth-child(even of .pcard:not([hidden])) .pshot{grid-column:2;grid-row:1}
.v-journal .pc-body{position:static;grid-column:2;grid-row:1;padding:4px 0 0;border:0;background:none;
  box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;transform:none!important;min-width:0}
.v-journal .pc-in > :first-child,.v-list .pc-in > :first-child{border-top:0;padding-top:0;margin-top:0}
.v-journal .pcard:nth-child(even of .pcard:not([hidden])) .pc-body{grid-column:1}
.v-journal .pc-head,.v-journal .pc-more,.v-journal .pc-in{display:contents}
.v-journal .h{font-size:clamp(1.6rem,2.4vw,2rem);font-weight:400;line-height:1.02;padding-right:132px;text-wrap:balance}
.v-journal .price{display:none}
.v-journal .pc-sub{margin-top:8px;font-size:.9rem;color:var(--text-muted);white-space:normal}
.v-journal .pc-cls{margin-top:2px;font-size:.84rem;color:var(--text-faint);white-space:normal}
.v-journal .pc-bld{display:none}
.v-journal .pc-facts{display:grid;margin-top:18px}
.v-journal .pcf{display:flex;align-items:baseline;gap:10px;padding:8px 0;border-top:1px solid var(--line);
  font-size:.9rem}
.v-journal .pcf-floors{display:none}
.v-journal .pc-facts:not(:has(.pcf-when)) .pcf-floors{display:flex}   /* срока нет — третьим фактом идёт этажность */
.v-journal .pf-k{color:var(--text-faint);white-space:nowrap}
.v-journal .pf-l{flex:1;min-width:14px;border-bottom:1px dotted rgba(31,27,21,.32);translate:0 -.32em}
.v-journal .pf-v{color:var(--text-strong);font-weight:500;white-space:nowrap;
  font-variant-numeric:tabular-nums lining-nums}
.v-journal .pc-go{display:inline-flex;align-items:center;gap:8px;margin-top:20px;font-size:.9rem;
  font-weight:600;color:var(--text-strong);transition:color var(--dur-hover) var(--ease-soft)}
.v-journal .pc-go i{font-style:normal;transition:transform .25s var(--ease)}
.v-journal .pcard:hover .pc-go{color:var(--accent-strong)}
.v-journal .pcard:hover .pc-go i{transform:translateX(4px)}
.v-journal .pcard:hover .pshot img{transform:scale(1.03)}
.v-journal .pc-cmp{position:static;grid-column:2;grid-row:1;align-self:start;justify-self:end;margin-top:2px;
  color:var(--text);background:var(--surface);border-color:var(--line);backdrop-filter:none;
  -webkit-backdrop-filter:none;box-shadow:none}
.v-journal .pcard:nth-child(even of .pcard:not([hidden])) .pc-cmp{grid-column:1}
.v-journal .pc-cmp:hover{border-color:var(--text-strong);background:var(--surface)}
.v-journal .pc-cmp:focus-visible{outline-color:var(--focus)}
.v-journal .pc-box{border-color:var(--text-decor)}
.v-journal .pc-box::after{background:var(--text-strong)}
.v-journal .pc-cmp[aria-pressed="true"]{color:var(--bone-0);background:var(--text-strong);border-color:var(--text-strong)}
.v-journal .pc-cmp[aria-pressed="true"] .pc-box{border-color:currentColor}
.v-journal .pc-cmp[aria-pressed="true"] .pc-box::after{background:var(--bone-0)}

/* ── режим «Список» (ведомость) ──
   Плотные строки: фото 96px, имя и «район · метро · минуты», бюджет входа, цена метра, срок.
   Колонки заголовка и строк — одна сетка (--lcols), чтобы шапка не разъезжалась с телом. */
.v-list{--lcols:96px minmax(0,1fr) 140px 140px 150px 124px}
.v-list .pgrid{display:flex;flex-direction:column;gap:0}
.plh[hidden]{display:none!important}
.plh{display:none;grid-template-columns:var(--lcols);gap:0 20px;align-items:center;padding:6px 6px 10px;
  border-bottom:1px solid var(--text-strong);font-size:var(--fs-xs);letter-spacing:.06em;
  text-transform:uppercase;color:var(--text-faint)}
.v-list .plh{display:grid}
.plh > span{grid-column:2}
.plh-s{appearance:none;background:none;border:0;padding:6px 0;margin:-6px 0;font:inherit;color:inherit;
  letter-spacing:inherit;text-transform:inherit;cursor:pointer;display:inline-flex;align-items:center;gap:6px;
  border-radius:4px;transition:color var(--dur-hover) var(--ease-soft)}
.plh-s:hover,.plh-s[aria-pressed="true"]{color:var(--text-strong)}
.plh-s:focus-visible{outline:2px solid var(--focus);outline-offset:2px}
.plh-s i{font-style:normal;opacity:.55;transition:transform .25s var(--ease),opacity .2s}
.plh-s[aria-pressed="true"] i{opacity:1}
.plh-s[data-dir="desc"] i{transform:rotate(180deg)}
.v-list .pcard{aspect-ratio:auto;display:grid;grid-template-columns:var(--lcols);grid-template-rows:auto auto;
  gap:0 20px;align-items:center;padding:10px 6px;margin:0 -6px;
  border:0;border-bottom:1px solid var(--line);border-radius:4px;background:transparent;box-shadow:none;
  overflow:visible;transition:background var(--dur-hover) var(--ease-soft),transform .35s var(--ease)}
.v-list .pcard:hover{transform:none;background:var(--bone-0);box-shadow:none}
.v-list .pcard::after{display:none}
.v-list .pc-link{position:static;display:grid;grid-template-columns:subgrid;grid-template-rows:subgrid;
  grid-column:1/6;grid-row:1/3;align-items:center;height:auto}
.v-list .pc-link:focus-visible{outline-offset:2px;border-radius:4px}
.v-list .pshot{position:relative;inset:auto;grid-column:1;grid-row:1/3;width:96px;height:72px;
  aspect-ratio:auto;border-radius:3px}
.v-list .badge{display:none}
.v-list .pc-body,.v-list .pc-head,.v-list .pc-more,.v-list .pc-in,.v-list .pc-facts{display:contents}
.v-list .h{grid-column:2;grid-row:1;align-self:end;font-size:1.3rem;font-weight:500;line-height:1.1;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-wrap:initial}
.v-list .pc-sub{grid-column:2;grid-row:2;align-self:start;margin-top:3px;font-size:.82rem;color:var(--text-muted)}
.v-list .pc-sd{display:inline;color:var(--text-faint)}
.v-list .pc-cls,.v-list .pc-bld,.v-list .pc-facts .pcf-price,.v-list .pc-facts .pcf-floors,.v-list .pc-go,
.v-list .pf-k,.v-list .pf-l{display:none}
.v-list .price{grid-column:3;grid-row:1/3;font-size:.95rem}
.v-list .price.nodata{font-size:.82rem;white-space:normal}
.v-list .pcf-m2{grid-column:4;grid-row:1/3}
.v-list .pcf-when{grid-column:5;grid-row:1/3}
.v-list .pcf{display:block;min-width:0}
.v-list .pf-v{font-size:.88rem;font-weight:500;color:var(--text-muted);font-variant-numeric:tabular-nums lining-nums}
.v-list .pcf-m2 .pf-v{color:var(--text-strong)}
.v-list .pc-cmp{position:static;grid-column:6;grid-row:1/3;justify-self:end;
  color:var(--text);background:transparent;border-color:var(--line);backdrop-filter:none;
  -webkit-backdrop-filter:none;box-shadow:none}
.v-list .pc-cmp:hover{border-color:var(--text-strong);background:var(--surface)}
.v-list .pc-cmp:focus-visible{outline-color:var(--focus)}
.v-list .pc-box{border-color:var(--text-decor)}
.v-list .pc-box::after{background:var(--text-strong)}
.v-list .pc-cmp[aria-pressed="true"]{color:var(--bone-0);background:var(--text-strong);border-color:var(--text-strong)}
.v-list .pc-cmp[aria-pressed="true"] .pc-box{border-color:currentColor}
.v-list .pc-cmp[aria-pressed="true"] .pc-box::after{background:var(--bone-0)}
/* строки пересортировываются со сдвигом (FLIP): .flip — кадр на старом месте, .flip-run — переезд */
.pcard.flip{transition:none!important}
.pcard.flip-run{transition:transform .45s var(--ease)!important}

/* ── переключатель режима в панели фильтров ── */
.fview{display:inline-flex;padding:3px;gap:2px;border:1px solid var(--line);border-radius:999px;background:var(--surface)}
.fvb{appearance:none;border:0;background:transparent;color:var(--text-muted);font:inherit;font-size:var(--fs-xs);
  font-weight:600;letter-spacing:.02em;display:inline-flex;align-items:center;gap:6px;min-height:30px;
  padding:0 11px;border-radius:999px;cursor:pointer;
  transition:background var(--dur-hover) var(--ease-soft),color var(--dur-hover) var(--ease-soft)}
.fvb svg{width:15px;height:15px;flex:none}
.fvb:hover{color:var(--text-strong)}
.fvb[aria-pressed="true"]{background:var(--text-strong);color:var(--bone-0)}
.fvb:focus-visible{outline:2px solid var(--focus);outline-offset:2px}
/* до 1440 строка фильтров полна: подписи режимов прячем, остаются пиктограммы с title/aria-label */
@media (max-width:1440px){.fvb span{display:none}.fvb{padding:0 10px}}
@media (max-width:720px){
  .fbar{justify-content:space-between;align-items:center}
  .fbar .fview{background:var(--surface);box-shadow:0 10px 24px -12px rgba(90,62,38,.55)}
  .fbar .fvb span{display:none}
  .fbar .fvb{padding:0 10px;min-height:32px}
  .cat-off .fbar .fview{pointer-events:auto}
}

/* ── телефон: плитка 4:3 в одну колонку, журнал столбиком, ведомость в две строки ── */
@media (max-width:560px){
  .pcard{aspect-ratio:4/3}
  .pc-body{left:8px;right:8px;bottom:8px;padding:11px 13px 10px}
  .pcard .h{font-size:1.3rem}
  .pc-cmp{padding:6px 10px 6px 6px}
  .v-journal .pcard{grid-template-columns:1fr;gap:14px 0;padding:20px 0;align-items:start}
  .v-journal .pc-link{grid-template-rows:auto auto;grid-row:1}
  .v-journal .pshot,.v-journal .pcard:nth-child(even of .pcard:not([hidden])) .pshot{grid-column:1;grid-row:1}
  .v-journal .pc-body,.v-journal .pcard:nth-child(even of .pcard:not([hidden])) .pc-body{grid-column:1;grid-row:2}
  .v-journal .pc-cmp,.v-journal .pcard:nth-child(even of .pcard:not([hidden])) .pc-cmp{grid-column:1;grid-row:1;
    align-self:start;justify-self:end;margin:10px 10px 0 0;position:relative;z-index:3;
    color:var(--on-dark);background:rgba(20,16,12,.42);border-color:rgba(253,251,246,.22);
    -webkit-backdrop-filter:blur(10px) saturate(1.2);backdrop-filter:blur(10px) saturate(1.2)}
  .v-journal .pc-cmp[aria-pressed="true"]{background:var(--text-strong)}
  .v-journal .pc-box{border-color:rgba(253,251,246,.7)}
  .v-journal .pc-box::after{background:var(--bone-0)}
  .v-journal .h{font-size:1.7rem;padding-right:0}
  .v-journal .pc-facts{margin-top:14px}
  .v-list{--lcols:72px minmax(0,1fr) auto}
  .v-list .plh{display:none}
  .v-list .pcard{grid-template-rows:auto auto auto;gap:0 14px;padding:10px 0;margin:0;border-radius:0}
  .v-list .pc-link{grid-column:1/3;grid-row:1/4}
  .v-list .pshot{grid-row:1/4;width:72px;height:54px}
  .v-list .h{font-size:1.15rem;align-self:auto}
  .v-list .pc-sub{margin-top:1px;white-space:normal;overflow:visible;font-size:.8rem}
  .v-list .pc-sd{display:none}
  .v-list .pc-facts{display:flex;grid-column:2;grid-row:3;gap:4px 12px;flex-wrap:wrap;margin-top:5px;
    font-variant-numeric:tabular-nums lining-nums}
  .v-list .price{display:none}
  .v-list .pc-facts .pcf-price{display:block}
  .v-list .pcf-m2,.v-list .pcf-when{grid-column:auto;grid-row:auto}
  .v-list .pf-v{font-size:.82rem}
  .v-list .pcf-price .pf-v{color:var(--text-strong);font-weight:600}
  .v-list .pc-cmp{grid-column:3;grid-row:1/4;padding:0;width:34px;justify-content:center;gap:0}
  .v-list .pc-cmp .pc-cmp-t{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
  .v-list .pc-cmp .pc-box{margin:0}
}

/* ── сравнение проектов ──
   Отмеченные «Сравнить» карточки собираются в таблицу под каталогом: липкая шапка с именами и
   липкая первая колонка параметров, «только различия», лучшая цена — глиной. Выбор живёт в
   localStorage; липкая плашка внизу ведёт к таблице и даёт снять любой проект одним нажатием. */
.cmp{margin-top:var(--sp-8);padding-top:var(--sp-6);border-top:1px solid var(--line);scroll-margin-top:150px}
@media (max-width:720px){.cmp{scroll-margin-top:120px}}
.cmp[hidden]{display:none}
.cmp-bar{display:flex;align-items:flex-end;justify-content:space-between;gap:12px 20px;flex-wrap:wrap;
  padding-bottom:12px;border-bottom:1px solid var(--text-strong)}
.cmp-t{font-family:var(--serif);font-weight:400;font-size:var(--fs-h3);color:var(--text-strong);line-height:1;margin:0}
.cmp-t b{font-weight:500;color:var(--accent-strong);font-variant-numeric:tabular-nums lining-nums}
.cmp-tools{display:flex;align-items:center;gap:18px;font-size:var(--fs-sm);color:var(--text-muted);flex-wrap:wrap}
.cmp-lg{display:inline-flex;align-items:center;gap:7px}
.cmp-lg i{width:8px;height:8px;border-radius:50%;background:var(--accent-strong)}
.cmp-diff{position:relative;display:inline-flex;align-items:center;gap:8px;cursor:pointer;user-select:none;min-height:44px}
.cmp-diff input{position:absolute;opacity:0;width:1px;height:1px;margin:0;pointer-events:none}
.cmp-diff:has(input:focus-visible) .cmp-sw{outline:2px solid var(--focus);outline-offset:2px}
.cmp-sw{position:relative;width:32px;height:19px;border-radius:999px;background:var(--bone-3);border:1px solid var(--line);
  transition:background .2s var(--ease-soft),border-color .2s var(--ease-soft);flex:none}
.cmp-sw::after{content:"";position:absolute;top:2px;left:2px;width:13px;height:13px;border-radius:50%;background:var(--bone-0);
  box-shadow:0 1px 2px rgba(31,27,21,.25);transition:transform .2s var(--ease)}
.cmp-diff input:checked+.cmp-sw{background:var(--text-strong);border-color:var(--text-strong)}
.cmp-diff input:checked+.cmp-sw::after{transform:translateX(13px)}
.cmp-clear{appearance:none;border:0;background:none;font:inherit;font-size:var(--fs-sm);color:var(--text-muted);
  text-decoration:underline;text-underline-offset:3px;cursor:pointer;padding:10px 0;transition:color var(--dur-hover) var(--ease-soft)}
.cmp-clear:hover{color:var(--text-strong)}
.cmp-clear:focus-visible{outline:2px solid var(--focus);outline-offset:2px;border-radius:4px}
.cmp-hint{margin:10px 0 0;font-size:var(--fs-sm);color:var(--text-muted);min-height:1.4em}
.cmp-hint:empty{display:none}
.cmp-wrap{margin-top:12px;max-height:min(72vh,640px);overflow:auto;position:relative;scrollbar-width:thin;
  background:var(--bone-0);border:1px solid var(--line);border-radius:8px;overscroll-behavior-x:contain}
.cmp-wrap:focus-visible{outline:2px solid var(--focus);outline-offset:-2px}
.cmp-tb{display:grid;grid-template-columns:var(--ck,168px) repeat(var(--cn,2),minmax(190px,1fr));min-width:max-content}
.cmp-r{display:contents}
.cmp-c{padding:11px 14px;border-bottom:1px solid var(--line);font-size:var(--fs-sm);min-width:0;color:var(--text-strong);
  background:var(--bone-0);font-variant-numeric:tabular-nums lining-nums;line-height:1.4;text-wrap:pretty;
  transition:background var(--dur-hover) var(--ease-soft)}
.cmp-c.soft{color:var(--text-faint);font-style:italic}
.cmp-c.best{color:var(--accent-strong);font-weight:600}
.cmp-k{position:sticky;left:0;z-index:1;color:var(--text-faint);font-size:var(--fs-xs);letter-spacing:.06em;
  text-transform:uppercase;font-style:normal;padding-top:13px;font-weight:600;white-space:nowrap;
  box-shadow:1px 0 0 var(--line)}
.cmp-h{position:sticky;top:0;z-index:2;background:var(--bone-0);font-family:var(--serif);font-size:1.15rem;font-weight:500;
  padding:12px 14px;border-bottom:1px solid var(--text-strong);display:flex;align-items:center;gap:10px;
  font-variant-numeric:lining-nums}
.cmp-h.cmp-k{font-family:var(--sans);font-size:var(--fs-xs);padding-top:16px;z-index:3}
.cmp-h a{color:var(--text-strong);text-decoration:none;border-bottom:1px solid transparent;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transition:border-color var(--dur-hover) var(--ease-soft)}
.cmp-h a:hover{border-bottom-color:currentColor}
.cmp-x{appearance:none;border:1px solid var(--line);background:var(--surface);color:var(--text-muted);width:26px;height:26px;
  border-radius:50%;display:grid;place-items:center;cursor:pointer;flex:none;margin-left:auto;font:inherit;font-size:.9rem;
  line-height:1;transition:color var(--dur-hover) var(--ease-soft),border-color var(--dur-hover) var(--ease-soft)}
.cmp-x:hover{color:var(--accent-strong);border-color:var(--accent)}
.cmp-x:focus-visible{outline:2px solid var(--focus);outline-offset:2px}
.cmp-r:not(.cmp-rh):hover .cmp-c{background:var(--bone-1)}
.cmp-r.same .cmp-k::after{content:"совпадает";display:block;text-transform:none;letter-spacing:0;color:var(--text-decor);
  font-weight:400;font-size:.72rem;margin-top:1px}
.cmp-r[hidden]{display:none}
.cmp-nodiff{padding:18px 14px;margin:0;font-size:var(--fs-sm);color:var(--text-muted)}
.cmp-nodiff[hidden]{display:none}
.cmp-xhint{margin:8px 0 0;font-size:var(--fs-xs);color:var(--text-faint)}
.cmp-xhint[hidden]{display:none}
.cmp-foot{display:flex;align-items:center;gap:var(--sp-4) var(--sp-5);flex-wrap:wrap;margin:var(--sp-5) 0 0}
.cmp-foot .tomap{padding:11px 20px;font-size:var(--fs-sm)}
.cmp-foot span{font-size:var(--fs-sm);color:var(--text-muted)}
/* липкая плашка: сколько выбрано, кто именно, и переход к таблице */
/* остров по центру внизу, а не полоса во всю ширину: справа внизу живут чужие плавающие панели */
.cmpbar{position:fixed;left:max(16px,calc((100% - var(--maxw)) / 2));bottom:calc(16px + env(safe-area-inset-bottom,0px));
  z-index:35;width:min(720px,calc(100% - 32px));padding:10px 12px 10px 18px;border-radius:14px;
  background:rgba(246,241,232,.86);border:1px solid var(--line);
  -webkit-backdrop-filter:blur(16px) saturate(1.2);backdrop-filter:blur(16px) saturate(1.2);
  box-shadow:0 1px 1px rgba(90,62,38,.05),0 14px 30px -18px rgba(31,27,21,.45);
  transform:translateY(calc(100% + 24px));transition:transform .45s var(--ease)}
.cmpbar.on{transform:none}
.cmpbar.on.away{transform:translateY(calc(100% + 24px))}   /* таблица уже на экране — плашка не нужна */
.cmpbar[hidden]{display:none}
.cmpbar-in{display:flex;align-items:center;justify-content:space-between;gap:12px 20px;width:auto;margin:0}
.cmpbar-l{display:flex;align-items:center;gap:8px 12px;flex-wrap:wrap;min-width:0}
.cmpbar-t{font-family:var(--serif);font-size:1.15rem;color:var(--text-strong);white-space:nowrap;
  font-variant-numeric:lining-nums}
.cmpbar-t b{font-weight:500;color:var(--accent-strong)}
.cmpbar-chip{display:inline-flex;align-items:center;gap:6px;max-width:220px;min-height:34px;padding:5px 6px 5px 12px;
  border:1px solid var(--line);border-radius:999px;background:var(--surface);font-size:var(--fs-sm);color:var(--text-strong)}
.cmpbar-chip span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cmpbar-chip .cmp-x{width:22px;height:22px;margin:0;font-size:.8rem}
.cmpbar-hint{font-size:var(--fs-sm);color:var(--text-muted)}
.cmpbar-go{appearance:none;border:1px solid var(--text-strong);background:var(--text-strong);color:var(--bone-0);
  font:inherit;font-size:var(--fs-sm);font-weight:600;min-height:42px;padding:9px 20px;border-radius:999px;cursor:pointer;
  white-space:nowrap;display:inline-flex;align-items:center;gap:8px;
  transition:background var(--dur-hover) var(--ease-soft),border-color var(--dur-hover) var(--ease-soft),
    transform var(--dur-press) var(--ease-soft),opacity var(--dur-hover) var(--ease-soft)}
.cmpbar-go:hover{background:var(--accent-strong);border-color:var(--accent-strong)}
.cmpbar-go:active{transform:scale(.98)}
.cmpbar-go:focus-visible{outline:2px solid var(--focus);outline-offset:3px}
.cmpbar-go[disabled]{opacity:.5;cursor:default}
.cmpbar-go[disabled]:hover{background:var(--text-strong);border-color:var(--text-strong)}
.has-cmpbar .ffab{bottom:calc(72px + env(safe-area-inset-bottom,0px))}
@media (max-width:720px){
  .cmpbar{padding:8px 8px 8px 14px;left:12px;width:calc(100% - 24px);bottom:calc(12px + env(safe-area-inset-bottom,0px))}
  .cmpbar-in{gap:10px}
  .cmpbar-chip{display:none}
  .cmpbar-hint{display:none}
  .cmpbar-go{min-height:40px;padding:8px 16px}
  .cmp-bar{flex-direction:column;align-items:flex-start}
  .cmp-tools{gap:10px 14px}
  .cmp-tb{grid-template-columns:var(--ck,118px) repeat(var(--cn,2),minmax(150px,1fr))}
  .cmp-c{padding:10px 12px;font-size:.86rem}
  .cmp-h{font-size:1.02rem}
  .cmp-r.same .cmp-k::after{content:none}
}
@media (prefers-reduced-motion:reduce){
  .pshot.sk{animation:none}
  .pshot.sk img{translate:0 0}
  .pc-body,.pc-more,.cmpbar,.cmp-c,.plh-s i{transition:none!important}
}

.empty{padding:var(--sp-9) 0;text-align:center;color:var(--text-muted)}
.empty #femptyr{margin-top:var(--sp-4)}
.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
.empty .h{display:block;font-family:var(--serif);font-weight:400;font-size:var(--fs-h3);color:var(--text-strong);
  margin-bottom:var(--sp-3)}
.empty[hidden]{display:none}

/* ── карточка проекта ── */
/* Герой: слева имя и строка «кто и где», справа панель решения. Панель — единственный
   поднятый объект на экране: бумага bone-0, волосяная кромка, светлая верхняя грань. */
.phero.solo{grid-template-columns:1fr}
.phero{display:grid;gap:clamp(28px,4vw,64px);grid-template-columns:minmax(0,1.12fr) minmax(300px,.88fr);
  align-items:start;padding-top:calc(var(--sp-8) + 46px)}
/* Разворот журнала (решение 6): слева фотография во всю высоту первого экрана, справа — имя,
   лид, ведомость фактов и действие. Сетка 12: фото 7 колонок, текст 5. */
.phero.spread{position:relative;grid-template-columns:minmax(0,7fr) minmax(320px,5fr);gap:clamp(28px,4vw,72px);
  align-items:stretch;padding-top:calc(var(--sp-7) + 46px);padding-bottom:var(--sp-6)}
.phero.spread.nofig{grid-template-columns:1fr}
/* Сетка как структура (решение 8): на десктопе — тонкие направляющие 12 колонок за первым экраном */
@media (min-width:1100px){
  .phero.spread::before{content:"";position:absolute;inset:0;pointer-events:none;z-index:0;opacity:.55;
    background-image:linear-gradient(90deg,var(--line) 1px,transparent 1px);
    background-size:calc((100% + 24px) / 12) 100%;background-position:0 0;
    -webkit-mask-image:linear-gradient(180deg,rgba(0,0,0,.9),rgba(0,0,0,0) 92%);mask-image:linear-gradient(180deg,rgba(0,0,0,.9),rgba(0,0,0,0) 92%)}
  .phero.spread > *{position:relative;z-index:1}
}
.ph-photo{min-width:0}
.ph-fig{position:relative;margin:0;height:100%;min-height:420px;border-radius:16px;overflow:hidden;
  background:var(--surface-raised);box-shadow:inset 0 1px 0 rgba(255,255,255,.5)}
.ph-fig > button[data-gal-open]{display:block;width:100%;height:100%;padding:0;border:0;background:none;cursor:zoom-in}
.ph-fig img{width:100%;height:100%;object-fit:cover;display:block;animation:galken 14s var(--ease-soft) both;
  transition:transform .7s var(--ease)}
.ph-fig > button[data-gal-open]:hover img{animation-play-state:paused;transform:scale(1.03)}
.ph-fig > button[data-gal-open]:focus-visible{outline:2px solid var(--focus);outline-offset:-3px}
.ph-fig::after{content:"";position:absolute;inset:0;pointer-events:none;border-radius:16px;box-shadow:inset 0 0 0 1px rgba(31,27,21,.08)}
.ph-copy{min-width:0;display:flex;flex-direction:column;padding-block:var(--sp-2)}
.ph-copy .eyebrow{margin-top:var(--sp-4)}
.phero h1,.pdoc .psec > h2{text-shadow:0 1px 0 rgba(255,255,255,.55)}   /* лёгкий letterpress на бумаге (решение 55) */
/* Ведомость фактов (решение 5): группы курсивом, строки «подпись … значение» с точечной отбивкой */
.pledger{display:grid;grid-template-columns:1fr;gap:0;margin-top:var(--sp-6);border-top:1px solid var(--ink-900)}
.pl-g{min-width:0;padding:12px 0 6px;border-bottom:1px solid var(--line)}
.pl-g:last-child{border-bottom:0}
.pl-gt{font-family:var(--serif);font-style:italic;font-weight:500;font-size:1.15rem;line-height:1.1;color:var(--accent-strong);
  margin:0 0 6px;text-shadow:none}
.pl-g dl{margin:0}
.pl-row{display:flex;align-items:baseline;gap:10px;padding:5px 0;font-size:.95rem}
.pl-row dt{color:var(--text-muted);flex:0 1 auto;white-space:nowrap}
.pl-lead{flex:1 1 14px;min-width:14px;border-bottom:1px dotted var(--line-strong);transform:translateY(-.3em)}
.pl-row dd{margin:0;color:var(--text-strong);font-weight:500;text-align:right;flex:0 1 auto;
  font-variant-numeric:tabular-nums lining-nums;line-height:1.35}
.pl-row dd[data-count]{font-size:1.02rem}
.ph-copy .pk-cta{padding-top:var(--sp-5);margin-top:auto}
/* Карта-гравюра с брендовой меткой (решение 19) */
.mapcard{position:relative;display:grid;grid-template-columns:auto 1fr;align-items:center;gap:18px;
  min-height:150px;padding:22px 24px;border-radius:16px;overflow:hidden;text-decoration:none;color:var(--text-strong);
  background:var(--bone-3);border:1px solid var(--line);box-shadow:inset 0 1px 0 rgba(255,255,255,.55);
  transition:transform var(--dur) var(--ease),box-shadow var(--dur) var(--ease),border-color var(--dur-hover) var(--ease-soft)}
.mapcard:hover{transform:translateY(-2px);border-color:var(--line-strong);box-shadow:inset 0 1px 0 rgba(255,255,255,.55),0 8px 8px -6px rgba(90,62,38,.18)}
.mapcard:focus-visible{outline:2px solid var(--focus);outline-offset:3px}
.mc-bg{position:absolute;inset:0;width:100%;height:100%;color:var(--ink-900);pointer-events:none}
/* Оттиск — тот же, что метка на карте: чернильная монета, золотой контур в 1.5px с отступом, золотой знак 56% */
.mc-pin{position:relative;z-index:1;display:grid;place-items:center;width:56px;height:56px;border-radius:50%;
  background:radial-gradient(circle at 50% 30%,#2A241C,#1A1611 70%);color:var(--on-dark);
  box-shadow:0 0 0 1.5px rgba(201,165,94,.9) inset,0 0 0 4px #1A1611 inset,inset 0 1px 0 rgba(255,255,255,.14),0 6px 8px -6px rgba(31,27,21,.5)}
.mc-pin svg{width:20px;height:31px;fill:#C9A55E}
.mc-pin::before,.mc-pin::after{content:"";position:absolute;inset:-6px;border-radius:50%;border:1px solid rgba(201,165,94,.55);
  animation:mcring 3.2s var(--ease-soft) infinite}
.mc-pin::after{inset:-16px;animation-delay:.9s;border-color:rgba(201,165,94,.35)}
@keyframes mcring{0%{transform:scale(.7);opacity:0}30%{opacity:1}100%{transform:scale(1.35);opacity:0}}
.mc-txt{position:relative;z-index:1;display:flex;flex-direction:column;gap:4px;min-width:0}
.mc-txt b{font-family:var(--serif);font-weight:400;font-size:1.35rem;line-height:1.15}
.mc-txt span{font-size:var(--fs-sm);color:var(--text-muted)}
.maplink2{display:inline-block;margin-top:var(--sp-4);font-size:var(--fs-sm)}
@media (prefers-reduced-motion:reduce){.mc-pin::before,.mc-pin::after{animation:none;opacity:.5;transform:none}.ph-fig img{animation:none}}
.phero h1{font-size:clamp(2.4rem,4.8vw,4rem);line-height:1.02;margin:var(--sp-3) 0 0;
  letter-spacing:-.005em;text-wrap:balance}
.pmeta{display:flex;flex-wrap:wrap;align-items:center;gap:6px 14px;margin-top:var(--sp-4);
  color:var(--text-muted);font-size:var(--fs-sm)}
.pmeta > span + span::before,.pmeta > span + a::before,.pmeta > a + span::before{content:"·";margin-right:14px;color:var(--text-decor)}
.pmeta a{color:var(--text-strong);text-decoration:none;border-bottom:1px solid var(--line-strong);
  transition:color var(--dur-hover) var(--ease-soft),border-color var(--dur-hover) var(--ease-soft)}
.pmeta a:hover{color:var(--accent-strong);border-color:currentColor}
.tag{font-size:var(--fs-xs);letter-spacing:.07em;text-transform:uppercase;
  border:1px solid var(--line);border-radius:999px;padding:5px 11px;color:var(--text-muted)}
.tag.hi{background:var(--text-strong);border-color:var(--text-strong);color:var(--bone-0)}
.tag a{color:inherit;text-decoration:none}
.pabout{margin-top:var(--sp-5);color:var(--text);font-size:var(--fs-lede);line-height:1.55;max-width:56ch;
  text-wrap:pretty}
.pkey{background:var(--bone-0);border:1px solid var(--line);border-radius:16px;
  box-shadow:inset 0 1px 0 #fff,0 1px 2px rgba(90,62,38,.05),0 6px 8px -6px rgba(90,62,38,.12);
  padding:clamp(20px,2.4vw,28px) clamp(20px,2.4vw,28px) clamp(18px,2vw,24px)}
/* dl.pkey — сетка фактов на страницах застройщика и классов (карточка проекта использует aside.pkey) */
dl.pkey{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:var(--sp-5);margin:0}
dl.pkey div{display:flex;flex-direction:column;gap:4px}
dl.pkey dt{font-size:var(--fs-xs);letter-spacing:.07em;text-transform:uppercase;color:var(--text-faint)}
dl.pkey dd{margin:0;font-family:var(--sans);font-size:1.22rem;font-weight:500;line-height:1.25;letter-spacing:-.01em;
  color:var(--text-strong);font-variant-numeric:tabular-nums lining-nums}
dl.pkey .v.sm{font-size:1rem;font-weight:400;line-height:1.35}
.pk-top{display:flex;flex-direction:column;gap:6px;padding-bottom:var(--sp-4);border-bottom:1px solid var(--line-strong)}
.pk-l{font-size:var(--fs-xs);letter-spacing:.09em;text-transform:uppercase;color:var(--text-faint)}
/* Цифры — только гротеском. У Cormorant старостильные цифры: 1, 2, 5 сидят на высоте
   строчных, а 6 и 8 выносятся вверх и вниз — «122 531 200» рассыпается по высоте. */
.pk-v{font-family:var(--sans);font-size:clamp(1.5rem,2.1vw,1.9rem);font-weight:500;line-height:1.1;
  letter-spacing:-.015em;color:var(--text-strong);font-variant-numeric:tabular-nums lining-nums}
.pk-rows{display:grid;margin:0}
.pk-rows div{display:flex;justify-content:space-between;align-items:baseline;gap:var(--sp-4);
  padding:10px 0;border-bottom:1px solid var(--line)}
.pk-rows dt{font-size:var(--fs-sm);color:var(--text-muted);flex:0 0 auto}
.pk-rows dd{margin:0;text-align:right;color:var(--text-strong);font-weight:500;font-size:var(--fs-sm);
  line-height:1.35;font-variant-numeric:tabular-nums lining-nums}
.pk-cta{display:flex;gap:10px;flex-wrap:wrap;padding-top:var(--sp-5)}
.pk-cta .btn{flex:1 1 auto;padding-inline:20px}
.pk-cta .btn-primary{flex:1.4 1 auto}

/* ── галерея ── */
/* Кадров у проекта бывает и четыре, и шестьдесят: герой во всю ширину плюс полоса
   миниатюр — единственная раскладка, которая не разваливается ни на одном количестве.
   Счётчик и «смотреть все» живут на самом герое, стеклянными плашками. */
.gal{display:grid;gap:8px;margin-top:var(--sp-7)}
.gal button:not(.gal-all){padding:0;border:0;background:var(--surface-raised);cursor:zoom-in;overflow:hidden;
  border-radius:8px;aspect-ratio:4/3;position:relative;display:block;width:100%}
.gal-hero{position:relative;border-radius:12px;overflow:hidden;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.5)}
.gal-hero > button:not(.gal-all){aspect-ratio:16/9;border-radius:12px}
.gal-hero::after{content:"";position:absolute;inset:0;pointer-events:none;border-radius:12px;
  box-shadow:inset 0 0 0 1px rgba(31,27,21,.08)}
.gal-strip{display:grid;grid-template-columns:repeat(5,1fr);gap:8px}
.gal-strip.n1{grid-template-columns:1fr}
.gal-strip.n2{grid-template-columns:1fr 1fr}
.gal-strip.n3{grid-template-columns:repeat(3,1fr)}
.gal-strip.n4{grid-template-columns:repeat(4,1fr)}
.gal img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .7s var(--ease)}
/* медленный кинематограф: кадр героя едва заметно «оседает» из 1.05 в 1 за 14 с */
.gal-hero img{animation:galken 14s var(--ease-soft) both}
@keyframes galken{from{transform:scale(1.05)}to{transform:scale(1)}}
.gal-hero > button:hover img{animation-play-state:paused;transform:scale(1.035)}
.gal button:hover img{transform:scale(1.035)}
.gal button:not(.gal-all):focus-visible{outline:2px solid var(--focus);outline-offset:3px}
.gal-count,.gal-all{position:absolute;bottom:14px;z-index:1;display:inline-flex;align-items:center;gap:8px;
  font:500 var(--fs-xs)/1 var(--sans);letter-spacing:.04em;color:var(--on-dark);
  background:rgba(20,16,12,.42);-webkit-backdrop-filter:blur(10px) saturate(1.2);backdrop-filter:blur(10px) saturate(1.2);
  border:1px solid rgba(253,251,246,.22);border-radius:999px;padding:9px 14px;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.18)}
.gal-count{left:14px;pointer-events:none;font-variant-numeric:tabular-nums lining-nums}
.gal-all{right:14px;top:14px;bottom:auto;margin:0;appearance:none;cursor:pointer;   /* сверху: в правом нижнем углу кадра — оттиск FATÓSH */
  transition:background var(--dur-hover) var(--ease-soft),border-color var(--dur-hover) var(--ease-soft),transform var(--dur-press) var(--ease-soft)}
.gal-all span{display:inline-grid;place-items:center;min-width:22px;height:22px;padding:0 6px;border-radius:999px;
  background:rgba(253,251,246,.16);font-variant-numeric:tabular-nums lining-nums}
.gal-all:hover{background:rgba(20,16,12,.62);border-color:rgba(253,251,246,.5)}
.gal-all:active{transform:scale(.97)}
.gal-all:focus-visible{outline:2px solid var(--bone-0);outline-offset:2px}
.gal .more::after{content:attr(data-more);position:absolute;inset:0;display:grid;place-items:center;
  background:rgba(31,27,21,.58);color:var(--on-dark);font-size:var(--fs-sm);letter-spacing:.05em;
  text-align:center;padding:0 8px}

.lb{position:fixed;inset:0;z-index:var(--z-menu);background:rgba(20,16,12,.94);display:none;
  place-items:center}
.lb[open],.lb.on{display:grid}
.lb img{max-width:min(1400px,94vw);max-height:86vh;object-fit:contain;border-radius:var(--r-sm)}
.lb .x,.lb .nav-b{position:absolute;appearance:none;background:rgba(253,251,246,.1);border:0;
  color:var(--on-dark);font-size:1.5rem;line-height:1;width:46px;height:46px;border-radius:999px;
  cursor:pointer;display:grid;place-items:center}
.lb .x{top:18px;right:18px}
.lb .prev{left:18px;top:50%;transform:translateY(-50%)}
.lb .next{right:18px;top:50%;transform:translateY(-50%)}
.lb .x:hover,.lb .nav-b:hover{background:rgba(253,251,246,.22)}
.lb .cap{position:absolute;bottom:18px;left:50%;transform:translateX(-50%);color:var(--on-dark-muted);
  font-size:var(--fs-sm);text-align:center;max-width:80vw}

/* ── секции карточки ── */
/* Рельс: подпись раздела слева, содержание справа. Одна вертикаль ведёт глаз по всей
   карточке; между разделами — волосяная линия и ровный воздух, а не пустота в 64px. */
.psec{padding:var(--sp-8) 0;border-top:1px solid var(--line)}
.psec > h2{font-family:var(--serif);font-weight:400;font-size:var(--fs-h3);color:var(--text-strong);
  margin:0 0 var(--sp-5)}
.pdoc .psec{display:grid;grid-template-columns:minmax(160px,.3fr) minmax(0,1fr);gap:var(--sp-4) clamp(24px,4vw,64px);
  padding:clamp(28px,3.4vw,44px) 0}
.pdoc .psec > h2{font-size:clamp(1.35rem,1.9vw,1.7rem);line-height:1.15;margin:0;position:sticky;top:96px;
  align-self:start;text-wrap:balance}
.psb{min-width:0;max-width:820px}
.psb > * + *{margin-top:var(--sp-5)}
.pdoc .psec.wide{grid-template-columns:1fr;gap:var(--sp-5)}
.pdoc .psec.wide > h2{position:static}
.psec.wide .psb{max-width:none}
/* страница района: «что сдано и что строится» — ведомости по состоянию стройки, имена — ссылки с предпросмотром */
.dov .plead a,.dov p a{color:var(--text-strong);text-decoration:none;border-bottom:1px solid color-mix(in srgb,var(--text-strong) 28%,transparent);
  transition:border-color var(--dur-hover) var(--ease-soft)}
.dov .plead a:hover,.dov p a:hover{border-color:var(--accent-strong)}
.dleds{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:var(--sp-5) var(--sp-6);margin-top:var(--sp-5)}
.dled h3{display:flex;align-items:baseline;gap:8px;margin:0 0 var(--sp-3);font-family:var(--sans);font-size:var(--fs-xs);font-weight:600;
  letter-spacing:.12em;text-transform:uppercase;color:var(--text-faint)}
.dled h3 span{font-variant-numeric:tabular-nums;color:var(--text-muted);letter-spacing:0}
.dled ul{list-style:none;margin:0;padding:0;border-top:1px solid var(--line)}
.dled li{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:2px 14px;padding:10px 0;border-bottom:1px solid var(--line);align-items:baseline}
.dled li a{grid-column:1;font-family:var(--serif);font-size:1.1rem;color:var(--text-strong);text-decoration:none;line-height:1.2}
.dled li a:hover{color:var(--accent-strong)}
.dled li .m{grid-column:1;font-size:var(--fs-xs);color:var(--text-muted)}
.dled li .r{grid-column:2;grid-row:1/3;font-size:var(--fs-xs);color:var(--text-faint);white-space:nowrap;font-variant-numeric:tabular-nums}
.dled ul.cols{columns:2;column-gap:var(--sp-6)}
.dled ul.cols li{break-inside:avoid}
.dled:has(ul.cols){grid-column:1/-1}
@media (max-width:640px){.dleds{grid-template-columns:1fr}.dled ul.cols{columns:1}}
/* «Рядом по уровню» — горизонтальная лента карточек с прилипанием; десять сразу, остальные по кнопке */
.pstrip-head{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4);margin-bottom:var(--sp-4)}
.pstrip-n{font-size:var(--fs-sm);color:var(--text-muted)}
.pstrip-nav{display:flex;gap:8px}
.pstrip-nav .sc-btn{appearance:none;width:40px;height:40px;border-radius:50%;border:1px solid var(--line);background:var(--surface);
  color:var(--text-strong);cursor:pointer;display:grid;place-items:center;transition:border-color var(--dur-hover) var(--ease-soft),transform var(--dur-press) var(--ease-soft)}
.pstrip-nav .sc-btn:hover{border-color:var(--text-strong)}
.pstrip-nav .sc-btn:active{transform:scale(.94)}
.pstrip-nav .sc-btn[disabled]{opacity:.35;cursor:default}
.pstrip-nav .sc-btn svg{width:16px;height:16px}
.pgrid.pstrip{display:flex;gap:var(--sp-4);overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;
  padding:4px var(--gutter) 12px;margin:0 calc(-1 * var(--gutter));scrollbar-width:none;-webkit-overflow-scrolling:touch}
.pgrid.pstrip::-webkit-scrollbar{display:none}
.pgrid.pstrip:focus-visible{outline:2px solid var(--focus);outline-offset:-2px;border-radius:12px}
.pgrid.pstrip > .pcard{flex:0 0 clamp(260px,24vw,320px);scroll-snap-align:start}
.pgrid.pstrip > .pcard[hidden]{display:none}
.pstrip-foot{display:flex;align-items:center;gap:var(--sp-5);flex-wrap:wrap;margin-top:var(--sp-4)}
.pstrip-more span{margin-left:6px;color:var(--text-faint)}
@media (max-width:640px){.pgrid.pstrip > .pcard{flex-basis:76vw}.pstrip-nav{display:none}}
@media (prefers-reduced-motion:reduce){.pgrid.pstrip{scroll-behavior:auto}}
/* закрывающий призыв разделов живёт в панели контекста формы (см. _LeadCopy) */
.psb > * + *{margin-top:var(--sp-5)}
.chips{display:flex;flex-wrap:wrap;gap:8px}
.chips span,.chips a{border:1px solid var(--line);border-radius:999px;padding:6px 13px;font-size:var(--fs-sm);
  color:var(--text);background:var(--surface);display:inline-flex;align-items:center;min-height:36px}
.chips a{transition:border-color var(--dur-hover) var(--ease-soft),color var(--dur-hover) var(--ease-soft)}
@media (max-width:640px){.chips a{min-height:44px;padding:10px 15px}}   /* на тач-экране чип-ссылка = кнопка */
/* «В проекте», «Вокруг»: список колонками с точкой — структура вместо россыпи бирок */
.amen{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));
  gap:8px 24px}
.amen li{position:relative;padding:6px 0 6px 18px;color:var(--text);line-height:1.4;border-bottom:1px solid var(--line)}
.amen li::before{content:"";position:absolute;left:0;top:calc(.7em + 3px);width:5px;height:5px;border-radius:50%;
  background:var(--accent)}
.amen.around li{color:var(--text-muted)}
.amen.around li::before{background:var(--line-strong)}
/* dl2 на разделах: подпись над текстом (значения там — абзацы) */
.dl2{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:var(--sp-5) var(--sp-7);margin:0}
.dl2 div{display:flex;flex-direction:column;gap:3px;padding-bottom:var(--sp-3);border-bottom:1px solid var(--line)}
.dl2 dt{font-size:var(--fs-xs);letter-spacing:.07em;text-transform:uppercase;color:var(--text-faint)}
.dl2 dd{margin:0;color:var(--text-strong)}
/* характеристики и «рядом» на карточке проекта: ведомость «подпись … значение» */
.pdoc .dl2{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:0 clamp(24px,4vw,56px)}
.pdoc .dl2 div{flex-direction:row;justify-content:space-between;align-items:baseline;gap:var(--sp-4);padding:10px 0}
.pdoc .dl2 dt{font-size:var(--fs-sm);letter-spacing:0;text-transform:none;color:var(--text-muted);flex:0 0 auto}
.pdoc .dl2 dd{font-weight:500;font-size:var(--fs-sm);text-align:right;line-height:1.4}
.pwhere{margin:0;color:var(--text-muted)}
.metro{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:8px}
.metro li{display:inline-flex;align-items:center;gap:9px;padding:7px 14px 7px 8px;border:1px solid var(--line);
  border-radius:999px;background:var(--surface);font-size:var(--fs-sm);color:var(--text-muted)}
.metro li b{font-weight:500;color:var(--text-strong)}
.metro .mm{display:inline-grid;place-items:center;width:22px;height:22px;border-radius:50%;
  background:var(--ink-900);color:var(--bone-0);font:600 .68rem/1 var(--sans);letter-spacing:.02em}
.near{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));
  gap:0 clamp(24px,4vw,56px)}
.near li{display:flex;justify-content:space-between;align-items:baseline;gap:var(--sp-4);padding:10px 0;
  border-bottom:1px solid var(--line);color:var(--text-strong);font-size:var(--fs-sm)}
.near li span:last-child{color:var(--text-muted);white-space:nowrap;font-variant-numeric:tabular-nums lining-nums}
.maplink{margin-top:var(--sp-5)}
.maplink .ar{font-size:1.05em;line-height:1}
.ploc-links{display:flex;flex-wrap:wrap;gap:var(--sp-3) var(--sp-5);margin-top:var(--sp-5);font-size:var(--fs-sm)}
.ploc-links a{color:var(--accent-strong);border-bottom:1px solid var(--accent-wash);padding:14px 0 6px;margin:-14px 0 -6px;
  transition:border-color var(--dur-hover) var(--ease-soft)}
.ploc-links a:hover{border-bottom-color:var(--accent)}
.ploc-links a::after{content:" →"}

/* ── застройщик ── */
.dcardbig{display:grid;grid-template-columns:auto 1fr auto;gap:var(--sp-5);align-items:center;
  background:var(--bone-0);border:1px solid var(--line);border-radius:16px;padding:var(--sp-5) var(--sp-6);
  text-decoration:none;color:inherit;box-shadow:inset 0 1px 0 #fff;
  transition:border-color var(--dur-hover) var(--ease-soft),transform var(--dur) var(--ease),box-shadow var(--dur) var(--ease)}
.dcardbig:hover{border-color:var(--line-strong);transform:translateY(-2px);
  box-shadow:inset 0 1px 0 #fff,0 6px 8px -6px rgba(90,62,38,.16)}
.dcardbig .mono{display:grid;place-items:center;width:52px;height:52px;border-radius:50%;
  border:1px solid var(--line-strong);font-family:var(--serif);font-size:1.6rem;line-height:1;color:var(--accent-strong)}
.dcardbig h3{font-family:var(--serif);font-weight:400;font-size:1.5rem;margin:0 0 3px;color:var(--text-strong)}
.dcardbig p{margin:0;font-size:var(--fs-sm);color:var(--text-muted)}
.dcardbig .go{font-size:var(--fs-sm);font-weight:600;color:var(--text-strong);white-space:nowrap;
  transition:color var(--dur-hover) var(--ease-soft)}
.dcardbig:hover .go{color:var(--accent-strong)}

.dgrid2{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:var(--sp-6)}
.dev-card{display:flex;flex-direction:column;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r-md);overflow:hidden;text-decoration:none;color:inherit;
  transition:transform var(--dur-hover) var(--ease),box-shadow var(--dur-hover) var(--ease)}
.dev-card:hover{transform:translateY(-3px);box-shadow:var(--shadow-card)}
.dev-card:focus-visible{outline:2px solid var(--focus);outline-offset:3px}
.dev-card .pshot{aspect-ratio:16/9;background:var(--surface-raised);overflow:hidden}
.dev-card .pshot img{width:100%;height:100%;object-fit:cover;display:block;
  transition:transform .6s var(--ease),opacity .5s var(--ease),translate .5s var(--ease)}
.dev-card:hover .pshot img{transform:scale(1.04)}
.dev-card .body{padding:var(--sp-5);display:flex;flex-direction:column;gap:8px;flex:1}
.dev-card .h{display:block;font-family:var(--serif);font-weight:400;font-size:1.5rem;margin:0;color:var(--text-strong)}
.dev-card .seg{font-size:var(--fs-xs);letter-spacing:.08em;text-transform:uppercase;color:var(--text-faint)}
.dev-card ul{list-style:none;display:flex;flex-wrap:wrap;gap:6px;margin:0}
.dev-card li{font-size:var(--fs-xs);border:1px solid var(--line);border-radius:999px;padding:3px 9px;
  color:var(--text-muted)}
.dev-card .pmeta{margin-top:auto;padding-top:var(--sp-4);border-top:1px solid var(--line);
  display:flex;flex-wrap:wrap;gap:4px 12px;justify-content:space-between;font-size:var(--fs-sm);color:var(--text-faint)}
/* общий .pmeta проектов ставит «·» перед вторым спаном — здесь два столбца, и при переносе
   точка открывала строку («· 834 300 ₽/м²»); цена держится справа и не рвётся */
.dev-card .pmeta > span + span::before{content:none;margin:0}
.dev-card .pmeta > span:last-child{margin-left:auto;white-space:nowrap}
.dev-card .pmeta b{font-weight:500;color:var(--text-strong);font-variant-numeric:tabular-nums}

/* ── таблица классов ── */
.ctable{width:100%;border-collapse:collapse;font-size:var(--fs-sm)}
.ctable th,.ctable td{text-align:left;padding:var(--sp-4) var(--sp-4);border-bottom:1px solid var(--line);
  vertical-align:top}
.ctable th{font-size:var(--fs-xs);letter-spacing:.07em;text-transform:uppercase;color:var(--text-faint);
  font-weight:500}
.ctable td b{font-weight:500;color:var(--text-strong);font-variant-numeric:tabular-nums}
.tscroll{overflow-x:auto;-webkit-overflow-scrolling:touch}

/* ── лента рынка ── */
.mrk-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:var(--sp-6)}
.mrk{display:flex;flex-direction:column;gap:var(--sp-3);background:var(--surface);
  border:1px solid var(--line);border-radius:var(--r-md);padding:var(--sp-6)}
.mrk-meta{display:flex;gap:var(--sp-3);align-items:center;font-size:var(--fs-xs);
  letter-spacing:.07em;text-transform:uppercase;color:var(--text-faint)}
.mrk-meta span::before{content:"·";margin-right:var(--sp-3);opacity:.6}
.mrk h2{font-family:var(--serif);font-weight:400;font-size:1.32rem;line-height:1.2;
  color:var(--text-strong);margin:0}
.mrk p{margin:0;color:var(--text-muted);font-size:.98rem;line-height:1.55}
.mrk-links{margin-top:auto;padding-top:var(--sp-4);display:flex;flex-wrap:wrap;gap:var(--sp-4);
  border-top:1px solid var(--line);font-size:var(--fs-sm)}
.mrk-go{color:var(--accent-strong);text-decoration:none;border-bottom:1px solid rgba(142,69,38,.35);
  padding-bottom:1px}
.mrk-go:hover{border-bottom-color:currentColor}
.mrk-src{color:var(--text-faint);text-decoration:none;border-bottom:1px solid transparent}
.mrk-src:hover{color:var(--text);border-bottom-color:var(--line-strong)}

/* ── кнопка «вся галерея» ── */
/* ── карта проектов застройщика ──
   Не ссылка «посмотреть на карте», а сама карта: точки стоят на своих настоящих местах,
   кольца — расстояния от центра Москвы. Тёмное поле повторяет карту проектов, чтобы
   переход не выглядел прыжком в другой продукт. */
.dmap{position:relative;display:block;margin:0 0 var(--sp-6);border-radius:var(--r-md);
  overflow:hidden;text-decoration:none;color:var(--on-dark);background:#141210;
  aspect-ratio:24/9;min-height:210px;border:1px solid rgba(214,187,140,.18);
  transition:border-color var(--dur-hover) var(--ease-soft),transform var(--dur-hover) var(--ease-soft)}
.dmap:hover{border-color:rgba(214,187,140,.5);transform:translateY(-2px)}
.dmap:focus-visible{outline:2px solid var(--focus);outline-offset:3px}
.dmap > svg{position:absolute;inset:0;width:100%;height:100%;display:block}   /* только подложка: иначе правило растягивает и стрелку в подписи */
.dmap .dmk circle:first-child{transform-box:fill-box;transform-origin:center;
  animation:dmp 3.4s var(--ease-soft) infinite}
.dmap .dmk:nth-child(2n) circle:first-child{animation-delay:.9s}
.dmap .dmk:nth-child(3n) circle:first-child{animation-delay:1.7s}
@keyframes dmp{0%,70%,100%{opacity:.5;transform:scale(1)}35%{opacity:.12;transform:scale(1.55)}}
.dmap-in{position:absolute;left:0;right:0;bottom:0;display:flex;flex-direction:column;gap:5px;
  padding:var(--sp-5);background:linear-gradient(to top,rgba(20,18,16,.92) 30%,rgba(20,18,16,0))}
.dmap-t{font-family:var(--serif);font-size:1.42rem;line-height:1.15;font-variant-numeric:lining-nums}
.dmap-s{font-size:var(--fs-sm);color:rgba(246,241,232,.62);overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.dmap-go{display:inline-flex;align-items:center;gap:7px;margin-top:6px;font-size:var(--fs-sm);
  color:#d6bb8c;letter-spacing:.02em}
.dmap:hover .dmap-go svg{transform:translateX(3px)}
.dmap-go svg{transition:transform var(--dur-hover) var(--ease-soft)}
@media (prefers-reduced-motion:reduce){
  .dmap .dmk circle:first-child{animation:none}
  .dmap:hover{transform:none}
}
@media (max-width:640px){.dmap{aspect-ratio:16/11}}
.ptw{overflow-x:auto;-webkit-overflow-scrolling:touch}
.ptt{width:100%;border-collapse:collapse;font-size:var(--fs-sm);min-width:460px}
.ptt th,.ptt td{text-align:left;padding:12px 14px;border-bottom:1px solid var(--line);
  font-variant-numeric:tabular-nums lining-nums}
.ptt thead th{font-size:var(--fs-xs);letter-spacing:.07em;text-transform:uppercase;
  color:var(--text-faint);font-weight:400;border-bottom-color:var(--line-strong,var(--line))}
.ptt tbody th{font-weight:500;color:var(--text-strong)}
.ptt tbody tr:last-child th,.ptt tbody tr:last-child td{border-bottom:0}
.gplan{grid-template-columns:repeat(auto-fill,minmax(190px,1fr));margin-top:0}
.gplan + .gal-all{position:static;margin-top:var(--sp-4);color:var(--text-strong);background:var(--surface);border-color:var(--line)}
.gplan + .gal-all span{background:var(--surface-alt);color:var(--text-muted)}
.gplan button:not(.gal-all){aspect-ratio:4/3;background:var(--bone-0)}
.gplan img{object-fit:contain;padding:6px}
/* .gal-all — см. блок галереи */

/* ── источники / сноска ── */
.srcnote{margin-top:var(--sp-6);font-size:var(--fs-xs);color:var(--text-faint);max-width:78ch;
  line-height:1.6}
.srcnote a{color:inherit}
/* Сноска об источниках — не текст для чтения, а справка по требованию. */
.srcd{margin-top:var(--sp-6);font-size:var(--fs-xs);color:var(--text-faint);max-width:78ch}
.srcd summary{cursor:pointer;list-style:none;display:inline-flex;align-items:center;gap:7px;
  border-bottom:1px dashed var(--line-strong,var(--line));padding-bottom:2px}
.srcd summary::-webkit-details-marker{display:none}
.srcd summary::after{content:"+";font-size:1.1em;line-height:1}
.srcd[open] summary::after{content:"–"}
.srcd span{display:block;margin-top:7px;line-height:1.5}

/* Семь пунктов в шапке не влезают в 1280: сужаем шаг и убираем телефон раньше,
   чем он переносится на две строки (он остаётся в мобильном меню и в подвале). */
.nav .row{gap:var(--sp-6)}
.nav-links{gap:26px}
.nav-cta .ulink{white-space:nowrap}
@media (max-width:1360px){ .nav-links{gap:24px} }
@media (max-width:1200px){ .nav-cta .ulink{display:none} }

/* На телефоне длинное имя застройщика раздувало select шире экрана — режем интринсик. */
.frow > .fsel,.frow > .fsearch{max-width:100%;min-width:0}
@media (max-width:640px){
  .frow{gap:8px}
  .frow > .fsel{flex:1 1 calc(50% - 4px)}
  /* «Любая готовность» не влезала и обрезалась на полслове — сужаем поля, а не текст. */
  .fsel{padding:8px 10px;padding-right:24px;background-position:calc(100% - 13px) 52%,calc(100% - 8px) 52%}
  .frow > .fsearch{flex:1 1 100%;min-width:0}
  .fgroup{width:100%}
  .fgroup .chip{flex:1 1 auto}
}
@media (max-width:900px){
  .phero{grid-template-columns:1fr;padding-top:calc(var(--sp-7) + 46px)}
  .phero.spread{grid-template-columns:1fr;gap:var(--sp-5)}
  .ph-fig{height:auto;min-height:0;aspect-ratio:4/3}
  .ph-fig::after{border-radius:16px}
  .gal-hero > button:not(.gal-all){aspect-ratio:3/2}
  .gal-strip,.gal-strip.n3,.gal-strip.n4{grid-template-columns:1fr 1fr}
  .pdoc .psec{grid-template-columns:1fr;gap:var(--sp-3)}
  .pdoc .psec > h2{position:static}
  .pk-cta .btn{flex:1 1 100%}
  .filters{padding:var(--sp-3) 0;top:70px}
  .fmeta{margin-left:0;width:100%;justify-content:space-between}
  .dcardbig{grid-template-columns:1fr;gap:var(--sp-4)}
}
@media (max-width:560px){
  .pgrid,.dgrid2{grid-template-columns:1fr}
  .gal-strip,.gal-strip.n3,.gal-strip.n4{grid-template-columns:1fr 1fr 1fr}
  .gal-strip button:not(.gal-all){aspect-ratio:1}
  .mapcard{grid-template-columns:1fr;gap:14px;padding:20px}
  .pmeta{display:grid;gap:8px;justify-items:start}
  .pmeta > *::before{content:none!important}
  .amen{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:4px 16px}
  .gal-count{display:none}
  .pdoc .dl2 div,.near li{flex-direction:column;align-items:flex-start;gap:2px}
  .pdoc .dl2 dd{text-align:left}
  .cstats{gap:var(--sp-5)}
}
@media (prefers-reduced-motion:reduce){
  .pcard,.dev-card,.gal img,.pcard .pshot img{transition:none!important}
  .pcard:hover,.dev-card:hover{transform:none}
  .gal-hero img{animation:none}
  .pcard::after,.dev-card::after,.dcard::after,.dcardbig::after{display:none}
}
