/* Шрифт Montserrat подключается через <link> в <head> (см. partials/head.ejs),
   не через @import здесь — @import в CSS блокирует и замедляет загрузку
   страницы (браузер должен сначала целиком получить этот файл, только потом
   узнать про шрифт и начать его качать; через <link> оба ресурса грузятся
   параллельно с самого начала). */

:root {
  --cream: #FAF6EC;
  --cream-2: #F3EBDA;
  --gold: #B8985F;
  --gold-dark: #93794B;
  --ink: #2E2B28;
  --ink-soft: #5B5650;
  --white: #FFFFFF;
  --line: #E6DCC6;
  --error: #B5544A;
  --success: #5E8C6A;
  --radius: 14px;
  --shadow: 0 10px 30px rgba(46, 43, 40, 0.08);
}

* { box-sizing: border-box; }

html, body {
  margin: 0; padding: 0;
  background: var(--cream);
  color: var(--ink);
  font-family: 'Montserrat', sans-serif;
  scroll-behavior: smooth;
}

h1, h2, h3, h4, .display {
  font-family: 'Montserrat', sans-serif;
  font-weight: 600;
  color: var(--ink);
  margin: 0 0 0.5em;
  letter-spacing: 0.01em;
}

h1 { font-size: clamp(2.2rem, 5vw, 3.6rem); line-height: 1.08; }
h2 { font-size: clamp(1.7rem, 3vw, 2.4rem); }
h3 { font-size: 1.35rem; }

/* Жирнее заголовки на страницах сайта — прямая просьба владельца, КРОМЕ
   главной страницы (там он явно попросил вес не трогать). Скоуп через
   body.site-page — этот класс стоит на <body> каждого шаблона в views/*.ejs
   (about/account/blog/booking/gallery/how-to-find/loyalty/masters/post/
   privacy/reviews/services), но НЕ на views/index.ejs (главная) и не на
   body админки/мини-аппов/бота/панели мастера (у них свои классы — см.
   miniapp-body/master-body — или его нет вовсе, как в admin/*), так что
   правило ниже их не касается. */
body.site-page h1 { font-weight: 800; }
body.site-page h2 { font-weight: 750; }
body.site-page h3 { font-weight: 700; }

p { line-height: 1.65; color: var(--ink-soft); margin: 0 0 1em; }
a { color: var(--gold-dark); text-decoration: none; }
a:hover { color: var(--ink); }

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

.container { max-width: 1140px; margin: 0 auto; padding: 0 24px; }
.section { padding: 84px 0; }
.section-tight { padding: 48px 0; }
.section-alt { background: var(--cream-2); }

.eyebrow {
  font-family: 'Montserrat', sans-serif;
  text-transform: uppercase;
  letter-spacing: 0.18em;
  font-size: 0.72rem;
  color: var(--gold-dark);
  font-weight: 600;
  margin-bottom: 12px;
  display: block;
}

.lead { font-size: 1.15rem; max-width: 640px; }

/* ---- Buttons ---- */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  padding: 14px 28px;
  border-radius: 999px;
  font-family: 'Montserrat', sans-serif;
  font-weight: 600;
  font-size: 0.95rem;
  cursor: pointer;
  border: 1px solid transparent;
  transition: all 0.2s ease;
  text-decoration: none;
}
.btn-primary { background: var(--ink); color: var(--white); }
.btn-primary:hover { background: var(--gold-dark); color: var(--white); }
.btn-gold { background: var(--gold); color: var(--white); }
.btn-gold:hover { background: var(--gold-dark); }
.btn-outline { background: transparent; border-color: var(--ink); color: var(--ink); }
.btn-outline:hover { background: var(--ink); color: var(--white); }
.btn-outline-light { background: transparent; border-color: rgba(255,255,255,0.5); color: var(--white); }
.btn-outline-light:hover { background: var(--white); color: var(--ink); }
.btn-sm { padding: 9px 18px; font-size: 0.85rem; }
.btn-block { width: 100%; }
.btn[disabled] { opacity: 0.5; cursor: not-allowed; }

/* Общие SVG-иконки вместо эмодзи (views/partials/icon.ejs) — flex-shrink:0,
   чтобы длинный текст рядом не сжимал иконку, vertical-align для мест без
   flex (текст внутри <p>/<li>). */
.icon { flex-shrink: 0; vertical-align: -3px; }
/* Уточнение для иконок прямо внутри текста заголовков/подсказок (не во
   flex-контейнере) — та же выверка по базовой линии, что и у .icon, просто
   явное имя класса в местах замены эмодзи внутри h3/p/div, см. views/*.ejs. */
.icon-inline { vertical-align: -3px; }

/* Общая замена для инлайновых "display:flex" пар кнопок без flex-wrap —
   живая жалоба владельца: "кнопки на разных девайсах плывут" — почти везде
   причиной был именно такой ряд без wrap/gap (см. фикс по всем найденным
   местам). Использовать вместо голого style="display:flex" на кнопках. */
.btn-row { display: flex; flex-wrap: wrap; gap: 10px; }
.btn-row .btn { flex: 0 1 auto; }

/* Рейтинг звёздами через icon.ejs (вместо текстовых ★/☆) — заполненная звезда
   залита цветом (как раньше был сплошной ★), пустая — просто контур (как ☆). */
/* ЖИВОЙ БАГ (найден при проверке макета 2026-09): className в icon.ejs
   вешается прямо на сам <svg>, а не на обёртку — поэтому ".star-filled svg"
   (потомок) никогда не совпадал, заливка не применялась, и звёзды
   отличались только чуть заметным оттенком контура, а не залитая/пустая,
   как было с текстовым ★/☆. Правильно — класс ставим прямо на .star-filled. */
.star-filled { color: var(--gold); fill: currentColor; }
.star-empty { color: var(--line); }

/* ---- Header ----
   ЖИВАЯ ЖАЛОБА владельца (iPhone, Safari 26): «сверху с телефона хз че творится» —
   липкая шапка висела в ~50pt от верха экрана, а над ней просвечивал скроллящийся
   контент. Safari 26 сажает sticky/fixed-элементы под свою свёрнутую адресную
   строку, а страница под ней прокручивается «сквозь». На телефоне это выглядит
   как сломанная шапка, и подогнать её из CSS нельзя: величину отступа браузер
   не сообщает (без viewport-fit=cover env() отдаёт 0).
   Поэтому на телефоне шапка НЕ липкая: прокручивается вместе со страницей, а
   постоянная навигация — нижняя панель (Главная/Услуги/Записаться/Работы/Кабинет),
   она прижата к низу и от этой проблемы не страдает.
   Вернуть липкую шапку — одна строка: в @media (max-width: 860px) ниже поставить
   --header-pos: sticky и --sticky-top: var(--header-h).
   Высоты (--header-h, --strip-h) меряет public/js/site-animations.js, а не зашиты
   числами: у Android-устройств шапка бывает разной высоты (крупный шрифт в
   настройках, узкий экран, где кнопка «Записаться» переносится), и зашитые
   69px/75px давали то щель, то наезд полосы категорий на шапку. */
:root {
  --header-h: 69px;
  --strip-h: 56px;
  --header-pos: sticky;
  --sticky-top: var(--header-h);
}
@media (max-width: 860px) {
  :root { --header-pos: relative; --sticky-top: 0px; }
}
.site-header {
  position: var(--header-pos, sticky); top: 0; z-index: 50;
  background: rgba(250, 246, 236, 0.92);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--line);
}
.site-header .container { display: flex; align-items: center; justify-content: space-between; padding: 14px 24px; }
.brand { display: flex; align-items: center; gap: 10px; font-family: 'Montserrat', sans-serif; font-weight: 600; font-size: 1.3rem; color: var(--ink); flex-shrink: 0; }
.brand img { height: 40px; width: 40px; object-fit: cover; border-radius: 50%; }
.nav { display: flex; gap: 28px; align-items: center; }
/* :not(.btn) — в меню на телефоне лежат и КНОПКИ (телефон, «Записаться»). Без исключения
   правила ссылок меню перебивали стили кнопок: см. живую жалобу у мобильного блока ниже. */
.nav a:not(.btn) { color: var(--ink-soft); font-size: 0.92rem; font-weight: 500; }
.nav a:not(.btn):hover { color: var(--gold-dark); }
.header-actions { display: flex; gap: 10px; align-items: center; }
.account-icon { display: none; }
.header-actions .account-label { display: inline; }

/* ==== Шапка на ПК (от 861px) — ТРЕТИЙ заход по жалобе владельца: «пункты меню вплотную к лого и к
   кнопкам». Почему прошлые правки не помогли: ширину проверяли на ЗАПАСНОМ шрифте (в песочнице нет
   Montserrat), а на сайте — Montserrat, он примерно на 12% шире; на настоящем шрифте прежняя шапка
   слипалась на ВСЕХ широких экранах (1323px и шире), т.к. 8 пунктов + бренд + две кнопки с зазором
   28px не помещались в 1092px контейнера. Теперь:
   • у контейнера шапки есть физический минимум между блоками (gap) — лого/меню/кнопки не могут
     оказаться вплотную, даже если текст окажется шире расчётного;
   • ступени по ширине считаны под НАСТОЯЩУЮ ширину Montserrat (эмуляция сверена по скриншоту
     владельца: положение элементов совпало с точностью до пикселей) с запасом 5%:
       ≥1140   — бренд «Майя» + меню (зазор 20) + «Личный кабинет» + «Записаться»;
       1060–1139 — то же, без слова «Майя» (название и так есть на самом логотипе);
       900–1059  — «Личный кабинет» становится иконкой, меню чуть мельче;
       861–899   — самый плотный вариант. Ниже 861px включается бургер, там места хватает. */
@media (min-width: 861px) {
  .site-header .container { gap: 24px; }
  .nav { gap: 20px; flex-wrap: nowrap; }
  .nav a:not(.btn) { font-size: 0.9rem; white-space: nowrap; }
  .header-actions { flex-shrink: 0; }
}
@media (min-width: 861px) and (max-width: 1139px) {
  .site-header .container { padding-left: 18px; padding-right: 18px; }
  .brand-name { display: none; }
}
@media (min-width: 861px) and (max-width: 1059px) {
  .site-header .container { gap: 16px; }
  .nav { gap: 16px; }
  .nav a:not(.btn) { font-size: 0.86rem; }
  .header-actions { gap: 8px; }
  .header-actions .account-label { display: none; }
  .header-actions .account-icon { display: inline-flex; }
  .header-actions .desktop-only { padding: 9px 11px; }
}
@media (min-width: 861px) and (max-width: 899px) {
  .site-header .container { gap: 10px; padding-left: 12px; padding-right: 12px; }
  .nav { gap: 11px; }
  .nav a:not(.btn) { font-size: 0.8rem; }
  .header-actions .btn-gold { padding: 9px 12px; font-size: 0.8rem; }
}
/* Активный раздел в шапке. Раньше подсветки не было вовсе — «Как дойти?»
   был золотым всегда и читался как «вы здесь» на любой странице. */
.nav a.is-current { color: var(--gold-dark); font-weight: 700; }
.nav a.is-current::after {
  content: ""; display: block; height: 2px; margin-top: 4px;
  background: var(--gold); border-radius: 2px;
}
/* Живая жалоба владельца («сверху всё ещё ужасно»): подчёркивание активного пункта было блоком под
   текстом и раздувало его высоту — «Обучение» стояло выше остальных пунктов. На ПК рисуем линию
   поверх, вне потока: текст всех пунктов на одной строке, линия просто под ним. (На телефоне
   подчёркивания нет вовсе, см. блок ниже.) */
@media (min-width: 861px) {
  .nav a:not(.btn) { position: relative; }
  .nav a.is-current::after { position: absolute; left: 0; right: 0; bottom: -7px; margin-top: 0; }
}

/* Бургер — три полосы, которые складываются в крестик при открытом меню. */
.nav-toggle {
  display: none; background: none; border: 1px solid var(--line); border-radius: 10px;
  width: 42px; height: 42px; cursor: pointer; color: var(--ink);
  flex-shrink: 0; align-items: center; justify-content: center; padding: 0;
}
.nav-toggle-bars { display: block; width: 18px; height: 12px; position: relative; }
.nav-toggle-bars i {
  position: absolute; left: 0; right: 0; height: 2px; border-radius: 2px;
  background: var(--ink); transition: transform 0.25s ease, opacity 0.2s ease, top 0.25s ease;
}
.nav-toggle-bars i:nth-child(1) { top: 0; }
.nav-toggle-bars i:nth-child(2) { top: 5px; }
.nav-toggle-bars i:nth-child(3) { top: 10px; }
.nav-toggle.is-open .nav-toggle-bars i:nth-child(1) { top: 5px; transform: rotate(45deg); }
.nav-toggle.is-open .nav-toggle-bars i:nth-child(2) { opacity: 0; }
.nav-toggle.is-open .nav-toggle-bars i:nth-child(3) { top: 5px; transform: rotate(-45deg); }

.nav-panel-head, .nav-panel-foot { display: none; }
.nav-backdrop { display: none; }
.mobile-only-link { display: none; }
.desktop-only { display: inline-flex; }

@media (max-width: 860px) {
  /* ВАЖНО: backdrop-filter на шапке создаёт для вложенных position:fixed
     новый «экран» — панель меню прилипала к шапке высотой в саму шапку и
     выглядела пустой полосой. На телефоне блюр не нужен: делаем шапку
     непрозрачной, и fixed-панель снова считается от окна. */
  /* z-index шапки должен быть ВЫШЕ затемнения (.nav-backdrop, z:70): панель
     меню лежит внутри шапки, а sticky+z-index создаёт свой слой — иначе
     затемнение накрывало и саму панель. */
  .site-header { backdrop-filter: none; background: var(--cream); z-index: 90; }

  /* Выезжающая справа панель вместо выпадающего списка: пункты крупные,
     под большой палец, и видно, что это отдельный слой поверх страницы. */
  .nav {
    position: fixed; top: 0; right: 0; bottom: 0; z-index: 80;
    width: min(320px, 86vw);
    display: flex; flex-direction: column; align-items: stretch; gap: 0;
    background: var(--cream); padding: 0 0 24px;
    /* Тень — только у ОТКРЫТОЙ панели. Раньше она была всегда: закрытая панель уезжает
       за правый край (translateX(100%)), но её тень в 50px просачивалась на экран —
       на телефоне по всей высоте справа шла серая полоса (видно на скринах владельца). */
    box-shadow: none;
    transform: translateX(100%);
    transition: transform 0.28s cubic-bezier(0.2, 0.8, 0.2, 1), box-shadow 0.28s ease;
    overflow-y: auto;
  }
  .nav.nav-open { transform: translateX(0); box-shadow: -18px 0 50px rgba(20,18,15,0.25); }
  /* ЖИВАЯ ЖАЛОБА владельца (скрин меню на iPhone): «телефон криво выглядит». Правило для
     пунктов меню (.nav a) заодно цеплялось за кнопки внизу панели (.btn): у кнопки телефона
     нижняя линия становилась светло-бежевой при тёмных остальных сторонах — рамка «кривая»;
     у «Записаться» текст из белого превращался в тёмный, а паддинг/шрифт брались от пункта
     меню, а не от кнопки. Поэтому пункты меню — только `a:not(.btn)`. */
  .nav a:not(.btn) {
    padding: 15px 22px; border-bottom: 1px solid var(--line);
    font-size: 1rem; font-weight: 600; color: var(--ink);
  }
  .nav a.is-current { background: var(--cream-2); }
  .nav a.is-current::after { display: none; }

  .nav-panel-head {
    display: flex; align-items: center; justify-content: space-between;
    padding: 20px 22px 14px; border-bottom: 1px solid var(--line);
  }
  .nav-close {
    background: none; border: 0; font-size: 1.8rem; line-height: 1;
    color: var(--ink-soft); cursor: pointer; padding: 0 4px;
  }
  .nav-panel-foot { display: flex; flex-direction: column; gap: 10px; padding: 20px 22px 0; }
  /* Кнопки внизу меню — крупнее .btn-sm: это тач-цели под большой палец (телефон, запись). */
  .nav-panel-foot .btn { justify-content: center; padding: 14px 18px; font-size: 0.98rem; }

  .nav-backdrop {
    display: block; position: fixed; inset: 0; z-index: 70;
    background: rgba(20,18,15,0.45); backdrop-filter: blur(2px);
    animation: lightboxIn 0.2s ease;
  }
  .nav-backdrop[hidden] { display: none; }

  .mobile-only-link { display: block; }
  .desktop-only { display: none; }
  .nav-toggle { display: inline-flex; }
  .header-actions .btn-sm { padding: 10px 16px; font-size: 0.82rem; }

  /* Плавающие бургер + «Записаться» (см. дисклеймер у #mobile-fixed-bar в header.ejs) заменяют
     собой те же кнопки внутри самой шапки — прячем оригиналы, чтобы не задваивались на глаз,
     пока шапка ещё не уехала прокруткой. */
  #header-booking-btn, .site-header .header-actions .nav-toggle { display: none; }
}

.mobile-fixed-bar { display: none; }
@media (max-width: 860px) {
  .mobile-fixed-bar {
    display: flex; align-items: center; gap: 6px;
    position: fixed; z-index: 95;
    top: calc(env(safe-area-inset-top, 0px) + 10px);
    left: 14px;
    background: var(--cream); border: 1px solid var(--line); border-radius: 999px;
    padding: 5px 6px 5px 5px; box-shadow: var(--shadow);
  }
  .mobile-fixed-bar .nav-toggle { border: none; background: var(--cream-2); width: 38px; height: 38px; }
  .mobile-fixed-bar .btn-sm { padding: 9px 16px; font-size: 0.82rem; }
}

