/* [РЕТРО-СНЯТ 14.08] Капс с разрядкой 0.16–0.32em при кегле 11–12px — «разряжённый микро-кегль
   капсом», в правилах проекта назван тиком 2016-го и снят в подвале 28.07. На страницах квартир
   он жил дальше: замер 14.08 дал 33 таких элемента на одной странице и 7 на «Нашем районе»
   (на главной и в отзывах — ноль). Снимаем капс и разрядку, кегль поднимаем в шкалу проекта. */
/* dailyrent.css — verbatim transcription of the live dailyrent.kz styles.
   Sources (1:1, no reinterpretation):
   - V2Layout.astro  <style is:global>   → tokens + base + skip + v2-header + v2-footer
   - HomePage.astro  <style>             → v2-hero / v2-aptsection / v2-reviews / v2-faq
   - v2/ApartmentCard.astro <style>      → v2-aptcard
   - v2/ReviewCard.astro    <style>      → v2-reviewcard
   - v2/MobileBottomBar.astro <style>    → mobile-bar
   Astro scoping ([data-astro-cid-*]) and :global() wrappers dropped — class
   names are already BEM-unique so flattening to global CSS is collision-safe. */

/* ── V2 design tokens ─────────────────────────────────────────────────── */
:root {
  --ink: 220 14% 8%;
  --ink-deep: 220 18% 5%;
  --paper: 36 16% 97%;
  --paper-soft: 36 14% 92%;
  --ink-soft: 220 8% 30%;
  /* [A11Y-MUTED 04.08] 48% → 47%. На бумаге сайта 48% давало 4,37:1 при обязательном пороге 4,5:1
     (WCAG 1.4.3, мелкий текст) — то есть роль «приглушённый» формально не проходила AA везде, где
     стояла. 47% даёт 4,53:1. Разницу глазом не видно, замер проходит. Токен ОБЩИЙ на 22 страницы,
     правка только затемняет — сломать контраст она не может нигде. */
  /* [A11Y-MUTED-2 15.08] 47% → 45%. Довод 04.08 считал контраст на бумаге 97%, а метки
     секций и подписи условий стоят на ПОДЛОЖКЕ-soft rgb(249,248,246) — там 47% даёт 4,35:1.
     Нашёл пиксельный прибор фазы 3 (семь мест на странице квартиры). 45% даёт 4,67:1 на soft
     и 4,83:1 на бумаге. Довод тот же: правка только затемняет. */
  --ink-muted: 220 6% 45%;
  --terracotta: 0 0% 12%;
  --terracotta-deep: 0 0% 0%;
  --terracotta-glow: 0 0% 40%;
  --sage: 85 14% 60%;
  --hairline: 36 8% 86%;
  --hairline-dark: 220 10% 18%;
  --gradient-veil: linear-gradient(180deg, hsl(var(--ink) / 0) 0%, hsl(var(--ink) / 0.35) 45%, hsl(var(--ink) / 0.85) 100%);
  --gradient-veil-top: linear-gradient(180deg, hsl(var(--ink) / 0.7) 0%, hsl(var(--ink) / 0) 50%);

  --color-ink:        hsl(var(--ink));
  --color-ink-soft:   hsl(var(--ink-soft));
  --color-muted:      hsl(var(--ink-muted));
  --color-paper:      hsl(var(--paper));
  --color-bg:         hsl(var(--paper));
  --color-line:       hsl(var(--hairline));
  --color-accent:     hsl(var(--terracotta));

  --font-family-display-cinematic: var(--font-sans);
  --font-family-sans-cinematic:    var(--font-sans);
  --paper-soft: 36 14% 92%;

  --hdr-ease:              var(--ease-standard);
  --hdr-glass-duration:    720ms;
  /* Scrim height: pill-bottom (~top + 56px) + breathing room. Same visual fade regardless of header top offset. */
  --hdr-scrim-h:           140px;
  --hdr-scrim-strength:    0.34;
  --site-gutter:           clamp(1.25rem, 4vw, 2.5rem);
  --hero-shell-max:        1100px;
  --hero-actions-max:      720px;
  --header-pill-inline:    calc(1.1rem + 0.3rem * var(--hdr-progress, 0));
  --header-shell-max:      calc(var(--hero-actions-max) + var(--header-pill-inline) + var(--header-pill-inline));
}

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

html {
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  /* [BAR-TINT 03.08] Фон корня сведён с поверхностью хрома. Был hsl(var(--ink)) — тёмный,
     наследие геройской секции. Гостю он почти не виден (body укрывает его целиком, наружу
     выходит только при перетягивании страницы за край), зато его берёт Safari: когда сэмплеру
     цвета статус-бара не за что зацепиться, он идёт по цепочке fixed/sticky → body → html.
     Владелец увидел это глазом: «цвет статус-бара отличается от цвета меню». Полоса брала
     фон body (--paper, 97% светлоты), а шапка и плита стоят на 99.5% — 2,5% разницы и другой
     тон читаются сероватой полосой над белой шапкой.
     Теперь и корень, и шапка, и плита, и нижний бар — одна поверхность hsl(42 40% 99.5%).
     РЕВЕРС: вернуть hsl(var(--ink)). */
  background: hsl(42 40% 99.5%);
  scroll-behavior: smooth;
}

body.v2-body {
  margin: 0;
  background: hsl(var(--paper));
  color: hsl(var(--ink));
  font-family: var(--font-sans);
  font-feature-settings: 'ss01', 'cv11';
  font-size: var(--fs-base);
  line-height: 1.5;
}

.v2-main--offset { padding-top: 96px; }
@media (min-width: 768px) { .v2-main--offset { padding-top: 120px; } }

/* Sticky header is ~88px tall — give in-page anchors room to clear it. */
:where(#apartments, #reviews, #faq, #contact, #district, #location) { scroll-margin-top: 96px; }
@media (min-width: 768px) { :where(#apartments, #reviews, #faq, #contact, #district, #location) { scroll-margin-top: 112px; } }

img { max-width: 100%; height: auto; display: block; }
a { color: inherit; text-decoration: none; }
button { font: inherit; cursor: pointer; border: none; background: none; }

::selection { background: hsl(var(--terracotta) / 0.85); color: hsl(var(--paper)); }

:focus { outline: none; }
:focus-visible {
  outline: 2px solid hsl(var(--terracotta));
  outline-offset: 3px;
}

.font-display {
  font-family: var(--font-sans);
  font-weight: 700;
  letter-spacing: -0.02em;
}
.tabular { font-variant-numeric: tabular-nums; }

.veil { background: var(--gradient-veil); }


.text-pretty { text-wrap: pretty; }


@keyframes pulse-ring {
  0%   { box-shadow: 0 0 0 0   hsl(var(--terracotta-glow) / 0.55); }
  70%  { box-shadow: 0 0 0 10px hsl(var(--terracotta-glow) / 0); }
  100% { box-shadow: 0 0 0 0   hsl(var(--terracotta-glow) / 0); }
}


@keyframes ken-burns {
  from { transform: scale(1.0)  translate(0, 0); }
  to   { transform: scale(1.12) translate(-1.5%, -1%); }
}

/* .reveal lives in tokens.css now — single source of truth (Step 2).
   The duplicate definition that used to sit here (hidden-by-default, no
   no-JS fallback) was overriding tokens.css and is removed. */



/* Skip link */

.v2-skip:focus { top: 12px; }

/* ── V2 Header — Split capsule sticky island ─────────────────────── */

/* Sticky-on-scroll-up only: slide the bar offscreen when scrolling down past 80px. */



/* Subtle top-down scrim for legibility over photo hero (no text-shadows).
   Multi-stop ease-out curve so the fade reads identically across header heights. */
.v2-header::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: var(--hdr-scrim-h);
  background: linear-gradient(
    to bottom,
    rgba(0, 0, 0, calc(var(--hdr-scrim-strength) * 1.00)) 0%,
    rgba(0, 0, 0, calc(var(--hdr-scrim-strength) * 0.86)) 12%,
    rgba(0, 0, 0, calc(var(--hdr-scrim-strength) * 0.66)) 28%,
    rgba(0, 0, 0, calc(var(--hdr-scrim-strength) * 0.44)) 46%,
    rgba(0, 0, 0, calc(var(--hdr-scrim-strength) * 0.24)) 64%,
    rgba(0, 0, 0, calc(var(--hdr-scrim-strength) * 0.10)) 80%,
    rgba(0, 0, 0, calc(var(--hdr-scrim-strength) * 0.03)) 92%,
    rgba(0, 0, 0, 0) 100%
  );
  pointer-events: none;
  z-index: 0;
  opacity: 0;
  transition: opacity var(--hdr-glass-duration) var(--hdr-ease);
  will-change: opacity;
}
.v2-header[data-dark-hero="true"]:not(.is-scrolled)::before { opacity: 1; }
.v2-header[data-dark-hero="true"]:not(.is-scrolled) .v2-header__inner { position: relative; z-index: 1; }




/* — The single floating pill (host for 4-layer liquid glass) — */



/* Direct children (nav, brand, group) sit above the glass layers */


/* ── 4 liquid-glass layers (hidden by default; faded in on scroll) ──
   Phase 1 (immediate): glass tint + blur appear first */



/* Scrolled: ink text, calm hover */

.v2-header.is-scrolled .v2-header__link:hover { opacity: 1; }



/* Firefox fallback: no backdrop-filter → solid tint (degraded but legible) */



/* Dark-hero (no scroll): keep the same stable pill, only text becomes light. */
.v2-header[data-dark-hero="true"]:not(.is-scrolled) .v2-header__pill {
  color: #fff;
  box-shadow: none;
}
.v2-header[data-dark-hero="true"]:not(.is-scrolled) .v2-header__lg-filter,
.v2-header[data-dark-hero="true"]:not(.is-scrolled) .v2-header__lg-tint,
.v2-header[data-dark-hero="true"]:not(.is-scrolled) .v2-header__lg-specular {
  opacity: 0;
}
.v2-header[data-dark-hero="true"]:not(.is-scrolled) .v2-header__lg-tint {
  background: rgba(255, 255, 255, 0.82);
}
.v2-header[data-dark-hero="true"]:not(.is-scrolled) .v2-header__lg-specular {
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, 0.9),
    inset 0 0 0 1px rgba(20, 20, 28, 0.08);
}
/* Dark-hero: brand left, nav pinned right (mirrors hero text alignment) */
.v2-header[data-dark-hero="true"]:not(.is-scrolled) .v2-header__nav {
  justify-self: end;
  gap: 1.75rem;
}
.v2-header[data-dark-hero="true"]:not(.is-scrolled) .v2-header__link {
  /* Match the scrolled-state link metrics (size/weight/spacing) so
     the nav doesn't reflow when the threshold is crossed. */
  color: #fff;
}
.v2-header[data-dark-hero="true"]:not(.is-scrolled) .v2-header__link:hover {
  color: rgba(255, 255, 255, 0.7);
}
/* Dark-hero: brand anchored to the left edge of the hero container */
.v2-header[data-dark-hero="true"]:not(.is-scrolled) .v2-header__brand {
  justify-self: start;
}
.v2-header[data-dark-hero="true"]:not(.is-scrolled) .v2-header__brand-name {
  /* Keep the same font-size/letter-spacing as the scrolled state so the
     brand never visibly grows or reflows when the pill morphs. */
  color: #fff;
}
/* Dark-hero desktop: no empty CTA column while the hero already has WhatsApp. */
@media (min-width: 1024px) {
  .v2-header[data-dark-hero="true"]:not(.is-scrolled) .v2-header__group {
    display: none;
  }
}
/* Dark-hero: WhatsApp CTA reveal is now driven entirely by --hdr-progress
   on the .v2-header__wa rule itself (max-width / margin / padding / opacity
   all lerp continuously). No threshold-bound display/visibility toggle here
   — that's what used to snap at the .is-scrolled boundary. */

.v2-header[data-dark-hero="true"]:not(.is-scrolled) .v2-header__lang {
  gap: 0.55rem;
}
.v2-header[data-dark-hero="true"]:not(.is-scrolled) .v2-header__lang-link {
  font-size: var(--fs-2xs);
  font-weight: 500;
  letter-spacing: 0.18em;
  color: rgba(255, 255, 255, 0.65);
}
.v2-header[data-dark-hero="true"]:not(.is-scrolled) .v2-header__lang-link--current {
  color: #fff;
}




/* — Brand — */


/* — Nav links (Apple-style: uppercase, tracked, tiny, bold) — */


.v2-header__link:hover { color: #fff; }
/* Compact inline nav on tablet (no burger) */

/* On phones, drop the tightest pill and let nav wrap to a second row
   if absolutely needed; in practice 4 short RU labels at 9px fit a 360px
   pill comfortably. */


/* Dividers removed — header now uses pill spacing alone. */



/* — Lang — */


.v2-header__lang-link:hover { color: #fff; }



/* — WhatsApp: reveal is purely a function of --hdr-progress, so it slides
   and fades continuously across the entire scroll ramp instead of snapping
   at the .is-scrolled threshold. On non-dark-hero routes Header.tsx pins
   --hdr-progress to 1, so the pill stays fully visible. */

/* Block clicks while the CTA is still mostly collapsed. The .is-scrolled
   toggle (Header.tsx) fires once progress is past the threshold (~p=0.75),
   well after the pill is visibly real, so it's a safe pointer-events gate. */
.v2-header[data-dark-hero="true"]:not(.is-scrolled) .v2-header__wa {
  pointer-events: none;
}


.v2-header__wa:hover {
  background: var(--wa-hover);
  border-color: var(--wa-hover);
}

.v2-header__wa:hover .v2-header__wa-dot { transform: scale(1.2); }




/* — Burger trigger (mobile only) — */

/* Single chrome-mode breakpoint at 1024px:
   <1024px — bare wordmark + bare hamburger, no pill, no glass, no shadow.
             Legibility over photo hero comes from the top scrim alone.
   ≥1024px — full desktop chrome (pill + glass + WhatsApp + nav). */
@media (max-width: 1023.98px) {
  
  .v2-header::before { height: 120px; }
  
  
  
  
  
  
  
  

  /* Bare wordmark — no enclosure, no shape, no shadow. */
  
  
  
  

  /* Bare hamburger — no circle, no pill, no background, no border. */
  
  .v2-header__burger:hover { background: transparent; }
  
}



/* ── Skip-to-content link ─────────────────────────────────────────────── */
/* [source-hygiene 10.07] дубль .site-skip удалён (#27) — действующее определение ниже (~line 5220),
   оно было посвойственно идентично и выигрывало каскад и раньше. */

/* ── Slide-from-right drawer (mobile menu) ────────────────────────────── */
.site-drawer {
  position: fixed; top: 0; right: 0; bottom: 0;
  width: min(88vw, 360px);
  background: hsl(var(--paper));
  z-index: 90;
  padding: 64px 20px 24px;
  padding-bottom: calc(96px + env(safe-area-inset-bottom));
  transform: translateX(100%);
  transition: transform var(--dur-slow) var(--ease-standard);
  display: flex;
  flex-direction: column;
  box-shadow: -10px 0 30px rgba(0, 0, 0, 0.18);
  visibility: hidden;
}
.site-drawer.is-open { transform: translateX(0); visibility: visible; }

.site-drawer__brand {
  position: absolute; top: 20px; left: 20px;
  font-family: var(--font-sans);
  font-size: var(--fs-base); font-weight: 600;
  letter-spacing: 0.01em; line-height: 1;
  color: hsl(var(--ink)); text-decoration: none;
}
.site-drawer__brand em {
  font-style: normal; font-weight: 300; margin-left: 2px;
  color: hsl(var(--ink) / 0.55);
}

/* [source-hygiene 10.07] дубль .site-drawer__close удалён (#27) — действующий (36×36 / right 16)
   ниже (~line 5430); тот перекрывал этот по всему набору свойств и раньше. */

.site-drawer__locale { display: flex; gap: 6px; margin-bottom: 20px; }
.site-drawer__locale a {
  flex: 1; text-align: center; padding: 8px 0; border-radius: var(--radius-full);
  border: 1px solid hsl(var(--ink) / 0.14);
  font-family: var(--font-sans); font-size: var(--fs-2xs); font-weight: 600;
  letter-spacing: 0.14em; text-transform: uppercase;
  color: hsl(var(--ink) / 0.7); text-decoration: none;
}
.site-drawer__locale a.is-active {
  background: hsl(var(--ink)); color: hsl(var(--paper));
  border-color: hsl(var(--ink));
}

.site-drawer__nav h4 {
  font-family: var(--font-sans); font-size: var(--s-13, 13px);
  letter-spacing: 0; font-weight: 700;
  color: hsl(var(--ink) / 0.5);
  margin: 1rem 0 0.5rem;
}
.site-drawer__nav ul {
  list-style: none; padding: 0; margin: 0;
  display: flex; flex-direction: column; gap: 6px;
}
.site-drawer__nav li a {
  font-family: var(--font-sans); font-size: var(--fs-base); font-weight: 500;
  color: hsl(var(--ink)); text-decoration: none;
}

/* [source-hygiene 13.07] дубль .site-drawer__bottom (+ a / __wa / __call) удалён (#28) —
   действующее определение ниже (~line 5528). Слияние zero-change: margin-top:auto (был
   только здесь) перенесён в поздний блок; поздний нёс height:44 (действующее) —
   ранний давал 40. Итоговый computed идентичен. __wa/__call были байт-в-байт равны. */

.site-drawer__scrim {
  position: fixed; inset: 0;
  background: rgba(0, 0, 0, 0.42); z-index: 80;
}

/* Visible keyboard focus on bare/drawer interactive elements. */
.v2-header__burger:focus-visible,
.v2-header__brand:focus-visible,
.site-drawer__close:focus-visible,
.site-drawer__brand:focus-visible,
.site-drawer__locale a:focus-visible,
.site-drawer__nav a:focus-visible,
.site-drawer__bottom a:focus-visible {
  outline: 2px solid hsl(var(--ink));
  outline-offset: 3px;
  border-radius: var(--radius-xs);
}
.v2-header:not(.is-scrolled) .v2-header__burger:focus-visible,
.v2-header:not(.is-scrolled) .v2-header__brand:focus-visible {
  outline-color: hsl(var(--paper));
}

@media (prefers-reduced-motion: reduce) {
  .site-skip, .site-drawer{ transition: none; }
}

/* ════════════════════════════════════════════════════════════════════════
   HomePage.astro <style> — hero / apartments / reviews / faq
   ════════════════════════════════════════════════════════════════════════ */
.v2-hero {
  position: relative;
  isolation: isolate;
  height: 100svh;
  min-height: 640px;
  width: 100%;
  /* Clip the video at the integer box. The seam itself is masked by
     `.home-hero__fade-wrap::before` (a single 2px solid strip in the
     apartments bg color), so no box-shadow / margin trick is needed
     here and we avoid stacking two light lines along the same edge. */
  overflow: hidden;
  background: hsl(220 14% 8%);
  color: hsl(36 16% 97%);
}
/* Progress-driven veil — continues the header's 420ms transition into the
   hero photo: as the pill morphs to its scrolled (glass) state, the hero
   gently deepens + cools, so the two surfaces read as one motion. */
.v2-hero::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 0;
  background:
    linear-gradient(180deg,
      hsl(220 18% 6% / 0.55) 0%,
      hsl(220 18% 6% / 0.18) 35%,
      hsl(220 18% 6% / 0) 70%),
    radial-gradient(140% 90% at 50% 0%,
      hsl(220 22% 4% / 0.35),
      transparent 60%);
  opacity: var(--hdr-progress, 0);
  transition: opacity var(--hdr-glass-duration, var(--dur-slow)) var(--hdr-ease, var(--ease-standard));
  will-change: opacity;
}
@media (prefers-reduced-motion: reduce) {
  .v2-hero::after { transition: none; }
}
.v2-hero__photo { position: absolute; inset: 0; }
.v2-hero__picture,
.v2-hero__img,
.v2-hero__video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.v2-hero__video { display: block; }
@media (prefers-reduced-motion: reduce) {
  .v2-hero__video { display: none; }
}
.v2-hero__veil{ position: absolute; inset: 0; pointer-events: none; }

.v2-hero__content {
  position: relative;
  z-index: 1;
  height: 100%;
  width: var(--layout-rail);
  margin: 0 auto;
  padding: 0 0 calc(5.5rem + env(safe-area-inset-bottom));
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
}
@media (min-width: 768px) {
  .v2-hero__content { padding: 0 0 5rem; }
}










.v2-hero__cta--whatsapp:hover { background: var(--wa-hover); }



.v2-hero__cta--ghost:hover { background: hsl(36 16% 97% / 0.1); }





.v2-hero__trust:hover { color: hsl(36 16% 97%); }





.v2-hero__trust:hover .v2-hero__trust-arrow {
  color: hsl(0 0% 12%);
  transform: translateX(3px);
}

.v2-aptsection {
  background: hsl(36 16% 97%);
  color: hsl(220 14% 8%);
  content-visibility: auto;
  contain-intrinsic-size: auto 1px auto 1200px;
  /* [WEIGHT 04.08] Ключевое слово auto: браузер запоминает НАСТОЯЩУЮ высоту после первой
     отрисовки и больше не подставляет выдуманную. Без него заглушка врала, и при обновлении
     страницы восстановленная позиция указывала на другой контент — в Safari это видно как
     рывок, в Chrome скрыто его собственным механизмом запоминания.
     ОТКАТ: убрать оба слова auto. */
}
.v2-aptsection__inner {
  width: var(--layout-rail);
  margin: 0 auto;
  padding: 5rem 0;
}
@media (min-width: 768px) {
  .v2-aptsection__inner { padding: var(--section-y) 0; }
}
/* ── Groups (Свободно сегодня / Скоро освободятся / Ремонт) ── */

.v2-aptsection__eyebrow-dot[data-state='free']       { background: var(--wa); box-shadow: 0 0 0 4px rgba(31,168,85,0.16); }
.v2-aptsection__eyebrow-dot[data-state='booked']     { background: hsl(36 60% 50%); }
.v2-aptsection__eyebrow-dot[data-state='renovation'] { background: hsl(0 50% 55%); }

/* ── Grids ── */
.v2-aptsection__grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  column-gap: 1.75rem;
  row-gap: 2.75rem;
  /* Equal-height rows so every plate's price row sits at the same Y */
  grid-auto-rows: 1fr;
  align-items: stretch;
}
@media (min-width: 640px) {
  .v2-aptsection__grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    column-gap: 1.75rem;
    row-gap: 3rem;
  }
}
@media (min-width: 1024px) {
  .v2-aptsection__grid {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    column-gap: var(--space-8);
    row-gap: 3.25rem;
  }
}

