/* ============================================================
   Общий слой правок для всех страниц сайта.
   Подключается ПОСЛЕДНИМ — перебивает инлайновые <style> страниц.
   Причина существования: у каждой страницы свой инлайновый CSS (23-29 КБ),
   из ~250 правил совпадают только 59 — база разъехалась при посестраничной
   сборке. Пока общего ядра нет, все сквозные правки живут здесь, в одном месте.
   ============================================================ */

:root{
  /* тот же тон золота, светлота 0.457 → 0.35: мелкий золотой текст давал 2.98:1 при норме 4.5 */
  --gold-text:#75653C;
  --line-strong:rgba(46,78,72,.60);          /* 3.05:1 на paper */
  --line-strong-dark:rgba(247,244,238,.46);  /* 3.12:1 на pine  */
}

/* ---- 1. КОНТРАСТ. Рамка полей формы была 1.44:1 — поле ввода, границу
   которого не видно. Это форма заявки на всех страницах. ---- */
input[type=text],input[type=tel],input[type=email],textarea,select{
  border-color:var(--line-strong)
}
.on-dark input[type=text],.on-dark input[type=tel],
.on-dark input[type=email],.on-dark textarea{
  border-color:var(--line-strong-dark)
}
.btn-outline{border-color:var(--line-strong)}
.on-dark .btn-outline,.header-phone{border-color:var(--line-strong-dark)}
/* мелкий золотой текст: 2.98-3.27:1 → проходит AA */
.swipe-hint,.more,.tag,.rating-inline,.cnt,.rating-card .cnt{color:var(--gold-text)}

/* ---- 2. ФОЛД. На десктопе sticky-бар выключался с 1024px, а первичный CTA
   при этом на 4 страницах из 6 уходил под сгиб (до +439px на 1024x640).
   Возвращаем бар там, где высоты окна не хватает. ---- */
@media (min-width:1024px) and (max-height:819.98px){
  .sticky-bar{display:flex}
  body{padding-bottom:calc(var(--sticky-h,66px) + env(safe-area-inset-bottom,0px))}
}

/* ---- 3. КОЛОНКИ. Сетки уходили в 3-4 колонки на 700-760px, когда места ещё нет:
   футер ужимался до 16.8ch, отзывы до 16.1ch в 6 строк. Норма 45-75ch. ---- */
@media (min-width:700px) and (max-width:1023.98px){
  .footer-grid{grid-template-columns:1fr 1fr;gap:30px 40px}
  .rev-scroll,.swipe.rev,.reviews-track{grid-template-columns:1fr 1fr}
  .team-note{grid-template-columns:1fr 1fr;gap:26px 34px}
}
@media (max-width:719.98px){
  .team-note{grid-template-columns:1fr}
}

/* ---- 4. ТАЧ-ЦЕЛИ. Ссылки футера 17-22px, чекбокс согласия 20px —
   а это required-поле формы. Расширяем хит-зону, не меняя вид. ---- */
.footer-grid a{display:inline-block;padding:12px 0;margin:-12px 0}
.consent{position:relative;min-height:44px;align-items:center}
.consent input[type=checkbox]{width:22px;height:22px;position:relative}
.consent input[type=checkbox]::before{content:"";position:absolute;inset:-11px}

/* ---- 5. ПРОПОРЦИИ. height:100% перебивал aspect-ratio — заявленная пропорция
   не соблюдалась, кроп становился непредсказуемым (до -72% кадра). ---- */
.why-media img,.cap-media img,.hero-media img,.sign-media img,.mosaic img,
.rev-media img,.rt-media img{height:auto}

/* ---- 6. РИТМ. У всех секций был одинаковый padding 89.6px и строгое
   чередование фона A/B — метроном, который и читается как «сгенерировано».
   Ритм даёт контраст, а не равномерность. ---- */
section{padding:clamp(48px,5.4vw,80px) 0}
section.band{padding:clamp(40px,4.6vw,68px) 0}
section#prices,section#price,section#ceny,section#zapis,
section#contacts,section#kontakty,section#cta-final{
  padding-top:clamp(72px,8.5vw,132px);
  padding-bottom:clamp(72px,8.5vw,132px);
}

/* ---- 7. ПРОВАЛЫ. Колонки заканчивались на разной высоте: до 772px пустоты
   на /plomba/, 199px на /udalenie/, 174px на /priem/. ---- */
@media (min-width:1024px){
  .rev-grid,.trust-grid,.steps-grid,.band-grid{align-items:center}
}

/* ---- 8. ЕДИНАЯ ШКАЛА H1. Было пять разных clamp на шести страницах. ---- */
.hero h1{font-size:clamp(1.9rem,1.3rem + 2.1vw,3.05rem);line-height:1.08;max-width:19ch;text-wrap:balance}
@media (max-width:640px){.hero h1{max-width:none;font-size:clamp(1.75rem,1.1rem + 3.4vw,2.3rem)}}

/* ---- 9. Строка согласия разваливалась: .consent{display:flex} делал
   текстовый узел «Согласен(а) с» и ссылку отдельными flex-элементами,
   предлог «с» отрывался на вторую строку, ссылка уезжала вбок. ---- */