@media (max-width: 420px) {
  .brand span, .brand { font-size: 1.05rem; }
  .site-header .container { padding: 12px 16px; }
}

/* (Раньше тут был padding-top:10px у липкой шапки на телефоне — костыль под ту же
   жалобу про Safari. С неприлипающей шапкой он не нужен: см. комментарий у
   :root выше.) */

/* ---- Hero (главная) ----
   Полноэкранный тёмный hero с фоновым фото + градиентным оверлеем — живая
   просьба владельца "гораздо сильнее и контрастнее" (макет 2026-09, второй
   заход после "макет слишком аккуратный, непродающе и скучно"). ВАЖНО:
   .hero-grid и .hero-photo-wrap используются ЕЩЁ и в views/about.ejs —
   их сюда не трогаем, у полноэкранного hero свои классы (.hero-bg-img,
   .hero-overlay, .hero-content, .hero-badge-floating). Сам .hero и
   .hero-cta-row/.stats-strip/.stat/.hero-badge — только в index.ejs,
   их можно менять свободно. */

/* ЖИВОЙ БАГ (прямая жалоба владельца — "о нас поплыло"): у .hero-grid и
   .hero-photo-wrap НЕ БЫЛО базового правила вообще — только упоминание в
   комментарии выше и мобильный @media-оверрайд ниже (.hero-photo-wrap {
   aspect-ratio: 16/9 } внутри max-width:640px). На десктопе/планшете это
   значило: никакого grid, текст и фото в about.ejs просто течужит друг под
   другом блоками, а сама картинка — без aspect-ratio/object-fit, то есть в
   своём естественном (часто огромном и не той пропорции) размере. Отсюда и
   "поплыло". Базовое правило ниже — именно то, что должно было тут быть
   всегда; мобильный оверрайд ниже по файлу его просто уточняет.*/
.hero-grid { display: grid; grid-template-columns: 1.05fr 0.95fr; gap: 48px; align-items: center; }
@media (max-width: 860px) { .hero-grid { grid-template-columns: 1fr; } }
.hero-photo-wrap { border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow); aspect-ratio: 4/5; }
.hero-photo-wrap img { width: 100%; height: 100%; object-fit: cover; display: block; }

.hero {
  position: relative;
  min-height: 84vh;
  display: flex;
  align-items: center;
  overflow: hidden;
  padding: 120px 0 80px;
}
.hero-bg-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: 0; }
.hero-overlay {
  position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(100deg, rgba(20,18,15,0.94) 0%, rgba(20,18,15,0.82) 34%, rgba(20,18,15,0.42) 66%, rgba(20,18,15,0.16) 100%);
}
.hero-content { position: relative; z-index: 2; max-width: 640px; }
/* ЖИВАЯ ЖАЛОБА владельца: золотой (var(--gold)) на некоторых фото фона
   (светлые/розовые тона маникюра) сливается с картинкой, плохо читается.
   Берём тёплый почти белый (var(--cream)) — контраст гарантирован что на
   тёмной, что на светлой части фото — плюс тень для подстраховки. */
.hero-content .eyebrow { color: var(--cream); text-shadow: 0 1px 4px rgba(20,18,15,0.55); }
.hero-content h1 { color: var(--white); font-size: clamp(2.1rem, 4.4vw, 3.4rem); }
.hero-content .lead { color: rgba(255,255,255,0.84); }
.hero-cta-row { display: flex; gap: 14px; margin-top: 28px; flex-wrap: wrap; }
.hero-quick-row { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; margin-top: 18px; }
.hero-phone-link { color: var(--white); font-weight: 600; font-size: 0.95rem; }
.hero-phone-link:hover { color: var(--gold); }
.hero-content .social-icons-row a, .hero-content .social-row { color: rgba(255,255,255,0.85); }
.hero-content .social-icons-row a:hover, .hero-content .social-row a:hover { color: var(--gold); }

.hero-badge-floating {
  position: absolute; z-index: 2; right: 40px; bottom: 40px;
  background: var(--white); padding: 16px 22px; border-radius: 16px; box-shadow: var(--shadow);
  display: flex; gap: 12px; align-items: center;
}
.hero-badge-floating .num { font-family: 'Montserrat', sans-serif; font-size: 1.7rem; color: var(--gold-dark); font-weight: 700; }
.hero-badge-floating .lbl { font-size: 0.78rem; color: var(--ink-soft); line-height: 1.2; }

/* ---- Счётчики в hero — крупные анимированные цифры, "считаются" от 0 до
   data-count-to при попадании в вьюпорт (см. site-animations.js). Только
   реальные, проверяемые цифры (сверено с Яндекс Картами и настройками
   лояльности) — никаких придуманных чисел. */
.hero-counters { display: flex; gap: 40px; margin-top: 40px; flex-wrap: wrap; }
.hero-counter .num { font-family: 'Montserrat', sans-serif; font-size: clamp(1.7rem, 3vw, 2.3rem); color: var(--white); font-weight: 700; }
.hero-counter .lbl { font-size: 0.82rem; color: rgba(255,255,255,0.62); }

/* ---- Stats strip (используется только на главной — оставлено для
   совместимости, но сама главная теперь показывает счётчики в hero) ---- */
.stats-strip { display: flex; gap: 48px; margin-top: 40px; flex-wrap: wrap; }
.stat .num { font-family: 'Montserrat', sans-serif; font-size: 2rem; color: var(--gold-dark); font-weight: 700; }
.stat .lbl { font-size: 0.82rem; color: var(--ink-soft); }

@media (max-width: 900px) {
  .hero { min-height: auto; padding: 96px 0 150px; }
  .hero-badge-floating { left: 16px; right: 16px; bottom: 16px; justify-content: center; }
  .hero-counters { gap: 22px; }
}

/* ---- Cards ---- */
.grid { display: grid; gap: 24px; }
/* ЖИВАЯ ЖАЛОБА (iPhone, скрин прайса): карточка услуги вылезала за правый край экрана,
   «Записаться» и цена были обрезаны. Причина: в сетке было `1fr` — это
   minmax(auto, 1fr), и колонка не может стать уже самого длинного «слова» внутри.
   Название вроде «снятие+маникюр+укрепление+гель-лак» (без пробелов) раздвигало
   колонку шире экрана. minmax(0, 1fr) разрешает колонке сжиматься, а перенос
   длинных слов делают сами карточки (overflow-wrap). На Android с его сотнями
   ширин экрана и крупным шрифтом такое встречается ещё чаще. */