/* ── District bridge card — lives inside the apartment grid as a peer card,
      spans the empty slots so it visually fills the row ── */

.v2-aptsection__bridge-card:hover,
.v2-aptsection__bridge-card:focus-visible {
  transform: translateY(-3px);
  box-shadow:
    0 1px 0 hsl(var(--ink) / 0.06),
    0 30px 60px -28px hsl(var(--ink) / 0.32);
}
/* Tie the round CTA to the apartment-card hover so it slides like its peers */
.v2-aptsection__bridge-card:hover .v2-glass__cta,
.v2-aptsection__bridge-card:focus-visible .v2-glass__cta {
  transform: translateX(3px);
}

.v2-faq {
  background: hsl(36 14% 92% / 0.4);
  border-top: 1px solid hsl(36 8% 86%);
  color: hsl(220 14% 8%);
  content-visibility: auto;
  contain-intrinsic-size: auto 1px auto 900px;
}
.v2-faq__inner {
  width: var(--layout-rail);
  margin: 0 auto;
  padding: 5rem 0;
  display: grid;
  gap: 2.5rem;
  grid-template-columns: 1fr;
}
@media (min-width: 768px) {
  .v2-faq__inner {
    padding: var(--section-y) 0;
    gap: 4rem;
    grid-template-columns: 4fr 8fr;
  }
}

.v2-faq__h2 {
  /* Inherits p-display--h2: Onest 600 / -0.015em / 1.05 from primitives.css */
  margin: 0.75rem 0 0;
  font-size: var(--t-h2);
}
.v2-faq__wa {
  margin-top: 2rem;
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  font-size: var(--fs-md);
  color: hsl(0 0% 12%);
  transition: color var(--dur-base);
}
.v2-faq__wa:hover { color: hsl(14 60% 36%); }
.v2-faq__list {
  list-style: none;
  margin: 0;
  padding: 0;
  border-top: 1px solid hsl(36 8% 86%);
  border-bottom: 1px solid hsl(36 8% 86%);
}
.v2-faq__item { border-bottom: 1px solid hsl(36 8% 86%); }
.v2-faq__item:last-child { border-bottom: none; }
.v2-faq__summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-6);
  padding: 1.5rem 0;
  cursor: pointer;
  list-style: none;
}
.v2-faq__summary::-webkit-details-marker { display: none; }
.v2-faq__q {
  font-weight: 400;
  font-size: 1.5rem;
  line-height: 1.2;
}
@media (min-width: 768px) {
  .v2-faq__q { font-size: 1.75rem; }
}
.v2-faq__plus {
  flex-shrink: 0;
  font-size: var(--fs-xl);
  line-height: 1;
  color: hsl(220 8% 30%);
  width: 1.25rem;
  text-align: center;
}
.v2-faq__plus::before { content: '+'; }
.v2-faq__item details[open] .v2-faq__plus::before { content: '−'; }
.v2-faq__a {
  max-width: 60ch;
  margin: -0.5rem 0 1.75rem;
  font-size: var(--fs-base);
  line-height: 1.6;
  color: hsl(220 8% 30%);
}
.v2-faq__a a {
  color: var(--color-terracotta, hsl(0 0% 12%));
  text-decoration: none;
  transition: color var(--dur-base) ease;
}
.v2-faq__a a:hover,
.v2-faq__a a:focus-visible {
  color: hsl(14 60% 36%);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.v2-faq__a p { margin: 0 0 0.75rem; }
.v2-faq__a p:last-child { margin-bottom: 0; }
.v2-faq__a ul {
  margin: 0 0 0.75rem;
  padding-left: 1.25rem;
  list-style: disc;
}
.v2-faq__a li { margin: 0.25rem 0; }
.v2-faq__a strong { color: var(--color-ink); font-weight: 600; }

/* ════════════════════════════════════════════════════════════════════════
   v2/ApartmentCard.astro <style>
   ════════════════════════════════════════════════════════════════════════ */
/* ════════════════════════════════════════════════════════════════════════
   ApartmentCard — editorial layout: photo on top, text block below.
   ════════════════════════════════════════════════════════════════════════ */
/* ApartmentCard — editorial minimalist liquid-glass.
   Glass surface, photo 4:5 with chip + glass arrow overlaid in-frame,
   terracotta ЖК eyebrow, serif name, labeled stats ribbon with italic ₸. */

:root {
  --aptcard-accent: 14 45% 45%;       /* terracotta — scoped to card */
  --aptcard-accent-glow: 14 60% 55%;
}

/* ── Editorial photo card (overlay style) ── */
.v2-aptcard {
  display: block;
  color: inherit;
  text-decoration: none;
  border-radius: var(--radius-lg);
  overflow: hidden;
  width: 100%;
  height: 100%;
  transition:
    transform 0.38s cubic-bezier(.2,.7,.2,1),
    box-shadow 0.38s cubic-bezier(.2,.7,.2,1);
  box-shadow:
    0 1px 0 hsl(220 14% 8% / 0.04),
    0 24px 60px -32px hsl(220 14% 8% / 0.28);
}
.v2-aptcard:hover {
  transform: translateY(-3px);
  box-shadow:
    0 1px 0 hsl(220 14% 8% / 0.06),
    0 30px 60px -28px hsl(220 14% 8% / 0.32);
}
.v2-aptcard:focus-visible {
  transform: translateY(-3px);
  outline: none;
  /* Inner white halo separates ring from dark photo;
     outer dark-blue ring (4.7:1 on white page bg) stays visible on light surfaces. */
  box-shadow:
    0 0 0 3px hsl(0 0% 100%),
    0 0 0 6px hsl(220 95% 42%),
    0 0 0 7px hsl(0 0% 100% / 0.6),
    0 30px 60px -28px hsl(220 14% 8% / 0.32);
}
/* High-contrast mode — let the UA paint a system focus indicator. */
@media (forced-colors: active) {
  .v2-aptcard:focus-visible {
    outline: 3px solid CanvasText;
    outline-offset: 3px;
    box-shadow: none;
  }
}
.v2-aptcard[aria-disabled="true"] {
  cursor: not-allowed;
}

.v2-aptcard__photo {
  position: relative;
  aspect-ratio: 3 / 4;
  height: 100%;
  min-height: 100%;
  overflow: hidden;
  background: hsl(228 12% 9%);
  border-radius: inherit;
}
.v2-aptcard--feature .v2-aptcard__photo { aspect-ratio: 4 / 3; }
/* Align compact (non-plated) cards to the plated 4/5 ratio so the grid
   stays on a consistent baseline regardless of card status. */
.v2-aptcard--compact .v2-aptcard__photo { aspect-ratio: 4 / 5; }

.v2-aptcard__img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 1.4s ease-out;
}
.v2-aptcard:hover .v2-aptcard__img,
.v2-aptcard:focus-visible .v2-aptcard__img { transform: scale(1.04); }

.v2-aptcard__corner {
  position: absolute;
  top: 1rem;
  right: 1rem;
  z-index: 2;
}





/* Metabar — liquid-glass pill with specs + price */


/* Compact density */
.v2-aptcard--compact .v2-aptcard__overlay { padding: 1.25rem; gap: 0.8rem; }
.v2-aptcard--compact .v2-aptcard__name { font-size: 1.75rem; }
.v2-aptcard--compact .v2-aptcard__building { font-size: var(--fs-2xs); letter-spacing: 0.18em; }
.v2-aptcard--compact .v2-aptcard__metabar-spec { padding: 0.3rem 0.65rem 0.3rem 0.8rem; gap: var(--space-2); }
.v2-aptcard--compact .v2-aptcard__metabar-price { padding: 0.4rem 0.8rem; }
.v2-aptcard--compact .v2-aptcard__metabar-num { font-size: var(--fs-xs); }
.v2-aptcard--compact .v2-aptcard__metabar-price-num { font-size: 22px; }

/* ─── Renovation card — переосмысление ─────────────────────────────────
   Фото десатурируется и закрывается тонким scrim, поверх — центральная
   стеклянная плашка статуса. Под фото плашка минимальная: только район,
   название и одна подпись. Никакой нижней пилюли — статус считывается
   моментально и больше не «висит в середине снизу». */
.v2-aptcard[data-status='renovation'] .v2-aptcard__img {
  filter: grayscale(0.85) brightness(0.96);
}

/* Упрощённая плашка под фото для ремонта */



/* Карточка ремонта в каталоге — без hover-эффектов клика */
.aptcat__cell [data-status='renovation'] { cursor: default; }
.aptcat__cell .v2-aptcard[data-status='renovation'] { opacity: 0.92; }
/* Renovation status — visible to sighted users AND screen readers.
   Sized for legibility at small card widths; scales up on roomier viewports. */
/* Renovation status — mirrors the metabar layout:
   glass spec-pill on the left, transparent label on the right. */
.v2-aptcard__status {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  width: 100%;
  gap: var(--space-3);
  margin: 0;
  padding: 0;
  color: #fff;
  font-family: var(--font-family-sans-cinematic);
  font-size: var(--fs-sm);
  line-height: 1;
}

.v2-aptcard--compact .v2-aptcard__status,
.v2-aptcard--compact .v2-aptcard__status-sub { font-size: var(--fs-sm); }
.v2-aptcard--feature .v2-aptcard__status,
.v2-aptcard--hero .v2-aptcard__status { font-size: var(--fs-md); }




.v2-aptcard[data-status='renovation'] .v2-aptcard__status { opacity: 1; }