.consent{display:block}
.consent input[type=checkbox]{float:left;margin:2px 10px 0 0}
.consent::after{content:"";display:block;clear:both}

/* ---- 10. Пустые колонки: секции, где одна колонка короче другой на 450-770px.
   Выравнивание по центру убирает дыру, не трогая содержимое. ---- */
@media (min-width:1024px){
  .rev-grid,.trust-grid,.steps-grid,.band-grid,.hiw-grid,.rt-grid,
  .price-split,.final-grid,.cap-grid,.why-grid{align-items:center}
}

/* ---- 11. Логотип: бежевая марка в белом круге давала почти нулевой контраст,
   читалась как пустой кружок. Убираем подложку на тёмной шапке. ---- */
.on-dark .brand img,header.site .brand img{background:transparent}

/* ---- 12. Шапка вплотную к краям экрана: .top__in{padding:18px 0} шло ПОСЛЕ
   .wrap{padding:0 clamp(...)} при равной специфичности и обнуляло боковые отступы.
   Замер на живом: left=0, right=390 при экране 390. ---- */
.top__in,.header-row,header .wrap{
  padding-left:clamp(18px,4vw,48px);
  padding-right:clamp(18px,4vw,48px);
}

/* ---- 13. Рейтинги: плоский flex-wrap рвал пару «значение + площадка» —
   «4,9» оставалось на одной строке, «ПроДокторов» уезжало на следующую,
   оценка читалась как относящаяся к соседней площадке. ---- */
.rates,.rate-line{display:flex;flex-wrap:wrap;gap:6px 14px;align-items:baseline}
.rates > b,.rate-line > b{white-space:nowrap}
.rates > b + span,.rate-line > b + span{white-space:nowrap}
@media (max-width:560px){
  .rates .dot,.rate-line .dot{display:none}
}

/* ---- 14. Липкая нижняя панель перекрывала текст под кнопкой ---- */
body{padding-bottom:calc(var(--sticky-h,66px) + 12px + env(safe-area-inset-bottom,0px))}
@media (min-width:1024px) and (min-height:820px){body{padding-bottom:0}}

/* ---- 15. Заглушка карты рисовалась миллиметровкой (два repeating-linear-gradient
   крест-накрест, шаг 46px) — читается как вайрфрейм, а не как дизайн.
   Замысел «блок не выглядит пустым» верный, исполнение дешёвое.
   Спокойная брендовая плашка вместо текстуры. ---- */
.map__fallback{
  background:
    radial-gradient(120% 100% at 50% 0%, rgba(46,78,72,.10) 0%, rgba(46,78,72,.04) 55%, transparent 100%),
    var(--paper-2, #EFE9DE) !important;
}
.map__fallback::before{
  content:"";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  width:min(56%,320px);aspect-ratio:1;border-radius:50%;
  background:radial-gradient(circle, rgba(201,180,135,.16) 0%, transparent 70%);
  pointer-events:none;
}

/* ---- 16. Состав команды: имена и специализации из открытых данных клиники
   (ideal70.ru/vrachi). Отдельным списком, НЕ подписями под фото — сопоставить
   лица с именами нельзя, а подписать наугад хуже, чем не подписывать. ---- */
.team-roster{margin:clamp(28px,3.5vw,44px) auto 0;max-width:1200px;
  padding:clamp(22px,2.6vw,32px) clamp(18px,4vw,48px) 0;
  border-top:1px solid var(--line,#DED6C7)}
.team-roster__t{font-size:.78rem;letter-spacing:.14em;text-transform:uppercase;
  font-weight:700;color:var(--pine,#2E4E48);margin:0 0 18px}
.team-roster ul{list-style:none;margin:0;padding:0;display:grid;gap:14px 34px;
  grid-template-columns:1fr}
@media (min-width:680px){.team-roster ul{grid-template-columns:1fr 1fr}}
@media (min-width:1100px){.team-roster ul{grid-template-columns:1fr 1fr 1fr}}
.team-roster li{display:flex;flex-direction:column;gap:3px;
  padding-bottom:12px;border-bottom:1px solid var(--line,#DED6C7)}
.team-roster b{font-weight:600;font-size:1rem;line-height:1.3}
.team-roster span{font-size:.86rem;color:var(--ink-muted,#5E6B67)}
.on-dark .team-roster{border-top-color:rgba(247,244,238,.2)}
.on-dark .team-roster__t{color:var(--gold,#C9B487)}
.on-dark .team-roster li{border-bottom-color:rgba(247,244,238,.14)}
.on-dark .team-roster span{color:rgba(247,244,238,.72)}

/* ── Тач-цели ≥44px (гейт вёрстки 2026-08-18) ────────────────────────────
   Самостоятельные контролы — телефон и логотип — были 19–43px по высоте.
   Область нажатия расширяется невидимым слоем ТОЛЬКО по вертикали: ширина,
   ритм и высота строки не меняются, поэтому вёрстка не едет (грабля
   «широкие правила тач-целей ломают вёрстку», MEMORY). ────────────────── */
a.tel,a.ftr__tel,a[href^="tel:"]{position:relative}
a.tel::after,a.ftr__tel::after,a[href^="tel:"]::after{content:"";position:absolute;left:0;right:0;top:50%;transform:translateY(-50%);height:44px;pointer-events:auto}