.grid > * { min-width: 0; }
.grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.grid-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
@media (max-width: 900px) { .grid-3, .grid-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { .grid-3, .grid-4, .grid-2 { grid-template-columns: minmax(0, 1fr); } }

.card {
  background: var(--white);
  border-radius: var(--radius);
  padding: 28px;
  box-shadow: var(--shadow);
  border: 1px solid var(--line);
  transition: transform 0.25s ease, box-shadow 0.25s ease;
}
.service-card { display: flex; flex-direction: column; gap: 10px; }
.service-card .price { font-family: 'Montserrat', sans-serif; color: var(--gold-dark); font-size: 1.4rem; font-weight: 700; }
a.card:hover, a.service-card:hover { transform: translateY(-6px); box-shadow: 0 18px 40px rgba(46,43,40,0.14); }

/* ==== Макет 2026-09 (живая просьба владельца — "максимально красиво",
   "больше анимаций", "как у Пилок с каруселями"): анимация появления секций
   при скролле + прилипающее меню-якорь по разделам главной, в стиле
   category-tabs у pilkinail.ru — см. public/js/site-animations.js
   (IntersectionObserver вешает .is-visible на .reveal и .active на текущую
   вкладку меню). Без JS (например, поисковый бот) .reveal просто виден сразу
   — .is-visible тут не обязателен для контента, только для красивого входа. */
.reveal { opacity: 0; transform: translateY(28px); transition: opacity 0.7s cubic-bezier(0.2,0.7,0.2,1), transform 0.7s cubic-bezier(0.2,0.7,0.2,1); }
.reveal.is-visible { opacity: 1; transform: translateY(0); }
.reveal-stagger > * { opacity: 0; transform: translateY(24px); transition: opacity 0.6s ease, transform 0.6s ease; }
.reveal-stagger.is-visible > * { opacity: 1; transform: translateY(0); }
.reveal-stagger.is-visible > *:nth-child(1) { transition-delay: 0.02s; }
.reveal-stagger.is-visible > *:nth-child(2) { transition-delay: 0.09s; }
.reveal-stagger.is-visible > *:nth-child(3) { transition-delay: 0.16s; }
.reveal-stagger.is-visible > *:nth-child(4) { transition-delay: 0.23s; }
.reveal-stagger.is-visible > *:nth-child(5) { transition-delay: 0.30s; }
.reveal-stagger.is-visible > *:nth-child(6) { transition-delay: 0.37s; }
@media (prefers-reduced-motion: reduce) {
  .reveal, .reveal-stagger > * { opacity: 1 !important; transform: none !important; transition: none !important; }
}

/* Hero — виден сразу без скролла, поэтому анимация идёт по времени
   (@keyframes при загрузке), а не по IntersectionObserver. */
@keyframes hero-fade-up { from { opacity: 0; transform: translateY(18px); } to { opacity: 1; transform: translateY(0); } }
.hero-animate { animation: hero-fade-up 0.8s cubic-bezier(0.2,0.7,0.2,1) both; }
@media (prefers-reduced-motion: reduce) { .hero-animate { animation: none; } }

/* Прилипающая строка разделов главной — тот же приём, что у Пилок на
   /price (category tabs, которые подсвечивают текущий раздел и прилипают
   при скролле), только применённый к секциям самой главной, а не к списку
   услуг: Услуги / Галерея / Клуб / Отзывы / Контакты. */
.section-scrollnav-wrap { position: sticky; top: var(--sticky-top); z-index: 40; background: var(--cream); border-bottom: 1px solid var(--line); }
.section-scrollnav { display: flex; gap: 6px; overflow-x: auto; -webkit-overflow-scrolling: touch; padding: 12px 24px; max-width: 1140px; margin: 0 auto; scrollbar-width: none; }
.section-scrollnav::-webkit-scrollbar { display: none; }
.section-scrollnav a {
  flex-shrink: 0; padding: 8px 16px; border-radius: 999px; font-size: 0.86rem; font-weight: 600;
  color: var(--ink-soft); white-space: nowrap; transition: all 0.2s ease;
}
.section-scrollnav a:hover { color: var(--ink); background: var(--cream-2); }
.section-scrollnav a.active { color: var(--white); background: var(--gold); }

/* Карусель "Популярные услуги" — прокрутка со snap, стрелки для десктопа,
   карточки с hover-приподнятием (как заезженные ползущие карточки у Пилок,
   но без автопрокрутки — управляет сам пользователь, надёжнее на телефоне). */
.popular-carousel { position: relative; margin-top: 32px; }
.popular-carousel-track {
  display: flex; gap: 20px; overflow-x: auto; scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch; padding: 4px 4px 16px; scrollbar-width: none;
}
.popular-carousel-track::-webkit-scrollbar { display: none; }
/* Карточки крупнее по прямой просьбе владельца ("побольше бы сделать в
   высоту и длину карусели") — было 260px/без заданной высоты, сейчас шире и
   с минимальной высотой, чтобы карусель ощущалась весомее на широких экранах. */
.popular-card {
  scroll-snap-align: start; flex: 0 0 320px; min-height: 250px; text-decoration: none; color: inherit;
  background: var(--white); border-radius: var(--radius); border: 1px solid var(--line);
  box-shadow: var(--shadow); padding: 28px; display: flex; flex-direction: column; gap: 10px;
  transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.popular-card:hover { transform: translateY(-8px) scale(1.02); box-shadow: 0 20px 44px rgba(46,43,40,0.16); }
.popular-card .badge {
  align-self: flex-start; font-size: 0.68rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--gold-dark); background: var(--cream-2); padding: 3px 10px; border-radius: 999px;
}
.popular-card .price { font-family: 'Montserrat', sans-serif; color: var(--gold-dark); font-size: 1.3rem; font-weight: 700; margin-top: 4px; }
/* Кнопка-CTA внизу карточки — текст и ссылка редактируются в админке
   (владелец: "хочу чтоб в карусели была везде кнопка текст и куда она ведет
   которые я бы мог менять"). Карточка целиком остаётся ссылкой (как и
   раньше) — это визуальный акцент, а не отдельный <a>. */
.popular-card-cta {
  display: flex; align-items: center; gap: 5px; margin-top: auto; padding-top: 6px;
  color: var(--gold-dark); font-size: 0.82rem; font-weight: 700;
}
.popular-card:hover .popular-card-cta { color: var(--ink); }
.popular-carousel-arrow {
  position: absolute; top: 50%; transform: translateY(-50%); z-index: 5;
  width: 44px; height: 44px; border-radius: 50%; background: var(--white); border: 1px solid var(--line);
  box-shadow: var(--shadow); display: flex; align-items: center; justify-content: center; cursor: pointer;
  color: var(--ink); transition: background 0.2s ease;
}
.popular-carousel-arrow:hover { background: var(--cream-2); }
.popular-carousel-arrow.prev { left: -18px; }
.popular-carousel-arrow.next { right: -18px; }
@media (max-width: 700px) { .popular-carousel-arrow { display: none; } }

/* Карточки "Акции" — та же карусель-механика (.popular-carousel-track/
   -arrow, см. выше), но своя карточка: фоновое фото (если задано в админке)
   размывается ПОД текстом, а не рядом с ним — живая просьба владельца
   ("фото на задний план которое будет за текстом замыленно"). Без фото —
   просто тёмный градиент, тоже читаемо. */
.promo-card {
  position: relative; overflow: hidden; scroll-snap-align: start;
  flex: 0 0 340px; min-height: 280px; border-radius: var(--radius);
  padding: 28px; display: flex; flex-direction: column; justify-content: flex-end; gap: 6px;
  text-decoration: none; color: var(--white);
  background: linear-gradient(135deg, var(--ink) 0%, #423C34 100%);
  box-shadow: var(--shadow); transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.promo-card:hover { transform: translateY(-8px) scale(1.02); box-shadow: 0 20px 44px rgba(46,43,40,0.24); }
.promo-card-bg {
  position: absolute; inset: -12px; z-index: 0; background-size: cover; background-position: center;
  filter: blur(16px); transform: scale(1.1);
}
.promo-card-overlay {
  position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(180deg, rgba(20,18,15,0.1) 0%, rgba(20,18,15,0.88) 100%);
}
.promo-card-content { position: relative; z-index: 2; }
.promo-card h3 { color: var(--white); margin: 0 0 6px; font-size: 1.2rem; line-height: 1.22; }
.promo-card p {
  color: rgba(255,255,255,0.86); font-size: 0.87rem; line-height: 1.45; margin: 0;
  /* Владелец может ввести текст любой длины в админке — обрезаем троеточием
     после 3 строк, чтобы длинный текст не разваливал фиксированную высоту карточки. */
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
}
.promo-card-cta {
  display: flex; align-items: center; gap: 5px; margin-top: 12px;
  color: var(--gold); font-size: 0.82rem; font-weight: 700;
}
.promo-card:hover .promo-card-cta { color: var(--white); }
.promo-card .badge {
  align-self: flex-start; font-size: 0.68rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--ink); background: var(--gold); padding: 4px 11px; border-radius: 999px; margin-bottom: 10px; display: inline-block;
}

.gallery-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; }
@media (max-width: 900px) { .gallery-grid { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 600px) { .gallery-grid { grid-template-columns: repeat(2, 1fr); } }
.gallery-item { border-radius: 14px; overflow: hidden; aspect-ratio: 1/1; box-shadow: var(--shadow); min-width: 0; min-height: 0; }
.gallery-item img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.4s ease; }
.gallery-item video { width: 100%; height: 100%; object-fit: cover; display: block; background: #000; }
.gallery-item:hover img { transform: scale(1.06); }

/* Галерея на главной ("Наши работы") — была пробная masonry-раскладка
   (CSS columns, у карточек разная высота под свои пропорции), но ЖИВОЙ
   ОТКАЗ владельца: "должно быть всё в 1 уровень без ёлочек и вылезаний
   вниз" — то есть обычная ровная сетка одинаковых по размеру ячеек, как на
   странице /gallery (там таких жалоб не было). Возвращаем сюда ту же
   .gallery-grid (квадратные ячейки, .gallery-item aspect-ratio:1/1 общий
   стиль выше) без какого-либо модификатора — никакого крупного фото 2x2,
   никакого masonry, все ряды строго вровень. */

/* ЖИВАЯ ПРОСЬБА владельца: на телефоне меньше фото в этом блоке. Рендерим
   на бэкенде общий пул (см. server/routes/site.js — 8 штук, под 2 ровных
   ряда по 4 в десктопной сетке), а на узком экране просто прячем всё, что
   не входит в первые 4 (получаются те же 2 ряда, но по 2 в ряд — компактно,
   без длинной простыни фото на телефоне). */
@media (max-width: 600px) {
  #sec-gallery .gallery-grid .gallery-item:nth-child(n+5) { display: none; }
}

.master-card { text-align: center; }
.master-card img { width: 100%; aspect-ratio: 3/4; object-fit: cover; border-radius: var(--radius); margin-bottom: 14px; }

.review-card .stars { display: flex; gap: 2px; margin-bottom: 8px; }
.review-card .author { font-weight: 600; margin-top: 10px; }

/* ---- Бегущая лента отзывов ("как у Пилок") — вместо статичной сетки на
   главной. Список отзывов рендерится ДВАЖДЫ подряд (см. index.ejs), лента
   уезжает ровно на 50% своей ширины и уходит в бесшовный повтор. Наведение
   останавливает — читать удобнее, чем гнаться за текстом. */
/* -28px = отступ самого .reviews-framed (в котором лента лежит), чтобы
   карточки реально уезжали к его краям, а не обрезались раньше времени. */
.reviews-marquee { overflow: hidden; margin: 8px -28px 0; padding: 8px 0; }
.reviews-marquee-track { display: flex; gap: 20px; width: max-content; animation: reviews-marquee-scroll 34s linear infinite; padding: 0 28px; }
.reviews-marquee:hover .reviews-marquee-track { animation-play-state: paused; }
@keyframes reviews-marquee-scroll { from { transform: translateX(0); } to { transform: translateX(-50%); } }
.review-chip {
  flex: 0 0 320px; background: var(--white); border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--shadow); padding: 26px;
}
.review-chip p { margin: 0 0 10px; }
.review-chip .author { font-weight: 600; color: var(--ink); }
@media (max-width: 600px) { .review-chip { flex-basis: 270px; padding: 20px; } }
@media (prefers-reduced-motion: reduce) { .reviews-marquee-track { animation: none; } }

.post-card img { width: 100%; aspect-ratio: 16/10; object-fit: cover; border-radius: var(--radius); margin-bottom: 14px; }

/* ---- CTA band ---- */
.cta-band {
  background: linear-gradient(135deg, var(--ink) 0%, #423C34 100%);
  color: var(--white);
  border-radius: 28px;
  padding: 56px;
  text-align: center;
}
.cta-band h2 { color: var(--white); }
.cta-band p { color: rgba(255,255,255,0.75); margin: 0 auto 24px; max-width: 560px; }

/* ---- Loyalty highlight ---- */
.loyalty-box {
  display: grid; grid-template-columns: 1fr 1fr; gap: 40px; align-items: center;
  background: var(--white); border-radius: 28px; padding: 48px; box-shadow: var(--shadow);
}
@media (max-width: 860px) { .loyalty-box { grid-template-columns: 1fr; } }
.loyalty-perks { list-style: none; padding: 0; margin: 20px 0; }
.loyalty-perks li { padding: 10px 0 10px 30px; position: relative; color: var(--ink-soft); border-bottom: 1px dashed var(--line); }
.loyalty-perks li:before { content: "✦"; position: absolute; left: 0; color: var(--gold); }

/* Тёмный вариант блока клуба — больше контраста на главной ("гораздо
   сильнее и контрастнее", макет 2026-09). Тот же .loyalty-box, просто с
   модификатором — carточка на других страницах (если появится) останется
   светлой по умолчанию. */
.loyalty-box-dark { background: linear-gradient(135deg, var(--ink) 0%, #423C34 100%); }
.loyalty-box-dark h2, .loyalty-box-dark p, .loyalty-box-dark .eyebrow { color: var(--white); }
.loyalty-box-dark .eyebrow { color: var(--gold); }
.loyalty-box-dark p { color: rgba(255,255,255,0.78); }
.loyalty-box-dark .loyalty-perks li { color: rgba(255,255,255,0.82); border-bottom-color: rgba(255,255,255,0.15); }

/* ---- Map ---- */
.map-wrap { border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow); }
.map-wrap iframe { width: 100%; height: 420px; border: 0; display: block; }

/* ---- Footer ---- */
.site-footer { background: var(--ink); color: rgba(255,255,255,0.7); padding: 56px 0 28px; margin-top: 40px; }
.footer-grid { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: 32px; }
@media (max-width: 760px) { .footer-grid { grid-template-columns: 1fr 1fr; } }
.site-footer h4 { color: var(--white); font-size: 1rem; margin-bottom: 14px; }
.site-footer a { color: rgba(255,255,255,0.68); display: block; margin-bottom: 8px; font-size: 0.9rem; }
.site-footer a:hover { color: var(--gold); }
.footer-bottom { border-top: 1px solid rgba(255,255,255,0.12); margin-top: 40px; padding-top: 20px; font-size: 0.8rem; display: flex; justify-content: space-between; flex-wrap: wrap; gap: 10px; }
.social-row { display: flex; gap: 12px; }
.social-row a {
  width: 38px; height: 38px; border-radius: 50%;
  background: rgba(255,255,255,0.08);
  display: flex; align-items: center; justify-content: center;
  margin: 0;
}
.social-row a:hover { background: var(--gold); }

/* ---- Forms ---- */
.form-group { margin-bottom: 16px; }
.form-group label { display: block; font-size: 0.85rem; font-weight: 600; margin-bottom: 6px; color: var(--ink); }
.form-control {
  width: 100%; padding: 12px 16px; border-radius: 10px;
  border: 1px solid var(--line); background: var(--white);
  font-family: 'Montserrat', sans-serif; font-size: 0.95rem; color: var(--ink);
}
.form-control:focus { outline: none; border-color: var(--gold); }
textarea.form-control { resize: vertical; min-height: 120px; }
.form-hint { font-size: 0.78rem; color: var(--ink-soft); margin-top: 4px; }
.form-error { color: var(--error); font-size: 0.85rem; margin-top: 6px; }
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
@media (max-width: 560px) { .form-row { grid-template-columns: 1fr; } }

/* ---- Account / Points ---- */
/* ==================== Личный кабинет — премиальный hero ==================== */
.cabinet-hero {
  background: radial-gradient(circle at 15% 15%, rgba(212,175,120,0.18), transparent 55%), var(--ink);
  color: var(--white); border-radius: 28px; padding: 44px 40px; position: relative; overflow: hidden;
  box-shadow: 0 24px 60px rgba(46,43,40,0.22); border: 1px solid rgba(212,175,120,0.2);
}
.cabinet-hero-top { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 20px; }
.cabinet-hero-tier { display: flex; align-items: center; gap: 10px; font-size: 0.95rem; color: rgba(255,255,255,0.75); }
.cabinet-hero-tier b { color: var(--white); font-weight: 700; }
.cabinet-hero-points { text-align: center; margin: 28px 0 20px; }
.cabinet-hero-points .big-num { font-family: 'Montserrat', sans-serif; font-size: 3.6rem; font-weight: 700; line-height: 1; color: var(--gold); }
.cabinet-hero-points .lbl { color: rgba(255,255,255,0.6); font-size: 0.85rem; margin-top: 6px; letter-spacing: 0.03em; text-transform: uppercase; }
.cabinet-progress-track { background: rgba(255,255,255,0.12); border-radius: 999px; height: 8px; overflow: hidden; margin: 18px 0 10px; }
.cabinet-progress-fill { background: linear-gradient(90deg, var(--gold-dark), var(--gold)); height: 100%; border-radius: 999px; transition: width 0.6s ease; }
.cabinet-progress-label { font-size: 0.82rem; color: rgba(255,255,255,0.7); text-align: center; }
.cabinet-progress-label a { color: var(--gold); text-decoration: none; border-bottom: 1px dotted rgba(212,175,120,0.5); }

.cabinet-stats-strip { display: flex; justify-content: space-around; flex-wrap: wrap; margin-top: 28px; padding-top: 24px; border-top: 1px solid rgba(255,255,255,0.14); gap: 16px 24px; }
.cabinet-stat { text-align: center; }
.cabinet-stat .num { font-family: 'Montserrat', sans-serif; font-size: 1.5rem; font-weight: 700; color: var(--white); }
.cabinet-stat .lbl { font-size: 0.76rem; color: rgba(255,255,255,0.6); margin-top: 2px; }

.tabs { display: flex; gap: 6px; background: var(--cream-2); border-radius: 999px; padding: 5px; margin-bottom: 24px; flex-wrap: wrap; justify-content: center; }
.tabs-scroll-hint { display: none; } /* видна только на мобиле, где вкладки скроллятся — см. медиа-запрос ниже */
.tab-btn { padding: 10px 18px; background: none; border: none; cursor: pointer; font-family: 'Montserrat'; font-weight: 600; font-size: 0.88rem; color: var(--ink-soft); border-radius: 999px; transition: all 0.15s; }
.tab-btn.active { color: var(--white); background: var(--ink); }
/* История баллов — раньше плоские строки с одной линией снизу, ничем не
   выделялись на фоне остального премиального кабинета. Лёгкая карточная
   подложка + hover, зебра почти незаметна (просто чуть темнее cream на
   чётных), чтобы длинный список читался легче. */
.tx-row {
  display: flex; justify-content: space-between; align-items: center; padding: 13px 16px;
  border-radius: 12px; font-size: 0.9rem; transition: background 0.15s ease;
}
.tx-row:nth-child(even) { background: var(--cream); }
.tx-row:hover { background: var(--cream-2); }
.tx-amount.credit { color: var(--success); font-weight: 700; }
.tx-amount.debit { color: var(--error); font-weight: 700; }
.referral-box { background: var(--cream-2); border-radius: 14px; padding: 20px; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; box-shadow: inset 0 0 0 1px var(--line); }
.referral-code { font-family: 'Montserrat', sans-serif; font-size: 1.4rem; font-weight: 700; color: var(--gold-dark); letter-spacing: 0.05em; }

.tiers-toggle { text-align: center; margin-top: 8px; }
.tiers-toggle button { background: none; border: none; color: var(--ink-soft); font-size: 0.85rem; cursor: pointer; text-decoration: underline; text-underline-offset: 3px; }
.tiers-compare { display: none; margin-top: 16px; }
.tiers-compare.open { display: block; }

/* ---- Admin ----
   РЕДИЗАЙН (прямая просьба владельца: «админку редизайни чтоб было удобнее
   и интуитивнее»). Ключевые решения:
   1) Меню прилипло и скроллится отдельно от контента — в длинных таблицах
      больше не нужно листать страницу вверх, чтобы перейти в другой раздел.
   2) У пунктов появились иконки и поиск (см. partials/admin_sidebar.ejs):
      двадцать одинаковых строк текста глаз не различал.
   3) Шапка раздела стала липкой и с подписью — видно, где ты и что тут
      делают, даже когда страница пролистана вниз.
   4) Таблицы получили липкую шапку и подсветку строки под курсором —
      в списке клиентов на сотню строк это разница между «читаю» и «гадаю». */
.admin-shell { display: flex; min-height: 100vh; background: var(--cream); }

.admin-sidebar {
  width: 252px; flex-shrink: 0;
  background: var(--ink); color: rgba(255,255,255,0.85);
  padding: 20px 12px 14px;
  display: flex; flex-direction: column;
  position: sticky; top: 0; height: 100vh;
}
.admin-sidebar-top { flex-shrink: 0; }
.admin-sidebar .brand { color: var(--white); margin-bottom: 14px; padding: 0 6px; font-size: 1.15rem; display: flex; align-items: center; gap: 10px; }
.admin-sidebar .brand img { height: 32px; width: 32px; border-radius: 50%; object-fit: cover; }

/* Поиск по разделам — быстрее набрать «пром», чем вспоминать, в какой
   группе лежат промокоды. */
.admin-nav-search {
  display: flex; align-items: center; gap: 8px;
  background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.12);
  border-radius: 10px; padding: 8px 10px; margin-bottom: 14px;
  color: rgba(255,255,255,0.5);
}
.admin-nav-search input {
  flex: 1; min-width: 0; background: none; border: 0; outline: none;
  color: var(--white); font-family: inherit; font-size: 0.86rem;
}
.admin-nav-search input::placeholder { color: rgba(255,255,255,0.4); }
.admin-nav-search:focus-within { border-color: var(--gold); }

.admin-nav-scroll { flex: 1; overflow-y: auto; margin: 0 -4px; padding: 0 4px; scrollbar-width: thin; }
.admin-nav-scroll::-webkit-scrollbar { width: 6px; }
.admin-nav-scroll::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.15); border-radius: 3px; }
.admin-nav-empty { color: rgba(255,255,255,0.45); font-size: 0.84rem; padding: 10px 12px; }

.admin-sidebar a {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 10px; border-radius: 9px;
  color: rgba(255,255,255,0.75); font-size: 0.875rem; margin-bottom: 2px;
  transition: background 0.15s, color 0.15s;
}
.admin-sidebar a:hover { background: rgba(255,255,255,0.08); color: var(--white); }
.admin-sidebar a.active { background: var(--gold); color: var(--white); font-weight: 600; }
.admin-nav-icon { display: flex; flex-shrink: 0; opacity: 0.75; }
.admin-sidebar a.active .admin-nav-icon { opacity: 1; }
.admin-nav-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Счётчик «ждёт действия»: заявки на списание, фото и отзывы на проверке. */
.admin-nav-count {
  margin-left: auto; flex-shrink: 0;
  background: #B03A3A; color: #fff;
  font-size: 0.7rem; font-weight: 700;
  border-radius: 999px; padding: 1px 7px;
}
.admin-sidebar a.active .admin-nav-count { background: rgba(0,0,0,0.3); }
.admin-sidebar .badge { background: var(--gold); color: var(--white); font-size: 0.7rem; padding: 1px 7px; border-radius: 10px; margin-left: 6px; }

/* Группы пунктов меню — было 19 ссылок подряд одним списком (жалоба
   владельца: "в админке дохуя вкладок"), сгруппировали в 5 подписанных
   блоков. */
.admin-nav-group { margin-bottom: 14px; }
.admin-nav-group[hidden] { display: none; }
.admin-nav-group:last-of-type { margin-bottom: 0; }
.admin-nav-label {
  font-size: 0.66rem; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase;
  color: rgba(255,255,255,0.38); padding: 0 10px; margin-bottom: 5px;
}
.admin-sidebar-foot {
  flex-shrink: 0; margin-top: 10px; padding-top: 12px;
  border-top: 1px solid rgba(255,255,255,0.1);
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
}
.admin-nav-external {
  display: flex; align-items: center; gap: 7px;
  color: rgba(255,255,255,0.6); font-size: 0.84rem; padding: 6px 8px; border-radius: 8px;
}
.admin-nav-external:hover { color: var(--white); background: rgba(255,255,255,0.08); }
.admin-nav-logout {
  background: none; border: 1px solid rgba(255,255,255,0.22); border-radius: 8px;
  color: rgba(255,255,255,0.7); cursor: pointer; padding: 6px 12px; font-size: 0.84rem; font-family: inherit;
}
.admin-nav-logout:hover { border-color: #B03A3A; color: #fff; background: rgba(176,58,58,0.35); }

.admin-main { flex: 1; padding: 0 0 48px; max-width: 1280px; min-width: 0; }
.admin-main > *:not(.admin-topbar) { margin-left: 40px; margin-right: 40px; }

/* Шапка раздела — липкая: при длинном списке видно, где ты, и кнопки
   действия всегда под рукой. */
.admin-topbar {
  position: sticky; top: 0; z-index: 20;
  display: flex; justify-content: space-between; align-items: center;
  gap: 16px; flex-wrap: wrap;
  padding: 22px 40px;
  margin-bottom: 26px;
  background: rgba(250,246,236,0.94);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--line);
}
.admin-topbar h1 { margin: 0; font-size: 1.55rem; line-height: 1.2; }
.admin-topbar .admin-topbar-sub { font-size: 0.84rem; color: var(--ink-soft); margin-top: 3px; }

.admin-table { width: 100%; border-collapse: collapse; background: var(--white); border-radius: 14px; overflow: hidden; box-shadow: var(--shadow); }
.admin-table th, .admin-table td { padding: 12px 16px; text-align: left; border-bottom: 1px solid var(--line); font-size: 0.9rem; }
/* Липкую шапку таблицы пробовали — в связке border-collapse:collapse +
   overflow:hidden на самой таблице строка шапки уезжала в середину списка.
   Оставляем обычную: подсветки строки под курсором для читаемости хватает. */
.admin-table th { background: var(--cream-2); font-weight: 600; color: var(--ink); }
.admin-table tbody tr { transition: background 0.12s; }
.admin-table tbody tr:hover { background: var(--cream); }
.admin-table tr:last-child td { border-bottom: none; }
.admin-table a.row-link { color: var(--ink); font-weight: 600; }
.admin-table a.row-link:hover { color: var(--gold-dark); }

.stat-cards { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 30px; }
@media (max-width: 900px) { .stat-cards { grid-template-columns: repeat(2, 1fr); } }
.stat-card {
  background: var(--white); border: 1px solid var(--line); border-radius: 14px;
  padding: 20px; box-shadow: var(--shadow);
  transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease;
}
a.stat-card { text-decoration: none; color: inherit; display: block; }
a.stat-card:hover { transform: translateY(-3px); border-color: var(--gold); box-shadow: 0 14px 34px rgba(46,43,40,0.12); }
.stat-card .num { font-family: 'Montserrat', sans-serif; font-size: 1.9rem; font-weight: 700; color: var(--gold-dark); line-height: 1.1; }
.stat-card .lbl { font-size: 0.82rem; color: var(--ink-soft); margin-top: 4px; }
.stat-card-head { display: flex; align-items: center; gap: 8px; color: var(--gold-dark); margin-bottom: 10px; }
.stat-card-head span { font-size: 0.72rem; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-soft); }

/* Блок «требует внимания» на дашборде: сводка того, что ждёт действия, —
   раньше это было видно только по бейджам в меню. */