/* Chip (top-right) — matches the spec-pill glass */
.v2-aptcard__chip {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: 0.4rem 0.8rem;
  border-radius: var(--radius-full);
  background: hsl(0 0% 100% / 0.12);
  color: #fff;
  font-family: var(--font-family-sans-cinematic);
  font-size: clamp(11.5px, 0.3vw + 10.5px, 13px);
  font-weight: 500;
  line-height: 1;
  letter-spacing: -0.006em;
  font-variant-numeric: tabular-nums;
  text-transform: none;
  white-space: nowrap;
  -webkit-backdrop-filter: blur(18px) saturate(160%);
  backdrop-filter: blur(18px) saturate(160%);
  box-shadow:
    inset 0 1px hsl(0 0% 100% / 0.28),
    inset 0 0 0 1px hsl(0 0% 100% / 0.14);
}
.v2-aptcard__chip-dot {
  width: 7px;
  height: 7px;
  border-radius: var(--radius-full);
}
.v2-aptcard__chip[data-state='free'] .v2-aptcard__chip-dot {
  background: hsl(150 60% 60%);
  box-shadow: 0 0 0 3px hsl(150 60% 60% / 0.28);
}
.v2-aptcard__chip[data-state='booked'] .v2-aptcard__chip-dot {
  background: hsl(28 92% 62%);
  box-shadow: 0 0 0 3px hsl(28 92% 62% / 0.25);
}
.v2-aptcard__chip[data-state='renovation'] .v2-aptcard__chip-dot {
  background: hsl(28 92% 62%);
  box-shadow: 0 0 0 3px hsl(28 92% 62% / 0.25);
}

/* Renovation state */
.v2-aptcard[data-status='renovation'] {
  pointer-events: none;
  opacity: 0.72;
}
.v2-aptcard[data-status='renovation'] .v2-aptcard__img {
  filter: grayscale(0.6) brightness(0.9);
}

@media (prefers-reduced-motion: reduce) {
  .v2-aptcard,
  .v2-aptcard:hover,
  .v2-aptcard:focus-visible { transform: none; transition: none; }
  .v2-aptcard__img,
  .v2-aptcard:hover .v2-aptcard__img,
  .v2-aptcard:focus-visible .v2-aptcard__img { transition: none; transform: none; }
}

/* ════════════════════════════════════════════════════════════════════════
   v2/ReviewCard.astro <style>
   ════════════════════════════════════════════════════════════════════════ */
/* Dark plate review card — same DNA as v2-aptsection__bridge-card. */



.v2-reviewcard--linked:hover {
  transform: translateY(-3px);
  border-color: hsl(0 0% 100% / 0.14);
  box-shadow: 0 28px 56px -28px hsl(220 14% 0% / 0.55);
}

/* Faint map-grid watermark. */


/* Body — clean sans, same family as apartment subtitles. */



/* ════════════════════════════════════════════════════════════════════════
   v2/MobileBottomBar.astro <style>
   ════════════════════════════════════════════════════════════════════════ */
.mobile-bar {
  display: none;
  position: fixed;
  bottom: 0; left: 0; right: 0;
  z-index: 200;
  background: hsl(var(--ink));
  color: hsl(var(--paper));
  padding: 8px 0 max(8px, env(safe-area-inset-bottom));
  box-shadow: 0 -4px 16px rgba(0, 0, 0, 0.15);
  border-top: 1px solid rgba(244, 240, 230, 0.1);
}
@media (max-width: 1023.98px) {
  .mobile-bar {
    display: grid;
    grid-template-columns: 1fr 1fr;
  }
  /* Dedupe: drawer carries its own WhatsApp + Звонок row when open. */
  body:has(.site-drawer.is-open) .mobile-bar { display: none; }
}
.mobile-bar-item {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 4px;
  min-height: 56px;
  padding: 8px 4px;
  color: rgba(244, 240, 230, 0.85);
  font-family: var(--font-sans);
  font-size: var(--fs-2xs);
  text-transform: uppercase;
  letter-spacing: 0.1em;
  transition: color var(--dur-base);
}
.mobile-bar-item svg {
  width: 22px; height: 22px;
  color: currentColor;
}
.mobile-bar-item:active,
.mobile-bar-item:hover {
  color: hsl(var(--paper));
}
.mobile-bar-item-wa svg {
  color: var(--wa);
}
@media (max-width: 1023.98px) {
  body { padding-bottom: calc(72px + env(safe-area-inset-bottom)); }
}

/* ════════════════════════════════════════════════════════════════════════
   Apartment-detail — layout A: compact two-column (2026-05-14)
   No photo hero. Compact title, gallery-led left column, sticky booking rail.
   ════════════════════════════════════════════════════════════════════════ */

.apt-renov-banner {
  border-bottom: 1px solid hsl(var(--hairline));
  background: hsl(var(--paper));
}
.apt-renov-banner__inner {
  max-width: 1400px;
  margin: 0 auto;
  padding: 1.25rem 1.25rem;
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}
@media (min-width: 768px) { .apt-renov-banner__inner { padding: 1.5rem 2.5rem; } }
.apt-renov-banner__label {
  margin: 0;
  font-size: var(--fs-2xs);
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.22em;
  color: hsl(var(--ink-muted));
}
.apt-renov-banner__text {
  margin: 0;
  font-size: var(--fs-base);
  line-height: 1.55;
  color: hsl(var(--ink-soft));
  max-width: 60ch;
}
.apt-renov-banner__text a {
  color: hsl(var(--ink));
  border-bottom: 1px solid hsl(var(--ink) / 0.3);
}
.apt-renov-banner__text a:hover { border-bottom-color: currentColor; }

/* ════════════════════════════════════════════════════════════════════════
   Apartment detail — "Cinematic narrative" (v3, 2026-05-15)
   Editorial header → asymmetric gallery → rituals → dark district band →
   pull-quote reviews → host → conditions → collection. Floating concierge bar.
   ════════════════════════════════════════════════════════════════════════ */

.apt2 {
  --apt2-shell-max: 1280px;
  --apt2-pad: 1.25rem;
  --apt2-gap: 3.5rem;
  --apt2-gap-md: 5rem;
  --apt2-gap-lg: 6.5rem;
  background: hsl(var(--paper));
  color: hsl(var(--ink));
  padding-bottom: 7rem; /* room for floating bar */
}
@media (min-width: 768px) {
  .apt2 { --apt2-pad: 2.5rem; padding-bottom: 8rem; }
}
@media (min-width: 1024px) {
  .apt2 { --apt2-pad: clamp(2.5rem, calc(3.125vw + 0.5rem), 3rem); }
}

.apt2-shell {
  max-width: var(--apt2-shell-max);
  margin: 0 auto;
  padding-left: var(--apt2-pad);
  padding-right: var(--apt2-pad);
  width: 100%;
}

.apt2-eyebrow {
  margin: 0 0 0.75rem;
  font-size: var(--s-13, 13px);
  font-weight: 500;
  letter-spacing: 0;
  color: hsl(var(--ink-muted));
}
/* [A11Y-MUTED-2 15.08] На подложке --soft секции коллекции rgb(237,235,232) даже 45%
   даёт 4,17:1 — здесь тон локально глубже, 43% = 4,49:1 ≈ порог, 42% = 4,62. Берём 42. */
.apt2-section--soft .apt2-eyebrow { color: hsl(220 6% 42%); }
.apt2-eyebrow--paper { color: hsl(var(--paper) / 0.55); }

.apt2-h2 {
  margin: 0;
  font-family: var(--font-family-display-cinematic);
  font-weight: 300;
  font-size: clamp(2rem, 4.5vw, 3.5rem);
  line-height: 1;
  letter-spacing: -0.015em;
  color: hsl(var(--ink));
}
.apt2-h2 em { font-style: italic; font-weight: 400; color: hsl(var(--terracotta)); }
.apt2-h2--paper { color: hsl(var(--paper)); }
.apt2-h2--paper em { color: hsl(34 65% 70%); font-style: italic; opacity: 1; }

.apt2-section { padding: var(--apt2-gap) 0; }
@media (min-width: 1024px) {
  .apt2-section { padding: clamp(5rem, calc(9.375vw - 1rem), 6.5rem) 0; }
}
.apt2-section--soft { background: hsl(var(--paper-soft)); }

.apt2-gallery__handoff {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  margin: 1rem 0 0;
  padding: 12px 1.1rem;
  background: transparent;
  border: 1px solid hsl(var(--hairline));
  border-radius: var(--radius-full);
  font-family: var(--font-sans);
  font-size: var(--fs-md);
  font-weight: 500;
  letter-spacing: 0;
  color: hsl(var(--ink));
  cursor: pointer;
  transition: background-color .2s ease, border-color .2s ease, color .2s ease;
}
.apt2-gallery__handoff:hover {
  background: hsl(var(--ink));
  border-color: hsl(var(--ink));
  color: hsl(var(--paper));
}
.apt2-gallery__handoff-arrow {
  display: inline-block;
  transition: transform .2s ease;
}
.apt2-gallery__handoff:hover .apt2-gallery__handoff-arrow { transform: translateX(3px); }
@media (min-width: 1024px) {
  .apt2-gallery__handoff { margin-top: 1.25rem; padding: 12px 1.4rem; font-size: var(--fs-base); }
}

/* ── Editorial header ─────────────────────────────────────────────────── */
.apt2-head { padding-top: 3rem; padding-bottom: 1.5rem; }
@media (min-width: 1024px) {
  .apt2-head {
    padding-top: clamp(4rem, 6.25vw, 5rem);
    padding-bottom: clamp(2.5rem, calc(3.125vw + 0.5rem), 3rem);
  }
}
.apt2-head__inner {
  display: grid;
  grid-template-columns: 1fr;
  gap: 2.5rem;
  align-items: end;
}
@media (min-width: 1024px) {
  .apt2-head__inner { grid-template-columns: minmax(0, 1fr) auto; gap: 4rem; }
}
.apt2-head__lede { max-width: 42rem; min-width: 0; }

.apt2-head__title {
  margin: 0;
  font-weight: 300;
  font-size: clamp(2.75rem, 7.5vw, 6.5rem);
  line-height: 0.95;
  letter-spacing: -0.025em;
  color: hsl(var(--ink));
}
.apt2-head__sub {
  margin: 1.25rem 0 0;
  max-width: 56rem;
  font-size: var(--fs-lg);
  line-height: 1.55;
  font-weight: 400;
  color: hsl(var(--ink) / 0.78);
}

.apt2-head__meta {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1.25rem 2rem;
  margin: 0;
  padding-top: 1.5rem;
  border-top: 1px solid hsl(var(--ink) / 0.12);
}
@media (min-width: 640px) {
  .apt2-head__meta { grid-template-columns: repeat(4, auto); gap: 0 2.25rem; }
}
@media (min-width: 1024px) {
  .apt2-head__meta {
    border-top: 0;
    padding: 0 0 0.5rem 2.25rem;
    border-left: 1px solid hsl(var(--ink) / 0.12);
    /* [27.08] 4 ячейки в одну строку душили колонку заголовка: длинная парковка
       раздувала мету до 564px. Два ряда по два — мета узкая, заголовок дышит. */
    grid-template-columns: repeat(2, auto);
    gap: 1.25rem 2.25rem;
    align-self: center;
  }
}
.apt2-head__meta dd { max-width: 11rem; }
.apt2-head__meta div { display: flex; flex-direction: column; gap: 4px; /* [GRID-4 15.08] 5.6 → 4 */ }
.apt2-head__meta dt {
  margin: 0;
  font-size: var(--s-13, 13px);
  letter-spacing: 0;
  color: hsl(var(--ink) / 0.45);
}
.apt2-head__meta dd { margin: 0; font-size: var(--fs-base); font-weight: 500; color: hsl(var(--ink)); }
.apt2-head__rating { color: inherit; display: inline-flex; align-items: center; gap: 8px; }
.apt2-head__rating:hover { color: hsl(var(--terracotta)); }


/* ── Asymmetric gallery ───────────────────────────────────────────────── */
.apt2-gallery { padding-bottom: var(--apt2-gap); }
@media (min-width: 1024px) {
  .apt2-gallery { padding-bottom: clamp(5rem, calc(9.375vw - 1rem), 6.5rem); }
}
.apt2-gallery__grid {
  position: relative;
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-2);
  align-items: stretch;
}
@media (min-width: 768px) {
  .apt2-gallery__grid {
    grid-template-columns: 2fr 1fr 1fr;
    grid-template-rows: 1fr 1fr;
    gap: 0.6rem;
    aspect-ratio: 2 / 1;
  }
}
.apt2-gallery__main {
  appearance: none;
  border: 0;
  padding: 0;
  background: hsl(var(--ink) / 0.06);
  width: 100%;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  cursor: pointer;
  display: block;
  position: relative;
}
@media (min-width: 768px) {
  .apt2-gallery__main {
    aspect-ratio: auto;
    grid-column: 1 / 2;
    grid-row: 1 / 3;
    height: 100%;
  }
}
/* Photo-like loading placeholder until <img data-loaded="true">.
   Shared base — main and tile each tune intensity + speed below so the
   placeholder reads the same on a wide 4/3 hero and a square 1/1 tile. */
.apt2-gallery__main::before,
.apt2-gallery__tile::before {
  content: "";
  position: absolute;
  inset: 0;
  background-repeat: no-repeat;
  pointer-events: none;
  transition: opacity var(--dur-slow) ease;
  z-index: 0;
}

/* Main (large, ~4/3 on mobile / tall on desktop): softer ink wash, wider
   shimmer band, slower sweep so the highlight feels proportional to the
   bigger surface and doesn't streak past too quickly. */
.apt2-gallery__main::before {
  background-color: hsl(var(--ink) / 0.045);
  background-image:
    linear-gradient(
      115deg,
      transparent 0%,
      transparent 32%,
      hsl(var(--paper) / 0.5) 47%,
      hsl(var(--paper) / 0.72) 50%,
      hsl(var(--paper) / 0.5) 53%,
      transparent 68%,
      transparent 100%
    ),
    radial-gradient(circle at 28% 22%, hsl(var(--ink) / 0.08), transparent 72%),
    radial-gradient(circle at 78% 88%, hsl(var(--ink) / 0.05), transparent 72%);
  background-size: 280% 100%, 100% 100%, 100% 100%;
  background-position: 180% 0, 0 0, 0 0;
  animation: apt2-photo-shimmer-main 2200ms ease-in-out infinite;
}

/* Tile (small square): punchier highlight + faster sweep so the shorter
   travel distance still reads as movement, and slightly stronger ink tint
   compensates for the smaller surface. */
.apt2-gallery__tile::before {
  background-color: hsl(var(--ink) / 0.05);
  background-image:
    linear-gradient(
      115deg,
      transparent 0%,
      transparent 28%,
      hsl(var(--paper) / 0.6) 46%,
      hsl(var(--paper) / 0.85) 50%,
      hsl(var(--paper) / 0.6) 54%,
      transparent 72%,
      transparent 100%
    ),
    radial-gradient(circle at 32% 18%, hsl(var(--ink) / 0.1), transparent 70%),
    radial-gradient(circle at 72% 84%, hsl(var(--ink) / 0.06), transparent 70%);
  background-size: 220% 100%, 100% 100%, 100% 100%;
  background-position: 140% 0, 0 0, 0 0;
  animation: apt2-photo-shimmer-tile 1500ms ease-in-out infinite;
}

.apt2-gallery__main:has(img[data-loaded="true"])::before,
.apt2-gallery__tile:has(img[data-loaded="true"])::before {
  opacity: 0;
  animation: none;
}
@keyframes apt2-photo-shimmer-main {
  0%   { background-position: 180% 0, 0 0, 0 0; }
  100% { background-position: -180% 0, 0 0, 0 0; }
}
@keyframes apt2-photo-shimmer-tile {
  0%   { background-position: 140% 0, 0 0, 0 0; }
  100% { background-position: -140% 0, 0 0, 0 0; }
}
@media (prefers-reduced-motion: reduce) {
  .apt2-gallery__main::before,
  .apt2-gallery__tile::before { animation: none; }
}
.apt2-gallery__main img,
.apt2-gallery__tile img {
  position: relative;
  z-index: 1;
  width: 100%; height: 100%; object-fit: cover;
  opacity: 0;
  transition: transform var(--dur-slower) var(--ease-standard), opacity var(--dur-slow) ease;
}
.apt2-gallery__main img[data-loaded="true"],
.apt2-gallery__tile img[data-loaded="true"] { opacity: 1; }
.apt2-gallery__main:hover img,
.apt2-gallery__tile:hover img { transform: scale(1.03); }