.admin-attention { display: grid; gap: 10px; margin-bottom: 30px; }
.admin-attention-item {
  display: flex; align-items: center; gap: 12px;
  background: var(--white); border: 1px solid var(--line); border-left: 4px solid var(--gold);
  border-radius: 12px; padding: 14px 16px; text-decoration: none; color: inherit;
  box-shadow: var(--shadow); transition: transform 0.15s ease, border-color 0.15s ease;
}
.admin-attention-item:hover { transform: translateX(3px); border-left-color: var(--gold-dark); }
.admin-attention-item .t { display: block; font-weight: 600; font-size: 0.94rem; }
.admin-attention-item .d { display: block; font-size: 0.82rem; color: var(--ink-soft); margin-top: 2px; }
.admin-attention-item .n {
  margin-left: auto; flex-shrink: 0;
  background: #B03A3A; color: #fff; font-weight: 700; font-size: 0.82rem;
  border-radius: 999px; padding: 3px 11px;
}
.admin-attention-icon {
  width: 38px; height: 38px; border-radius: 10px; flex-shrink: 0;
  background: var(--cream-2); color: var(--gold-dark);
  display: flex; align-items: center; justify-content: center;
}
.admin-attention-empty {
  background: var(--white); border: 1px solid var(--line); border-radius: 12px;
  padding: 18px; color: var(--ink-soft); font-size: 0.9rem; box-shadow: var(--shadow);
  display: flex; align-items: center; gap: 10px;
}
.admin-attention-empty svg { color: #2E6B39; flex-shrink: 0; }

.pill { display: inline-block; padding: 3px 10px; border-radius: 999px; font-size: 0.75rem; font-weight: 600; }
.pill-pending { background: #FBEBD6; color: #92601C; }
.pill-applied { background: #DFF0E1; color: #2E6B39; }
.admin-search { max-width: 340px; }
.settings-section { background: var(--white); border-radius: 14px; padding: 28px; box-shadow: var(--shadow); margin-bottom: 24px; }
.settings-section h3 { margin-bottom: 4px; }
.settings-section .form-hint { margin-bottom: 18px; }
.flash-success { background: #DFF0E1; color: #2E6B39; padding: 12px 18px; border-radius: 10px; margin-bottom: 20px; font-size: 0.9rem; }
.inline-form { display: flex; gap: 10px; align-items: flex-end; flex-wrap: wrap; }

@media (max-width: 860px) {
  .admin-shell { flex-direction: column; }
  /* На телефоне меню — горизонтальная лента вкладок сверху: боковая колонка
     съела бы весь экран. */
  .admin-sidebar {
    width: 100%; height: auto; position: sticky; top: 0; z-index: 30;
    padding: 8px 10px;
    flex-direction: column;
  }
  .admin-sidebar .brand { display: none; }
  .admin-nav-search { margin-bottom: 8px; }
  .admin-nav-scroll { display: flex; gap: 4px; overflow-x: auto; overflow-y: hidden; }
  .admin-nav-group { display: flex; gap: 4px; margin-bottom: 0; }
  .admin-nav-label { display: none; }
  .admin-sidebar a { white-space: nowrap; margin-bottom: 0; }
  .admin-sidebar-foot { margin-top: 8px; padding-top: 8px; }
  .admin-main { padding: 0 0 32px; }
  .admin-main > *:not(.admin-topbar) { margin-left: 16px; margin-right: 16px; }
  .admin-topbar { padding: 16px; margin-bottom: 18px; position: static; }
  .admin-topbar h1 { font-size: 1.3rem; }
}

/* ==================== ОБЩИЙ МОБИЛЬНЫЙ ПРОХОД ==================== */
@media (max-width: 640px) {
  .container { padding: 0 16px; }
  .section { padding: 48px 0; }
  .section-tight { padding: 32px 0; }
  h1 { font-size: clamp(1.7rem, 8vw, 2.2rem); }
  h2 { font-size: clamp(1.35rem, 6vw, 1.7rem); }
  .lead { font-size: 1rem; }

  /* Мобильный hero — сильно урезан по прямой просьбе владельца ("на
     телефоне не оч нравится что много текста... прям не хватает чего то и
     выглядит налепленно"): короткий заголовок + 1 кнопка, дальше сразу
     карусели. Лид-текст, вторая кнопка, телефон/соцсети, счётчики и
     плавающий бейдж скидки — прячем (.hero-mobile-hide, см. index.ejs),
     чтобы между заголовком и первой карточкой карусели почти не было
     лишнего текста. На десктопе (.hero без max-width:640px) всё это видно.
     ВТОРОЙ ЗАХОД (живая жалоба владельца — "фотка мелкая и несуразно, не
     цепляет со старта"): изначальный диагональный градиент оверлея (.hero-overlay,
     100deg) рассчитан на широкий десктопный hero, где текст слева, а фото
     уходит вправо — на узком мобильном экране почти вся ширина попадает в
     самую тёмную часть градиента, и от фото остаётся только тёмная полоска
     у края. Решение: на мобиле фото — это и есть "крючок", поэтому hero
     стал заметно выше (реальная витрина фото), текст прижат к низу поверх
     вертикального градиента (тёмный только у самого низа, где текст), а
     верх фото остаётся ясным и читаемым. */
  .hero { padding: 0; min-height: 58vh; align-items: flex-end; }
  .hero-overlay { background: linear-gradient(180deg, rgba(20,18,15,0.05) 0%, rgba(20,18,15,0.08) 45%, rgba(20,18,15,0.62) 75%, rgba(20,18,15,0.9) 100%); }
  .hero-content { padding-bottom: 28px; }
  .hero h1 { font-size: clamp(1.5rem, 6.5vw, 1.9rem); }
  .hero-mobile-hide { display: none !important; }
  .hero-grid > .hero-photo-wrap { order: -1; margin-bottom: 24px; } /* картинка сразу цепляет взгляд, текст идёт следом (about.ejs) */
  .hero-photo-wrap { aspect-ratio: 16/9; border-radius: 16px; }
  .hero-badge { padding: 10px 14px; bottom: 12px; left: 12px; }
  .hero-badge .num { font-size: 1.2rem; }
  .hero-cta-row { margin-top: 18px; }
  .hero-cta-row .btn { flex: 1 1 auto; text-align: center; }
  .promo-card, .popular-card { flex-basis: 260px; }
  .stats-strip { gap: 24px; }
  .stat .num { font-size: 1.5rem; }

  .card { padding: 20px; }
  .cta-band { padding: 32px 20px; border-radius: 20px; }
  .loyalty-box { padding: 28px 20px; border-radius: 20px; }

  .cabinet-hero { padding: 28px 20px; border-radius: 20px; }
  .cabinet-hero-points .big-num { font-size: 2.6rem; }
  .cabinet-stats-strip { gap: 14px 18px; }
  .cabinet-stat .num { font-size: 1.2rem; }
  .tabs { gap: 2px; overflow-x: auto; flex-wrap: nowrap; -webkit-overflow-scrolling: touch; position: relative; }
  .tab-btn { flex-shrink: 0; padding: 10px 14px; font-size: 0.85rem; }
  .tabs-scroll-hint {
    position: absolute; right: 2px; top: 50%; transform: translateY(-50%);
    width: 22px; height: 22px; border-radius: 50%; background: var(--ink); color: var(--white);
    display: flex; align-items: center; justify-content: center; font-size: 0.8rem;
    pointer-events: none; animation: tabs-hint-bounce 1.4s ease-in-out infinite;
  }
  @keyframes tabs-hint-bounce { 0%, 100% { transform: translateY(-50%) translateX(0); } 50% { transform: translateY(-50%) translateX(4px); } }

  .footer-grid { grid-template-columns: 1fr; gap: 24px; }
  .footer-bottom { flex-direction: column; align-items: flex-start; gap: 6px; }

  /* Таблицы шире экрана — даём горизонтальный скролл, а не ломаем макет */
  .admin-table { display: block; overflow-x: auto; white-space: nowrap; }
  .admin-table thead, .admin-table tbody, .admin-table tr { display: table; width: 100%; table-layout: fixed; }

  .stat-cards { grid-template-columns: 1fr 1fr; gap: 12px; }
  .stat-card { padding: 16px; }
  .stat-card .num { font-size: 1.5rem; }

  .map-wrap iframe { height: 300px; }
  .referral-box { flex-direction: column; align-items: flex-start; }
}

/* ==================== Иконки соцсетей (реальные логотипы вместо эмодзи) ==================== */
.social-icons-row { display: flex; gap: 16px; align-items: center; flex-wrap: wrap; }
.social-icon-link {
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--ink-soft); transition: color 0.15s, transform 0.15s;
}
.social-icon-link:hover { color: var(--gold-dark); transform: translateY(-2px); }
/* .hero-phone-link теперь определён один раз, у самого .hero (тёмный hero,
   белый текст) — старое дублирующее правило с color:var(--ink) отсюда
   убрано, оно перебивало белый цвет из-за порядка в файле. */

/* ==================== Кнопки блока лояльности — не липнут друг к другу ==================== */
.loyalty-cta-row { display: flex; gap: 14px; flex-wrap: wrap; margin-top: 24px; }

/* ==================== Рамка вокруг отзывов и карты ==================== */
.reviews-framed {
  margin-top: 32px; padding: 28px;
}
.map-wrap { }

/* ==================== Карточки записи одинаковой высоты ==================== */
.booking-cards { align-items: stretch; }
.booking-cards .card { height: 100%; }

/* ==================== Окно записи /booking — оформленная карточка сайта ====
   Живая жалоба владельца: "окно записи на сайте некрасиво... не хочется
   записываться". Сам визард (bw-*, partials/booking_wizard, общий с
   мини-аппами) не трогаем внутри — оборачиваем крупной карточкой сайта с
   полосой шагов сверху, плюс на широких экранах (>700px, там где раньше был
   просто узкий мобильный виджет посреди страницы) чуть увеличиваем шрифты и
   отступы у элементов визарда — на телефоне (миниаппы, узкий /booking)
   ничего не меняется, там уже всё компактно и ок. */
.site-booking-shell {
  background: var(--white); border-radius: 24px; box-shadow: 0 20px 50px rgba(46,43,40,0.1);
  padding: 32px; border: 1px solid var(--line);
}
.site-booking-steps {
  display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 28px; padding-bottom: 20px;
  border-bottom: 1px solid var(--line);
}
.site-booking-step {
  font-size: 0.78rem; font-weight: 700; letter-spacing: 0.01em; color: var(--ink-soft);
  background: var(--cream-2); padding: 7px 14px; border-radius: 999px; transition: all 0.2s ease;
}
.site-booking-step.is-done { background: var(--cream); color: var(--gold-dark); }
.site-booking-step.is-active { background: var(--gold); color: var(--white); box-shadow: 0 4px 12px rgba(184,152,95,0.35); }
@media (max-width: 640px) {
  .site-booking-shell { padding: 20px 16px; border-radius: 18px; }
  .site-booking-steps { gap: 6px; margin-bottom: 20px; padding-bottom: 16px; }
  .site-booking-step { font-size: 0.7rem; padding: 6px 10px; }
}
@media (min-width: 700px) {
  .site-booking-shell .bw-list-btn,
  .site-booking-shell .bw-master-btn { padding: 16px 20px; }
  .site-booking-shell .bw-list-btn .name,
  .site-booking-shell .bw-master-btn .name { font-size: 1rem; }
  .site-booking-shell .bw-list-btn:hover,
  .site-booking-shell .bw-master-btn:hover { border-color: var(--gold); box-shadow: 0 10px 24px rgba(46,43,40,0.1); transform: translateY(-2px); }
  .site-booking-shell .bw-chip-grid { grid-template-columns: repeat(3, 1fr); gap: 10px; }
  .site-booking-shell .bw-chip { padding: 14px 10px; font-size: 0.92rem; }
  .site-booking-shell .bw-chip:hover { border-color: var(--gold); transform: translateY(-2px); }
  .site-booking-shell h2 { font-size: 1.4rem; }
}

@media (max-width: 640px) {
  .reviews-framed { padding: 18px; margin-top: 24px; }
  .reviews-marquee { margin: 8px -18px 0; }
  .reviews-marquee-track { padding: 0 18px; }
  .loyalty-cta-row .btn { flex: 1 1 auto; text-align: center; }
  .social-icons-row { gap: 14px; }
}

/* ==================== Приложение мастера: недельный календарь ====================
   Используется и в "Мой график" (просто показать рабочие дни), и в
   "Перезаписать клиента" (выбор даты) — см. public/js/master.js, buildWeekCalendar().
   Переключатель "старый вид / новый вид" запоминается в localStorage браузера
   мастера (не в общей базе — это чисто личная настройка отображения). */
.week-cal { margin-bottom: 10px; }
.week-cal-nav { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; gap: 10px; }
.week-cal-nav-label { font-weight: 600; color: var(--ink); font-size: 0.92rem; }
.week-cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; }
.week-cal-day {
  border: 1px solid var(--line); border-radius: 10px; padding: 8px 4px; text-align: center;
  cursor: pointer; background: var(--white); transition: all 0.15s ease; line-height: 1.3;
}
.week-cal-day .week-cal-weekday { display: block; font-size: 0.72rem; color: var(--ink-soft); text-transform: uppercase; }
.week-cal-day .week-cal-num { display: block; font-size: 1.05rem; font-weight: 600; color: var(--ink); }
.week-cal-day.is-available { border-color: var(--gold); background: var(--cream-2); }
.week-cal-day.is-unavailable { opacity: 0.55; }
.week-cal-day.is-past { opacity: 0.3; cursor: default; pointer-events: none; }
.week-cal-day:hover:not(.is-past) { border-color: var(--gold-dark); }
.week-cal-day.is-selected { background: var(--ink); border-color: var(--ink); }
.week-cal-day.is-selected .week-cal-weekday,
.week-cal-day.is-selected .week-cal-num { color: var(--white); }
.view-toggle-row { display: flex; gap: 8px; align-items: center; margin-bottom: 12px; }
.view-toggle-row .form-hint { margin: 0; }
@media (max-width: 640px) {
  .week-cal-grid { gap: 4px; }
  .week-cal-day { padding: 6px 2px; }
  .week-cal-day .week-cal-num { font-size: 0.92rem; }
}

/* ==== Частые вопросы (/faq и раздел в ботах — см. server/services/faq.js).
   Обычный <details>/<summary>: раскрывается без единой строчки JS, работает
   даже если скрипты не загрузились, и доступно с клавиатуры. ==== */
.faq-list { display: flex; flex-direction: column; gap: 12px; }
.faq-item {
  background: var(--white);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  overflow: hidden;
}
.faq-item summary {
  list-style: none;
  cursor: pointer;
  padding: 18px 52px 18px 20px;
  font-family: 'Montserrat', sans-serif;
  font-weight: 600;
  font-size: 1rem;
  color: var(--ink);
  position: relative;
  transition: background 0.15s ease;
}
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary:hover { background: var(--cream); }
/* Плюс/минус справа — рисуем псевдоэлементом, без иконок и картинок. */
.faq-item summary::after {
  content: "+";
  position: absolute;
  right: 20px; top: 50%;
  transform: translateY(-50%);
  font-size: 1.4rem;
  font-weight: 400;
  color: var(--gold-dark);
  line-height: 1;
  transition: transform 0.2s ease;
}
.faq-item[open] summary::after { content: "−"; }
.faq-item[open] summary { background: var(--cream); }
.faq-answer {
  padding: 0 20px 20px;
  color: var(--ink-soft);
  line-height: 1.6;
  white-space: pre-line; /* переносы строк из админки сохраняются как есть */
}
@media (max-width: 600px) {
  .faq-item summary { padding: 16px 44px 16px 16px; font-size: 0.95rem; }
  .faq-answer { padding: 0 16px 16px; font-size: 0.92rem; }
}

/* ==== Обязательная пометка про Instagram/Meta (просьба владельца "для
   безопасности": Meta признана экстремистской организацией, её деятельность
   в РФ запрещена — при упоминании требуется соответствующая сноска). ====
   Звёздочка рисуется псевдоэлементом прямо у иконки — не трогая сам SVG и не
   ломая выравнивание ряда соцсетей. */
.social-icon-marked { position: relative; }
.social-icon-marked::after {
  content: "*";
  position: absolute;
  top: -4px; right: -6px;
  font-size: 0.95em;
  line-height: 1;
  font-weight: 700;
  pointer-events: none; /* звёздочка не должна перехватывать клик по ссылке */
}

/* Сноска в подвале — на каждой странице сайта. Намеренно неяркая: это
   юридическая пометка, а не часть контента, но читаемая (не 8px серым по
   серому, иначе теряется смысл). */
.footer-legal {
  margin-top: 22px;
  padding-top: 16px;
  border-top: 1px solid rgba(255,255,255,0.1);
  font-size: 0.76rem;
  line-height: 1.5;
  color: rgba(255,255,255,0.5);
}

/* ==================================================================
   РЕДИЗАЙН ВНУТРЕННИХ СТРАНИЦ (прямая просьба владельца: «всё в стиле
   как главный экран», «навигацию интуитивнее и красивее»)
   ================================================================== */

/* ---- Шапка внутренней страницы (views/partials/page_hero.ejs) ----
   Тот же приём, что у hero на главной: фото + тёмный градиент + текст.
   Ниже по высоте — внутренняя страница должна сразу показать содержимое,
   а не заставлять скроллить мимо картинки. */
.page-hero {
  position: relative;
  overflow: hidden;
  padding: 92px 0 64px;
  margin-bottom: 0;
  background: var(--ink);
}
.page-hero-bg {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  z-index: 0;
}
.page-hero-overlay {
  position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(105deg, rgba(20,18,15,0.95) 0%, rgba(20,18,15,0.86) 40%, rgba(20,18,15,0.55) 75%, rgba(20,18,15,0.3) 100%);
}
.page-hero-content { position: relative; z-index: 2; max-width: 680px; }
.page-hero-content .eyebrow { color: var(--cream); text-shadow: 0 1px 4px rgba(20,18,15,0.55); }
.page-hero-content h1 { color: var(--white); margin-bottom: 14px; }
.page-hero-content .lead { color: rgba(255,255,255,0.82); margin-bottom: 0; }
.page-hero-actions { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 26px; }

@media (max-width: 600px) {
  .page-hero { padding: 56px 0 44px; }
  .page-hero-content .lead { font-size: 1rem; }
}

/* ---- Липкая полоса разделов внутри страницы ----
   Повторяет .section-scrollnav с главной, но для внутренних страниц: на
   длинном прайсе человек сразу видит, какие есть категории, и прыгает в
   нужную, а не листает всё подряд. Подсветка активного пункта — в
   public/js/site-animations.js (тот же наблюдатель, что и на главной). */
.page-subnav-wrap {
  position: sticky; top: var(--sticky-top); z-index: 40;
  background: rgba(250,246,236,0.96);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--line);
}
.page-subnav {
  display: flex; gap: 6px; overflow-x: auto; -webkit-overflow-scrolling: touch;
  padding: 12px 24px; max-width: 1140px; margin: 0 auto; scrollbar-width: none;
}
.page-subnav::-webkit-scrollbar { display: none; }
.page-subnav a {
  flex-shrink: 0; padding: 8px 16px; border-radius: 999px;
  font-size: 0.86rem; font-weight: 600; color: var(--ink-soft);
  white-space: nowrap; transition: all 0.2s ease;
}
.page-subnav a:hover { color: var(--ink); background: var(--cream-2); }
.page-subnav a.active { color: var(--white); background: var(--gold); }

/* ---- Карточка услуги ----
   Раньше это была обычная .card: цена терялась в тексте, а то, что карточка
   кликабельная и ведёт к записи, никак не читалось. Теперь цена — крупный
   акцент справа, при наведении карточка приподнимается и показывает
   «Записаться» со стрелкой. */
.service-tile {
  display: flex; align-items: flex-start; justify-content: space-between; gap: 16px;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 20px 22px; text-decoration: none; color: inherit;
  box-shadow: var(--shadow);
  transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}
.service-tile:hover {
  transform: translateY(-3px);
  border-color: var(--gold);
  box-shadow: 0 16px 40px rgba(46,43,40,0.13);
}
.service-tile-main { min-width: 0; }
.service-tile h3 { font-size: 1.05rem; margin: 0 0 4px; line-height: 1.3; overflow-wrap: anywhere; }
.service-tile .service-desc { overflow-wrap: anywhere; }
.service-tile .service-meta { font-size: 0.82rem; color: var(--ink-soft); margin: 0; }
.service-tile .service-desc { font-size: 0.84rem; color: var(--ink-soft); margin: 8px 0 0; line-height: 1.45; }
/* ---- Разбивка цены по мастерам («у кого сколько») ----
   Прямая просьба владельца: должна быть ХОРОШО ВИДНА, а не мелкой серой строкой — поэтому не просто
   приглушённый текст, а золотистые бейджи-«таблетки» с именем и ценой каждого мастера, во всю ширину
   карточки (узкая колонка с ценой не вместила бы 3+ имени в одну строку). */
.service-price-breakdown { margin: 10px 0 0; display: flex; flex-wrap: wrap; gap: 6px 8px; }
.price-breakdown-item {
  display: inline-block; padding: 3px 10px; border-radius: 999px; font-size: 0.8rem; font-weight: 600;
  color: var(--gold-dark); background: rgba(184, 152, 95, 0.14); border: 1px solid rgba(184, 152, 95, 0.35);
  white-space: nowrap;
}
.service-tile-side { text-align: right; flex-shrink: 0; }
.service-tile-price {
  font-family: 'Montserrat', sans-serif; font-weight: 700;
  font-size: 1.15rem; color: var(--gold-dark); white-space: nowrap;
}
.service-tile-go {
  display: inline-flex; align-items: center; gap: 5px;
  margin-top: 8px; font-size: 0.78rem; font-weight: 600;
  color: var(--ink-soft); opacity: 0; transform: translateX(-4px);
  transition: opacity 0.2s ease, transform 0.2s ease;
}
.service-tile:hover .service-tile-go { opacity: 1; transform: translateX(0); color: var(--gold-dark); }
/* На телефоне наведения нет — подсказку показываем всегда, но приглушённой. */
@media (hover: none) {
  .service-tile-go { opacity: 0.7; transform: none; }
}
@media (max-width: 480px) {
  .service-tile { padding: 16px; gap: 12px; }
  .service-tile h3 { font-size: 0.98rem; }
  .service-tile-price { font-size: 1.05rem; }
}
/* Узкие экраны (320–400px): справа от названия остаётся ~100px, а там ещё цена и
   «Записаться» — название превращалось в столбик из 2–3 букв. Ставим цену под название. */
@media (max-width: 400px) {
  .service-tile { flex-direction: column; gap: 10px; }
  .service-tile-side { display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; text-align: left; }
  .service-tile-go { margin-top: 0; }
}

.service-group-head {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 16px; margin-top: 52px; margin-bottom: 18px;
}
.service-group-head h2 { margin: 0; }
.service-group-count { font-size: 0.82rem; color: var(--ink-soft); white-space: nowrap; }

/* ---- Нижняя панель навигации на телефоне (views/partials/mobile_nav.ejs) ---- */
.mobile-nav { display: none; }

@media (max-width: 860px) {
  .mobile-nav {
    display: flex;
    position: fixed; bottom: 0; left: 0; right: 0; z-index: 60;
    background: rgba(255,255,255,0.97);
    backdrop-filter: blur(12px);
    border-top: 1px solid var(--line);
    box-shadow: 0 -6px 24px rgba(46,43,40,0.1);
    padding-bottom: env(safe-area-inset-bottom, 0);
  }
  .mobile-nav-item {
    flex: 1; display: flex; flex-direction: column; align-items: center; gap: 3px;
    padding: 9px 2px 7px; text-decoration: none;
    color: var(--ink-soft); font-size: 0.66rem; font-weight: 600;
    font-family: 'Montserrat', sans-serif;
    transition: color 0.15s ease;
    min-width: 0;
  }
  .mobile-nav-icon {
    display: flex; align-items: center; justify-content: center; line-height: 1;
    width: 40px; height: 30px; border-radius: 11px;
    transition: background 0.15s ease, transform 0.15s ease;
  }
  .mobile-nav-item.is-active { color: var(--gold-dark); }
  .mobile-nav-item.is-active .mobile-nav-icon { background: var(--cream-2); }
  .mobile-nav-item:active .mobile-nav-icon { transform: scale(0.9); }
  .mobile-nav-label { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }

  /* Запись — главное действие, поэтому золотая и приподнята над панелью. */
  .mobile-nav-cta { color: var(--gold-dark); }
  .mobile-nav-cta .mobile-nav-icon {
    background: var(--gold); color: var(--white);
    width: 46px; height: 36px; border-radius: 13px;
    box-shadow: 0 6px 16px rgba(184,152,95,0.45);
  }
  .mobile-nav-cta.is-active .mobile-nav-icon { background: var(--gold-dark); }

  /* Место под панель, чтобы она не перекрывала последний блок страницы. */
  body.site-page, body.has-mobile-nav { padding-bottom: 68px; }
}

/* ---- Плитка галереи ----
   Раньше фото были просто квадратами в сетке. Теперь при наведении фото
   немного приближается и появляется подсказка «Записаться на такой же» —
   галерея перестаёт быть просто картинками и начинает вести к записи. */
.photo-tile {
  position: relative; display: block; overflow: hidden;
  border-radius: var(--radius); background: var(--cream-2);
  aspect-ratio: 1/1; box-shadow: var(--shadow);
}
.photo-tile img, .photo-tile video {
  width: 100%; height: 100%; object-fit: cover; display: block;
  transition: transform 0.5s cubic-bezier(0.2, 0.8, 0.2, 1);
}
.photo-tile:hover img { transform: scale(1.07); }
.photo-tile-caption {
  position: absolute; left: 0; right: 0; bottom: 0;
  padding: 26px 14px 12px;
  background: linear-gradient(transparent, rgba(20,18,15,0.82));
  color: #fff; font-size: 0.82rem; line-height: 1.35;
  pointer-events: none;
}
.photo-tile-hint {
  position: absolute; inset: 0; z-index: 2;
  display: flex; align-items: center; justify-content: center;
  background: rgba(20,18,15,0.45); opacity: 0;
  transition: opacity 0.25s ease;
  color: #fff; font-weight: 600; font-size: 0.86rem;
  font-family: 'Montserrat', sans-serif;
}
.photo-tile:hover .photo-tile-hint { opacity: 1; }
@media (hover: none) { .photo-tile-hint { display: none; } }

/* ---- Карточка мастера ----
   Фото во всю ширину карточки вместо круглой аватарки: лицо мастера —
   самое убедительное, что есть на этой странице, и оно должно быть крупным. */
.master-tile {
  display: flex; flex-direction: column;
  background: var(--white); border: 1px solid var(--line);
  border-radius: var(--radius); overflow: hidden;
  box-shadow: var(--shadow); text-decoration: none; color: inherit;
  transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease;
}
.master-tile:hover { transform: translateY(-4px); border-color: var(--gold); box-shadow: 0 18px 44px rgba(46,43,40,0.14); }
.master-tile-photo { position: relative; aspect-ratio: 4/5; background: var(--cream-2); overflow: hidden; }
.master-tile-photo img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform 0.5s cubic-bezier(0.2,0.8,0.2,1); }
.master-tile:hover .master-tile-photo img { transform: scale(1.05); }
/* Пока фото мастера не загружено — показываем логотип целиком, а не
   обрезанный по центру кусок (object-fit: cover на логотипе выглядит браком). */