.apt2-gallery__side {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 1fr 1fr;
  gap: var(--space-2);
}
@media (min-width: 768px) {
  .apt2-gallery__side { display: contents; }
}
.apt2-gallery__tile {
  appearance: none;
  border: 0;
  padding: 0;
  background: hsl(var(--ink) / 0.06);
  width: 100%;
  aspect-ratio: 1 / 1;
  overflow: hidden;
  cursor: pointer;
  display: block;
  position: relative;
}
@media (min-width: 768px) {
  .apt2-gallery__tile { aspect-ratio: auto; height: 100%; }
}
.apt2-gallery__open {
  position: absolute;
  right: 1rem;
  bottom: 1rem;
  background: hsl(var(--paper));
  color: hsl(var(--ink));
  border: 1px solid hsl(var(--ink) / 0.12);
  border-radius: var(--radius-sm);
  font-size: var(--s-13, 13px);
  letter-spacing: 0;
  font-weight: 600;
  cursor: pointer;
  padding: 12px 1rem;
  box-shadow: 0 6px 20px hsl(var(--ink) / 0.18);
  transition: transform .2s, box-shadow .2s;
}
@media (min-width: 1024px) {
  .apt2-gallery__open { right: 1.25rem; bottom: 1.25rem; padding: 12px 1.15rem; }
}
.apt2-gallery__open:hover { transform: translateY(-1px); box-shadow: 0 10px 28px hsl(var(--ink) / 0.24); }

/* ── Curated rituals ──────────────────────────────────────────────────── */
.apt2-rituals {
  display: grid;
  grid-template-columns: 1fr;
  gap: 3rem;
}
@media (min-width: 768px) {
  .apt2-rituals { gap: clamp(3rem, 6.25vw, 4rem); }
}
@media (min-width: 1024px) {
  .apt2-rituals { grid-template-columns: 4fr 8fr; gap: clamp(4rem, calc(12.5vw - 4rem), 6rem); }
}
.apt2-rituals__intro { min-width: 0; }
.apt2-rituals__lead {
  margin: 1.5rem 0 0;
  font-size: var(--fs-lg);
  line-height: 1.6;
  font-weight: 400;
  color: hsl(var(--ink) / 0.78);
  max-width: 34ch;
}
.apt2-highlights { list-style: none; margin: 2.5rem 0 0; padding: 0; display: flex; flex-direction: column; gap: 1.75rem; }
.apt2-highlight {
  display: grid;
  grid-template-columns: 3rem 1fr;
  gap: var(--space-5);
  padding-top: 1.75rem;
  border-top: 1px solid hsl(var(--ink) / 0.1);
}
.apt2-highlight:first-child { padding-top: 0; border-top: 0; }
.apt2-highlight__num {
  font-size: 1.75rem;
  font-style: italic;
  font-weight: 400;
  line-height: 1;
  color: hsl(var(--terracotta));
}
.apt2-highlight__title { margin: 0; font-size: var(--fs-lg); line-height: 1.5; font-weight: 500; color: hsl(var(--ink)); }
.apt2-highlight__note { margin: 8px /* [GRID-4 15.08] 6.4 → 8 */ 0 0; font-size: var(--fs-base); line-height: 1.6; color: hsl(var(--ink) / 0.65); }

.apt2-rituals__list { min-width: 0; }
.apt2-rooms { display: grid; grid-template-columns: 1fr; gap: 0; }
@media (min-width: 640px) { .apt2-rooms { grid-template-columns: repeat(2, 1fr); } }
.apt2-room {
  padding: 1.75rem 0;
  border-top: 1px solid hsl(var(--ink) / 0.1);
}
.apt2-room:nth-child(-n+2) { border-top: 0; padding-top: 0; }
@media (max-width: 639px) {
  .apt2-room:not(:first-child) { border-top: 1px solid hsl(var(--ink) / 0.1); padding-top: 1.75rem; }
  .apt2-room:first-child { padding-top: 0; }
}
@media (min-width: 640px) {
  .apt2-room:nth-child(odd) { padding-right: 2rem; }
  .apt2-room:nth-child(even) { padding-left: 2rem; border-left: 1px solid hsl(var(--ink) / 0.1); }
  .apt2-room--full {
    grid-column: 1 / -1;
    padding: 1.75rem 0 0;
    margin-top: 0.25rem;
    border-top: 1px solid hsl(var(--ink) / 0.1);
    border-left: 0 !important;
    padding-left: 0 !important;
    padding-right: 0 !important;
  }
}
.apt2-room__name {
  margin: 0 0 0.5rem;
  font-size: var(--fs-xl);
  font-style: italic;
  font-weight: 400;
  color: hsl(var(--ink));
}
.apt2-room__items { margin: 0; font-size: var(--fs-lg); line-height: 1.6; color: hsl(var(--ink) / 0.82); font-weight: 400; }



.apt2-amen__item::before { content: '·'; position: absolute; left: 0; color: hsl(var(--terracotta)); }




/* ── Dark district band ───────────────────────────────────────────────── */
.apt2-district {
  background: hsl(var(--ink));
  color: hsl(var(--paper));
  padding: var(--apt2-gap) 0;
  position: relative;
  overflow: hidden;
}
@media (min-width: 1024px) {
  .apt2-district { padding: clamp(5rem, calc(9.375vw - 1rem), 6.5rem) 0; }
}
.apt2-district .apt2-eyebrow { color: hsl(var(--paper) / 0.5); }
.apt2-district__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 3rem;
  align-items: center;
  position: relative;
}
@media (min-width: 768px) {
  .apt2-district__grid { gap: clamp(3rem, 6.25vw, 4rem); }
}
@media (min-width: 1024px) {
  .apt2-district__grid { grid-template-columns: 1fr 1fr; gap: clamp(4rem, calc(12.5vw - 4rem), 6rem); }
}
.apt2-district__copy { position: relative; min-width: 0; }
.apt2-district__giant {
  position: absolute;
  top: -3rem;
  left: -1rem;
  font-size: clamp(10rem, 22vw, 18rem);
  line-height: 0.8;
  font-style: italic;
  font-weight: 300;
  color: hsl(var(--paper));
  opacity: 0.05;
  pointer-events: none;
  user-select: none;
}
.apt2-district__lede {
  margin: 1.75rem 0 0;
  font-size: var(--fs-lg);
  line-height: 1.6;
  font-weight: 400;
  color: hsl(var(--paper) / 0.82);
  max-width: 36rem;
}
.apt2-district__nearby {
  margin: 2.5rem 0 0;
  padding-top: 2rem;
  border-top: 1px solid hsl(var(--paper) / 0.12);
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.5rem 2.5rem;
}
@media (min-width: 540px) { .apt2-district__nearby { grid-template-columns: repeat(2, 1fr); } }
.apt2-district__nearby div { min-width: 0; }
.apt2-district__nearby dt {
  margin: 0 0 8px; /* [GRID-4 15.08] 9.6 → 8 */
  font-size: var(--s-13, 13px);
  letter-spacing: 0;
  color: hsl(var(--paper) / 0.45);
}
.apt2-district__nearby dd { margin: 0; font-size: var(--fs-base); line-height: 1.6; font-weight: 400; color: hsl(var(--paper) / 0.85); }

.apt2-district__links {
  margin-top: 2rem;
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-4);
  align-items: center;
  font-size: var(--s-13, 13px);
  letter-spacing: 0;
}
.apt2-district__links span { color: hsl(var(--paper) / 0.45); }
.apt2-district__links a { color: hsl(var(--paper)); border-bottom: 1px solid hsl(var(--paper) / 0.3); padding-bottom: 2px; }
.apt2-district__links a:hover { border-bottom-color: hsl(var(--paper)); }

.apt2-district__map {
  width: 100%;
  aspect-ratio: 1 / 1;
  background:
    radial-gradient(circle at 50% 45%, hsl(var(--terracotta) / 0.18), transparent 55%),
    linear-gradient(135deg, hsl(var(--paper) / 0.04), hsl(var(--paper) / 0.08));
  border: 1px solid hsl(var(--paper) / 0.1);
  overflow: hidden;
  position: relative;
}
.apt2-district__map::before {
  content: '';
  position: absolute; inset: 0;
  background-image:
    linear-gradient(hsl(var(--paper) / 0.04) 1px, transparent 1px),
    linear-gradient(90deg, hsl(var(--paper) / 0.04) 1px, transparent 1px);
  background-size: 32px 32px;
  pointer-events: none;
}
@media (min-width: 1024px) { .apt2-district__map { aspect-ratio: 4 / 5; } }
.apt2-district__map iframe { width: 100%; height: 100%; border: 0; position: relative; z-index: 1; filter: invert(0.92) hue-rotate(180deg) saturate(0.6); }

/* ── Reviews — pull-quote ─────────────────────────────────────────────── */


.apt2-reviews__head .apt2-eyebrow { margin-bottom: 0.5rem; }









@media (min-width: 1024px) {
  /* Match the total height of 3 cards + 2 gaps. Both the card height and this
     reservation are expressed in the same rem-based formula, so any root font-size
     change (user zoom, browser default size) scales them in lockstep. */
  
}
/* 1+3 layout: featured quote stays on the left, three cards stack vertically on the right */
@media (min-width: 768px) and (max-width: 1023.98px) {
  
  .apt2-reviews__grid > :first-child { grid-column: 1 / -1; }
}




.apt2-reviews__profiles a span.tabular { color: hsl(var(--terracotta)); }

/* ── Host ─────────────────────────────────────────────────────────────── */
.apt2-host {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: var(--space-8);
  align-items: center;
  padding: 2.5rem 0;
  border-top: 1px solid hsl(var(--ink) / 0.1);
  border-bottom: 1px solid hsl(var(--ink) / 0.1);
}
.apt2-host__photo {
  width: 5.5rem;
  height: 5.5rem;
  border-radius: 50%;
  object-fit: cover;
  background: hsl(var(--ink) / 0.06);
}
.apt2-host__photo--frame {
  position: relative;
  display: grid;
  place-items: center;
  overflow: hidden;
  background: linear-gradient(135deg, hsl(var(--terracotta) / 0.18), hsl(var(--ink) / 0.08));
  flex-shrink: 0;
}
.apt2-host__photo--frame::before {
  content: attr(data-initials);
  position: absolute; inset: 0;
  display: grid; place-items: center;
  font-family: var(--font-sans);
  font-style: italic;
  font-size: 1.75rem;
  color: hsl(var(--ink) / 0.55);
  letter-spacing: 0.02em;
}
.apt2-host__photo--frame img {
  position: relative; z-index: 1;
  width: 100%; height: 100%; object-fit: cover;
  border-radius: inherit;
}
@media (min-width: 768px) {
  .apt2-host__photo { width: 8rem; height: 8rem; }
  .apt2-host__photo--frame::before { font-size: 2.25rem; }
}
.apt2-host__text { min-width: 0; }
/* Хозяева на страницах квартир — «Влад и Ия» двумя ОТДЕЛЬНЫМИ кадрами (не парной рамкой —
   см. решение по полароидам на главной): два квадрата чуть меньше одиночного фото. */
.apt2-host__pair { display: flex; gap: 0.8rem; align-items: center; flex-shrink: 0; }
.apt2-host__pair .apt2-host__photo { width: 4.75rem; height: 4.75rem; }
@media (min-width: 768px) { .apt2-host__pair .apt2-host__photo { width: 6.25rem; height: 6.25rem; } }
.apt2-host__name { margin: 0.25rem 0 8px; font-size: clamp(1.5rem, 3vw, 2rem); font-weight: 300; letter-spacing: -0.015em; }
.apt2-host__line { margin: 0; font-size: var(--fs-lg); line-height: 1.6; color: hsl(var(--ink) / 0.78); font-weight: 400; }
.apt2-host__contact { margin: 0.75rem 0 0; font-size: var(--fs-base); display: flex; gap: 0.6rem; flex-wrap: wrap; align-items: center; color: hsl(var(--ink) / 0.55); }
.apt2-host__contact a { color: hsl(var(--ink)); border-bottom: 1px solid hsl(var(--ink) / 0.3); padding-bottom: 1px; }
.apt2-host__contact a:hover { border-bottom-color: hsl(var(--terracotta)); color: hsl(var(--terracotta)); }

/* ── Conditions ───────────────────────────────────────────────────────── */
.apt2-cond { display: flex; flex-direction: column; gap: 2.5rem; }
.apt2-cond__head { max-width: 32rem; }
.apt2-cond__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-8);
}
@media (min-width: 768px) { .apt2-cond__grid { grid-template-columns: repeat(3, 1fr); gap: 3rem; } }
.apt2-cond__col { min-width: 0; padding-top: 1.5rem; border-top: 1px solid hsl(var(--ink) / 0.12); }
.apt2-cond__sub {
  margin: 28px 0 12px; /* [GRID-4 15.08] 13.6 → 12 */
  font-size: var(--s-13, 13px);
  font-weight: 500;
  letter-spacing: 0;
  color: hsl(var(--ink-muted));
}
.apt2-cond__col > .apt2-cond__sub:first-child { margin-top: 0; }
.apt2-cond__line { margin: 0; font-size: var(--fs-lg); line-height: 1.6; color: hsl(var(--ink) / 0.8); font-weight: 400; }
.apt2-cond__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--space-3); }
.apt2-cond__list li {
  font-size: var(--fs-lg);
  line-height: 1.6;
  color: hsl(var(--ink) / 0.8);
  font-weight: 400;
  padding-left: 1rem;
  position: relative;
}
.apt2-cond__list li::before { content: '·'; position: absolute; left: 0; color: hsl(var(--terracotta)); }
.apt2-cond__faq {
  margin: 2.5rem 0 0;
  padding-top: 1.75rem;
  border-top: 1px solid hsl(var(--ink) / 0.12);
  font-size: var(--fs-base);
  line-height: 1.6;
  color: hsl(var(--ink) / 0.6);
}
.apt2-cond__faq a { color: hsl(var(--ink)); border-bottom: 1px solid hsl(var(--ink) / 0.3); padding-bottom: 1px; }
.apt2-cond__faq a:hover { border-bottom-color: hsl(var(--terracotta)); color: hsl(var(--terracotta)); }

/* ── Collection ───────────────────────────────────────────────────────── */
.apt2-coll { display: flex; flex-direction: column; gap: 2.5rem; }
.apt2-coll__head { display: flex; flex-wrap: wrap; align-items: end; justify-content: space-between; gap: 1rem 2rem; }
.apt2-coll__head h2 em { font-style: italic; color: hsl(var(--terracotta)); }
.apt2-coll__all { font-size: var(--s-13, 13px); letter-spacing: 0; color: hsl(var(--ink)); border-bottom: 1px solid hsl(var(--ink) / 0.3); padding-bottom: 2px; }
.apt2-coll__all:hover { border-bottom-color: hsl(var(--terracotta)); color: hsl(var(--terracotta)); }
.apt2-coll__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-8);
}
@media (min-width: 360px) { .apt2-coll__grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1024px) { .apt2-coll__grid { grid-template-columns: repeat(3, 1fr); } }

/* ── Floating concierge bar ───────────────────────────────────────────── */
.apt2-bar {
  position: fixed;
  left: 50%;
  bottom: calc(1rem + env(safe-area-inset-bottom));
  transform: translateX(-50%);
  z-index: 60;
  width: calc(100% - 1.25rem);
  max-width: 44rem;
  pointer-events: auto;
}
@media (min-width: 768px) { .apt2-bar { bottom: calc(1.5rem + env(safe-area-inset-bottom)); } }
.apt2-bar__inner {
  background: hsl(var(--ink) / 0.94);
  color: hsl(var(--paper));
  border: 1px solid hsl(var(--paper) / 0.06);
  border-radius: var(--radius-full);
  padding: 0.5rem 0.5rem 0.5rem 1.25rem;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  box-shadow: 0 18px 48px -24px hsl(var(--ink) / 0.6), 0 2px 8px -2px hsl(var(--ink) / 0.3);
  backdrop-filter: blur(14px) saturate(140%);
  -webkit-backdrop-filter: blur(14px) saturate(140%);
}
@media (min-width: 768px) { .apt2-bar__inner { padding: 0.5rem 0.5rem 0.5rem 1.5rem; gap: var(--space-5); } }
.apt2-bar__price {
  display: inline-flex;
  align-items: baseline;
  gap: 0.4rem;
  min-width: 0;
  color: hsl(var(--paper));
}
.apt2-bar__price-prefix {
  font-size: var(--fs-2xs);
  font-weight: 400;
  color: hsl(var(--paper) / 0.5);
}
.apt2-bar__price-amount {
  font-size: var(--fs-lg);
  font-weight: 500;
  letter-spacing: -0.01em;
  color: hsl(var(--paper));
}
@media (min-width: 768px) { .apt2-bar__price-amount { font-size: var(--fs-lg); } }
.apt2-bar__price-unit {
  font-size: var(--fs-2xs);
  font-weight: 400;
  color: hsl(var(--paper) / 0.5);
}
.apt2-bar__ctas { display: flex; align-items: center; gap: 0.4rem; }
.apt2-bar__ghost {
  display: none;
  align-items: center;
  gap: 0.35rem;
  padding: 0.65rem 1rem;
  border-radius: var(--radius-full);
  color: hsl(var(--paper) / 0.85);
  font-size: var(--fs-sm);
  font-weight: 500;
  letter-spacing: 0;
  transition: color .2s, background-color .2s;
}
.apt2-bar__ghost:hover { color: hsl(var(--paper)); background: hsl(var(--paper) / 0.06); }
@media (min-width: 640px) { .apt2-bar__ghost { display: inline-flex; } }
.apt2-bar__cta {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: 0.7rem 1.15rem;
  border-radius: var(--radius-full);
  background: hsl(var(--whatsapp));
  color: hsl(var(--whatsapp-foreground));
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: 0;
  box-shadow: 0 6px 16px -6px hsl(var(--whatsapp) / 0.6);
  transition: transform .2s ease, filter .2s ease, box-shadow .2s ease;
}
@media (min-width: 768px) { .apt2-bar__cta { padding: 0.75rem 1.35rem; } }
.apt2-bar__cta:hover { transform: translateY(-1px); filter: brightness(1.04); box-shadow: 0 10px 24px -6px hsl(var(--whatsapp) / 0.7); }
.apt2-bar__cta svg { flex-shrink: 0; }
.apt2-bar__cta-label-short { display: inline; }
.apt2-bar__cta-label-long { display: none; }
@media (min-width: 480px) {
  .apt2-bar__cta-label-short { display: none; }
  .apt2-bar__cta-label-long { display: inline; }
}

.apt2-bar--closed .apt2-bar__inner { background: hsl(var(--ink) / 0.9); padding: 0.85rem 1.5rem; justify-content: center; border-radius: var(--radius-full); }
.apt2-bar--closed p { margin: 0; font-size: var(--fs-sm); color: hsl(var(--paper) / 0.8); letter-spacing: 0.01em; }

/* legacy hooks kept for backward compat with older snippets */


/* Other apartments — full width */








/* Lightbox */
.apt-lightbox {
  position: fixed;
  inset: 0;
  /* [Z-LIGHTBOX 01.08] Было 50 — НИЖЕ липкого бара брони .apt2-bar (60): «от 20 000 ₸ · WhatsApp»
     висел ПОВЕРХ открытой галереи и перехватывал тапы в нижней трети экрана. Оба position:fixed и
     оба соседи на уровне body, так что спор решает только число. Замер по этому файлу — весь
     плавающий хром: .site-header 50 · .apt2-bar 60 · .site-drawer__scrim 80 · .site-drawer 90 ·
     .site-skip 100 · .mobile-bar 200. Полноэкранная галерея обязана быть выше ВСЕГО, поэтому 210 —
     первый шаг над максимумом файла, а не «побольше на глаз». Дефект жил ДО работ 01.08.
     РЕВЕРС: вернуть 50. */
  z-index: 210;
  overflow-y: auto;
  background: hsl(var(--ink) / 0.95);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
}
.apt-lightbox__bar {
  position: sticky;
  top: 0;
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 1rem 1.25rem;
  border-bottom: 1px solid hsl(var(--paper) / 0.1);
  background: hsl(var(--ink) / 0.85);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  color: hsl(var(--paper));
}
@media (min-width: 768px) { .apt-lightbox__bar { padding: 1rem 2.5rem; } }
.apt-lightbox__bar-title {
  /* [РЕТРО-ДОЛГ 14.08] Был капс 12px с разрядкой 0.18em — тот самый «разряжённый микро-кегль
     капсом», который проект называет тиком 2016-го и снял в подвале 28.07. Здесь разрядка была
     ещё шире, чем в той записи (0.18 против 0.06–0.1). Обычный регистр, кегль в шкалу. */
  font-size: var(--s-13, 13px);
  letter-spacing: 0;
  color: hsl(var(--paper) / 0.7);
}
.apt-lightbox__close {
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  border: 0;
  background: hsl(var(--paper) / 0.1);
  border-radius: var(--radius-full);
  color: hsl(var(--paper));
  cursor: pointer;
  transition: background var(--dur-base);
}
.apt-lightbox__close:hover { background: hsl(var(--paper) / 0.2); }
.apt-lightbox__body {
  max-width: 1400px;
  margin: 0 auto;
  padding: 1.25rem;
}
@media (min-width: 768px) { .apt-lightbox__body { padding: 2rem 2.5rem 4rem; } }
.apt-lightbox__group { margin-top: 2.5rem; }
.apt-lightbox__group:first-child { margin-top: 0.5rem; }
.apt-lightbox__group-title {
  /* [РЕТРО-ДОЛГ 14.08] см. пояснение у `.apt-lightbox__bar-title`. Отступ 0.875rem = 14px
     выпадал из шага 4 — поставлен 12px. */
  display: flex;
  align-items: baseline;
  gap: var(--space-2);
  margin: 0 0 12px;
  font-weight: 600;
  font-size: var(--s-13, 13px);
  letter-spacing: 0;
  color: hsl(var(--paper) / 0.86);
}
/* [КОНТРАСТ 14.08] Было 0.4 — замер дал около 3,0 при норме 4,5 для текста. */
.apt-lightbox__group-count { color: hsl(var(--paper) / 0.62); font-weight: 400; }
.apt-lightbox__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-2);
}
@media (min-width: 640px) {
  .apt-lightbox__grid { grid-template-columns: repeat(3, 1fr); gap: var(--space-3); }
}
.apt-lightbox__cell {
  position: relative;
  /* aspect-ratio is set inline per-image via usePhotoAspect() so the
     skeleton mirrors the real photo proportions. 4/3 is the fallback
     while the natural dimensions are still resolving. */
  aspect-ratio: 4 / 3;
  overflow: hidden;
  border: 0;
  background: hsl(var(--ink-soft));
  /* [TAP-PHOTO 01.08] cursor:pointer снят вместе с тапом-закрывашкой: ячейка больше не
     кнопка (в разметке стала <div>), обещать нажатие курсором нельзя. border/padding
     оставлены — они гасили дефолты <button>, на <div> безвредны.
     РЕВЕРС: вернуть cursor: pointer. */
  padding: 0;
}
/* [PV-КАДР 09.08] Тапу вернули работу — он открывает снимок крупно (js/site.js). Значит и
   обещание нажатия вернулось, но ТОЛЬКО тем ячейкам, которые скрипт реально включил: метку
   `data-pv-i` ставит он же. Без скрипта разметка остаётся немой, как и была. */
.apt-lightbox__cell[data-pv-i] { cursor: pointer; }
.apt-lightbox__cell[data-pv-i]:focus-visible {
  outline: 2px solid hsl(var(--ink));
  outline-offset: 2px;
}
/* Shimmer skeleton until <img data-loaded="true"> — same language as the
   apartment gallery so lazy-loaded lightbox tiles never read as gray boxes. */
.apt-lightbox__cell::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background-color: hsl(var(--paper) / 0.06);
  background-image:
    linear-gradient(
      115deg,
      transparent 0%,
      transparent 30%,
      hsl(var(--paper) / 0.16) 47%,
      hsl(var(--paper) / 0.22) 50%,
      hsl(var(--paper) / 0.16) 53%,
      transparent 70%,
      transparent 100%
    );
  background-size: 240% 100%;
  background-position: 160% 0;
  background-repeat: no-repeat;
  animation: apt-lightbox-shimmer 1800ms ease-in-out infinite;
  transition: opacity var(--dur-slow) ease;
}
.apt-lightbox__cell:has(img[data-loaded="true"])::before {
  opacity: 0;
  animation: none;
}
@keyframes apt-lightbox-shimmer {
  0%   { background-position: 160% 0; }
  100% { background-position: -160% 0; }
}
@media (prefers-reduced-motion: reduce) {
  .apt-lightbox__cell::before { animation: none; }
}
.apt-lightbox__cell img {
  position: relative;
  z-index: 1;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0;
  transition: transform var(--dur-slower), opacity var(--dur-slow) ease;
}
.apt-lightbox__cell img[data-loaded="true"] { opacity: 1; }
/* [TAP-PHOTO 01.08] Ховер только там, где указатель точный. На таче :hover ЗАЛИПАЕТ: после
   того как тап перестал закрывать галерею, он оставлял кадр увеличенным — и это читалось как
   «что-то сломалось», ровно взамен прежней жалобы. РЕВЕРС: снять медиа-обёртку. */
@media (hover: hover) and (pointer: fine) {
  .apt-lightbox__cell:hover img { transform: scale(1.02); }
}

/* ════════════════════════════════════════════════════════════════════════
   DistrictPage.astro <style> — dist-* blocks (verbatim; landmark-gallery +
   unused dist-guide / dist-hero photo omitted — those sections aren't rendered)
   ════════════════════════════════════════════════════════════════════════ */

/* Tighten top padding when the grid section is either the first block
   under main (no gallery above) OR directly follows the gallery — both
   cases should keep the same vertical rhythm without a void. */
.v2-main--offset > .dist-grid-section:first-of-type .dist-grid-section__inner,
.dist-gallery + .dist-grid-section .dist-grid-section__inner {
  padding-top: 3rem;
}
@media (min-width: 768px) {
  .v2-main--offset > .dist-grid-section:first-of-type .dist-grid-section__inner,
  .dist-gallery + .dist-grid-section .dist-grid-section__inner {
    padding-top: 4rem;
  }
}
@media (min-width: 1024px) {
  .v2-main--offset > .dist-grid-section:first-of-type .dist-grid-section__inner,
  .dist-gallery + .dist-grid-section .dist-grid-section__inner {
    padding-top: 4rem;
  }
}

.v2-main--offset > .dist-grid-section:first-of-type .dist-h2,
.dist-gallery + .dist-grid-section .dist-h2 {
  margin-top: 0;
}
@media (min-width: 768px) {
  
  .dist-practical__inner:not(:has(.dist-practical__text)) {
    grid-template-columns: 1fr;
  }
}

/* DistrictPage landmark gallery (.dist-gallery*) — verbatim, clean-card variant */
.dist-gallery {
  background: transparent;
  color: hsl(220 14% 8%);
}



.dist-gallery__grid {
  display: grid;
  gap: 2rem 1.5rem;
  grid-template-columns: 1fr;
}
@media (min-width: 640px) {
  .dist-gallery__grid {
    grid-template-columns: repeat(2, 1fr);
    gap: 2.5rem 2rem;
  }
}
@media (min-width: 1024px) {
  .dist-gallery__grid {
    grid-template-columns: repeat(2, 1fr);
    gap: 4rem 3rem;
  }
}



.dist-gallery__card:hover img {
  filter: brightness(1.05) saturate(1.05);
}






.dist-gallery__lead-jump:hover {
  color: var(--color-terracotta-deep, hsl(14 60% 36%));
  text-decoration-color: hsl(14 60% 36%);
}

.dist-gallery__grid + .dist-gallery__section-eyebrow {
  margin-top: 3rem;
}
@media (min-width: 768px) {
  .dist-gallery__grid + .dist-gallery__section-eyebrow {
    margin-top: 4rem;
  }
}

/* ════════════════════════════════════════════════════════════════════════
   legal/[slug].astro <style> — legal-* blocks (verbatim)
   ════════════════════════════════════════════════════════════════════════ */
.legal {
  max-width: 720px;
  margin: 0 auto;
  padding: 5rem 1.25rem 6rem;
}
@media (min-width: 768px) {
  .legal { padding: 7rem 2.5rem 8rem; }
}
@media (min-width: 768px) {
  .legal { padding-top: 9rem; }
}


.legal__crumb-link:hover { color: hsl(var(--ink)); }



.legal__h1 {
  margin: 0.75rem 0 0;
  font-weight: 400;
  font-size: clamp(2rem, 5vw, 3rem);
  line-height: 1.05;
  letter-spacing: -0.02em;
  color: hsl(var(--ink));
}
.legal__meta {
  margin: 1rem 0 0;
  font-size: var(--fs-md);
  color: hsl(var(--ink-muted));
}
.legal__article {
  margin: 2.5rem 0 0;
  font-size: var(--fs-base);
  line-height: 1.65;
  color: hsl(var(--ink-soft));
}
.legal__dl {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1rem 1.25rem;
  margin: 0;
}
@media (min-width: 640px) {
  .legal__dl { grid-template-columns: 180px 1fr; }
}
.legal__row { display: contents; }
.legal__row dt {
  font-size: var(--fs-2xs);
  text-transform: uppercase;
  letter-spacing: 0.18em;
  color: hsl(var(--ink-muted));
  align-self: start;
}
.legal__row dd {
  margin: 0;
  color: hsl(var(--ink));
  font-variant-numeric: tabular-nums;
}
@media (max-width: 639px) {
  .legal__row { display: block; margin-bottom: 1rem; }
  .legal__row dt { margin-bottom: 0.25rem; }
}
.legal__article h2 {
  margin: 2.5rem 0 1rem;
  padding-top: 1.5rem;
  border-top: 1px solid hsl(var(--hairline));
  font-family: var(--font-sans);
  font-weight: 400;
  letter-spacing: -0.02em;
  font-size: 1.5rem;
  line-height: 1.2;
  color: hsl(var(--ink));
}
.legal__article h2:first-child { border-top: 0; padding-top: 0; }
.legal__article h3 {
  margin: 2rem 0 0.75rem;
  font-family: var(--font-sans);
  font-weight: 400;
  font-size: var(--fs-xl);
  color: hsl(var(--ink));
}
.legal__article p { margin: 0.75rem 0; }
.legal__article ul,
.legal__article ol {
  margin: 0.75rem 0;
  padding-left: 1.5rem;
}
.legal__article li { margin: 8px 0; /* [GRID-4 15.08] 6 → 8 */ }
.legal__article strong { color: hsl(var(--ink)); }
.legal__article a {
  color: hsl(var(--terracotta));
  text-decoration: underline;
  text-underline-offset: 3px;
}
.legal__article a:hover { color: hsl(var(--terracotta-deep)); }
.legal__article hr {
  margin: 2rem 0;
  border: 0;
  border-top: 1px solid hsl(var(--hairline));
}
.legal__article table {
  width: 100%;
  border-collapse: collapse;
  margin: 1rem 0;
  font-size: var(--fs-md);
}
.legal__article th,
.legal__article td {
  padding: 0.75rem;
  border: 1px solid hsl(var(--hairline));
  text-align: left;
}
.legal__article th {
  background: hsl(var(--paper-soft));
  font-weight: 500;
}

/* ============================================================
   ApartmentCard — light info plates (Airbnb / Apple direction)
   ============================================================ */

.v2-aptcard--plated:hover { transform: translateY(-2px); box-shadow: none; }
.v2-aptcard--plated .v2-aptcard__photo {
  aspect-ratio: 4 / 5;
  border-radius: 1.5rem;
  overflow: hidden;
  flex: 0 0 auto;
  height: auto;
  min-height: 0;
  box-shadow: 0 18px 40px -28px hsl(220 14% 8% / 0.32);
}
.v2-aptcard--plated:hover .v2-aptcard__img { transform: scale(1.04); }

/* Make the grid cells stretch so every plate has the same bottom line */
.v2-aptsection__cell { display: flex; height: 100%; }
.v2-aptsection__cell > .v2-aptcard { height: 100%; }

/* Shared plate primitives */


/* ── A — Airbnb compact ── */


/* ── B — Apple-style with CTA circle ── */



/* When divider already pins the block, don't double-push the row */


/* ── C — Minimalist split + animated underline ── */