.master-tile-photo.is-placeholder { background: var(--cream-2); }
.master-tile-photo.is-placeholder img { object-fit: contain; padding: 18%; }
.master-tile:hover .master-tile-photo.is-placeholder img { transform: none; }
.master-tile-role {
  position: absolute; left: 12px; bottom: 12px;
  background: rgba(20,18,15,0.72); backdrop-filter: blur(6px);
  color: #fff; font-size: 0.72rem; font-weight: 600; letter-spacing: 0.04em;
  text-transform: uppercase; padding: 6px 12px; border-radius: 999px;
  font-family: 'Montserrat', sans-serif;
}
.master-tile-body { padding: 18px 20px 20px; display: flex; flex-direction: column; gap: 8px; flex: 1; }
.master-tile-body h3 { margin: 0; font-size: 1.1rem; }
.master-tile-body p { margin: 0; font-size: 0.88rem; color: var(--ink-soft); line-height: 1.5; }
.master-tile-foot { margin-top: auto; padding-top: 12px; display: flex; align-items: center; gap: 6px; font-size: 0.8rem; color: var(--gold-dark); font-weight: 600; }

/* ---- Карточка отзыва ---- */
.review-tile {
  position: relative; background: var(--white);
  border: 1px solid var(--line); border-radius: var(--radius);
  padding: 26px 24px 22px; box-shadow: var(--shadow);
  display: flex; flex-direction: column; gap: 12px;
  transition: transform 0.25s ease, box-shadow 0.25s ease;
}
.review-tile:hover { transform: translateY(-3px); box-shadow: 0 16px 40px rgba(46,43,40,0.12); }
.review-tile::before {
  content: "”"; position: absolute; top: -6px; right: 18px;
  font-family: 'Playfair Display', serif; font-size: 5rem; line-height: 1;
  color: var(--gold); opacity: 0.18; pointer-events: none;
}
.review-tile .stars { display: flex; gap: 3px; }
.review-tile-text { margin: 0; font-size: 0.93rem; line-height: 1.6; color: var(--ink); }
.review-tile-author { margin-top: auto; font-weight: 600; font-family: 'Montserrat', sans-serif; font-size: 0.86rem; color: var(--ink); }

/* ---- Карточка поста блога ----
   Прямая просьба владельца: посты "выглядят как просто кнопки" — без обложки (а свежие посты
   почти всегда без фото) карточка была просто мелким текстом. Плюс самый свежий пост теперь
   отдельным крупным блоком сверху ("featured") — сразу видно, что это важно, а не рядовая кнопка. */
.post-tile {
  display: flex; flex-direction: column; overflow: hidden;
  background: var(--white); border: 1px solid var(--line);
  border-radius: var(--radius); box-shadow: var(--shadow);
  text-decoration: none; color: inherit;
  transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease;
}
.post-tile:hover { transform: translateY(-6px); border-color: var(--gold); box-shadow: 0 20px 48px rgba(46,43,40,0.16); }
.post-tile-cover { aspect-ratio: 16/10; background: var(--cream-2); overflow: hidden; }
.post-tile-cover img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform 0.5s cubic-bezier(0.2,0.8,0.2,1); }
.post-tile:hover .post-tile-cover img { transform: scale(1.05); }
.post-tile-body { padding: 24px 26px 26px; display: flex; flex-direction: column; gap: 10px; flex: 1; }
.post-tile-body h3 { margin: 0; font-size: 1.32rem; font-weight: 750; line-height: 1.3; }
.post-tile-body p { margin: 0; font-size: 0.93rem; color: var(--ink-soft); line-height: 1.6; }
.post-tile-more { margin-top: auto; padding-top: 12px; display: flex; align-items: center; gap: 6px; font-size: 0.85rem; font-weight: 700; color: var(--gold-dark); }

/* Заглушка обложки, когда фото не загружено — тот же тёмный градиент, что и у карточек "Акции",
   плюс крупная буква первого слова названия водяным знаком: пусто без фото не выглядит. */
.post-cover-fallback {
  background: linear-gradient(135deg, var(--ink) 0%, #423C34 100%);
  display: flex; align-items: center; justify-content: center;
}
.post-cover-letter { font-family: 'Montserrat', sans-serif; font-weight: 800; color: rgba(255,255,255,0.16); font-size: 4.6rem; line-height: 1; }

/* Самый свежий пост — крупный блок на всю ширину над обычной сеткой. */
.post-featured {
  display: flex; text-decoration: none; color: inherit; overflow: hidden;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--shadow); margin-bottom: 32px;
  transition: transform 0.3s ease, box-shadow 0.3s ease, border-color 0.3s ease;
}
.post-featured:hover { transform: translateY(-5px); border-color: var(--gold); box-shadow: 0 24px 56px rgba(46,43,40,0.18); }
.post-featured-cover { flex: 0 0 44%; position: relative; overflow: hidden; }
.post-featured-cover img { width: 100%; height: 100%; object-fit: cover; display: block; }
.post-featured-cover .post-cover-letter { font-size: 7rem; }
.post-featured-body { flex: 1; min-width: 0; padding: 38px 42px; display: flex; flex-direction: column; gap: 12px; justify-content: center; }
.post-featured-body .badge {
  align-self: flex-start; font-size: 0.7rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--ink); background: var(--gold); padding: 4px 12px; border-radius: 999px;
}
.post-featured-body h2 { margin: 0; font-size: 1.9rem; line-height: 1.25; }
.post-featured-body p { margin: 0; font-size: 1.02rem; color: var(--ink-soft); line-height: 1.65; }
.post-featured-body .post-tile-more { font-size: 0.9rem; padding-top: 4px; }
@media (max-width: 780px) {
  .post-featured { flex-direction: column; }
  .post-featured-cover { flex: none; aspect-ratio: 16/9; }
  .post-featured-cover .post-cover-letter { font-size: 5rem; }
  .post-featured-body { padding: 24px 22px 26px; }
  .post-featured-body h2 { font-size: 1.5rem; }
}

/* ---- Шаги маршрута (/how-to-find) ----
   Текст маршрута раньше был одним абзацем: человек с телефоном в руке у
   метро не может держать в голове пять поворотов. Теперь — пронумерованные
   шаги, которые видно по одному. */
.route-steps { display: flex; flex-direction: column; gap: 0; margin: 0; padding: 0; list-style: none; counter-reset: routestep; }
.route-step {
  position: relative; display: flex; gap: 16px; align-items: flex-start;
  padding: 0 0 26px 0;
}
.route-step:last-child { padding-bottom: 0; }
.route-step-num {
  flex-shrink: 0; width: 34px; height: 34px; border-radius: 50%;
  background: var(--gold); color: #fff; display: flex; align-items: center; justify-content: center;
  font-family: 'Montserrat', sans-serif; font-weight: 700; font-size: 0.9rem;
  box-shadow: 0 4px 12px rgba(184,152,95,0.4); z-index: 1;
}
/* Соединительная линия между шагами — маршрут читается как маршрут. */
.route-step:not(:last-child)::before {
  content: ""; position: absolute; left: 17px; top: 34px; bottom: 0;
  width: 2px; background: linear-gradient(var(--gold), rgba(184,152,95,0.15));
}
.route-step-text { padding-top: 5px; font-size: 0.97rem; line-height: 1.6; color: var(--ink); }

/* ---- Тёмный блок-выноска (используется на «О нас» и в кабинете) ---- */
.dark-panel {
  background: linear-gradient(135deg, #1e1b17 0%, #2e2b28 100%);
  color: var(--white); border-radius: var(--radius-lg);
  padding: 38px 34px; box-shadow: 0 20px 50px rgba(20,18,15,0.2);
}
.dark-panel h2, .dark-panel h3 { color: var(--white); }
.dark-panel p { color: rgba(255,255,255,0.78); }
.dark-panel .eyebrow { color: var(--gold); }
@media (max-width: 600px) { .dark-panel { padding: 26px 20px; } }

/* ---- Полоса фактов (цифры/короткие факты в ряд) ---- */
.fact-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 18px; margin-top: 26px; }
.fact-item { text-align: center; }
.fact-value { font-family: 'Playfair Display', serif; font-size: 2rem; line-height: 1; color: var(--gold); display: block; }
.fact-label { display: block; margin-top: 8px; font-size: 0.84rem; color: var(--ink-soft); line-height: 1.4; }
.dark-panel .fact-label { color: rgba(255,255,255,0.7); }