/* ── E — Editorial split (locked direction) ── */










.v2-aptcard--design-e .v2-aptcard__photo {
  border-radius: 14px;
  overflow: hidden;
}
.v2-aptcard--design-e .v2-aptcard__img {
  transition: transform var(--dur-slower) var(--ease-standard);
}
.v2-aptcard--design-e:hover .v2-aptcard__img {
  transform: scale(1.05);
}
@media (prefers-reduced-motion: reduce) {
  .v2-aptcard--design-e:hover .v2-aptcard__img { transform: none; }
}

/* ── Editorial bridge card — dark panel with real city-map background ── */
/* ── District band — full-width editorial strip between the apartment grid
   and reviews. A calm "place" moment: solid ink text panel on the left,
   real riverside dusk photo on the right. NOT a clickable card. ── */

.v2-aptsection__bridge-card--editorial:hover,
.v2-aptsection__bridge-card--editorial:focus-visible {
  transform: none;
  box-shadow: none;
}
/* Photo occupies the right ~60%; normal blend, full cover. */

/* Seam: solid ink under the text, then a soft horizontal fade into the photo. */
.v2-aptsection__bridge-card--editorial::before {
  background:
    linear-gradient(90deg,
      hsl(var(--ink)) 0%,
      hsl(var(--ink)) 30%,
      hsl(var(--ink) / 0.72) 44%,
      hsl(var(--ink) / 0) 60%);
}
/* Keep the base `::before` veil + `.v2-aptsection__bridge-card-map` from the
   non-editorial rules — the map returns, the editorial variant just keeps the
   tighter radius and no card shadow. */

.v2-aptsection__bridge-card--editorial:hover .v2-glass__cta,
.v2-aptsection__bridge-card--editorial:focus-visible .v2-glass__cta {
  background: hsl(var(--paper));
  color: hsl(var(--ink));
  transform: none;
}

@media (prefers-reduced-motion: reduce) {
  .v2-aptsection__bridge-card--editorial:hover{
    transition: none;
  }
}
/* District band — mobile: photo as a top band, text below on solid ink. */
@media (max-width: 639px) {
  
  
  .v2-aptsection__bridge-card--editorial::before {
    background:
      linear-gradient(180deg,
        hsl(var(--ink) / 0) 0%,
        hsl(var(--ink) / 0) 30%,
        hsl(var(--ink) / 0.8) 46%,
        hsl(var(--ink)) 56%);
  }
  
}

/* ── ApartmentCard image skeleton (prevents layout flash) ── */
.v2-aptcard__skeleton {
  position: absolute;
  inset: 0;
  z-index: 0;
  border-radius: inherit;
  background:
    linear-gradient(
      100deg,
      hsl(36 12% 90%) 0%,
      hsl(36 16% 95%) 40%,
      hsl(36 12% 90%) 80%
    );
  background-size: 200% 100%;
  animation: v2-aptcard-shimmer 1.4s linear infinite;
  opacity: 1;
  transition: opacity 0.35s ease 0.05s;
  pointer-events: none;
}
.v2-aptcard__photo[data-loaded='true'] .v2-aptcard__skeleton {
  opacity: 0;
  animation: none;
}
.v2-aptcard__photo .v2-aptcard__img {
  opacity: 0;
  transition: opacity 0.45s ease, transform 0.45s cubic-bezier(.2,.7,.2,1);
}
.v2-aptcard__photo[data-loaded='true'] .v2-aptcard__img { opacity: 1; }

@keyframes v2-aptcard-shimmer {
  0%   { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}
@media (prefers-reduced-motion: reduce) {
  .v2-aptcard__skeleton { animation: none; }
}

/* ───────────────────────────────────────────────────────────────────────
   Apartment card — Liquid Glass overlays (G1 / G2 / G3)
   The text panel sits ON the photo, not below it.
   ─────────────────────────────────────────────────────────────────────── */

.v2-aptcard--glass .v2-aptcard__photo {
  position: relative;
  aspect-ratio: 4 / 5;
  border-radius: 1.5rem;
  overflow: hidden;
  box-shadow: 0 24px 48px -20px rgba(0, 0, 0, 0.28);
  height: 100%;
  transition: transform 0.6s cubic-bezier(.2,.7,.2,1),
              box-shadow 0.6s cubic-bezier(.2,.7,.2,1);
}
.v2-aptcard--glass:hover .v2-aptcard__photo {
  transform: translateY(-4px);
  box-shadow: 0 32px 64px -24px rgba(0, 0, 0, 0.36);
}
.v2-aptcard--glass .v2-aptcard__img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 1.1s cubic-bezier(.2,.7,.2,1), opacity 0.45s ease;
}
.v2-aptcard--glass:hover .v2-aptcard__img { transform: scale(1.06); }



/* Shared panel base */


/* CTA buttons */

.v2-aptcard--glass:hover .v2-glass__cta { transform: translateX(3px); }



/* G2 — floating price pill in top-right */




/* G3 — small chip on top */


@media (prefers-reduced-motion: reduce) {
  .v2-aptcard--glass .v2-aptcard__photo, .v2-aptcard--glass .v2-aptcard__img{ transition: none; }
}

/* Glass card — suppress floating index, move G2 price pill to avoid status chip */


/* On glass cards, give the status chip a darker background for contrast */
.v2-aptcard--glass .v2-aptcard__corner { z-index: 4; }

/* ───────────────────────────────────────────────────────────────────────
   Plate B — refined editorial typography (round 2)
   • Serif display name (matches hero)
   • ЖК как тонкая подпись под названием
   • Цена и метраж в одну строку, без подписей-капителей
   ─────────────────────────────────────────────────────────────────────── */


/* ───────────────────────────────────────────────────────────────────────
   Card overlay — refined meta + price line (round 3)
   Single baseline row: 45 м² · 4 гостей      20 000 ₸ / ночь
   ─────────────────────────────────────────────────────────────────────── */





.v2-aptcard__priceline .v2-aptcard__price-num {
  font-size: 1.7rem;
  letter-spacing: -0.025em;
  line-height: 1;
}


/* Compact density tweaks for the new line */
.v2-aptcard--compact .v2-aptcard__metaline { font-size: var(--fs-sm); gap: 0.55rem; }
.v2-aptcard--compact .v2-aptcard__priceline .v2-aptcard__price-num { font-size: 1.5rem; }
.v2-aptcard--compact .v2-aptcard__price-suffix { font-size: var(--fs-xs); }

/* Mobile wrap */


/* ─────────────────────────────────────────────────────────────────────────
 * APARTMENT CARD — OVERLAY VARIANTS (O1 / O2 / O3)
 * Three live options for moving metadata onto the photo. Locked to the
 * Apple iOS 26 + warm paper system: Onest sans, hairline borders, no
 * card shadows on the card itself, restrained motion.
 * ───────────────────────────────────────────────────────────────────────── */

.v2-aptcard--overlay .v2-aptcard__photo {
  aspect-ratio: 4 / 5;
  border-radius: 14px;
  overflow: hidden;
}
.v2-aptcard--overlay .v2-aptcard__img {
  transition: transform var(--dur-slower) var(--ease-standard);
}
.v2-aptcard--overlay:hover { transform: translateY(-2px); }
.v2-aptcard--overlay:hover .v2-aptcard__img { transform: scale(1.04); }









/* ── O1 · Slim ink strip (max photo exposure) ─────────────────────────── */
/* Single tight row: name left, price right. Drops eyebrow/chips for height.
   Panel hugs ~30% of card height vs O2's ~50%. Same ink material — contract clean. */


/* ── O4 · Museum label (asymmetric ink caption on photo) ──────────────── */
/* Hybrid: O1's "floating-on-photo" feel + O2's solid ink material.
   Caption-shaped panel anchored bottom-left with hairline border all around,
   photo breathes on the right and below. Contains O1's airy layout. */


/* ── O2 · Solid ink panel ─────────────────────────────────────────────── */

.v2-aptcard--overlay-o2:hover .v2-ov__o2 { transform: translateY(-2px); }





/* ── O3 · Liquid glass panel ──────────────────────────────────────────── */

.v2-aptcard--overlay-o3:hover .v2-ov__o3 { background: hsl(0 0% 100% / 0.16); }






/* ── O5 · Naked on photo (O2 composition, no bar) ─────────────────────── */
/* Same content rhythm as O2 — eyebrow + name + chips left, price right —
   but no full-width panel. Each piece is its own tight ink pill so the
   photo reads through everywhere else. Contract-clean: solid ink only,
   1px hairline borders, no gradients, no drop shadows. */


@media (prefers-reduced-motion: reduce) {
  .v2-aptcard--overlay:hover, .v2-aptcard--overlay .v2-aptcard__img, .v2-aptcard--overlay:hover .v2-aptcard__img, .v2-aptcard--overlay-o2:hover .v2-ov__o2, .v2-aptcard--overlay-o4:hover .v2-ov__o4, .v2-aptcard--overlay-o5:hover .v2-ov__o5{
    transform: none !important;
    transition: none !important;
  }
}

/* Tiny tag above each card so the user can identify which variant they pick. */
.v2-aptsection__cell { position: relative; }


/* ─────────────────────────────────────────────────────────────────────────
   ApartmentCard — minimal (photo + 4 lines)
   Source of truth for the homepage / catalog card. Overrides all earlier
   .v2-aptcard rules (shadows, fixed heights, overlay/plate variants) so the
   minimal card is hairline-light: rounded photo + plain text under it.
   ───────────────────────────────────────────────────────────────────────── */

.v2-aptcard--minimal {
  display: block;
  width: 100%;
  height: auto;
  background: transparent;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  overflow: visible;
  color: hsl(var(--ink));
  text-decoration: none;
  transition: transform var(--dur-base) var(--ease-standard);
}
.v2-aptcard--minimal:hover { transform: translateY(-3px); box-shadow: none; }
.v2-aptcard--minimal:focus-visible {
  outline: 2px solid hsl(var(--ink));
  outline-offset: 4px;
  box-shadow: none;
  transform: none;
}

.v2-aptcard--minimal .v2-aptcard__photo {
  position: relative;
  width: 100%;
  height: auto;
  min-height: 0;
  aspect-ratio: 4 / 5;
  overflow: hidden;
  border-radius: var(--radius-md);
  background: hsl(var(--paper-soft));
}
.v2-aptcard--minimal.v2-aptcard--feature .v2-aptcard__photo { aspect-ratio: 4 / 3; }
/* [СВЕДЕНИЕ 21.08] Карточки соседей на страницах квартир несут compact+minimal и брали 4:5 —
   отвергнутый владельцем аспект. Приводим их к 4:3, как на главной. */
.v2-aptcard--compact.v2-aptcard--minimal .v2-aptcard__photo { aspect-ratio: 4 / 3; }

.v2-aptcard--minimal .v2-aptcard__img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform var(--dur-base) var(--ease-standard);
}
.v2-aptcard--minimal:hover .v2-aptcard__img { transform: scale(1.04); }

.v2-aptcard__text {
  padding: clamp(0.9rem, 2vw, 1.15rem) 0.15rem 0;
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
}

.v2-aptcard__zhk {
  font-family: var(--font-sans);
  font-size: clamp(1.05rem, 1.7vw, 1.25rem);
  font-weight: 600;
  letter-spacing: -0.02em;
  line-height: 1.18;
  color: hsl(var(--ink));
  margin: 0;
}

.v2-aptcard__unit {
  font-family: var(--font-sans);
  font-size: clamp(0.85rem, 1.1vw, 0.92rem);
  font-weight: 400;
  letter-spacing: -0.005em;
  line-height: 1.3;
  color: hsl(var(--ink) / 0.6);
  margin: 0;
}

.v2-aptcard__type {
  font-family: var(--font-sans);
  font-size: clamp(0.8rem, 1vw, 0.86rem);
  font-weight: 500;
  letter-spacing: 0.005em;
  line-height: 1.3;
  color: hsl(var(--ink) / 0.5);
  margin: 0.15rem 0 0;
}

.v2-aptcard__price {
  font-family: var(--font-sans);
  font-size: clamp(0.85rem, 1.1vw, 0.92rem);
  font-weight: 500;
  letter-spacing: -0.005em;
  line-height: 1.3;
  color: hsl(var(--ink) / 0.85);
  margin: 0.35rem 0 0;
}
.v2-aptcard__price-num {
  font-variant-numeric: tabular-nums;
  font-weight: 600;
  color: hsl(var(--ink));
}
.v2-aptcard__price-unit { font-weight: 500; }
.v2-aptcard__price .tabular { font-variant-numeric: tabular-nums; }

.v2-aptcard__reno {
  font-family: var(--font-sans);
  font-size: var(--fs-sm);
  font-weight: 500;
  line-height: 1.3;
  color: hsl(var(--ink) / 0.55);
  margin: 0.35rem 0 0;
}


@media (prefers-reduced-motion: reduce) {
  .v2-aptcard--minimal,
  .v2-aptcard--minimal:hover,
  .v2-aptcard--minimal .v2-aptcard__img,
  .v2-aptcard--minimal:hover .v2-aptcard__img {
    transition: none;
    transform: none;
  }
}

/* Don't let section/catalog wrappers stretch the minimal card to fill cell. */
.v2-aptsection__cell > .v2-aptcard--minimal,
.aptcat__cell .v2-aptcard--minimal { height: auto; }



/* ════════════════════════════════════════════════════════════════════════
   Mobile + tablet portrait header (<1024px) — bare wordmark + bare burger.
   Eight of eight award-tier boutique hospitality sites ship this shape.
   No pill, no glass blur, no shadow, no background — the wordmark IS chrome.
   ════════════════════════════════════════════════════════════════════════ */

.site-header {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  z-index: 50;
  height: 64px;
  /* Align inner items to the same rail (--layout-rail = min(100% - 2rem, 1280px))
     as the hero content. Formula yields ≥16px on every viewport, so no max() floor. */
  padding-inline: calc((100% - var(--layout-rail)) / 2);
  padding-top: env(safe-area-inset-top);
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
  align-items: center;
  justify-content: space-between;
  gap: clamp(1rem, 2.5vw, 2rem);
  background: transparent;
  border-bottom: 1px solid transparent;
  pointer-events: none;
  transition: background-color var(--dur-fast) ease, backdrop-filter var(--dur-fast) ease, border-color var(--dur-fast) ease;
}
/* Cinematic: header rides away with the hero; a solid bar appears in the content. */
.site-header.is-pinned { position: fixed; }
/* The pinned bar moves ONLY via the hide/reveal transform — no auto slide-in.
   It waits hidden while you scroll down (never pops out) and slides in smoothly
   only when you scroll back up to navigate. */
/* [HDR-SM 02.08 · v3] Ход шапки 320мс → 220мс. Вердикт с телефона: «медленно вылезает,
   не плавно». 64px хода на приезд — это короткая дистанция, и растягивать её на длинную
   ступень шкалы значит показывать медленное скольжение вместо отклика. --dur-base это тот
   же рунг, на котором живут карточки и кнопки. Кривая не меняется. РЕВЕРС: вернуть --dur-slow. */
/* [HDR-SM 02.08 · v4] Числа взяты из источников, а не на глаз.
   Material Design: мелкие анимации 150-200мс, крупные 300-400; длительность подбирается под
   ПРОЙДЕННОЕ РАССТОЯНИЕ. NN/g: 100-400мс общий диапазон, 400 только для больших перемещений
   по всему экрану; «уход» короче «прихода»; и прямая формулировка — «гораздо чаще анимации
   бывают слишком длинными, чем слишком короткими».
   У нас ход 64px = мелкая анимация ⇒ приход 180мс (--dur-fast), уход 140мс. Асимметрия уже
   принята в проекте: плита меню открывается 360мс, закрывается 240.
   РЕВЕРС: одна строка с var(--dur-slow) для обоих направлений. */
/* [HDR-SM 03.08 · v5] 180 → 150 на приход. Запрос владельца: «почти моментально, но аккуратно».
   NN/g: 100мс читается как немедленный отклик, и «гораздо чаще анимации бывают слишком
   длинными, чем слишком короткими». Material: мелкие анимации 150-200мс. 150 — нижняя кромка
   их диапазона и верхняя кромка «немедленного» у NN/g, то есть ровно «почти моментально,
   но не рывком». Уход 120: объект, покидающий экран, требует меньше внимания. */