/* ---- Просмотр фото крупнее (галерея, «как дойти») ---- */
.lightbox {
  position: fixed; inset: 0; z-index: 200;
  background: rgba(15,13,11,0.92);
  display: flex; align-items: center; justify-content: center;
  padding: 24px; cursor: zoom-out;
  animation: lightboxIn 0.18s ease;
}
.lightbox[hidden] { display: none; }
@keyframes lightboxIn { from { opacity: 0; } to { opacity: 1; } }
.lightbox-img { max-width: 100%; max-height: 100%; border-radius: 10px; box-shadow: 0 30px 80px rgba(0,0,0,0.5); }
.lightbox-close {
  position: absolute; top: 16px; right: 20px;
  background: rgba(255,255,255,0.12); color: #fff; border: 0;
  width: 42px; height: 42px; border-radius: 50%;
  font-size: 1.6rem; line-height: 1; cursor: pointer;
}
.lightbox-close:hover { background: rgba(255,255,255,0.22); }

/* Якоря разделов не должны прятаться под липкой шапкой и полосой категорий:
   без этого клик по «Педикюр» прокручивал так, что сам заголовок оказывался
   под панелью, и человек не понимал, туда ли он попал. */
.site-page [id] { scroll-margin-top: calc(var(--sticky-top) + var(--strip-h) + 12px); }

/* На узком экране заголовок раздела и подпись справа не помещаются в строку. */
@media (max-width: 560px) {
  .service-group-head { flex-direction: column; align-items: flex-start; gap: 4px; margin-top: 40px; }
  .service-group-count { font-size: 0.78rem; }
}

/* ---- Блок «почему не страшно записываться» под визардом (/booking) ---- */
.booking-reassure {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 14px; margin-top: 28px;
}
.booking-reassure-item {
  display: flex; align-items: flex-start; gap: 11px;
  background: var(--white); border: 1px solid var(--line);
  border-radius: var(--radius); padding: 16px 18px;
  font-size: 0.86rem; line-height: 1.45; color: var(--ink-soft);
}
.booking-reassure-item svg { color: var(--gold); flex-shrink: 0; margin-top: 2px; }
.booking-reassure-item b { color: var(--ink); font-family: 'Montserrat', sans-serif; font-size: 0.88rem; }

/* ---- Вкладки личного кабинета: липкие, как полоса разделов на сайте ----
   Раньше, чтобы из длинной истории баллов перейти в «Профиль», нужно было
   листать страницу обратно наверх. */
.tabs-sticky {
  position: sticky; top: var(--sticky-top); z-index: 40;
  background: rgba(250,246,236,0.97);
  backdrop-filter: blur(10px);
}
.tab-btn.active { background: var(--gold); color: var(--white); }

/* Список выгод внутри тёмной выноски — светлым по тёмному. */
.dark-panel .loyalty-perks li { color: rgba(255,255,255,0.8); }
.dark-panel .loyalty-perks li b { color: var(--white); }

/* .hero-grid рассчитан на hero главной, где фото намеренно высокое и текст
   рядом с ним длинный. В разделах вроде «Люди, которые это делают» текст
   короче фото почти вдвое, и центрирование оставляло над абзацем пустоту в
   пол-экрана. Здесь выравниваем колонки по верху и ограничиваем пропорцию
   фото, чтобы высоты были сопоставимы. */
.hero-grid-even { align-items: start; }
.hero-grid-even .hero-photo-wrap { aspect-ratio: 4/3; }
.hero-grid-even .hero-photo-wrap img { width: 100%; height: 100%; object-fit: cover; }

/* ==================================================================
   ЗАВЕРШЕНИЕ СТРАНИЦЫ (views/partials/funnel_end.ejs)
   Последние сантиметры воронки: раньше страница заканчивалась призывом
   и сразу футером с реквизитами — все оставшиеся сомнения человек уносил
   с собой. Теперь перед футером короткая полоса ответов на них и один
   понятный следующий шаг.
   ================================================================== */
.funnel-end {
  background: var(--cream-2);
  border-top: 1px solid var(--line);
  padding: 40px 0 44px;
}
.trust-strip {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  gap: 18px 26px;
}
.trust-item { display: flex; align-items: flex-start; gap: 11px; font-size: 0.84rem; color: var(--ink-soft); line-height: 1.45; }
.trust-item b {
  display: block; color: var(--ink); font-family: 'Montserrat', sans-serif;
  font-size: 0.89rem; font-weight: 600; margin-bottom: 2px;
}
.trust-icon {
  width: 36px; height: 36px; border-radius: 50%; flex-shrink: 0;
  background: var(--white); color: var(--gold-dark);
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 3px 10px rgba(46,43,40,0.07);
}

.next-steps { margin-top: 34px; padding-top: 26px; border-top: 1px solid var(--line); }
/* Без полосы «причин не сомневаться» (trust:false, страница «Как дойти») блок «Что дальше» — первый в секции:
   ему не нужны ни отступ сверху, ни своя разделительная линия (над секцией уже есть граница) — иначе выходили
   бы две линии подряд с пустотой между ними. Двойной класс — чтобы перебить мобильное правило .next-steps. */
.next-steps.next-steps-alone { margin-top: 0; padding-top: 0; border-top: 0; }
.next-steps-row {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 12px; margin-top: 14px;
}
.next-step {
  display: flex; align-items: center; gap: 12px;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 16px 18px; text-decoration: none; color: inherit;
  box-shadow: var(--shadow);
  transition: transform 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;
}
.next-step:hover { transform: translateY(-3px); border-color: var(--gold); box-shadow: 0 14px 34px rgba(46,43,40,0.12); }
.next-step-text { min-width: 0; }
.next-step .t { display: block; font-family: 'Montserrat', sans-serif; font-weight: 600; font-size: 0.93rem; }
.next-step .x { display: block; font-size: 0.8rem; color: var(--ink-soft); margin-top: 2px; line-height: 1.4; }
.next-step .go { margin-left: auto; flex-shrink: 0; color: var(--gold-dark); display: flex; }

@media (max-width: 600px) {
  .funnel-end { padding: 30px 0 34px; }
  .trust-strip { gap: 14px; }
  .next-steps { margin-top: 26px; padding-top: 20px; }
}


/* ---- Фото нельзя «сохранить / скопировать» долгим нажатием ----
   ЖИВАЯ ПРОСЬБА владельца (iPhone): зажал палец на фото работы — iOS предлагает
   «Поделиться / Сохранить в Фото / Скопировать / Скопировать субъект». На Android
   Chrome — «Скачать изображение». Часть фото (фоновые, через CSS) так не открывалась,
   часть (обычные <img>) — открывалась.
   Надёжнее всего — убрать у картинки события указателя: долгое нажатие тогда попадает
   в обёртку (кнопку/ссылку/плитку), у которой нет меню «сохранить фото». Нажатия при
   этом работают как раньше: клик уходит родителю (лайтбокс, ссылка на запись).
   -webkit-touch-callout / user-select / user-drag — второй рубеж на случай, если
   картинку где-то забудут обернуть.
   ЧЕСТНО о пределе: это защита от «случайно сохранил», а не от копирования — скриншот,
   «открыть в новой вкладке» по адресу или просмотр кода страницы никуда не деваются.
   Поэтому НЕ вешаем ничего на сами фото в админке и приложении мастера. */
.site-page img, .img-protect img, .miniapp-body img, .lightbox-img {
  pointer-events: none;
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  user-select: none;
  -webkit-user-drag: none;
}

/* ---- Значок «видео» на плитке-превью ----
   Плитка на главной ведёт на страницу маршрута; без значка кадр видео выглядел как
   обычное фото (а при неудачной загрузке — как чёрная дыра). */
.gallery-item { position: relative; }
.gallery-item .video-badge {
  position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);
  width: 46px; height: 46px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: rgba(20,18,15,0.55); color: #fff;
  pointer-events: none;
  box-shadow: 0 4px 18px rgba(0,0,0,0.35);
}
.gallery-item .video-badge svg { margin-left: 2px; } /* треугольник оптически смещён вправо */


/* ---- Плитки-категории прайса (сайт /services и мини-аппки) ----
   Прайс из 30–40 позиций одной лентой — жалоба владельца. Плитка = категория;
   по нажатию открываются только её услуги (public/js/service-tiles.js).
   Без JS всё остаётся обычной страницей: плитки — якорные ссылки, панели видны.
   Про Android (сотни экранов): две колонки на всём телефонном диапазоне, на
   совсем узких (<340px) — одна; названия могут быть длинными («Наращивание и
   коррекция ногтей»), поэтому переносим по слогам / где угодно, а не
   вылезаем за плитку; minmax(0, 1fr) — чтобы длинное слово не раздвигало колонку. */
.svc-root { scroll-margin-top: calc(var(--sticky-top) + 12px); }
.svc-tiles { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
@media (min-width: 640px) { .svc-tiles { grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 16px; } }
@media (max-width: 339px) { .svc-tiles { grid-template-columns: minmax(0, 1fr); } }

.svc-tile {
  position: relative; display: flex; flex-direction: column; justify-content: space-between; gap: 12px;
  min-width: 0; min-height: 112px; padding: 16px 14px 14px 18px; overflow: hidden;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--shadow); color: var(--ink); text-decoration: none;
  -webkit-tap-highlight-color: transparent;
  transition: transform 0.15s ease, border-color 0.2s ease, box-shadow 0.2s ease;
}
.svc-tile::before { content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 4px; background: var(--gold); }
.svc-tile-name {
  font-family: 'Playfair Display', serif; font-weight: 600; line-height: 1.2;
  font-size: clamp(1rem, 4.4vw, 1.25rem);
  overflow-wrap: anywhere; word-break: normal; hyphens: auto; -webkit-hyphens: auto;
}
.svc-tile-meta { font-size: 0.78rem; color: var(--ink-soft); line-height: 1.35; padding-right: 26px; }
.svc-tile-arrow { position: absolute; right: 12px; bottom: 12px; color: var(--gold-dark); display: flex; }
.svc-tile:active { transform: scale(0.98); }
@media (hover: hover) { .svc-tile:hover { border-color: var(--gold); transform: translateY(-2px); } }
.svc-tile:focus-visible, .svc-back:focus-visible { outline: 2px solid var(--gold-dark); outline-offset: 2px; }

.svc-panel { margin-top: 28px; }
.svc-panel-head { margin-bottom: 14px; }
.svc-back {
  display: inline-flex; align-items: center; gap: 6px; min-height: 44px; padding: 0 6px 0 0;
  font-size: 0.9rem; font-weight: 600; color: var(--gold-dark); text-decoration: none;
}
.svc-panel-title { display: flex; align-items: baseline; justify-content: space-between; flex-wrap: wrap; gap: 4px 12px; }
.svc-panel-title h2 { margin: 0; outline: none; overflow-wrap: anywhere; }

/* Режим с JS: показана либо сетка плиток, либо одна категория. */
.svc-enhanced .svc-panel { display: none; margin-top: 0; }
.svc-enhanced .svc-panel.is-open { display: block; animation: svcIn 0.22s ease; }
.svc-enhanced.has-open .svc-tiles { display: none; }
@keyframes svcIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) { .svc-enhanced .svc-panel.is-open { animation: none; } }


/* ---- Длинные слова не должны раздвигать страницу ----
   Нашла матрица экранов (scripts/layout-matrix.py): в ответе на странице «Вопросы»
   есть слово/ссылка, которое при крупном шрифте на телефоне (Android «крупный шрифт»,
   iOS «размер текста») шире экрана — страница становилась шире окна, и телефон
   уменьшал масштаб («страница уехала в сторону»). break-word разрешает перенос
   ТОЛЬКО когда слово иначе не помещается; обычный текст не меняется. */
.site-page, .miniapp-body, .img-protect { overflow-wrap: break-word; }


/* ---- Пометка к входу со стороны Сенной («2 выход из метро «Садовая»») ----
   Просьба владельца: пометку видеть везде, где описан этот вход. Текст задаётся в админке
   (Настройки -> «Пометка к основному входу»), тут только оформление: золотистый полужирный,
   чтобы читалась сразу под адресом и не терялась в описании двери. */