/* [EDGE 03.08] ШАПКА ПРЯЧЕТСЯ ПРОЗРАЧНОСТЬЮ, А НЕ СДВИГОМ — лечение полосы под статус-баром.
   РАЗБОР ЖИВЫХ САЙТОВ (браузером, с замером computed): за кромку шапку не прячет НИКТО.
   vc.ru и dtf.ru не прячут вовсе — сплошная fixed-шапка стоит всегда. habr.com — sticky,
   всегда видна. theverge.com — fixed у кромки всегда, прячет ПРОЗРАЧНОСТЬЮ (transition:
   opacity .2s), элемент кромку не покидает. medium.com прячет сдвигом, как делали мы, — и
   дыра у него ЕСТЬ, просто белая шапка на белой странице делает её невидимой.
   МЕХАНИЗМ: Safari 26 сам красит зону статус-бара, сэмплируя background-color у fixed/sticky
   элемента у кромки (баг WebKit 301756, инженер Apple Wenson Hsieh). Читает даже при
   opacity:0. НЕ читает absolute-детей и псевдоэлементы — поэтому и провалились попытки с
   отрицательным top, ::before и служебным слоем.
   У нас в момент возврата шапка уезжала трансформом за кромку — кандидат уходил из зоны,
   сэмплер промахивался, и в полосе оставались настоящие пиксели страницы. Ровно то, что
   владелец описал как «поднимаюсь наверх — шапка вылезает с гэпом».
   Теперь узел с кремовым фоном остаётся у кромки всегда, прячется только его видимость.
   Над фото героя шапка по-прежнему position:absolute — а absolute сэмплер игнорирует, значит
   в полосе там останется фотография. Поведение следует состоянию шапки само.
   ПОБОЧНО: движение стало ещё короче. Прозрачность композитор считает дешевле трансформа,
   и у Verge на этом же приёме стоит 200мс — берём 150/120, как было.
   РЕВЕРС: вернуть transform:translateY(-100%) в правило --hidden и transform в transition. */
.site-header.is-pinned { transition: transform 150ms var(--ease-standard), background-color var(--dur-base), border-color var(--dur-base); }
.site-header.is-pinned.site-header--hidden { transform: translateY(-100%); transition-duration: 120ms, var(--dur-base), var(--dur-base); }
/* ⚰ [EDGE 03.08] `.site-header.is-pinned.site-header--hidden{transform:translateY(-100%)}` СНЯТО:
   стояло ПОЗЖЕ нового правила и перебивало его. Это и был увод шапки за кромку. */
/* Возврат шапки из pinned в прозрачную над героем — фейд вместо «попа»
   при резком скролле к верху (класс вешает home-grouped-locac.js в момент
   смены позиции fixed→absolute). */
.site-header.is-returning { animation: hdr-return var(--dur-base) var(--ease-standard); }
@keyframes hdr-return { from { opacity: 0; } }
@media (prefers-reduced-motion: reduce) { .site-header.is-returning { animation: none; } }
/* Solid frosted bar the instant you scroll off the hero — no fade. */
.site-header[data-on-cream="true"] {
  background: hsl(36 30% 97% / 0.96);
  -webkit-backdrop-filter: blur(16px) saturate(1.4);
  backdrop-filter: blur(16px) saturate(1.4);
  border-bottom-color: hsl(var(--hairline));
}
.site-header > * { pointer-events: auto; }
.site-header__brand { grid-column: 1; justify-self: start; }
.site-header__nav { grid-column: 2; justify-self: center; }
.site-header__right { grid-column: 3; justify-self: end; }

@media (min-width: 640px) and (max-width: 1023.98px) {
  .site-header { padding-inline: calc((100% - var(--layout-rail)) / 2); }
}

.site-header__brand {
  font-family: var(--font-sans);
  font-size: var(--fs-base);
  font-weight: 600;
  letter-spacing: 0.01em;
  line-height: 1;
  color: hsl(var(--paper));
  text-decoration: none;
  transition: color var(--dur-fast) ease;
}
.site-header__brand em {
  font-style: normal;
  /* Равновесная 600/600 — выбор пользователя (июль 2): «тяжесть» снялась
     возвратом размера на шкалу (19→17px), разновес 600/400 отклонён. */
  font-weight: 600;
  margin-left: 2px;
  color: inherit;
  transition: color var(--dur-base) var(--ease-standard);
}
.site-header[data-on-cream="true"] .site-header__brand { color: hsl(var(--ink)); }
.site-header[data-on-cream="true"] .site-header__brand em { color: inherit; }
.site-header[data-on-cream="true"] .site-header__burger { color: hsl(var(--ink)); }

.site-header__burger {
  width: 44px;
  height: 44px;
  margin-right: -10px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: none;
  cursor: pointer;
  color: hsl(var(--paper));
  transition: color var(--dur-fast) ease;
}

.site-header__brand:focus-visible,
.site-header__burger:focus-visible {
  outline: 2px solid hsl(var(--ink));
  outline-offset: 4px;
  border-radius: var(--radius-xs);
}
.site-header[data-on-cream="false"] .site-header__brand:focus-visible,
.site-header[data-on-cream="false"] .site-header__burger:focus-visible {
  outline-color: hsl(var(--paper));
}

/* Hero top veil — legibility for wordmark over photographic hero. */
.v2-hero__top-veil {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 120px;
  background: linear-gradient(180deg, rgba(0,0,0,0.22) 0%, rgba(0,0,0,0.08) 55%, transparent 100%);
  z-index: 5;
  pointer-events: none;
}

/* Skip-to-content — visible only on focus. */
.site-skip {
  position: fixed;
  top: 8px;
  left: 8px;
  z-index: 100;
  background: hsl(var(--ink));
  color: hsl(var(--paper));
  padding: 10px 16px;
  border-radius: var(--radius-sm);
  font-family: var(--font-sans);
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  text-decoration: none;
  transform: translateY(-200%);
  transition: transform var(--dur-base) var(--ease-standard);
}
.site-skip:focus-visible { transform: translateY(0); outline: none; }

/* ── Drawer: full-screen on phone, slide-from-right on tablet portrait ── */
.site-drawer {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  width: 100vw;
  background: hsl(var(--paper));
  z-index: 90;
  padding: 64px 24px 24px;
  padding-bottom: calc(24px + env(safe-area-inset-bottom));
  transform: translateX(100%);
  visibility: hidden;
  transition: transform var(--dur-slow) var(--ease-standard), visibility 0s linear var(--dur-slow);
  display: flex;
  flex-direction: column;
  gap: var(--space-6);
  overflow-y: auto;
}
.site-drawer.is-open {
  transform: translateX(0);
  visibility: visible;
  transition: transform var(--dur-slow) var(--ease-standard), visibility 0s;
}

.site-drawer__scrim { display: none; }

@media (min-width: 640px) and (max-width: 1023.98px) {
  .site-drawer {
    width: min(88vw, 360px);
    box-shadow: -10px 0 30px rgba(0,0,0,0.18);
  }
  .site-drawer.is-open ~ .site-drawer__scrim,
  .site-drawer__scrim {
    display: block;
  }
  .site-drawer__scrim {
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,0.12);
    z-index: 80;
  }
}

/* Desktop nav + CTA — hidden by default (mobile), revealed at ≥1024px.
   Note: `.site-header__right` wraps the burger AND the desktop CTA. Keep it
   visible on mobile so the burger renders; hide only the CTA below 1024px. */
.site-header__nav,
.site-header__call,
.site-header__cta { display: none; }
.site-header__right { display: flex; align-items: center; }
.site-header__burger { display: inline-flex; }

@media (min-width: 1024px) {
  .site-drawer,
  .site-drawer__scrim { display: none; }

  .site-header {
    height: 64px;
    padding-inline: calc((100% - var(--layout-rail)) / 2);
    opacity: 1;
    visibility: visible;
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
    transition:
      transform var(--dur-slow) var(--ease-standard),
      background-color var(--dur-base) var(--ease-standard),
      border-color var(--dur-base) var(--ease-standard),
      height var(--dur-base) var(--ease-standard);
    border-bottom: 1px solid transparent;
  }
  .site-header[data-on-cream="true"] {
    background-color: hsl(36 30% 97% / 0.94);
    -webkit-backdrop-filter: blur(10px) saturate(1.3);
    backdrop-filter: blur(10px) saturate(1.3);
    border-bottom-color: hsl(var(--ink) / 0.08);
  }
  /* ⚰ [EDGE 03.08] Мобильный дубль того же увода. Прячем прозрачностью, узел остаётся
     у кромки — иначе сэмплер тинта Safari теряет кандидата и полоса показывает контент. */
  .site-header--hidden { transform: translateY(-100%); }

  /* ⛔ [ВОРДМАРКА 09.08] Ступень 20 ПРОБОВАЛИ ЖИВЬЁМ И ОТКАТИЛИ. Владелец,
     посмотрев обе страницы в браузере: «20 слишком». Довод за 20 был замером
     (разница с навигацией всего два пикселя, имя читалось шестым пунктом меню),
     но глаз владельца сильнее замера. Имя остаётся 17.
     ⛔ ТАМ ЖЕ ЗАКРЫТО И ВСЁ ОСТАЛЬНОЕ ПРО СТАРШИНСТВО ИМЕНИ. Смотрели живьём
     ещё четыре хода без изменения размера: приглушить навигацию до .72, вес имени
     700, разный вес внутри слова, и два последних вместе (стенд _qa/vordmarka-09-08.html).
     Вывод — задачи нет: у имени 396 пикселей пустоты до первого пункта навигации,
     оно первое по ходу чтения и одно в своей части строки, то есть старшинство ему
     дают изоляция и позиция, а не кегль. Гасить пять живых ссылок ради имени — обмен
     пользы на театр и откат июльской работы по контрасту. Если когда-нибудь захочется,
     чтобы имя читалось ЗНАКОМ, это нарисованная вордмарка, а не правка стилей.
     Не переоткрывать. */
  .site-header__brand { font-size: var(--s-17, 17px); }

  .site-header__nav {
    display: flex;
    align-items: center;
    gap: clamp(1.25rem, 2.5vw, 2rem);
    flex: none;
    justify-content: center;
  }
  .site-header__link {
    font-family: var(--font-sans);
    font-size: var(--fs-md);
    font-weight: 500;
    letter-spacing: 0.01em;
    line-height: 1;
    color: hsl(var(--paper));
    text-decoration: none;
    opacity: 0.85;
    transition: opacity var(--dur-base) var(--ease-standard), color var(--dur-fast) ease;
  }
  .site-header__link:hover,
  .site-header__link:focus-visible { opacity: 1; outline: none; }
  .site-header[data-on-cream="true"] .site-header__link { color: hsl(var(--ink)); opacity: 0.75; }
  .site-header[data-on-cream="true"] .site-header__link:hover { opacity: 1; }

  .site-header__right {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 8px;
    min-width: 0;
  }
  .site-header__call,
  .site-header__cta {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    height: 36px;
    padding: 0 14px;
    border-radius: var(--radius-full);
    font-family: var(--font-sans);
    font-size: var(--fs-sm);
    font-weight: 500;
    letter-spacing: 0;
    text-transform: none;
    text-decoration: none;
    white-space: nowrap;
    line-height: 1;
    transition:
      background-color var(--dur-base) var(--ease-standard),
      color var(--dur-base) var(--ease-standard),
      border-color var(--dur-base) var(--ease-standard),
      transform var(--dur-base) var(--ease-standard);
  }
  /* Phone — ghost pill, hairline border, ink text. */
  .site-header__call {
    background: transparent;
    border: 1px solid hsl(var(--ink) / 0.16);
    color: hsl(var(--ink));
  }
  .site-header__call:hover {
    background: hsl(var(--ink) / 0.04);
    border-color: hsl(var(--ink) / 0.28);
  }
  .site-header__call svg { opacity: 0.7; }

  /* WhatsApp — solid green, but smaller, refined, ink-toned green to sit
     calmer on cream. Uses #128C7E (WhatsApp brand deep teal-green) for less
     saturation against warm paper. */
  .site-header__cta {
    background: var(--wa);
    color: #fff;
    border: 1px solid transparent;
  }
  .site-header__cta:hover {
    background: var(--wa-hover);
    transform: translateY(-1px);
  }
  .site-header__call:focus-visible,
  .site-header__cta:focus-visible {
    outline: 2px solid hsl(var(--ink) / 0.6);
    outline-offset: 2px;
  }
  /* Over the photographic hero (data-on-cream="false") the hero shows its
     own CTAs — visually hide header CTAs but keep their layout box so the
     nav doesn't shift horizontally when the user scrolls onto cream. */
  .site-header[data-on-cream="false"] .site-header__call,
  .site-header[data-on-cream="false"] .site-header__cta {
    visibility: hidden;
    pointer-events: none;
  }

  .site-header__burger { display: none; }
}

@media (prefers-reduced-motion: reduce) {
  .site-header { transition: background-color 120ms; transform: none !important; }
  .site-header__link, .site-header__call, .site-header__cta { transition: none; }
}

.site-drawer__brand {
  position: absolute;
  top: 20px;
  left: 24px;
  font-family: var(--font-sans);
  font-size: var(--fs-base);
  font-weight: 600;
  letter-spacing: 0.01em;
  color: hsl(var(--ink));
  text-decoration: none;
}
.site-drawer__brand em {
  font-style: normal;
  font-weight: 300;
  margin-left: 2px;
  color: hsl(var(--ink) / 0.55);
}

.site-drawer__close {
  position: absolute;
  top: 14px;
  right: 16px;
  width: 36px;
  height: 36px;
  background: transparent;
  border: none;
  display: flex;
  align-items: center;
  justify-content: center;
  color: hsl(var(--ink));
  cursor: pointer;
}

.site-drawer__nav {
  display: flex;
  flex-direction: column;
  gap: var(--space-5);
  margin-top: 0.5rem;
}
.site-drawer__nav h4 {
  font-family: var(--font-sans);
  font-size: var(--s-13, 13px);
  letter-spacing: 0;
  font-weight: 700;
  color: hsl(var(--ink) / 0.5);
  margin: 0 0 0.5rem;
}
.site-drawer__nav ul {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}
.site-drawer__nav li a {
  font-family: var(--font-sans);
  font-size: var(--fs-base);
  font-weight: 500;
  color: hsl(var(--ink));
  text-decoration: none;
}
.site-drawer__nav li a.tabular { font-variant-numeric: tabular-nums; }

.site-drawer__locale {
  display: flex;
  gap: 6px;
  margin-top: auto;
}
.site-drawer__locale a {
  flex: 1;
  text-align: center;
  padding: 10px 0;
  border-radius: var(--radius-full);
  border: 1px solid hsl(var(--ink) / 0.14);
  font-family: var(--font-sans);
  font-size: var(--fs-2xs);
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: hsl(var(--ink) / 0.7);
  text-decoration: none;
}
.site-drawer__locale a.is-active {
  background: hsl(var(--ink));
  color: hsl(var(--paper));
  border-color: hsl(var(--ink));
}
/* Локаль в дровере подстраниц — НЕ-навигационный статус (были псевдо-ссылки на главную):
   RU активен, KZ/EN — честное «скоро» как в футере/тоггле главной. */
.site-drawer__locale span {
  flex: 1;
  text-align: center;
  padding: 10px 0;
  border-radius: var(--radius-full);
  border: 1px solid hsl(var(--ink) / 0.14);
  font-family: var(--font-sans);
  font-size: var(--fs-2xs);
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: hsl(var(--ink) / 0.7);
}
.site-drawer__locale span.is-active {
  background: hsl(var(--ink));
  color: hsl(var(--paper));
  border-color: hsl(var(--ink));
}
.site-drawer__locale .site-drawer__locale-soon { color: hsl(var(--ink) / 0.42); }

.site-drawer__bottom {
  margin-top: auto; /* [source-hygiene 13.07] перенесено из удалённого раннего дубля (~line 752) */
  display: flex;
  gap: 8px;
  padding-top: 16px;
  border-top: 1px solid hsl(var(--ink) / 0.08);
}
.site-drawer__bottom a {
  flex: 1;
  height: 44px;
  border-radius: var(--radius-full);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-sans);
  font-size: var(--fs-2xs);
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  text-decoration: none;
}
.site-drawer__wa { background: var(--wa); color: #fff; flex: 1.5; }
.site-drawer__call {
  background: transparent;
  color: hsl(var(--ink));
  border: 1px solid hsl(var(--ink) / 0.18);
}

/* [source-hygiene 13.07] дубль focus-группы дровера удалён (#28) — это было точное
   ПОДмножество раннего правила (~line 775), которое, помимо этих селекторов, кроет
   .v2-header__burger/__brand с идентичными декларациями. Zero-change. */

@media (prefers-reduced-motion: reduce) {
  .site-header__brand,
  .site-header__brand em,
  .site-header__burger,
  .site-drawer,
  .site-skip {
    transition: none;
  }
  .site-drawer { transform: none; }
}

/* Suppress the legacy .v2-header pill chrome (DOM no longer renders it, but keep
   any stragglers from leaking margin/space). */

@media (min-width: 1024px) {
  /* Desktop nav is handled in a follow-up; for now nothing renders at ≥1024px
     beyond the suppressed .v2-header — that's intentional per the spec. */
}


/* —— recovered hero/polish rules (orphaned from 06-06 branch, final versions) —— */
.site-header[data-on-cream="false"] .site-header__call,
  .site-header[data-on-cream="false"] .site-header__cta {
    visibility: hidden;
    pointer-events: none;
  }



/* —— recovered missing non-header rules (pre-indexing) —— */

/* [NAV-UNIFY 26.07] Одно меню на всех 22 страницах: «Квартиры» ведут в КАТАЛОГ (apartments.html),
   а не в якорь главной. Активная категория подсвечена: aria-current="page" — эта самая
   страница, data-current="section" — её ребёнок (квартира внутри «Квартир», район внутри
   «Нашего района»). Вордмарка в футере подстраниц стала слитной («Дейли<em>Рент</em>»,
   правило [MU5]) → em здесь не курсив, а вторая половина слова. */
.site-header__link[aria-current="page"],.site-header__link[data-current="section"]{opacity:1;font-weight:600}
.site-drawer__brand em{font-style:normal}

/* ═══ [POLISH 03.08] Страницы квартир: читаемость и тап-цели на телефоне ═══════════
   Замер chrome-headless-shell на 360 / 390 / 430 / 768 (DPR3, iPhone UA), страница
   site/apartment-abay10.html. Пять правок, все аддитивные. Селекторы живут ТОЛЬКО
   на семи страницах квартир (греп по всем site/*.html и главной): .apt2-crumb__trail--under,
   .apt2-host, .apt2-bar — 7/7 файлов, на главной их нет.
   РЕВЕРС: удалить блок целиком (до комментария [VT 03.08]). */

/* [POLISH 03.08 · 1] Крошка под H1: было 11px · .32em · КАПС · ink/.5 (≈2.9:1 при
   пороге AA 4.5). Тап-цель ссылки по ЖИВОМУ замеру — 14px, а не 16.5: у строчного
   элемента line-height в прямоугольник не идёт, при пороге WCAG 2.5.8 = 24.
   Лечим типографикой и паддингом: глифов-указателей не добавляем (отклонялись четыре
   раза), H1 и разметку не трогаем. href обязан остаться ссылкой — на нём close-to-back
   [BACK 01.08], перехват в js/site.js смотрит только на origin/pathname/referrer.
   Ссылка отличается от хвоста тоном и весом, линии нет (в навигации подчёркиваний нет).
   РЕВЕРС: удалить два правила ниже. */



/* [POLISH 03.08 · 2] Блок хозяев не перестраивался на телефоне: grid auto/1fr без
   мобильного правила, два портрета 4.75rem + внутренний зазор + grid-gap съедали
   196.8 из 350px рельса (замер @390), тексту оставалось 153px и 6–7 строк.
   Ниже 480px портреты уходят строкой НАД текстом. Порог 480 — из уже существующих
   в этом же компоненте (.apt2-bar__cta-label 480, .v2-footer__lang 481), новых чисел
   в систему не вносим. РЕВЕРС: удалить медиазапрос. */
@media (max-width: 479.98px) {
  .apt2-host { grid-template-columns: 1fr; gap: 1.5rem; align-items: start; }
  .apt2-host__pair { gap: 12px; }
}

/* [POLISH 03.08 · 3] Между «позвонить» и «написать» было 9.6px — промах уводит
   в звонок вместо переписки. Цели 26px добираем НЕВИДИМОЙ зоной через ::after
   (паддингом нельзя: у ссылок border-bottom, он уехал бы от текста), зазор разводим.
   Ряды разведены на 20px, чтобы при переносе (случается на 360px) зоны −10px
   стыковались, а не накладывались. РЕВЕРС: вернуть gap .6rem и удалить два правила. */
.apt2-host__contact { gap: 1.25rem 1rem; }
.apt2-host__contact a { position: relative; }
.apt2-host__contact a::after { content: ""; position: absolute; inset: -10px -6px; }

/* [POLISH 03.08 · 4] Липкий бар. Главная кнопка конверсии была 41.9px
   (padding .7rem + строка 13px/1.5), тихая ссылка на отзывы — 40.3px: обе ниже
   планки 44. Добираем min-height, паддинги не трогаем — геометрия бара не едет.
   .apt2-bar__ghost до сих пор был display:none ниже 640px, а js/site.js:509 честно
   писал туда рейтинг — работа в невидимый узел. Открываем его с 480px (существующий
   порог компонента) и коротким видом «★ 4.9»: по замеру на 390px в баре свободно 70px,
   на 360px — 40px, а короткая ссылка требует ~60 ⇒ ниже 480 она осталась бы за счёт
   сжатия цены. Слово «Отзывы» на узких экранах не исчезает из озвучки, а прячется
   visually-hidden — доступное имя ссылки прежнее. РЕВЕРС: удалить правила ниже
   и вернуть в разметку шести страниц один <span class="tabular">. */
.apt2-bar__cta { min-height: 44px; }
.apt2-bar__ghost { min-height: 44px; }
/* У Е-882 15Б отзывов нет: в разметке ни числа, ни секции #reviews — ссылка вела
   в никуда и при этом показывалась на десктопе. Прячем именно пустую. */
.apt2-bar__ghost:not(:has(.tabular)) { display: none; }
@media (min-width: 480px) {
  .apt2-bar__ghost { display: inline-flex; }
}
@media (max-width: 639.98px) {
  .apt2-bar__ghost { padding: 0.65rem 0.75rem; }
  .apt2-bar__ghost-word {
    position: absolute;
    width: 1px; height: 1px;
    margin: -1px; padding: 0; border: 0;
    overflow: hidden; clip-path: inset(50%); white-space: nowrap;
  }
}
@media (min-width: 640px) {
  .apt2-bar__ghost-star { display: none; }
}

/* [POLISH 03.08 · 5] Липкий бар перекрывал подвал — но НЕ на телефоне, как считалось,
   а на ДЕСКТОПЕ. Замер 2D-пересечением прямоугольников (не только по вертикали):
   до 1024px спасает `body{padding-bottom:calc(72px + env(safe-area-inset-bottom))}`
   (строка 2233) — под подвалом уже 72+env, а бар занимает 78+env снизу ⇒ запас 26px,
   наложение НОЛЬ. С 1024px эта подушка снимается, остаются только 2rem самой
   legal-строки против 86px бара ⇒ измеренное наложение: @1440 блок реквизитов
   137×54px под баром, @1200 — 193×54, @1024 — 281×54 плюс хвост строки © 16×16.
   Клиренс = высота бара (62) + его отступ (24) + запас, только с 1024px.
   РЕВЕРС: удалить медиазапрос ниже. */
@media (min-width: 1024px) {
  body:has(.apt2-bar) .v2-footer__legal-bar {
    padding-bottom: calc(2rem + 4.5rem + env(safe-area-inset-bottom));
  }
}

/* [VT 03.08 — ОТМЕНЕНО 04.08, СНЯТО ПОВТОРНО] Здесь жило включение кросс-документных переходов
   (@view-transition { navigation: auto }) и старый комментарий с фразой «переход НЕ выключаем».
   Строка вернулась в файл параллельной сессией и была снята второй раз. Если увидишь её здесь
   снова — это не откат решения, а гонка двух сессий: решение владельца от 04.08 ниже. */
/* [VT-OFF 04.08] ПЕРЕХОДОВ МЕЖДУ СТРАНИЦАМИ БОЛЬШЕ НЕТ — СНЯТО ВЛАДЕЛЬЦЕМ.
   Вердикт дословно: «уродливо выглядит». Страница уходила в перекрёстное затухание на каждой
   навигации; на возврате на главную это особенно заметно — браузер держит замерший старый кадр
   и растворяет его в ещё не дорисованную тяжёлую главную.
   04.08 сначала чинилась арифметика затухания (пара снимков теряла до двух третей непрозрачности
   на ~240мс — тумбстоун этого разбора оставлен здесь как знание, а не как код): старый гас за
   90мс, новый стартовал с 30-й мс и тянулся 240, сумма проваливалась до 0.35. Провал закрыли,
   но остался сам эффект — его и сняли.
   Основание против возврата — собственный разбор проекта от 03.08 («АНИМАЦИЯ-ПЕРЕХОДОВ-ВЕРДИКТ»):
   ни одного исследования и ни одного A/B в пользу; измеренная цена есть (+70мс до появления
   главного изображения на мобильных, +77мс при замедлении процессора в 20 раз); в нише переходов
   нет ни у одной из шести проверенных площадок; реально срабатывает на 0,92% просмотров.
   НЕ ВОЗВРАЩАТЬ без нового сигнала владельца. РЕВЕРС (если сигнал будет) — вернуть четыре строки:
     @view-transition { navigation: auto; }
     ::view-transition-old(root) { animation: dr-vt-out 240ms cubic-bezier(.22,1,.36,1) both; }
     ::view-transition-new(root) { animation: dr-vt-in  240ms cubic-bezier(.22,1,.36,1) both; }
     @keyframes dr-vt-out { to { opacity: 0 } }  @keyframes dr-vt-in { from { opacity: 0 } }
   Обе длительности и кривая ОБЯЗАНЫ совпадать, а задержки быть нулевыми — иначе вернётся провал. */

/* [BACK-BTN 03.08] Кнопка возврата к ленте на страницах квартир. Закрывает решение 26.07
   «на подстранице одна крошка назад, а не полный путь» — оно было принято и не отгружено.
   ФОРМА: обведённая пилюля, та же, что у «Показать ещё N отзывов» и у «Смотреть квартиры»
   (значения скопированы с .rvp__cta-alt, не подобраны заново). Ноль новых сущностей.
   Стрелка допустима, потому что живёт ВНУТРИ контрола с поверхностью, а не голым глифом
   у текста — голые указатели снимались четыре раза подряд.
   НЕ круг поверх фото: живой замер Airbnb 03.08 показал у них 56×32, радиус 8, прозрачный
   фон, без тени, на сплошной белой полосе — кружок с тенью это их приложение, не сайт.
   ССЫЛКА, не кнопка: гость из поиска уходит на ленту обычной навигацией, гость из сессии
   перехватывается блоком [BACK 01.08] в js/site.js и возвращается по истории со скроллом.
   Кегль --fs-sm: шкалы --s-15 на подстраницах НЕТ (переменные живут только на главной),
   неизвестная переменная молча выбросила бы объявление.
   РЕВЕРС: удалить блок + вернуть nav.apt2-crumb__trail на строку 49 из бэкапа. */
.dr-back {
  display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem;
  min-height: 44px; padding: 12px 1.4rem;
  border: 1px solid hsl(var(--ink) / 0.22);
  border-radius: var(--radius-full);
  color: hsl(var(--ink) / 0.82);
  font-size: var(--fs-sm); font-weight: 500;
  /* Зазор до заголовка — тот же 1.25rem, что был у снятых крошек (.apt2-crumb__trail--under). */
  margin-top: 1.25rem;
  transition: border-color var(--dur-base) var(--ease-standard), color var(--dur-base) var(--ease-standard);
}
.dr-back:hover { border-color: hsl(var(--ink) / 0.42); color: hsl(var(--ink)); }
.dr-back:focus-visible { outline: 2px solid hsl(var(--ink) / 0.6); outline-offset: 2px; }
.dr-back__glyph { flex: none; }


/* [BACK-ALL 03.08] Тот же контрол на страницах ЖК, «Нашего района» и юридических.
   Причина: в контенте этих страниц не было НИ ОДНОГО пути назад — меню в шапке скрыто до 1024px,
   оставался только бургер. На страницы ЖК вдобавок не ведёт ни одна внутренняя ссылка (ни с
   главной, ни с квартир, ни с «Нашего района») — гость попадает туда только из поиска, поэтому
   там кнопка работает не как возврат, а как ВХОД в каталог: холодный заход перехватчик не берёт,
   ссылка честно уводит на ленту.
   На юр-страницах текстовая крошка «Главная / Документы» заменена этим же контролом — один язык
   навигации на весь сайт вместо двух.
   --lead: контрол стоит ПЕРВЫМ в блоке, а не под заголовком, значит верхний зазор не нужен.
   РЕВЕРС: удалить правило + вернуть страницы из _backups/2026-08-03_fullnav/. */
.dr-back--lead { margin-top: 0; margin-bottom: 1.5rem; }

/* ═══ [HOVER-TOUCH 04.08] НА ТАЧЕ СНЯТ ХОВЕР-ПОДЪЁМ ТОЛЬКО У КАРТОЧЕК КВАРТИР ═══
   Повод: на айфоне первый свайп по фото карточки не проходил — палец лёг, Safari повесил
   эмулированный `:hover`, карточка уехала вверх на 3px под пальцем, жест потерялся. Со
   второго раза ховер уже «залип», подъёма нет, свайп идёт. Внутри карточки живёт лента
   фото — единственное место сайта, где ховер-подъём дерётся с жестом.
   ⚠ 04.08 БЫЛ отгружен гард на ВСЕ 21 живое ховер-движение сайта и ОТКАЧЕН в тот же час.
   Вердикт владельца: «стоило только с квартир снять, на остальном это создавало ощущение
   живого сайта» — на телефоне залипший после тапа подъём кнопок/плиток он читает как
   отклик, а не как дефект. НЕ ВОЗВРАЩАТЬ общий гард без новой просьбы; список тогдашних
   целей (кнопки хозяев/FAQ/брони, плитки галереи, карточки прогулок, стрелки) восстановлен.
   Замер: живых ховер-движений на сайте 32, заскопленных в `@media (hover: hover)` — 6.
   `!important` осознан: dailyrent.css грузится третьим, после него идут host/rightbank/
   dr-modern и инлайн главной; внутри `@media (hover: none)` настоящего ховера не бывает,
   гасить нечего кроме эмуляции. Базового transform у карточки нет — гасим только эффект,
   `:focus-visible` в тех же списках не тронут.
   ОТКАТ: удалить блок (+ точечный блок в главной, в dr-swipe-29-07). */
@media (hover: none) {
  .v2-aptcard:hover,
  .v2-aptcard--minimal:hover,
  .v2-aptcard:hover .v2-aptcard__img,
  .v2-aptcard--minimal:hover .v2-aptcard__img { transform: none !important; }
}


/* ================================================================
   [ЗАГОЛОВКИ СЕКЦИЙ НА ТЕЛЕФОНЕ 09.08] 42 → 30, следующая ступень шкалы вниз.
   Замер, из-за которого правка: на 390 заголовки секций были РОВНО 42 — столько
   же, сколько на десктопе 1400. Экран уже в три с половиной раза, а кегль тот же,
   поэтому «Спешим ответить на ваши вопросы» разваливалось на ТРИ строки.
   У героя правило текучести есть (56 → 50.7), у остальных заголовков не было.
   После: «Спешим…» две строки, «Что говорят гости» одна.
   ⚠ Селекторы с ДВОЙНЫМ классом намеренно: кегли на главной раздаёт её
   внутренний блок шкалы через `html body …` с !important, и он стоит в документе
   ПОЗЖЕ любых подключённых файлов. Обычным селектором эту правку не доставить.
   ================================================================ */
@media (max-width:560px){
  html body #reviews .rvx__title.rvx__title,
  html body #faq .faqx__title.faqx__title,
  html body #host .host__name.host__name{ font-size: var(--s-30, 30px) !important; }
}