.entrance-note { margin: 4px 0 8px; font-size: 0.9rem; font-weight: 600; color: var(--gold-dark); line-height: 1.4; }
.entrance-note-dark { color: var(--gold-light, #D9BE86); margin: 16px 0 0; }

/* ==== СОЦСЕТИ-v1 (28.09): блок «Мы в соцсетях», всплывающие окна, согласие на рассылку, редактор ====
   Маркер для проверки деплоя: curl -s https://mayaspb.ru/css/style.css | grep -c "СОЦСЕТИ-v1" */
.social-follow { border-radius: var(--radius-lg, 18px); padding: 20px; background: var(--white); border: 1px solid var(--line); }
.social-follow-head { margin-bottom: 14px; }
.social-follow-title { font-family: 'Playfair Display', serif; font-size: 1.25rem; font-weight: 700; color: var(--ink); }
.social-follow-pitch { font-size: 0.88rem; color: var(--ink-soft); margin-top: 4px; }
.social-follow-list { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 10px; }
.social-follow-item,
.site-footer .social-follow-item { display: flex; align-items: center; gap: 10px; margin: 0; padding: 12px 14px; border-radius: 12px; border: 1px solid var(--line); background: var(--cream); color: var(--ink); text-decoration: none; font-size: 0.92rem; min-width: 0; transition: border-color .15s, transform .15s; }
.social-follow-item:hover { border-color: var(--gold); transform: translateY(-1px); }
.social-follow-glyph { flex-shrink: 0; width: 34px; height: 34px; border-radius: 50%; display: grid; place-items: center; background: var(--white); color: var(--gold-dark); }
.social-follow-name { flex: 1; min-width: 0; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.social-follow-cta { flex-shrink: 0; font-size: 0.78rem; font-weight: 600; color: var(--gold-dark); }
.social-follow-legal { margin-top: 12px; font-size: 0.72rem; color: var(--ink-soft); line-height: 1.45; }
/* Тёмный вариант — полоса над колонками подвала сайта. */
.social-follow-dark { background: rgba(255,255,255,0.05); border-color: rgba(255,255,255,0.12); margin-bottom: 36px; display: flex; align-items: center; gap: 24px; flex-wrap: wrap; }
.social-follow-dark .social-follow-head { margin: 0; flex: 1 1 220px; }
.social-follow-dark .social-follow-title { color: var(--white); }
.social-follow-dark .social-follow-pitch { color: rgba(255,255,255,0.65); }
.social-follow-dark .social-follow-list { flex: 3 1 560px; grid-template-columns: repeat(2, minmax(0, 1fr)); }
.site-footer .social-follow-dark .social-follow-item { background: rgba(255,255,255,0.06); border-color: rgba(255,255,255,0.14); color: var(--white); }
.site-footer .social-follow-dark .social-follow-item:hover { border-color: var(--gold); color: var(--white); }
.social-follow-dark .social-follow-glyph { background: rgba(255,255,255,0.1); color: var(--gold); }
.social-follow-dark .social-follow-cta { color: var(--gold); }
@media (max-width: 560px) {
  .social-follow { padding: 16px; }
  .social-follow-list,
  .social-follow-dark .social-follow-list { grid-template-columns: 1fr; }
}

/* Всплывающее окно сайта (partials/site_popup.ejs). */
.site-popup-backdrop { position: fixed; inset: 0; z-index: 1000; background: rgba(28,26,24,0.55); display: flex; align-items: center; justify-content: center; padding: 16px; opacity: 0; transition: opacity .25s; }
.site-popup-backdrop.is-open { opacity: 1; }
.site-popup { position: relative; width: 100%; max-width: 420px; max-height: calc(100vh - 32px); max-height: calc(100dvh - 32px); overflow-y: auto; background: var(--white); border-radius: 20px; box-shadow: 0 24px 60px rgba(0,0,0,0.25); transform: translateY(12px) scale(.98); transition: transform .25s; }
.site-popup-backdrop.is-open .site-popup { transform: none; }
.site-popup-close { position: absolute; top: 10px; right: 10px; z-index: 2; width: 36px; height: 36px; border-radius: 50%; border: 0; background: rgba(255,255,255,0.92); color: var(--ink); font-size: 1.5rem; line-height: 1; cursor: pointer; box-shadow: 0 2px 8px rgba(0,0,0,0.12); }
.site-popup-photos { display: flex; overflow-x: auto; scroll-snap-type: x mandatory; scrollbar-width: none; border-radius: 20px 20px 0 0; }
.site-popup-photos::-webkit-scrollbar { display: none; }
.site-popup-photos img { flex: 0 0 100%; width: 100%; aspect-ratio: 4 / 3; object-fit: cover; scroll-snap-align: start; display: block; }
.site-popup-dots { display: flex; justify-content: center; gap: 6px; padding-top: 10px; }
.site-popup-dot { width: 8px; height: 8px; padding: 0; border-radius: 50%; border: 0; background: var(--line); cursor: pointer; }
.site-popup-dot.is-active { background: var(--gold); }
.site-popup-body { padding: 22px 22px 20px; }
.site-popup-title { margin: 0 36px 8px 0; font-size: 1.35rem; }
.site-popup-photos + .site-popup-body .site-popup-title,
.site-popup-dots + .site-popup-body .site-popup-title { margin-right: 0; }
.site-popup-text { margin: 0 0 16px; color: var(--ink-soft); white-space: pre-line; }
.site-popup-buttons { display: flex; flex-direction: column; gap: 8px; }
.site-popup-legal { margin: 12px 0 0; font-size: 0.7rem; color: var(--ink-soft); line-height: 1.4; }

/* Согласие на рассылку: бейджи и фильтр в «Клиентах», переключатель в кабинете. */
.consent-filter { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-bottom: 14px; }
.consent-filter-label { font-size: 0.85rem; color: var(--ink-soft); }
.consent-chip { display: inline-block; padding: 6px 12px; border-radius: 999px; border: 1px solid var(--line); background: var(--white); color: var(--ink); font-size: 0.85rem; text-decoration: none; }
.consent-chip.is-active { background: var(--ink); border-color: var(--ink); color: var(--white); }
.consent-badge { display: inline-block; padding: 2px 10px; border-radius: 999px; font-size: 0.78rem; font-weight: 600; white-space: nowrap; }
.consent-yes { background: #E3F1E7; color: #2F6B45; }
.consent-no { background: var(--cream-2); color: var(--ink-soft); }
.marketing-toggle { display: flex; gap: 12px; align-items: flex-start; cursor: pointer; margin: 0; }
.marketing-toggle input { width: 20px; height: 20px; margin-top: 2px; flex-shrink: 0; accent-color: var(--gold); }

/* Админка: всплывающие окна, отметка «редактор». */
.pp-card { margin-bottom: 12px; }
.pp-card-head { display: flex; justify-content: space-between; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 6px; }
.pp-photos { display: flex; flex-wrap: wrap; gap: 8px; }
.pp-photo { position: relative; width: 96px; height: 72px; }
.pp-photo img { width: 100%; height: 100%; object-fit: cover; border-radius: 8px; display: block; }
.pp-photo-rm { position: absolute; top: -6px; right: -6px; width: 22px; height: 22px; border-radius: 50%; border: 0; background: var(--ink); color: var(--white); cursor: pointer; line-height: 1; }
.pp-btn-row { display: grid; grid-template-columns: 1fr 180px 1fr auto; gap: 8px; margin-bottom: 8px; align-items: center; }
.pp-btn-row .pp-btn-url[hidden] { display: block; visibility: hidden; }
@media (max-width: 760px) { .pp-btn-row { grid-template-columns: 1fr 1fr; } }
.admin-role-note { flex: 0 0 100%; font-size: 0.78rem; color: var(--gold); margin-bottom: 4px; }
.admin-sidebar-foot:has(.admin-role-note) { flex-wrap: wrap; }

/* ==== АВТОПОСТИНГ-v1 (этап 3): /admin/autopost ==== */
.ap-setup summary { cursor: pointer; }
.ap-ready-list { list-style: none; padding: 0; margin: 12px 0 16px; display: grid; gap: 6px; }
.ap-grid { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(280px, 1fr); gap: 20px; align-items: start; }
@media (max-width: 1100px) { .ap-grid { grid-template-columns: 1fr; } }
.ap-toolbar { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 8px; }
.ap-toolbar button { border: 1px solid var(--line); background: var(--white); border-radius: 8px; padding: 6px 12px; font-size: 0.9rem; cursor: pointer; color: var(--ink); }
.ap-toolbar button:hover { border-color: var(--gold); }
.ap-editor { min-height: 180px; max-height: 480px; overflow-y: auto; padding: 14px; border: 1px solid var(--line); border-radius: 12px; background: var(--white); line-height: 1.55; outline: none; white-space: pre-wrap; word-break: break-word; }
.ap-editor:focus { border-color: var(--gold); box-shadow: 0 0 0 3px rgba(184,152,95,0.15); }
.ap-editor:empty::before { content: attr(data-placeholder); color: var(--ink-soft); opacity: .6; }
.ap-editor a { color: var(--gold-dark); text-decoration: underline; }
.ap-counter { font-size: 0.78rem; color: var(--ink-soft); margin-top: 6px; }
.ap-counter.is-over { color: #B03A3A; font-weight: 600; }
.ap-photos { display: flex; flex-wrap: wrap; gap: 8px; }
.ap-photo-left { position: absolute; bottom: 4px; left: 4px; width: 22px; height: 22px; border-radius: 50%; border: 0; background: rgba(0,0,0,.6); color: #fff; font-size: .75rem; cursor: pointer; line-height: 1; }
.ap-targets { display: grid; gap: 6px; }
.ap-target { display: flex; gap: 8px; align-items: center; margin: 0; font-weight: 500; }
.ap-target.is-disabled { opacity: .55; }
.ap-target-all { padding-bottom: 6px; border-bottom: 1px solid var(--line); }
.ap-target-group-label { font-size: 0.72rem; text-transform: uppercase; letter-spacing: .06em; color: var(--ink-soft); margin-top: 8px; }
.ap-mailing { background: var(--cream-2); border-radius: 12px; padding: 14px; margin-bottom: 12px; }
.ap-check { display: flex; gap: 8px; align-items: center; margin: 6px 0; font-weight: 500; }
.ap-when .form-control { margin-top: 4px; }
.ap-preview-col { position: sticky; top: 16px; }
.ap-preview-label { font-size: 0.78rem; color: var(--ink-soft); margin-bottom: 6px; }
.ap-preview { background: #EAF1F7; border-radius: 16px; padding: 12px; }
.ap-preview-photos { display: grid; gap: 3px; border-radius: 12px 12px 0 0; overflow: hidden; }
.ap-preview-photos:empty { display: none; }
.ap-preview-photos.ap-n2, .ap-preview-photos.ap-n3, .ap-preview-photos.ap-n4 { grid-template-columns: 1fr 1fr; }
.ap-preview-photos img { width: 100%; aspect-ratio: 1; object-fit: cover; display: block; }
.ap-preview-photos.ap-n1 img { aspect-ratio: 4 / 3; }
.ap-preview-text { background: var(--white); border-radius: 0 0 12px 12px; padding: 10px 12px; font-size: 0.92rem; line-height: 1.5; word-break: break-word; }
.ap-preview-photos:empty + .ap-preview-text { border-radius: 12px; }
.ap-preview-text a { color: #2A7AB8; }
.ap-post { margin-bottom: 12px; }
.ap-post-head { display: flex; justify-content: space-between; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 8px; }
.ap-post-text { white-space: pre-line; font-size: 0.9rem; color: var(--ink); margin-bottom: 8px; word-break: break-word; }
.ap-post-targets { list-style: none; padding: 0; margin: 0; display: grid; gap: 4px; font-size: 0.86rem; }
.ap-dot { display: inline-block; width: 9px; height: 9px; border-radius: 50%; margin-right: 6px; background: var(--line); vertical-align: middle; }
.ap-dot-ok { background: #3D8B57; }
.ap-dot-partial { background: #D9A441; }
.ap-dot-failed { background: #B03A3A; }
.ap-dot-sending { background: var(--gold); }
.ap-err { display: block; margin-left: 15px; font-size: 0.78rem; color: #B03A3A; word-break: break-word; }
.ap-st-warn { background: #FBEFD5; color: #8A6116; }
.ap-st-bad { background: #F6DEDE; color: #9A2E2E; }
.ap-grid [hidden], .ap-setup [hidden] { display: none !important; }
.ap-warn { color: #8A6116; }

/* ==== Счётчики hero на телефоне (29.09): компактная строка из трёх под кнопкой записи ==== */
@media (max-width: 640px) {
  .hero-counters { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; margin-top: 22px; }
  .hero-counter .num { font-size: 1.55rem; line-height: 1.1; }
  .hero-counter .lbl { font-size: 0.7rem; line-height: 1.3; margin-top: 2px; }
}

/* ==== Правовые страницы (/terms, /marketing-consent) ==== */
.legal-page ul { padding-left: 20px; margin: 0 0 1em; }
.legal-page li { margin-bottom: 4px; }
.legal-table-wrap { overflow-x: auto; margin: 0 0 1em; }
.legal-table { width: 100%; border-collapse: collapse; font-size: 0.9rem; background: var(--white); border-radius: 12px; overflow: hidden; }
.legal-table th, .legal-table td { padding: 8px 12px; border-bottom: 1px solid var(--line); text-align: left; white-space: nowrap; }
.legal-table th { background: var(--cream-2); color: var(--ink); font-weight: 600; }
@media (max-width: 480px) { .legal-table th, .legal-table td { padding: 8px 8px; white-space: normal; font-size: 0.82rem; } }
.ap-vkphotos { background: var(--white); border: 1px solid var(--line); border-radius: 12px; padding: 12px 14px; margin: 10px 0 14px; }

/* ==== Автопостинг: вкладки «Пост / Сторис / УБТ», видео (30.09) ==== */
.ap-tabs { display: flex; gap: 6px; margin: 0 0 16px; border-bottom: 1px solid var(--line); }
.ap-tab { padding: 10px 18px; font-weight: 600; color: var(--ink-soft); text-decoration: none; border-bottom: 2px solid transparent; margin-bottom: -1px; }
.ap-tab:hover { color: var(--ink); }
.ap-tab.is-active { color: var(--ink); border-bottom-color: var(--gold); }
.pp-photo video { width: 100%; height: 100%; object-fit: cover; border-radius: 8px; display: block; background: #000; }
.ap-preview-photos video { width: 100%; aspect-ratio: 1; object-fit: cover; display: block; background: #000; }
.ap-preview-photos.ap-story { grid-template-columns: 1fr !important; max-width: 220px; margin: 0 auto; }
.ap-preview-photos.ap-story img, .ap-preview-photos.ap-story video { aspect-ratio: 9 / 16; object-fit: contain; background: #faf6ec; }

/* MAYA-SEO-UX-20261001-v1 */
.seo-intro h1 { max-width: 850px; margin: 16px 0; }
.seo-lead { max-width: 780px; line-height: 1.8; margin-bottom: 24px; }
.seo-breadcrumbs { font-size: .85rem; margin-bottom: 24px; line-height: 1.8; }
.seo-category-links { display:flex; flex-wrap:wrap; gap:12px 20px; margin:24px 0; }
.seo-category-links a { color:var(--gold-dark); text-decoration:underline; text-underline-offset:4px; }
.seo-sections { margin:40px 0; }
.seo-sections p { line-height:1.8; }
.seo-faq { border-bottom:1px solid var(--line); padding:18px 0; }
.seo-faq summary { cursor:pointer; font-weight:600; }
.seo-faq p { margin-top:12px; line-height:1.7; }
.admin-nav-scroll [hidden], .admin-sidebar [hidden] { display:none !important; }

/* ==== Автопостинг 01.10: музыка, свой текст площадки, шаблоны, хэштеги, обложка Reels, превью по площадкам ==== */
.ap-lib { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; margin-bottom: 8px; }
.ap-lib-select { max-width: 240px; }
.ap-hashtags { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; margin-bottom: 10px; }
.ap-chip { display: inline-flex; align-items: center; border: 1px solid var(--line); background: var(--white); border-radius: 999px; font-size: 0.82rem; color: var(--ink); overflow: hidden; }
.ap-chip button { border: 0; background: transparent; color: inherit; cursor: pointer; padding: 5px 10px; font: inherit; }
.ap-chip .ap-chip-x { padding: 5px 8px 5px 2px; color: var(--ink-soft); }
.ap-chip-new, .ap-tag { padding: 5px 12px; cursor: pointer; }
.ap-chip:hover, .ap-tag.is-active { border-color: var(--gold); }
.ap-tag.is-active { background: var(--cream-2); }
.ap-music { background: var(--cream-2); border-radius: 12px; padding: 14px; }
.ap-music-picked { margin-bottom: 8px; }
.ap-music-note { color: var(--gold-dark); font-weight: 700; }
.ap-music-tags { display: flex; gap: 6px; flex-wrap: wrap; margin: 8px 0; }
.ap-music-tags:empty { display: none; }
.ap-music-list { list-style: none; padding: 0; margin: 8px 0; max-height: 280px; overflow-y: auto; display: grid; gap: 6px; }
.ap-mt { display: flex; align-items: center; gap: 8px; background: var(--white); border: 1px solid var(--line); border-radius: 10px; padding: 6px 8px; }
.ap-mt.is-picked { border-color: var(--gold); box-shadow: 0 0 0 2px rgba(184,152,95,0.15); }
.ap-mt-play { width: 34px; height: 34px; flex: 0 0 34px; border-radius: 50%; border: 0; background: var(--ink); color: var(--white); cursor: pointer; font-size: 0.8rem; }
.ap-mt-info { flex: 1; min-width: 0; }
.ap-mt-title { font-weight: 600; font-size: 0.9rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ap-mt-edit, .ap-mt-del { border: 0; background: transparent; color: var(--ink-soft); cursor: pointer; font-size: 1rem; padding: 4px 6px; }
.ap-music-opts { border-top: 1px solid var(--line); margin-top: 10px; padding-top: 10px; }
.ap-music-opts input[type=range] { width: 100%; }
.ap-music-upload { margin-top: 10px; }
.ap-music-upload summary { cursor: pointer; }
.ap-photo-badge { position: absolute; bottom: 4px; right: 4px; width: 22px; height: 22px; border-radius: 50%; background: var(--gold); color: #fff; font-size: .8rem; display: flex; align-items: center; justify-content: center; }
.ap-reels { background: var(--white); border: 1px solid var(--line); border-radius: 12px; padding: 12px 14px; }
.ap-cover-video, .ap-cover-img { display: block; max-width: 140px; aspect-ratio: 9 / 16; object-fit: cover; border-radius: 10px; background: #000; margin: 6px 0; }
.ap-captions { margin: 4px 0 14px; }
.ap-captions summary { cursor: pointer; }
.ap-caption textarea { resize: vertical; }
.ap-cap-copy { margin-top: 6px; }
.ap-over { color: #B03A3A !important; font-weight: 600; }
.ap-pv-tabs { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 8px; }
.ap-pv-tabs:empty { display: none; }
.ap-pv-tab { border: 1px solid var(--line); background: var(--white); border-radius: 999px; padding: 5px 12px; font-size: 0.8rem; cursor: pointer; color: var(--ink); }
.ap-pv-tab.is-active { background: var(--ink); border-color: var(--ink); color: var(--white); }
.ap-pv-tab.is-over { border-color: #B03A3A; }
.ap-pv-meta { margin-top: 8px; }
.ap-post-music { margin-bottom: 6px; }
@media (max-width: 600px) {
  .ap-mt { flex-wrap: wrap; }
  .ap-mt-info { flex-basis: calc(100% - 50px); }
  .ap-lib-select { max-width: 100%; flex: 1 1 100%; }
}
/* 02.10: живой предпросмотр музыки */
.ap-mprev { background: var(--white); border: 1px solid var(--line); border-radius: 12px; padding: 10px; margin: 10px 0; }
.ap-mprev-stage { display: flex; justify-content: center; background: #111; border-radius: 10px; overflow: hidden; }
.ap-mprev-stage video { display: block; max-width: 100%; max-height: 420px; background: #000; }
.ap-mprev-stage canvas { display: block; max-width: 100%; }
.ap-mprev-bar { display: flex; align-items: center; gap: 10px; margin: 8px 0 4px; }
.ap-mprev-bar input[type=range] { flex: 1; min-width: 0; }
.ap-mprev-play { width: 40px; height: 40px; flex: 0 0 40px; border-radius: 50%; border: 0; background: var(--gold); color: #fff; cursor: pointer; font-size: 0.9rem; }
.ap-mprev-time { white-space: nowrap; font-variant-numeric: tabular-nums; }
.ap-m-dirty { color: #8A6116; margin: 6px 0; }

/* ==== 02.10: разделы галереи, страница мастера, прайс популярных на главной, читаемые акции ==== */
.gallery-filters { display: flex; gap: 8px; flex-wrap: wrap; margin: 0 0 22px; }
.gallery-filter { display: inline-flex; align-items: center; gap: 6px; padding: 9px 16px; border-radius: 999px; border: 1px solid var(--line); background: var(--white); color: var(--ink); text-decoration: none; font-weight: 600; font-size: 0.92rem; transition: border-color .2s ease, background .2s ease; }
.gallery-filter span { color: var(--ink-soft); font-weight: 500; font-size: 0.82rem; }
.gallery-filter:hover { border-color: var(--gold); }
.gallery-filter.is-active { background: var(--ink); border-color: var(--ink); color: var(--white); }
.gallery-filter.is-active span { color: rgba(255,255,255,.72); }
@media (max-width: 600px) {
  .gallery-filters { flex-wrap: nowrap; overflow-x: auto; margin-left: -16px; margin-right: -16px; padding: 0 16px 4px; scrollbar-width: none; }
  .gallery-filters::-webkit-scrollbar { display: none; }
  .gallery-filter { flex: 0 0 auto; }
}
.photo-tile[hidden] { display: none !important; }
.lightbox { flex-direction: column; gap: 14px; }
.lightbox-master { color: #fff; background: rgba(184,152,95,.95); padding: 10px 18px; border-radius: 999px; text-decoration: none; font-weight: 600; font-size: 0.92rem; max-width: 92vw; text-align: center; }
.lightbox-master[hidden] { display: none; }

/* Страница мастера */
.mp-hero { padding: 40px 0 32px; background: linear-gradient(180deg, var(--cream-2) 0%, var(--cream) 100%); }
.mp-hero-inner { display: grid; grid-template-columns: minmax(220px, 340px) 1fr; gap: 40px; align-items: center; }
.mp-photo { aspect-ratio: 4 / 5; border-radius: 22px; overflow: hidden; background: var(--white); box-shadow: var(--shadow); }
.mp-photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
.mp-photo.is-placeholder img { object-fit: contain; padding: 40px; }
.mp-crumbs { font-size: 0.85rem; color: var(--ink-soft); margin-bottom: 14px; }
.mp-crumbs a { color: var(--gold-dark); }
.mp-head h1 { font-size: clamp(2rem, 4vw, 3rem); margin: 6px 0 14px; }
.mp-facts { list-style: none; padding: 0; margin: 0 0 14px; display: flex; flex-wrap: wrap; gap: 8px 22px; color: var(--ink-soft); }
.mp-facts b { color: var(--ink); }
.mp-specs { list-style: none; padding: 0; margin: 0 0 20px; display: flex; flex-wrap: wrap; gap: 8px; }
.mp-specs li { background: var(--white); border: 1px solid var(--line); border-radius: 999px; padding: 6px 14px; font-size: 0.88rem; }
.mp-actions { flex-wrap: wrap; }
.mp-about { max-width: 760px; }
.mp-about p { font-size: 1.05rem; line-height: 1.75; white-space: pre-line; }
.mp-svc-cat { margin: 26px 0 10px; font-size: 1.1rem; }
.mp-others { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; margin-top: 14px; }
.mp-other { display: flex; gap: 12px; align-items: center; padding: 10px; background: var(--white); border: 1px solid var(--line); border-radius: 14px; text-decoration: none; color: var(--ink); }
.mp-other:hover { border-color: var(--gold); }
.mp-other img { width: 56px; height: 56px; border-radius: 50%; object-fit: cover; background: var(--cream-2); flex: 0 0 56px; }
.mp-other span { display: grid; gap: 2px; }
@media (max-width: 760px) {
  .mp-hero { padding: 20px 0 24px; }
  .mp-hero-inner { grid-template-columns: 1fr; gap: 20px; }
  .mp-photo { max-width: 260px; }
  .mp-actions .btn { flex: 1 1 100%; justify-content: center; }
}
.master-tile-bio { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }

/* Прайс-строки: главная (популярные) и страница мастера */
.price-list { list-style: none; padding: 0; margin: 0; background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow); }
.price-list li + li { border-top: 1px solid var(--line); }
.price-row { display: grid; grid-template-columns: 1fr auto auto; gap: 6px 18px; align-items: center; padding: 16px 20px; text-decoration: none; color: var(--ink); transition: background .2s ease; }
.price-row:hover { background: var(--cream); }
.price-row-main { display: grid; gap: 3px; min-width: 0; }
.price-row-name { font-weight: 600; font-size: 1rem; line-height: 1.35; }
.price-row-desc { font-size: 0.84rem; color: var(--ink-soft); line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.price-row-price { font-weight: 700; font-size: 1.08rem; white-space: nowrap; }
.price-row-cta, .price-row-go { display: inline-flex; align-items: center; gap: 4px; color: var(--gold-dark); font-weight: 700; font-size: 0.85rem; white-space: nowrap; }
.home-prices-title { margin: 26px 0 12px; font-size: 1.15rem; }
@media (max-width: 600px) {
  .price-row { grid-template-columns: 1fr auto; padding: 14px 16px; }
  .price-row-cta { grid-column: 1 / -1; }
  .price-row-go { display: none; }
}

/* Акции: читаемость (02.10) — плотнее затемнение под текстом, крупнее заголовок, кнопка-«пилюля» */
.promo-card { min-height: 260px; padding: 26px 24px 22px; }
.promo-card-overlay { background: linear-gradient(180deg, rgba(20,18,15,0.25) 0%, rgba(20,18,15,0.62) 40%, rgba(20,18,15,0.92) 100%); }
.promo-card h3 { font-size: 1.38rem; font-weight: 700; line-height: 1.2; margin-bottom: 8px; text-shadow: 0 1px 12px rgba(0,0,0,.35); }
.promo-card p { color: rgba(255,255,255,0.95); font-size: 0.95rem; line-height: 1.45; -webkit-line-clamp: 3; text-shadow: 0 1px 10px rgba(0,0,0,.3); }
.promo-card-cta { display: inline-flex; align-self: flex-start; width: auto; margin-top: 14px; padding: 8px 16px; border-radius: 999px; background: var(--gold); color: var(--ink); font-size: 0.85rem; }
.promo-card:hover .promo-card-cta { background: var(--white); color: var(--ink); }
.promo-card-content { display: flex; flex-direction: column; }
.lightbox-img { max-height: calc(100vh - 120px); }

/* ==== 02.10: кнопка «Записаться» на плитках прайса — всегда видна и выглядит как кнопка ==== */
.service-tile-go,
.service-tile:hover .service-tile-go {
  opacity: 1; transform: none;
  margin-top: 10px; padding: 7px 14px; border-radius: 999px;
  background: var(--gold); color: var(--ink); font-size: 0.82rem; font-weight: 700;
  min-height: 36px; white-space: nowrap;
}
.service-tile:hover .service-tile-go { background: var(--ink); color: var(--white); }
@media (hover: none) { .service-tile-go { opacity: 1; } }
@media (max-width: 400px) { .service-tile-go { margin-top: 0; } }

/* ==== 02.10: низкая шапка на странице записи — форма видна сразу ==== */
.page-hero-compact { padding: 40px 0 26px; }
.page-hero-compact .page-hero-content h1 { font-size: clamp(1.6rem, 3.4vw, 2.3rem); margin-bottom: 6px; }
.page-hero-compact .page-hero-content .lead { font-size: 0.98rem; }
.booking-section { padding-top: 24px; }
@media (max-width: 600px) {
  .page-hero-compact { padding: 18px 0 14px; }
  .page-hero-compact .eyebrow { display: none; }
  .page-hero-compact .page-hero-content h1 { font-size: 1.35rem; margin: 0; }
  .page-hero-compact .page-hero-content .lead { display: none; }
  .booking-section { padding-top: 12px; }
}

/* ==== 02.10: ближайшие свободные окна ==== */
.nearest-wrap { padding-top: 28px; padding-bottom: 8px; }
.nearest-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 12px; }
.nearest-head h2 { font-size: 1.25rem; margin: 0; }
.nearest-all { color: var(--gold-dark); font-weight: 600; font-size: 0.9rem; white-space: nowrap; }
.nearest-list { list-style: none; padding: 0; margin: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 12px; }
.nearest-card { display: grid; gap: 10px; background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 14px; box-shadow: var(--shadow); }
.nearest-who { display: flex; gap: 12px; align-items: center; text-decoration: none; color: var(--ink); min-width: 0; }
.nearest-who img { width: 48px; height: 48px; flex: 0 0 48px; border-radius: 50%; object-fit: cover; background: var(--cream-2); }
.nearest-who > span { display: grid; gap: 2px; min-width: 0; }
.nearest-who > span span { font-size: 0.82rem; color: var(--ink-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nearest-time { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 10px 14px; border-radius: 12px; background: var(--ink); color: var(--white); text-decoration: none; font-weight: 600; min-height: 44px; }
.nearest-time b { color: var(--gold); font-size: 0.88rem; white-space: nowrap; }
.nearest-time:hover { background: #3a352f; }
@media (max-width: 600px) {
  .nearest-list { grid-auto-flow: column; grid-auto-columns: 82%; grid-template-columns: none; overflow-x: auto; margin: 0 -16px; padding: 0 16px 6px; scroll-snap-type: x mandatory; }
  .nearest-card { scroll-snap-align: start; }
}
.mp-nearest { display: grid; gap: 2px; margin: 0 0 18px; padding: 12px 16px; border-radius: 14px; background: var(--ink); color: var(--white); text-decoration: none; max-width: 420px; }
.mp-nearest span { font-size: 0.78rem; text-transform: uppercase; letter-spacing: .06em; color: var(--gold); }
.mp-nearest b { font-size: 1.2rem; }
.mp-nearest em { font-style: normal; font-size: 0.86rem; opacity: .85; }
.mp-nearest:hover { background: #3a352f; }

/* ==== 02.10: страницы входов ==== */
.addr-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 32px; align-items: start; }
.addr-line { font-size: 1.05rem; }
.addr-photo { margin: 0; border-radius: var(--radius); overflow: hidden; background: var(--cream-2); box-shadow: var(--shadow); }
.addr-photo img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; display: block; }
.addr-photo iframe { width: 100%; height: 340px; border: 0; display: block; }
.addr-photo figcaption { padding: 10px 14px; font-size: 0.85rem; color: var(--ink-soft); }
@media (max-width: 760px) { .addr-grid { grid-template-columns: 1fr; gap: 20px; } }
.mp-rating { font-size: 1.05rem; margin: 0 0 18px; } .mp-rating b { font-size: 1.6rem; color: var(--gold-dark); }
picture.pic { display: contents; }

/* ==== 02.10: мобильная проверка — нажимаемые элементы не меньше 40–44 px ==== */
@media (max-width: 860px) {
  .nav-close { min-width: 44px; min-height: 44px; display: inline-flex; align-items: center; justify-content: center; }
  .section-scrollnav a { padding: 11px 16px; min-height: 40px; display: inline-flex; align-items: center; }
  .nearest-all { padding: 10px 0; display: inline-block; }
  .service-group-count a, a.service-group-count { padding: 8px 0; display: inline-block; }
}

/* v5 polish: ссылки на подстраницы услуг — аккуратные «чипсы», окна — время в одну строку */
.seo-links-title { font-size: 1.15rem; margin: 40px 0 0; }
.seo-chips { gap: 10px; margin: 14px 0 24px; }
.seo-chips a { text-decoration: none; padding: 9px 16px; border: 1px solid var(--line); border-radius: 999px; background: var(--white); color: var(--ink); font-size: 0.92rem; min-height: 40px; display: inline-flex; align-items: center; }
.seo-chips a:hover { border-color: var(--gold); color: var(--gold-dark); }
.nearest-time span { white-space: nowrap; }
.nearest-time b { flex: 0 0 auto; }

/* v5.1: цена и «Записаться» — столбиком справа (раньше в одну строку, и с шрифтом Montserrat
   цена залезала под кнопку). На узких экранах — строкой под названием. */
.service-tile-side { display: flex; flex-direction: column; align-items: flex-end; gap: 8px; text-align: right; }
.service-tile-side .service-tile-go, .service-tile:hover .service-tile-side .service-tile-go { margin-top: 0; }
@media (max-width: 400px) {
  .service-tile-side { flex-direction: row; align-items: center; justify-content: space-between; text-align: left; }
}
/* Ближайшие окна: карточка шире, время и кнопка не вылезают за край */
.nearest-list { grid-template-columns: repeat(auto-fill, minmax(290px, 1fr)); }
.nearest-card { min-width: 0; }
.nearest-time { flex-wrap: wrap; row-gap: 4px; }
.nearest-time b { margin-left: auto; }
@media (max-width: 600px) {
  .nearest-list { grid-template-columns: none; grid-auto-columns: 86%; }
  .nearest-time { padding: 10px 12px; gap: 8px; }
  .nearest-time span { font-size: 0.92rem; }
  .nearest-time b { font-size: 0.8rem; }
}

/* ==== 02.10 (v6): админка «Автоматизация» ==== */
.auto-section h3 { margin-top: 0; }
.auto-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.auto-head h3 { margin: 0; }
.auto-cols { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 0 20px; align-items: start; }
.auto-switch { display: flex; align-items: center; gap: 8px; margin: 8px 0; font-weight: 500; cursor: pointer; }
.auto-switch input { width: 18px; height: 18px; accent-color: var(--gold); flex: 0 0 auto; }
.auto-warn { color: #b03a3a; font-size: 0.85rem; }
.auto-last { margin-top: 10px; }
.auto-res:empty { display: none; }
.auto-res { display: block; margin-top: 8px; }
.fc-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 10px; margin-top: 12px; }
.fc-day { border: 1px solid var(--line); border-radius: 12px; padding: 12px; background: var(--white); display: grid; gap: 8px; align-content: start; }
.fc-day-top { display: flex; justify-content: space-between; gap: 8px; }
.fc-day-top span { font-weight: 700; }
.fc-bar { height: 8px; border-radius: 99px; background: var(--cream-2, #efe6d6); overflow: hidden; }
.fc-bar i { display: block; height: 100%; background: var(--gold); border-radius: 99px; }
.fc-day.weak { border-color: #d9a54a; background: #fff8ec; }
.fc-day.weak .fc-day-top span { color: #b06d0a; }
.fc-day.full .fc-bar i { background: #3a8c3a; }
.fc-day.off { opacity: 0.6; }
.fc-masters { font-size: 0.78rem; color: var(--ink-soft); line-height: 1.4; }
.fc-post { justify-self: start; }
.auto-preview { margin-top: 16px; padding: 14px 16px; border-radius: 12px; border: 1px solid var(--gold); background: var(--white); }
.auto-preview-title { font-weight: 700; }
.auto-preview-text { padding: 12px; border-radius: 10px; background: var(--cream, #faf6ef); line-height: 1.5; font-size: 0.94rem; }
.auto-rating td, .auto-rating th { white-space: nowrap; }
.rating-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.auto-rating { min-width: 680px; }
.auto-delivery { min-width: 480px; }
@media (max-width: 600px) { .auto-cols { grid-template-columns: 1fr; } .fc-grid { grid-template-columns: 1fr 1fr; } }
/* таблицы «Автоматизации» — обычные таблицы с горизонтальной прокруткой в обёртке (не «мобильный» режим admin-table) */
.admin-table.auto-rating, .admin-table.auto-delivery { display: table; white-space: nowrap; }
.admin-table.auto-rating thead, .admin-table.auto-delivery thead { display: table-header-group; width: auto; table-layout: auto; }
.admin-table.auto-rating tbody, .admin-table.auto-delivery tbody { display: table-row-group; width: auto; table-layout: auto; }
.admin-table.auto-rating tr, .admin-table.auto-delivery tr { display: table-row; width: auto; table-layout: auto; }

/* ==== 02.10 (v7): админка «Тесты рассылок» ==== */
.lab-grid { display: grid; grid-template-columns: minmax(300px, 420px) 1fr; gap: 0 20px; align-items: start; }
@media (max-width: 1000px) { .lab-grid { grid-template-columns: 1fr; } }
.lab-client-row { display: flex; gap: 8px; align-items: center; }
.lab-client { margin-top: 8px; font-size: 0.88rem; line-height: 1.5; }
.lab-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
.lab-chip { font-size: 0.78rem; padding: 3px 9px; border-radius: 99px; border: 1px solid var(--line); }
.lab-chip.on { background: #eaf5ea; border-color: #b9dcb9; color: #2f6b2f; }
.lab-chip.off { color: var(--ink-soft); opacity: 0.8; }
.lab-speed { display: grid; gap: 6px; font-size: 0.92rem; }
.lab-speed label { display: flex; gap: 8px; align-items: center; font-weight: 500; }
.lab-help { margin-top: 16px; font-size: 0.86rem; color: var(--ink-soft); }
.lab-help summary { cursor: pointer; font-weight: 600; color: var(--ink); }
.lab-help ul { padding-left: 18px; line-height: 1.5; }
.lab-clock { padding: 14px 16px; border-radius: 12px; background: var(--ink); color: var(--white); }
.lab-clock .form-hint { color: rgba(255,255,255,0.7); margin: 0; }
.lab-now { font-size: 1.6rem; font-weight: 700; margin: 2px 0; }
.lab-visit { margin-top: 12px; padding: 14px 16px; border-radius: 12px; border: 2px solid var(--gold); background: #fff8ec; display: grid; gap: 10px; }
.lab-visit[hidden] { display: none; }
#lab-manual { margin-top: 10px; }
#lab-manual[hidden] { display: none; }
.lab-facts { margin: 10px 0 0; font-size: 0.9rem; display: grid; gap: 4px; }
.lab-steps { list-style: none; padding: 0; margin: 14px 0 0; display: grid; gap: 6px; }
.lab-step { display: flex; gap: 10px; align-items: flex-start; padding: 10px 12px; border-radius: 10px; border: 1px solid var(--line); background: var(--white); }
.lab-ico { width: 22px; height: 22px; flex: 0 0 22px; border-radius: 50%; display: grid; place-items: center; font-size: 0.8rem; font-weight: 700; background: var(--cream-2); color: var(--ink-soft); }
.st-sent .lab-ico { background: #3a8c3a; color: #fff; }
.st-failed { border-color: #e2a3a3; background: #fff5f5; }
.st-failed .lab-ico { background: #b03a3a; color: #fff; }
.st-partial { border-color: #e8c98a; background: #fffaf0; }
.st-partial .lab-ico { background: #c98a1e; color: #fff; }
.st-skipped .lab-ico { background: #d9d2c4; color: #5c544a; }
.st-running .lab-ico, .st-waiting .lab-ico { background: var(--gold); color: #fff; }
.st-waiting { border-color: var(--gold); }
.st-pending { opacity: 0.6; }
.lab-step-body { min-width: 0; flex: 1; }
.lab-step-top { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.lab-when { font-size: 0.76rem; color: var(--ink-soft); }
.lab-tag { font-size: 0.7rem; padding: 1px 7px; border-radius: 99px; background: var(--cream-2); color: var(--ink-soft); }
.lab-label { font-weight: 600; font-size: 0.92rem; }
.lab-detail { font-size: 0.84rem; color: var(--ink-soft); margin-top: 2px; }
.lab-step details { margin-top: 6px; }
.lab-step summary { cursor: pointer; font-size: 0.82rem; color: var(--gold-dark); }
.lab-msg { margin-top: 6px; padding: 10px 12px; border-radius: 10px; background: var(--cream, #faf6ef); font-size: 0.86rem; line-height: 1.45; overflow-wrap: anywhere; }
.lab-btns { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.lab-btns span { font-size: 0.78rem; padding: 4px 10px; border-radius: 8px; background: var(--white); border: 1px solid var(--line); }
.lab-singles { display: flex; flex-wrap: wrap; gap: 8px; margin: 12px 0; }
.lab-single-res:empty { display: none; }

/* «Тексты бота» по группам (v7.4) */
.bt-groups-nav { display: flex; flex-wrap: wrap; gap: 8px; margin: 6px 0 18px; }
.bt-groups-nav a { display: inline-block; padding: 6px 12px; border: 1px solid var(--line); border-radius: 999px; background: #fff; color: var(--ink); font-size: 13px; }
.bt-groups-nav a:hover { border-color: var(--gold); color: var(--gold-dark); }
.bt-group-title { font-size: 1.25rem; margin: 28px 0 12px; padding-top: 6px; scroll-margin-top: 120px; }
.bt-new { display: inline-block; margin-left: 6px; padding: 2px 8px; border-radius: 999px; background: #F3EBDA; color: var(--gold-dark); font-size: 11px; font-weight: 600; vertical-align: middle; text-transform: uppercase; letter-spacing: .04em; }
