/* NM-L1 2026-08-23 start — линия 1 визуального свипа: первый экран, липкий aside, медиа/схемы, таблицы, футер */
/* A. Первый экран услуги (шаблоны 30-33; область действия — только hero с .med-warn--hero): колонка H1 шире, кегль ниже, CTA до буллетов */
@media(min-width:992px){
.hero:has(.med-warn--hero){padding-top:32px;padding-bottom:64px}
.hero:has(.med-warn--hero) .col-lg-5{flex:0 0 58%;max-width:58%;display:flex;flex-direction:column;align-items:flex-start}
.hero:has(.med-warn--hero) .col-lg-7{flex:0 0 42%;max-width:42%}
.hero:has(.med-warn--hero) .col-lg-5>*{order:9;width:100%}
.hero:has(.med-warn--hero) .col-lg-5>.hero__title{order:1;font-size:clamp(34px,3.05vw,44px);line-height:1.13;letter-spacing:-.4px;margin-bottom:16px}
.hero:has(.med-warn--hero) .col-lg-5>.hero__subtitle{order:2;font-size:17px;line-height:1.5;margin-bottom:16px}
.hero:has(.med-warn--hero) .col-lg-5>.hero__price{order:3;margin-bottom:18px;width:auto}
.hero:has(.med-warn--hero) .col-lg-5>.hero__btns{order:4;margin-bottom:18px}
.hero:has(.med-warn--hero) .col-lg-5>.hero__intro{order:5;margin-bottom:12px}
.hero:has(.med-warn--hero) .col-lg-5>.med-warn--hero{order:6;max-width:620px;margin-top:0}
.hero:has(.med-warn--hero) .hero__image--service{padding-left:32px;padding-bottom:32px;height:auto;background-size:cover}
}
/* A2. Cookie-баннер на десктопе — компактная карточка справа: не перекрывает цену и CTA в левой колонке */
@media(min-width:992px){
#nm-cookie{left:auto!important;right:16px!important;max-width:440px;padding:14px 16px}
#nm-cookie .nm-cookie__in{display:block}
#nm-cookie .nm-cookie__t{flex:none;font-size:13px;line-height:1.45;margin:0 0 10px}
#nm-cookie .nm-cookie__b{justify-content:flex-end}
}
/* B. Aside-форма: липкость уже работала, но форма подъезжала под плавающую шапку .nm-stickbar (64 px).
   Высоту колонки НЕ трогаем: sticky ездит внутри своего контейнера, а его растягивает align-items:stretch у .row */
@media(min-width:992px){
.serv-page .col-lg-4>.form--page.form--page{position:sticky;top:88px}
}
/* C. svc-media с короткой подписью и D. схемы: фигура на всю ширину колонки, подпись под ней */
.typography .svc-media--full,.typography .svc-media--full.svc-media--rev,.article-page .svc-media--full,.article-page .svc-media--full.svc-media--rev{grid-template-columns:minmax(0,1fr)!important;gap:14px;align-items:start!important}
.typography .svc-media--full>.svc-media__fig,.article-page .svc-media--full>.svc-media__fig{max-width:100%!important;width:100%;height:auto!important;margin:0!important;order:0!important}
.typography .svc-media--full>.svc-media__fig img,.typography .svc-media--full>.svc-media__fig svg,.article-page .svc-media--full>.svc-media__fig img{width:100%!important;height:auto!important;min-height:0!important;max-height:none!important;aspect-ratio:16/9!important;object-fit:cover;display:block}
.typography .svc-media--full>.svc-media__body{max-width:none}
.typography .svc-media--scheme>.svc-media__fig img,.typography .svc-media--scheme>.svc-media__fig svg,.article-page .svc-media--scheme>.svc-media__fig img{aspect-ratio:auto!important;object-fit:contain!important;background:#f7fbfb;max-height:620px!important}
/* C-моб: фигура во всю ширину колонки (было 320 px в колонке 366) */
@media(max-width:767.98px){
.svc-media__fig{max-width:100%!important;margin:0 0 12px!important}
.typography .svc-media--scheme>.svc-media__fig img{max-height:none!important}
}
/* E. Таблицы: подсказка скролла тенью (появляется, только пока есть куда листать) + минимальная ширина колонок на мобиле */
.svc-twrap{background-color:#fff;background-image:linear-gradient(to right,#fff 30%,rgba(255,255,255,0)),linear-gradient(to left,#fff 30%,rgba(255,255,255,0)),radial-gradient(farthest-side at 0 50%,rgba(11,74,82,.20),rgba(11,74,82,0)),radial-gradient(farthest-side at 100% 50%,rgba(11,74,82,.20),rgba(11,74,82,0));background-position:0 0,100% 0,0 0,100% 0;background-repeat:no-repeat;background-size:34px 100%,34px 100%,14px 100%,14px 100%;background-attachment:local,local,scroll,scroll}
.svc-twrap__hint{display:none}
.svc-twrap__hint[data-on="1"]{display:block;margin:-10px 0 16px;font-size:13px;line-height:1.4;color:#5b7075}
/* минимум на ячейку: 3 колонки (330 px) ещё умещаются в 366, 4 и больше — уезжают в скролл, а не слипаются */
@media(max-width:767.98px){
.svc-twrap>table{width:auto!important;max-width:none!important;min-width:0!important}
.svc-twrap>table th,.svc-twrap>table td{white-space:normal!important;min-width:110px!important}
.svc-twrap>table th:first-child,.svc-twrap>table td:first-child{min-width:124px!important}
}
/* L. Футер: «Политика конфиденциальности» и «Карта сайта» не слипаются; правовая плашка — по сетке контейнера */
.footer__bottom{column-gap:28px;row-gap:8px;flex-wrap:wrap}
.footer__copyright{flex:1 1 480px;min-width:0}
.footer__policy,.footer__map{flex:0 0 auto;margin-left:0}
.footer__policy a,.footer__map a{white-space:nowrap}
.nm-legal-note{box-sizing:border-box;max-width:1344px;margin-left:auto!important;margin-right:auto!important;padding-left:12px;padding-right:12px}
/* N. Первый <b> в шаге — заголовок строки; остальные <b> внутри описания остаются в строке */
ol.svc-steps li b{display:inline;color:inherit;margin:0}
ol.svc-steps li b:first-of-type{display:block;color:#112233;margin:0 0 4px}
/* N. Всплывашка чата Битрикс24 не открывается поверх первого экрана (сама кнопка остаётся) */
.b24-widget-button-popup{display:none!important}
/* NM-L1 end */
/* NM-L1B 2026-08-25 — фикс D на услугах: схема в figure.svc-fig показывается целиком, а не кадрируется.
   Слоты фигур режут картинку по object-fit:cover — 12/5 у обычной .svc-fig, 16/9 у --wide и у всех на
   мобиле, 3/2 у --3x2. Замер 25.08: схема 1200x800 в слоте 12/5 теряла 37 % высоты (срезало заголовок и
   первый шаг — /lechenie-alkogolizma-na-domu, /ekstrennoe-vyitrezvlenie), на 390 та же схема в 16/9 —
   25 %. Класс svc-fig--scheme проставляет сниппет svcMedia по латинскому scheme/schema в имени файла/alt.
   width/height:auto + max-width/max-height — картинка вписывается в колонку без обрезки и без леттербокса. */
.typography figure.svc-fig--scheme,.article-page figure.svc-fig--scheme{background:#f7fbfb;text-align:center}
.typography figure.svc-fig--scheme img,.article-page figure.svc-fig--scheme img{aspect-ratio:auto!important;object-fit:contain!important;width:auto!important;height:auto!important;max-width:100%!important;max-height:620px!important;margin-left:auto;margin-right:auto}

/* NM-R2FIX 2026-08-25 */
/* Оглавление услуг вынесено отдельной секцией сразу за городским лидом (свип R2, T3).
   .contentblock рассчитан на колонку 533 px внутри текста — в самостоятельной секции распускаем
   на ширину контейнера и раскладываем список в две колонки, чтобы 15 пунктов не съедали экран. */
.serv-toc{padding:8px 0 24px}
.serv-toc .contentblock{max-width:none;width:100%;margin-bottom:0}
.serv-toc .contentblock__title{margin-bottom:14px}
.serv-toc #page-contents{margin:0;padding:0;list-style:none}
.serv-toc #page-contents li{position:relative;padding-left:18px;margin:0 0 9px;break-inside:avoid;font-weight:500}
.serv-toc #page-contents li:before{content:"";position:absolute;left:2px;top:.6em;width:6px;height:6px;border-radius:50%;background:#007e8a;opacity:.75}
.serv-toc #page-contents li:after{display:none}
.serv-toc #page-contents ul{margin:8px 0 0;padding:0 0 0 16px;list-style:none}
.serv-toc #page-contents a{text-decoration:none;border-bottom:1px solid transparent}
.serv-toc #page-contents a:hover{color:#b85000;border-bottom-color:currentColor}
@media(min-width:768px){.serv-toc #page-contents{columns:2;column-gap:40px}}
@media(max-width:767px){.serv-toc{padding:4px 0 18px}}
/* Список-вопросы в .svc-steps: <b> остаётся в строке, иначе строка начинается с запятой. */
.svc-steps li.is-inline > b{display:inline;margin:0}
/* Первый экран страниц-категорий врачей: цена и CTA (свип R2, /psixolog). */
.doc-page__lead{max-width:900px;margin:6px 0 18px;font-size:17px;line-height:1.6;color:#41565b}
.doc-page__cta{display:flex;flex-wrap:wrap;align-items:center;gap:14px;margin:0 0 10px}
.doc-page__cta .hero__price{margin-bottom:0;height:auto;min-height:52px;font-size:20px;padding:12px 22px}
@media(max-width:575px){.doc-page__cta{gap:10px}.doc-page__cta .hero__price{font-size:17px;padding:10px 16px;min-height:46px}.doc-page__cta .btn{flex:1 1 100%;text-align:center}}


/* NM-R2FINAL 2026-08-27 — финальный круг визуального свипа R2. */

/* 1. Вертикальные кадры: пустых полей по бокам больше нет.
   Было: svcStyles держит .svc-fig--tall в max-width:440px + margin:auto, и кадр 440x550 стоял по
   центру колонки 872 px — пустые поля 216+216 (в статьях 175+175 при колонке 790). Замер 27.08:
   17 кадров на 16 страницах, gapL/gapR = 216/216 и 175/175.
   Раскладку «кадр слева + текст справа» применить не к чему: у 12 из 12 вертикалей в телах
   ресурсов текста рядом нет — сразу за фигурой идёт H2 либо служебная плашка (разбор тел 27.08).
   Поэтому вариант задания «кадр между блоками»: контейнер во всю колонку, кадрирование по центру
   до высоты 560 px. Схему кадрировать нельзя (правило D свипа) — ей полноширинная подложка,
   картинка вписывается целиком. Класс svc-fig--vert проставляет сниппет svcMedia (98) по атрибутам
   width/height тега <img>. На 390 правила не действуют: там фигура и так во всю колонку (366x458). */
@media(min-width:992px){
.typography figure.svc-fig.svc-fig--vert,.article-page figure.svc-fig.svc-fig--vert{max-width:none!important;width:100%!important;margin:18px 0 22px!important}
.typography figure.svc-fig.svc-fig--vert:not(.svc-fig--scheme) img,.article-page figure.svc-fig.svc-fig--vert:not(.svc-fig--scheme) img{width:100%!important;height:560px!important;max-width:none!important;max-height:none!important;aspect-ratio:auto!important;object-fit:cover!important;object-position:50% 30%}
.typography figure.svc-fig.svc-fig--vert.svc-fig--scheme,.article-page figure.svc-fig.svc-fig--vert.svc-fig--scheme{background:#f7fbfb;padding:20px 0}
.typography figure.svc-fig.svc-fig--vert.svc-fig--scheme img,.article-page figure.svc-fig.svc-fig--vert.svc-fig--scheme img{width:auto!important;height:auto!important;max-width:100%!important;max-height:560px!important;object-fit:contain!important;margin-left:auto;margin-right:auto}
}

/* 2. N-1: 2-колоночная таблица прокручивалась вбок на десктопе и резала правый столбец.
   Причина не в min-width обёртки, а в .svc-table thead th{white-space:nowrap} из svcStyles:
   заголовки «Восстанавливается при отказе от употребления» / «Остаётся или требует пожизненного
   наблюдения» держали таблицу в 843 px при колонке 788 (замер 27.08: tableW 843, clientW 788,
   scrolls=true, /vliyanie-narkomanii-na-zdorove). Разрешаем перенос заголовков от 641 px и выше.
   Прокрутка 4–5-колоночных на 390 держится на min-width ячеек (110/124 px из блока E), не на
   nowrap (на ≤640 он и так снят правилом svc-fixv24), — она сохраняется. */
@media(min-width:641px){.typography .svc-table thead th,.article-page .svc-table thead th{white-space:normal}}

/* 3. R-4/R-11: между H2 «Цены на услуги» и таблицей было 88 px = margin-bottom заголовка 48 +
   margin-top .docprice__content 40. Секция помечена serv-price-top на всех четырёх шаблонах услуг
   (30–33) — правим только её; блок врачей (.docprice без serv-price-top) не трогаем. */
.docprice.serv-price-top .heading{margin-bottom:24px}
.docprice.serv-price-top .docprice__content{margin-top:0}

/* 4. /czenyi: правая треть экрана пустовала — в шаблон 27 добавлен столбец с формой заявки.
   Липкость такая же, как на страницах услуг (top:88px — высота плавающей шапки .nm-stickbar + зазор). */
@media(min-width:992px){.prices-page .col-lg-4>.form--page{position:sticky;top:88px}}

/* 5. N-3: карточка услуги на главной обрезала 6 px по ширине. .cat__cover{margin:0 -24px} рассчитан
   на padding 24 px, а на ≤575 px карточка ужимается до padding 18 px — обложка вылезала за карточку
   (замер: clientWidth 364 против scrollWidth 370). Сводим вынос обложки с фактическим padding. */
@media(max-width:575px){.cat__card .cat__cover{margin-left:-18px;margin-right:-18px}}

/* 6. Хаб психиатрии: сетка карточек направлений сразу после лида (свип R2, R-2 — раньше на хабе
   карточек не было вовсе, ссылки на 9 подуслуг лежали только в тексте и в «Других услугах», где
   печаталось 6 из 9). Разметка — чанки sec.psy-directions + tpl.psy-dir-card. */
.hub-dirs{padding:8px 0 40px}
.hub-dirs__lead{max-width:900px;margin:0 0 22px;font-size:16px;line-height:1.65;color:#41565b}
.hub-dirs__grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(288px,1fr));gap:18px}
/* девять направлений: сетка 3x3 — при auto-fit получалось 4+4+1 и три пустых места в последнем ряду */
@media(min-width:992px){.hub-dirs__grid{grid-template-columns:repeat(3,1fr)}}
.hub-dir{display:flex;flex-direction:column;background:#fff;border:1px solid #e1ecec;border-radius:20px;overflow:hidden;box-shadow:0 2px 12px rgba(10,60,70,.05);text-decoration:none;transition:box-shadow .18s,border-color .18s}
.hub-dir:hover{border-color:#bfe0e3;box-shadow:0 10px 28px rgba(10,60,70,.12)}
.hub-dir__pic{display:block;line-height:0;overflow:hidden;background:#eef6f7}
.hub-dir__pic img{display:block;width:100%;height:auto;aspect-ratio:26/15;object-fit:cover;transition:transform .5s ease}
.hub-dir:hover .hub-dir__pic img{transform:scale(1.045)}
.hub-dir__body{display:flex;flex-direction:column;flex:1;padding:18px 20px 20px}
.hub-dir__title{font-size:19px;line-height:1.28;font-weight:700;color:#0a3c46;margin:0 0 8px}
.hub-dir:hover .hub-dir__title{color:#00707b}
.hub-dir__desc{flex:1;font-size:14px;line-height:1.55;color:#5b7075;margin:0 0 14px}
.hub-dir__foot{display:flex;align-items:baseline;justify-content:space-between;gap:12px}
.hub-dir__price{font-size:15px;font-weight:700;color:#00707b;white-space:nowrap}
.hub-dir__more{font-size:14px;font-weight:700;color:#b85000}
@media(max-width:575px){.hub-dirs{padding:4px 0 28px}.hub-dirs__grid{grid-template-columns:1fr;gap:14px}.hub-dir__title{font-size:18px}}

/* 7. Страницы-категории врачей (шаблон 25): пустая строка пагинации из pdoPage занимала место
   под карточкой врача. Прячем её, когда страниц одна. */
.doc-page__container .pagination:empty{display:none}
/* NM-R2FINAL end */

/* NM-QA-LINKING-2026-08-27: домовой ритм 32px у новых блоков трастовых страниц (/kontaktyi, /otzyivyi) */
.contacts-page__leads,.reviews-page__links{margin-top:32px}
.contacts-page__leads{margin-bottom:32px}
/* NM-QA-LINKING-2026-08-27 end */

/* NM-IMGVERT 2026-08-27 — вертикальные кадры внутри div.svc-media (аудит размеров картинок).
   Слот --full кадрирует 16/9: у вертикали 800x1000 видно 45 % кадра (reab-09-two-cups — обе чашки
   за нижней кромкой). Класс svc-media--vert проставляет сниппет svcMedia (98) по атрибутам
   width/height тега img; высота 560 px — как у figure.svc-fig--vert из блока NM-R2FINAL. */
@media(min-width:992px){
.typography .svc-media--vert:not(.svc-media--scheme)>.svc-media__fig img,.article-page .svc-media--vert:not(.svc-media--scheme)>.svc-media__fig img{height:560px!important;max-height:none!important;aspect-ratio:auto!important;object-fit:cover!important;object-position:50% 30%}
}
@media(max-width:991.98px){
.typography .svc-media--vert:not(.svc-media--scheme)>.svc-media__fig img,.article-page .svc-media--vert:not(.svc-media--scheme)>.svc-media__fig img{height:auto!important;aspect-ratio:auto!important}
}
/* NM-IMGVERT end */

/* NM-IMGRADIUS 2026-08-27 — у картинок в figure.svc-fig были прямые углы, а у соседних
   в div.svc-media — скругление 16 px (на главной оба вида в одном экране). Выравниваем по
   svc-media. Схемы включены сознательно: подложка задана самой картинке, скругление повторяет
   её край — ровно так же, как в .svc-media--scheme, где 16 px стоят с самого начала. */
figure.svc-fig img,figure.svc-fig svg{border-radius:16px}
/* NM-IMGRADIUS end */

/* NM-IMGCAP 2026-08-27 — у полноширинных кадров .svc-media--full не было потолка высоты:
   в колонке главной 1260 px кадр 16/9 рендерился 1260x709 — 92 % вьюпорта 768, «пол-экрана»
   между абзацами (у figure.svc-fig потолок есть, там 525 px). Ставим те же 560 px, что у
   вертикалей из NM-IMGVERT. Схемы исключены явно — их кадрировать нельзя (contain, видимая
   доля 1.00); вертикали исключены, потому что свою высоту уже получают в NM-IMGVERT. */
.typography .svc-media--full:not(.svc-media--scheme):not(.svc-media--vert)>.svc-media__fig img,.article-page .svc-media--full:not(.svc-media--scheme):not(.svc-media--vert)>.svc-media__fig img{max-height:560px!important;object-fit:cover!important}
/* NM-IMGCAP end */

/* NM-IMGVERT-FIX 2026-08-27 — общее правило вертикалей показывает верх кадра (50% 30%):
   так надо кадрам с людьми (str-05, nvr-07, shp-05 — голова у верхней трети). У
   reab-09-two-cups сюжет внизу: чашки лежат на 66–87 % высоты и при 30 % уходили за нижнюю
   кромку целиком. Одному файлу сдвигаем окно вниз. Правильное лечение — горизонтальный
   кадр 1200x800 от линии графики; до него это точечная посадка. */
.svc-media--vert>.svc-media__fig img[src*="reab-09-two-cups"]{object-position:50% 80%!important}
.svc-media--vert>.svc-media__fig img[src*="shp-05-night-phone-down"]{object-position:50% 70%!important}
/* NM-IMGVERT-FIX end */

/* NM-CITY 2026-09-01 — отметка текущего города в модалке выбора города. Класс .active ставит
   nm-l1.js по location.hostname (серверный HTML общий для 85 хостов — см. комментарий там же).
   До этого класс приходил с сервера, но стилей у него не было ни в одной таблице темы:
   пользователь не видел отметки вообще, а помечен был чужой город. Цвет не меняем сознательно:
   фон модалки .form--popup — #007e8a, ссылки белые; акцент #b85000 на бирюзе читается плохо.
   Отметка даётся начертанием, подчёркиванием currentColor и галочкой — контраст остаётся 100 %. */
.cities-modal .citilisty li a.active,.sd-city-item>a.active{font-weight:700;text-decoration:underline;text-decoration-thickness:2px;text-underline-offset:3px}
.cities-modal .citilisty li a.active::after,.sd-city-item>a.active::after{content:" \2713";font-weight:400;text-decoration:none}
/* NM-CITY end */

/* NM-MODAL-LAYERS 2026-09-01 start — блокер мобильной конверсии.
   Диагноз (замер 01.09.2026, iPhone 13): у .mfp-wrap z-index 1043, а у #nm-cookie 10100,
   .callbar 10050, виджета B24 9990 — при открытом попапе тап по «Отправить заявку» попадал
   в «Принять» cookie-баннера (покрытие 93 %) или в «Позвонить» нижнего бара; в открытом
   мобильном меню баннер лежит поверх панели mmenu. Правило одно на все оверлеи: пока открыт
   попап или меню, липкие слои сняты, а попап поднят выше всех фиксированных слоёв темы.
   Классы: nm-modal-open ставит nm-l1.js, mm-wrapper_opened — сам mmenu. */
.mfp-bg{z-index:10200!important}
.mfp-wrap{z-index:10201!important}
html.nm-modal-open #nm-cookie,
html.nm-modal-open .callbar,
html.nm-modal-open .nm-stickbar,
html.nm-modal-open .b24-widget-button-wrapper,
html.nm-modal-open .b24-widget-button-shadow,
html.mm-wrapper_opened #nm-cookie,
html.mm-wrapper_opened .callbar,
html.mm-wrapper_opened .b24-widget-button-wrapper,
html.mm-wrapper_opened .b24-widget-button-shadow{display:none!important}

/* NM-COOKIE-COMPACT — переписан П31 06.09.2026 (первая редакция 01.09: плашка 198 -> 110 px).
   Замер «до» 06.09.2026 (Playwright, свой контекст, 390x664, первый визит, баннер не кликался,
   /stati/alkogolnaya-zavisimost-stadii): плашка 110 px — текст в 3 строки НАД кнопками во всю
   ширину; нижний стек на глубине прокрутки 110 + 64 (.callbar) + 66 (чат) = 240 px = 36,1 %
   экрана; баннер закрывал 6 строк лида из 9 и оставлял под собой 114 px контента на
   максимальной прокрутке.
   Стало: одна полоса — короткий текст слева, ОБЕ кнопки инлайн справа, высота плашки 52 px.
   Юридический смысл сохранён: сообщение об использовании cookie и обе ссылки (политика
   конфиденциальности и согласие на обработку ПДн) видимы без раскрытия, кнопки «Принять» и
   «Только необходимые» обе на месте, логика согласия (152-ФЗ) не тронута — правится только
   вёрстка. Полный текст остаётся в том же абзаце (.nm-cookie__full) и показывается с 576 px. */
.nm-cookie__min{display:none}
@media(max-width:575.98px){
  .nm-cookie__full{display:none}
  .nm-cookie__min{display:inline}
  #nm-cookie{left:6px;right:6px;bottom:6px;padding:7px 10px!important;border-radius:12px}
  .nm-cookie__in{flex-wrap:nowrap;align-items:center;gap:6px}
  .nm-cookie__t{flex:1 1 auto;min-width:0;font-size:11.5px;line-height:1.25}
  .nm-cookie__b{flex:0 0 auto;width:auto;flex-wrap:nowrap;gap:4px}
  #nm-cookie button{flex:0 0 auto;min-height:38px;padding:6px 7px;font-size:11.5px;line-height:1.1;border-radius:9px}
  html.nm-cookie-on .callbar{display:none!important}
  html.nm-cookie-on body.has-callbar #nm-cookie{bottom:6px!important}
}
/* Узкий телефон (360x640 и мельче — массовый Android рунета): тот же ряд, но текст и кнопки
   на полшага уже, иначе строка текста ломается на третью и плашка растёт до 61 px. */
@media(max-width:374.98px){
  #nm-cookie{left:4px;right:4px;padding:6px 8px!important}
  .nm-cookie__t{font-size:11px;line-height:1.22}
  #nm-cookie button{padding:6px 6px;font-size:11px;min-height:38px}
}

/* NM-FORM-IOS-ZOOM — Safari на iOS зумит страницу при фокусе в поле с кеглем меньше 16 px и
   обратно не отзумливает: после тапа в поле вёрстка «разъезжается». Поднимаем кегль только
   у реальных полей ввода и только на мобильных ширинах; десктоп не трогаем. Селекты темы
   подменены виджетом .nativejs-select (нативный select display:none), зума не дают. */
@media(max-width:767.98px){
  .form .form__input,
  .form input[type="text"],
  .form input[type="tel"],
  .form input[type="email"],
  .form input[type="date"],
  .form textarea{font-size:16px!important}
}
/* NM-MODAL-LAYERS 2026-09-01 end */

/* NM-HERO-CTA-M 2026-09-01 — CTA первого экрана услуг выше буллетов на телефоне.
   Диагноз (замер 01.09.2026, профиль iPhone 13, реальная видимая область 390x664, scrollY=0):
   шапка съедает 156 px, дальше в колонке .col-lg-5 идут заголовок → подзаголовок → бейдж цены →
   4 буллета (94 px + 32 отступа) → и только потом .hero__btns. Кнопка «Записаться» выпадала на
   601..665 (на /narkologicheskij-stacionar 620..684) — то есть на нижнюю кромку, под нижний
   липкий слой: до ответа на cookie-баннер это #nm-cookie (верх 550), после согласия — .callbar
   (верх 600). elementFromPoint по центру кнопки давал div.nm-cookie__b / div#nm-cookie, а не саму
   кнопку. Баннер тут ни при чём: в прогоне «повторный визит» центр той же кнопки давал div.callbar.
   Лечение — тот же приём, что уже работает на десктопе в блоке A: колонка становится flex-столбцом,
   порядок задаётся order. Разметку шаблонов 19/30–33 и чанка 99 не трогаем: на десктопе и на 768
   порядок остаётся исходным, потому что правило живёт только внутри @media(max-width:575.98px).
   Отступы: цена прижата к кнопкам (32 → 14 px) — канон первого экрана «цена + кнопка в одном
   экране»; кнопкам дан свой нижний отступ 18 px (в исходной раскладке он был нулевым, так как
   блок стоял последним перед плашкой), буллетам — 20 px. Схлопывание margin здесь ни на что не
   влияет: у всех детей margin-top 0, кроме плашки, которой он снят явно.
   Область действия сужена :has(.med-warn--hero) — это маркер hero страниц услуг; hero главной
   (шаблон 18, там в колонке ещё и мобильная картинка) под правило не попадает. */
@media(max-width:575.98px){
.hero:has(.med-warn--hero) .col-lg-5{display:flex;flex-direction:column;align-items:flex-start}
.hero:has(.med-warn--hero) .col-lg-5>*{order:9;width:100%}
.hero:has(.med-warn--hero) .col-lg-5>.hero__title{order:1}
.hero:has(.med-warn--hero) .col-lg-5>.hero__subtitle{order:2}
.hero:has(.med-warn--hero) .col-lg-5>.hero__price{order:3;width:auto;margin-bottom:14px}
.hero:has(.med-warn--hero) .col-lg-5>.hero__btns{order:4;margin-bottom:18px}
.hero:has(.med-warn--hero) .col-lg-5>.hero__intro{order:5;margin-bottom:20px}
.hero:has(.med-warn--hero) .col-lg-5>.med-warn--hero{order:6;margin-top:0}
}
/* Тот же дефект на страницах-категориях врачей (шаблон 25, класс .doc-page есть только в нём:
   /vrachi-narkologicheskoj-kliniki, /psixolog, /psixiatr-narkolog). Hero там другой — буллетов
   нет, переставлять нечего, — а кнопка всё равно падала под липкий слой: замер 01.09 на 390x664
   давал «Записаться» 556..620 при верхе слоя 550 (на гео-хосте с самым длинным топонимом,
   losino-petrovskij, — 557..621), центр кнопки по elementFromPoint попадал в баннер.
   Съедали первый экран две вещи: (1) у H1 .headline padding 32/32 — это отступ СЕКЦИОННОГО
   заголовка, а под хлебными крошками он даёт 64 px пустоты; (2) .doc-page__cta на ≤575 раскладывал
   бейдж цены отдельной строкой (flex:1 1 100% у кнопок), хотя на десктопе цена и кнопка стоят
   в одной строке. Возвращаем телефону десктопное поведение блока: цена + первичная кнопка в одной
   строке (канон «цена и кнопка в одном экране без прокрутки»), вторичная — во всю ширину под ними.
   Ширину первичной кнопки в строке задаёт не базис, а min-width:203px из .btn темы (замер
   01.09): 390 → 236 px, 360 → 206 px; на 320 (контейнер 296) цена 120 + gap 10 + 203 не
   помещаются, и кнопка сама уезжает на свою строку во всю ширину — деградация штатная,
   без обрезки текста и без горизонтального оверфлоу (проверено на 320 и 360). */
@media(max-width:575.98px){
.doc-page .headline{padding-top:8px;padding-bottom:14px}
.doc-page__cta{flex-wrap:wrap}
.doc-page__cta .hero__price{flex:0 0 auto;margin-bottom:0}
.doc-page__cta .btn--primary{flex:1 1 auto}
.doc-page__cta .btn--secondary{flex:1 1 100%}
}
/* Последний экземпляр того же класса — hero ГЛАВНОЙ (шаблон 18, единственный ресурс id 1,
   печатается на всех 85 гео-хостах). Замер 01.09 на 390x664: заголовок 170..260, подзаголовок
   270..335, буллеты 347..466, дальше в ту же колонку вклинена мобильная картинка hero
   (.hero__image--mobile2, 340 px) — и только за ней .hero__btns на y=838, то есть на 174 px
   ниже сгиба; «Записаться» вообще не попадала в первый экран, а от картинки над баннером был
   виден срез в 52 px. Порядок на телефоне: заголовок → подзаголовок → КНОПКИ → буллеты →
   картинка. Буллеты здесь — доверительные («врачебная тайна, ст. 13 ФЗ-323», «формат врач
   определяет после осмотра»), они должны остаться рядом с кнопкой, а не уезжать за иллюстрацию;
   картинка закрывает блок и на прокрутке видна целиком, а не срезом. Проверены оба варианта
   (кадры home-A-*.png и home-B-*.png, порядок вливался addStyleTag без правки прода).
   Маркер области — .hero__image--mobile2: этот класс есть только в шаблоне 18, hero услуг
   (там .med-warn--hero) и статьи под правило не попадают. */
@media(max-width:575.98px){
.hero:has(.hero__image--mobile2) .col-lg-5{display:flex;flex-direction:column;align-items:flex-start}
.hero:has(.hero__image--mobile2) .col-lg-5>*{order:9;width:100%}
.hero:has(.hero__image--mobile2) .col-lg-5>.hero__title{order:1}
.hero:has(.hero__image--mobile2) .col-lg-5>.hero__subtitle{order:2}
.hero:has(.hero__image--mobile2) .col-lg-5>.hero__btns{order:3;margin-bottom:18px}
.hero:has(.hero__image--mobile2) .col-lg-5>.hero__intro{order:4;margin-bottom:18px}
.hero:has(.hero__image--mobile2) .col-lg-5>.hero__image--mobile2{order:5}
}
/* NM-HERO-CTA-M end */

/* NM-RATE 2026-09-02 — подсказка паузы между заявками. Нейтральная, НЕ красная:
   это не ошибка посетителя, а сообщение «заявка уже принята». Красный .form__err
   остаётся за ошибками ввода — два состояния не должны выглядеть одинаково. */
.form__note{margin:12px 0 0;padding:12px 14px;border-radius:10px;background:#eef4fb;border-left:3px solid #2f6fb0;color:#1f2d3b;font-size:14px;line-height:1.5}
/* состояние «идёт отсчёт»: кнопка обязана оставаться ЧИТАЕМОЙ, поэтому не гасим прозрачностью
   (оранжевая CTA на бирюзовом фоне становилась грязно-оливковой), а даём явный нейтральный вид */
.form [data-nmr]{background:#e8eef5!important;background-image:none!important;border:1px solid #c3d3e4!important;color:#24405c!important;box-shadow:none!important;cursor:default;opacity:1}

/* nm-review-more 2026-09-02 — в слайдере услуг печатается выдержка (сниппет svcReviews),
   полный текст живёт на /otzyivyi. Ссылка обязана быть фирменной, а не bootstrap-синей. */
.review__content .review__more{color:#b85000;text-decoration:underline;text-underline-offset:2px;white-space:nowrap}
.review__content .review__more:hover,.review__content .review__more:focus{color:#8f3f00;text-decoration:none}

/* nm-review-note 2026-09-02 — предупреждение о модерации в форме отзыва: это фраза,
   а не ярлык поля, поэтому без капса темы. Класс .form__note занят модулем NM-RATE. */
.review-form .form__legend--note{text-transform:none;font-weight:400;letter-spacing:0;font-size:13px;line-height:1.45;margin-bottom:16px}

/* NM-CTA-BANNER 2026-09-03 start — cookie-баннер накрывал «Записаться» первого экрана
   на низких вьюпортах. Замер 03.09.2026 (Playwright, свой контекст, 390×664, scrollY=0,
   первый визит, баннер не кликался): у страниц шаблона 30 с длинным топонимом в H1
   (losino-petrovskij, «в Лосино-Петровском» — 3 строки) CTA лежит 507..571, баннер начинается
   на 533 → накрыто 38 из 64 px, elementFromPoint центра кнопки = div#nm-cookie. На apex тот же
   класс даёт 8 px. На 390×844 и 1366 перекрытия нет.

   Почему одного «компактного баннера» мало (посчитано, а не на глаз): при первом визите баннер
   на телефоне = 11 (паддинг+рамка) + 51 (текст 3 строки 13/1.32) + 8 (gap) + 42 (кнопки) + 11 =
   123 px, снизу отступ 8 → верх 533. Чтобы верх опустился ниже 571+8=579, вся плашка должна
   влезть в 77 px, а сжать до этого без потери ссылок на политику и согласие (152-ФЗ) нельзя:
   даже предельно ужатая версия — 107 px. Поэтому лечили с двух сторон: баннер и первый экран
   −43 px за счёт ПУСТОТЫ (паддинг крошек и бейджа цены), а не за счёт кегля, размера кнопки
   и содержания. С 06.09.2026 (П31) сам баннер на <=575.98 занимает 52 px и живёт в блоке
   NM-COOKIE-COMPACT; здесь остаётся только работа с первым экраном услуги.

   Область действия — только «низкий телефон»: @media (max-width:575.98px) and (max-height:720px).
   На 390×844 и на 1366 не срабатывает ни одно правило, первый экран этих вьюпортов не меняется
   (проверено скриншот-диффом до/после). Порог 720 взят с запасом: при высоте ≥710 старая
   раскладка уже даёт зазор ≥8 px, разрыва на границе нет. */
@media (max-width:575.98px) and (max-height:720px){

  /* 1. Правила самой плашки cookie отсюда сняты 06.09.2026 (П31): её геометрию на <=575.98
     целиком задаёт переписанный блок NM-COOKIE-COMPACT (одна полоса, 52 px). Две редакции
     одного элемента в одном файле давали конфликт !important и мешали считать высоту стека.

     2. Первый экран: снимаем пустоту, а не содержание.
     .crumbs — секционный отступ 24 px под шапкой в 156 px; на низком телефоне это чистая потеря.
     .hero__price — бейдж в 64 px под одну строку «от 3 500 ₽». Высота у него ЖЁСТКАЯ
     (height:64px в main.v2.css), паддинги на неё не влияют — в первом прогоне правка паддинга
     не дала ни пикселя, поэтому режем именно height. 44 px — это ровно строка (кегль 18,
     интерлиньяж 29.7) плюс 7+7: бейдж остаётся бейджем, кегль цены не трогаем.
     Кегль H1 не трогаем (26 px > нижней границы 24), кнопку не уменьшаем, буллеты не режем. */
  .crumbs{padding-top:8px}
  .hero{padding-top:8px}
  .hero .hero__title{margin-bottom:8px}
  .hero .hero__subtitle{margin-bottom:10px}
  .hero .hero__price{height:44px;padding-top:7px;padding-bottom:7px;margin-bottom:12px}
}

/* Узкий И низкий телефон (360×640 и мельче — массовый Android рунета): при 360 px текст баннера
   ложится в 4 строки вместо 3, плашка вырастает до 126 px, и правки выше не добирают 17 px.
   Добираем на той же ширине: поля плашки к краям экрана, паддинг и межстрочный интервал
   служебного текста, бейдж цены 44→40. Кегль текста баннера НЕ опускаем ниже 12 px. */
@media (max-width:374.98px) and (max-height:720px){
  .hero .hero__price{height:40px;padding-top:5px;padding-bottom:5px;margin-bottom:10px}
  .hero .hero__subtitle{margin-bottom:8px}
}
/* NM-CTA-BANNER 2026-09-03 end */

/* NM-HOME-HERO 2026-09-03 start — три предсуществующих дефекта PD-CTAB, чинятся в шаблоне/файле.

   (1) major: на десктопе с НИЗКИМ окном кнопка «Записаться» hero главной уходила за первый экран
   на 8 хостах из 8. Замер 03.09 (scrollY=0, 6 хостов x 6 вьюпортов): низ CTA 893 (Москва),
   952 (Лосино-Петровский, Всеволожск, Балашиха, Фрязино), 1011 (Павловский Посад) при высоте
   окна 768. Разбор высоты на худшем хосте (Павловский Посад, 1366x768):
   шапка 227 + padding-top hero 64 + H1 5 строк x 59 = 295 + отступ 30 + подзаголовок 3 строки 81
   + отступ 32 + буллеты 186 + отступ 32 + кнопка 64 = 1011. Съедают высоту буллеты (186 px)
   и пустота отступов (158 px), а не кегль.
   Лечение — тем же приёмом, что уже принят для телефона блоком от 01.09: кнопки поднимаются
   ВЫШЕ буллетов, отступы ужимаются. Кегль H1 не трогается (59/48 px), ничего не удаляется —
   буллеты остаются в hero сразу под кнопками. Замер после: низ CTA 729 на Павловском Посаде
   при 1366x768 — запас 39 px (порог 16).
   Область: min-width 992 (с этой ширины hero двухколоночный, Bootstrap lg) и max-height 1020.
   Порог 1020, а не 800: на 1536x864 дефект такой же (запас был -29...-147), а реальное окно на
   мониторе 1080p даёт innerHeight ~940. Синтетический вьюпорт 1920x1080 под правило не попадает —
   там первый экран остаётся пиксель-в-пиксель прежним (скриншот-дифф 0,000 %).
   Замер запаса «низ CTA -> низ экрана» на худшем хосте сети (Павловский Посад, H1 в 5 строк):
   992x768 +24, 1024x768 +24, 1200x800 +126, 1280x720 +40, 1366x768 +39, 1536x864 +135 (было
   -281, -281, -156, -242, -243, -147). Порог задачи 16.
   Маркер области — .hero__image--mobile2: класс есть только в шаблоне 18 (главная),
   hero услуг (.med-warn--hero) и статьи под правило не попадают. */
@media (min-width:992px) and (max-height:1020px){
.hero:has(.hero__image--mobile2){padding-top:28px}
.hero:has(.hero__image--mobile2) .col-lg-5{display:flex;flex-direction:column;align-items:flex-start}
.hero:has(.hero__image--mobile2) .col-lg-5>*{order:9;width:100%}
.hero:has(.hero__image--mobile2) .col-lg-5>.hero__title{order:1;margin-bottom:16px}
.hero:has(.hero__image--mobile2) .col-lg-5>.hero__subtitle{order:3;margin-bottom:18px}
.hero:has(.hero__image--mobile2) .col-lg-5>.hero__subtitle--geo{order:2;margin-bottom:8px}
.hero:has(.hero__image--mobile2) .col-lg-5>.hero__btns{order:4;margin-bottom:22px}
.hero:has(.hero__image--mobile2) .col-lg-5>.hero__intro{order:5;margin-bottom:0}
}

/* (2) minor: CLS до 0,068 на десктопе — у hero-картинок не было width/height, колонка
   .col-lg-7 росла при загрузке. Атрибуты проставлены в шаблоне 18 по фактическим размерам
   файлов (hero.png/webp 758x577, hero2.png/webp 273x399 — одинаковы на всех хостах, файл один).
   Здесь — обязательная пара к атрибутам: без height:auto жёсткий height ломает пропорцию,
   когда max-width:100% сужает картинку (колонка уже 758 px начиная с ширины окна ~1300). */
.hero__image--for-desktop img,.hero__image--mobile img{max-width:100%;height:auto}

/* (3) minor: в блоке .svc-compare описание оборачивалось в <p>, а значение TV compare-item
   у половины ресурсов уже размечено <p>…</p>. Парсер закрывал внешний абзац на внутреннем и
   оставлял по два пустых <p></p> на карточку (4 на страницу). Обёртка заменена на <div> —
   он законно содержит и текст, и абзацы. Правила ниже повторяют прежний вид «.svc-compare p»
   для случая, когда в TV лежит голый текст без разметки. */
.svc-compare__d{margin:0;color:#566;font-size:14px;line-height:1.55}
.svc-compare__d>p{margin:0}
.svc-compare__d>p+p{margin-top:8px}
/* NM-HOME-HERO 2026-09-03 end */

/* NM-TOC-COMPACT 2026-09-04 start — оглавление статьи (шаблон 24) съедало полтора-два экрана.
   Замер 04.09.2026 (Playwright, свой контекст, аналитика заглушена, 6 статей, scrollY=0):
   на 1366x768 блок .contentblock занимал 510..1295 (520-730 px), первый абзац тела начинался
   на 1149..1359 px = 1,50..1,77 экрана; на 390x844 — 1622..1919 px = 1,92..2,27 экрана.
   Эталон топа по запросам «давление после алкоголя» / «перегар сколько держится» /
   «промилле таблица» (10 страниц, тот же замер): медиана первого абзаца 906 px (x1,18) на
   десктопе и 916 px (x1,09) на мобильном; у narkolog-24.ru оглавление из 21 пункта свёрнуто
   в <details> и занимает 27 px, у verimed.ru и salerno.clinic текст идёт ДО оглавления.

   Решение — БЕЗ JS, на состоянии чекбокса: нулевой CLS, работает при выключенном скрипте,
   список целиком лежит в DOM всегда (краулер видит все пункты, ничего не «скрыто от индексации»
   сверх обычного аккордеона), меняется только отображение:
     мобильный (<992): список свёрнут, видна строка «СОДЕРЖАНИЕ · Показать всё»;
     десктоп (>=992): видны первые 6 пунктов верхнего уровня, вложенные H3 скрыты,
                      «Показать всё» раскрывает список целиком в 2 колонки.
   Скрытые пункты убраны через display:none, а не max-height: они не ловят фокус клавиатуры.
   Область — только .article-page__content (шаблон 24). Оглавление услуг (.serv-toc, шаблоны
   30-33) и прочих шаблонов не затрагивается: там разметка чекбокса вообще не печатается.
   Откат: удалить блок между маркерами start/end и вернуть сниппет AutoContent из бэкапа. */
.article-page__content .contentblock--fold{position:relative;max-width:none;margin-bottom:32px}
.article-page__content .contentblock__sw{position:absolute;width:1px;height:1px;margin:0;padding:0;opacity:0;pointer-events:none}
.article-page__content .contentblock--fold .contentblock__title{display:flex;align-items:center;gap:12px;margin:0;cursor:pointer}
.article-page__content .contentblock__hint{margin-left:auto;display:inline-flex;align-items:center;gap:8px;font-size:13px;font-weight:600;text-transform:none;color:#007e8a;white-space:nowrap}
.article-page__content .contentblock__hint::after{content:"";width:8px;height:8px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:translateY(-2px) rotate(45deg);transition:transform .2s ease}
.article-page__content .contentblock__sw:checked~.contentblock__title .contentblock__hint::after{transform:translateY(2px) rotate(-135deg)}
.article-page__content .contentblock__hint-off{display:none}
.article-page__content .contentblock__sw:checked~.contentblock__title .contentblock__hint-on{display:none}
.article-page__content .contentblock__sw:checked~.contentblock__title .contentblock__hint-off{display:inline}
.article-page__content .contentblock__sw:focus-visible~.contentblock__title{outline:2px solid #007e8a;outline-offset:4px;border-radius:8px}
.article-page__content .contentblock--fold #page-contents{margin:16px 0 0}
.article-page__content .contentblock--fold #page-contents>li{break-inside:avoid}
@media (max-width:991.98px){
  .article-page__content .contentblock--fold #page-contents{display:none}
  .article-page__content .contentblock__sw:checked~#page-contents{display:block}
}
@media (min-width:992px){
  .article-page__content .contentblock--long #page-contents>li:nth-of-type(n+7){display:none}
  .article-page__content .contentblock--long #page-contents>li>ul{display:none}
  .article-page__content .contentblock--long .contentblock__sw:checked~#page-contents{columns:2;column-gap:36px}
  .article-page__content .contentblock--long .contentblock__sw:checked~#page-contents>li:nth-of-type(n+7){display:list-item}
  .article-page__content .contentblock--long .contentblock__sw:checked~#page-contents>li>ul{display:block}
  .article-page__content .contentblock--fold:not(.contentblock--long) .contentblock__hint{display:none}
  .article-page__content .contentblock--fold:not(.contentblock--long) .contentblock__title{cursor:default}
}
/* NM-TOC-COMPACT 2026-09-04 end */

/* NM-TOC-NEST 2026-09-04 start — сниппет AutoContent теперь печатает вложенный список ВНУТРИ <li>
   (валидная разметка, axe `list` больше не срабатывает). Два следствия, которые здесь гасятся,
   чтобы страницы услуг остались прежней высоты (замер 04.09.2026, 1366x768):
   1) вложенный <ul> получал отступ дважды — от <li> и свой (на 390 блок оглавления
      /psihiatriya в геосети рос 1184 -> 1273 px); padding обнуляем, отступ даёт родительский <li>;
   2) `break-inside:avoid` у родительского <li> перестал давать колонкам ломаться внутри
      подсписка, и двухколоночное оглавление услуг выросло: detoks 444 -> 512, geo-psy 630 -> 806,
      reabilitaciya 346 -> 380 px. С правилом ниже — 442 / 628 / 344 px, то есть как было.
   Откат: удалить блок между маркерами start/end. */
.serv-toc #page-contents li>ul{padding-left:0}
.serv-toc #page-contents li:has(>ul){break-inside:auto}
/* NM-TOC-NEST 2026-09-04 end */

/* NM-TPL24-MOB 2026-09-04 start — порядок первого экрана статьи на телефоне.
   Замер 04.09.2026 (Playwright, свой контекст, аналитика заглушена, scrollY=0, 6 статей x 2 хоста):
   на 390x844 первый абзац начинался на 951..1054 px при медиане топа 844 px; остаток съедала
   превью-картинка 420x460 (401 px + 32 px отступа), стоявшая между датой и текстом. У двух
   лидеров выдачи (verimed.ru, salerno.clinic) текст идёт ВЫШЕ картинки и оглавления — 547..567 px.
   Здесь то же: на <=767 px порядок H1 -> дата -> лид -> картинка -> оглавление -> текст,
   на десктопе (>=768) ничего не меняется — блок целиком внутри медиазапроса.
   Картинка в DOM одна (шаблон 24 печатает её первым ребёнком .article-page__content),
   дубля разметки нет, переставляет её только CSS-свойство order.
   Лид ищется как абзац сразу за оглавлением (или за картинкой, если оглавления нет): у одной
   статьи сети первым блоком идёт экстренная плашка .svc-note--danger — её тоже поднимаем,
   а если первым окажется что-то иное (картинка, таблица), порядок останется прежним.
   margin-top обнуляется, потому что flex отменяет схлопывание вертикальных отступов:
   без этой строки документ рос на 354..825 px (замер по 7 статьям), с ней — -11..-85 px.
   Откат: удалить блок между маркерами start/end (порядок вернётся к исходному) и вернуть
   шаблон 24 из бэкапа core/nm-backups-tpl24-mob. */
@media (max-width:767.98px){
  .article-page__content{display:flex;flex-direction:column}
  .article-page__content>*{order:4;margin-top:0!important}
  .article-page__content>.contentblock+p,
  .article-page__content>.contentblock+.svc-note,
  .article-page__content>.article-page__preview--mobile+p,
  .article-page__content>.article-page__preview--mobile+.svc-note{order:1}
  .article-page__content>.article-page__preview--mobile{order:2}
  .article-page__content>.contentblock{order:3}
  .article-page__content>.expert{margin-top:26px!important}
  .article-page__content>.article-faq{margin-top:14px!important}
}
/* NM-TPL24-MOB 2026-09-04 end */

/* NM-ANCHOR-OFFSET 2026-09-05 start
   Клик по пункту оглавления (сниппет AutoContent) и любой переход по якорю ставил заголовок
   вплотную к верхней кромке окна, а на >=992 px его целиком накрывала плавающая шапка
   .nm-stickbar (замер 05.09.2026: высота 64 px, fixed top:0; описана в чанке 83, строки 315-330;
   ниже 992 px она display:none, замер на 390 px дал заголовок на top=0..1 px, без зазора).
   scroll-margin-top отодвигает точку остановки: 88 px на десктопе (64 шапка + 24 зазор,
   та же величина, что у липких форм .form--page top:88px) и 16 px ниже 992 px — только воздух.
   Цели: <a name> оглавления (a.page-contents-link), заголовки блоков услуг h2#svc-results/
   #svc-steps/#svc-compare и любой :target на случай ссылок вида #license из тела статьи.
   Свойство влияет ТОЛЬКО на точку остановки прокрутки: раскладка, высота документа и печать
   не меняются. Откат: удалить блок между маркерами start/end и вернуть ?v= в чанке 83. */
a.page-contents-link,h2[id],h3[id],h4[id],:target{scroll-margin-top:16px}
@media(min-width:992px){
  a.page-contents-link,h2[id],h3[id],h4[id],:target{scroll-margin-top:88px}
}
/* NM-ANCHOR-OFFSET 2026-09-05 end */
/* NM-SCHEMECLS 2026-09-05 start — П23: латентный сдвиг макета у схем. Правило выше
   (.svc-media--scheme>.svc-media__fig img{ aspect-ratio:auto!important }) отменяет презентационную
   подсказку img[width][height], поэтому до подгрузки ленивой картинки блок схемы имеет высоту
   2 px, а после — 445–527 px: замер 05.09.2026 дал сдвиг 443 px (схемы 16:9, ресурс 67) и 525 px
   (схема 3:2, ресурс 145). Форма «auto <ratio>» резервирует место ДО загрузки и уступает
   натуральным пропорциям ПОСЛЕ неё — вид загруженной схемы не меняется ни на одной странице.
   Дефолт 3/2 = атрибуты width="300" height="200" в телах; схемы 16:9 помечаются height="169".
   Откат: удалить блок между маркерами start/end и вернуть ?v= в чанке 83. */
.typography .svc-media--scheme>.svc-media__fig img,.article-page .svc-media--scheme>.svc-media__fig img{ aspect-ratio:auto 3/2!important }
.typography .svc-media--scheme>.svc-media__fig img[height="169"],.article-page .svc-media--scheme>.svc-media__fig img[height="169"]{ aspect-ratio:auto 16/9!important }
/* NM-SCHEMECLS 2026-09-05 end */

/* NM-SCHEME-ZOOM 2026-09-05 start — увеличение схем по тапу (парный файл assets/tpl/js/nm-scheme-zoom.js).
   Основание: QA-IMG 05.09.2026 (audit/QA-IMG-R1R2R3-2026-09-05.md, замечание major-1) — лист схемы
   1200 px показывается в колонке 366 px, минимальный кегль текста в нём 6,7-8,2 CSS px при пороге
   читаемости 12 px (Lighthouse font-size). Тап открывает лист в натуральном размере в слое .nm-zoom
   с прокруткой по обеим осям; масштабирование пальцами не блокируется (touch-action не задаётся).
   Подсказка ::after показывается только до 991.98 px и только на фигурах, которые скрипт реально
   вооружил (атрибут data-nm-zoom) — если JS не выполнился, обещания увеличения нет.
   Место и размер подсказки выбраны замером, а не на глаз: по всем 25 листам схем посчитана доля
   пикселей, отличных от фона, в четырёх углах (core/nm-backups-p25/corners2.php и corners3.php,
   05.09.2026). Нижние углы заняты тёмной итоговой плашкой листа — 43-56 % «чернил» на всех 25,
   плашка с текстом там перекрывала последние слова вывода. Верхние углы под словесной плашкой
   шириной 95 px заняты заголовком листа (10-18 % на 23 из 25). Свободен правый верхний угол
   под компактной иконкой, и размер тоже мерян: 30x30 при отступе 14 px задевает заголовок на
   4 листах из 25 (до 15 %), 26x26 при 10 px — на 3 (до 5,6 %), а 24x24 при отступе 8 px дают
   максимум 2,9 % и НИ ОДНОГО листа выше 3 %. Взято 24x24 / 8 px: иконка целиком лежит на картинке
   (скругление 16 px её не режет) и не накрывает ни заголовок листа, ни итоговую плашку.
   Поэтому подсказка — иконка «лупа с плюсом», а словесное имя («Увеличить схему. <alt>») отдаётся
   скринридеру через aria-label кнопки, а не рисуется поверх содержимого схемы.
   Позиционирование ::after (position:relative на фигуре, absolute у метки) высоту документа
   не меняет; на десктопе (>=992 px) фигура остаётся static — правило media-stretch из чанка 83
   не затрагивается.
   Откат: удалить блок между маркерами start/end, снять <script> из чанка 83, вернуть ?v=. */
.svc-media--scheme>.svc-media__fig[data-nm-zoom]{ cursor:zoom-in }
.svc-media--scheme>.svc-media__fig[data-nm-zoom]:focus-visible{ outline:3px solid #00707b;outline-offset:3px }
@media(max-width:991.98px){
  .svc-media--scheme>.svc-media__fig[data-nm-zoom]{ position:relative }
  .svc-media--scheme>.svc-media__fig[data-nm-zoom]::after{
    content:"";position:absolute;right:8px;top:8px;z-index:2;pointer-events:none;
    width:24px;height:24px;border-radius:50%;
    background:rgba(10,60,70,.86) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23fff' stroke-width='1.7' stroke-linecap='round'%3E%3Ccircle cx='6.8' cy='6.8' r='4.6'/%3E%3Cpath d='M10.4 10.4 L14.2 14.2M4.6 6.8h4.4M6.8 4.6v4.4'/%3E%3C/svg%3E") no-repeat 50% 50%;
    background-size:14px 14px;box-shadow:0 0 0 2px rgba(255,255,255,.55) }
}
.nm-zoom{ position:fixed;top:0;right:0;bottom:0;left:0;z-index:100000;
  background:rgba(6,26,30,.94);overflow:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch }
.nm-zoom[hidden]{ display:none }
.nm-zoom__in{ box-sizing:border-box;min-width:100%;min-height:100%;width:max-content;
  display:flex;align-items:center;justify-content:center;padding:64px 12px 24px }
.nm-zoom__img{ display:block;max-width:none;height:auto;background:#fff;border-radius:8px }
.nm-zoom__x{ position:fixed;top:10px;right:10px;z-index:2;width:44px;height:44px;padding:0;border:0;
  border-radius:50%;background:rgba(255,255,255,.94);color:#0a3c46;
  font-family:inherit;font-size:26px;font-weight:400;line-height:1;
  cursor:pointer;box-shadow:0 2px 10px rgba(0,0,0,.35) }
.nm-zoom__x:hover{ background:#fff }
.nm-zoom__x:focus-visible{ outline:3px solid #00B5C3;outline-offset:2px }
html.nm-zoom-open .callbar,html.nm-zoom-open #nm-cookie,html.nm-zoom-open .nm-stickbar,
html.nm-zoom-open .b24-widget-button-wrapper,html.nm-zoom-open .b24-widget-button-popup{ display:none!important }
/* NM-SCHEME-ZOOM 2026-09-05 end */

/* NM-P27 2026-09-05 start — удержание читателя на статьях (шаблон 24).
   Основания: audit\UX-ARTICLES-2026-09-05.md (наши 3 статьи против 4 чужих) и
   audit\RETENTION-TOP-2026-09-05.md (29 страниц топа по трём маркерам, правило «3 из N»).
   Все правила ограничены статьёй (.article-page) или крошками; услуги, главная и хаб
   получают только пункт 5 (крошки) и пункт 4 (виджет чата) — они общие по замыслу.
   Откат: удалить блок между маркерами start/end и вернуть ?v= в чанке 83. */

/* 1. ОГЛАВЛЕНИЕ НА ТЕЛЕФОНЕ. Было: медиазапрос <=991.98 прятал список целиком
   (#page-contents{display:none}) — 0 пунктов из 8..14 при 62 % у топа (18/29), блок 77 px.
   Стало: видны первые 5 пунктов верхнего уровня, остальное открывает та же подпись
   «Показать все N» на чекбоксе (JS не участвует, список целиком лежит в DOM).
   Тап-цель пункта поднята до 24 px (WCAG 2.2 AA 2.5.8), кегль пункта не трогаем — он 16 px. */
@media (max-width:991.98px){
  .article-page__content .contentblock--fold #page-contents{display:block}
  .article-page__content .contentblock--long #page-contents>li:nth-of-type(n+6){display:none}
  .article-page__content .contentblock--long #page-contents>li>ul{display:none}
  .article-page__content .contentblock--long .contentblock__sw:checked~#page-contents>li:nth-of-type(n+6){display:list-item}
  .article-page__content .contentblock--long .contentblock__sw:checked~#page-contents>li>ul{display:block}
  .article-page__content .contentblock--fold:not(.contentblock--long) .contentblock__hint{display:none}
  .article-page__content .contentblock--fold #page-contents{margin-top:12px}
  .article-page__content .contentblock--fold #page-contents>li{margin:0}
  .article-page__content .contentblock--fold #page-contents a{display:block;min-height:24px;padding:2px 0;font-size:14px;line-height:1.3}
}

/* 2. ЛИПКИЙ КОНТАКТ НА ТЕЛЕФОНЕ ПРИ НЕОТВЕЧЕННОМ COOKIE-БАННЕРЕ.
   Панель .callbar (телефон + «Заказать звонок», 64 px) на <=991 существует и работает,
   но на <=575.98 её прячет правило NM-COOKIE-COMPACT, пока баннер не получил ответа —
   у первого визита оставался ОДИН липкий слой вместо двух (решение 01.09 ради кнопки
   первого экрана услуг). На статье кнопки в первом экране нет: там H1, дата и лид.
   Поэтому только на статье и только после 700 px прокрутки (класс nm-deep ставит nm-l1.js,
   тот же порог, что у десктопной .nm-stickbar) панель возвращается, а баннер поднимается
   над ней. Замер слоёв на 390x664: баннер 110 + панель 64 + чат 66 = 240 px = 36,1 %
   при потолке 40 %. Ниже 992 px десктопной шапки нет, слои не суммируются с ней. */
@media (max-width:575.98px){
  html.nm-cookie-on.nm-deep body.has-callbar:has(.article-page) .callbar{display:flex!important}
  html.nm-cookie-on.nm-deep body.has-callbar:has(.article-page) #nm-cookie{bottom:calc(var(--callbar-h,64px) + 8px)!important}
}

/* 3. ТАБЛИЦЫ НА <=480: ПЕРВАЯ КОЛОНКА ЗАКРЕПЛЕНА.
   Замер 05.09.2026 на 390x664: у 145 главная таблица (4 колонки, 13 строк) 461 px в 364 —
   97 px за экраном; у 61 — 378 в 364; у 69 и 123 таблицы влезают. Проверены два варианта:
   А (карточный режим, строка = карточка) убирает прокрутку, но растит документ:
   145 23 955 -> 25 465 px (+1 510, +6,3 %), 61 +384, 69 +211, 123 +117, и ломает вид таблицы,
   обещанной в H1 «Стадии алкоголизма: таблица»;
   Б (первая колонка sticky + существующая подсказка и тень) высоту документа не меняет вовсе
   и сохраняет контекст строки при прокрутке: без него на максимальной прокрутке от первой
   колонки остаётся 27 px из 124, с ним — все 124 px.
   Взят Б: тот же результат по достижимости 4-й колонки при нулевой цене по высоте. */
@media (max-width:480px){
  .article-page .svc-twrap>table td:first-child,
  .article-page .svc-twrap>table th:first-child{position:sticky;left:0;z-index:2;background:#fff;box-shadow:1px 0 0 0 #e4efef}
  .article-page .svc-twrap>table thead th:first-child{background:#eefafa}
}

/* 4. ВИДЖЕТ БИТРИКС24 НА <=480: 56 -> 54 px, угол и подъём над липкой панелью сохранены.
   Обёртка уже стоит right:6px (порог <=8) и поднята над .callbar трансформом из чанка 83;
   уменьшаем сам кружок (внутренний контейнер виджета масштабируется его же скриптом на 0,85).
   Полностью убрать перекрытие строк нельзя: колонка текста на 390 занимает 12..378 px,
   любой фиксированный элемент в правом нижнем углу лежит поверх неё. Перекрываемая полоса
   строки — 56 -> 54 px из 366. */
@media (max-width:480px){
  .b24-widget-button-wrapper .b24-widget-button-inner-container{transform:scale(.818)!important}
}

/* 5. КРОШКИ: ТАП-ЦЕЛЬ 20 -> 24 px (WCAG 2.2 AA 2.5.8), высота блока не меняется —
   вертикальные поля контейнера уменьшены ровно на прирост ссылки (12+20+12 = 10+24+10 = 44). */
.breadcrumb{padding-top:10px;padding-bottom:10px}
.breadcrumb a{display:inline-flex;align-items:center;min-height:24px}

/* 6. КЕГЛЬ ТЕЛА СТАТЬИ НА ДЕСКТОПЕ 16 -> 17 px (пункт 8 спецификации, значение по замеру).
   Спецификация просила 17 -> 18 «93..99 знаков в строке -> 88». Замер 05.09.2026 показал
   другую исходную точку: тело статьи 16 px (правило svcStyles «.article-page .typography»),
   17 px — только врезка .svc-lead; знаков в строке на 1366 медиана 76,3, максимум 91,3
   (145; text-legibility.mjs по своей базе даёт 65). То есть порог «cpl <= 90» нарушал ровно
   один абзац одной статьи. При 17 px: максимум 84,0, медиана 71..76, высота документа +2..4 %.
   При 18 px: максимум 78, медиана 67..76, но высота +5..8,5 % и знаков в строке ниже p25 топа
   (77 по RETENTION §3.2 при медиане 89). Взято 17 px — это p75 кегля топа и выполнение порога
   при втрое меньшей цене по длине страницы. Мобильный кегль не трогаем: там 16 px при медиане
   топа 15 (RETENTION §3.2). */
@media (min-width:992px){
  .article-page .typography,
  .article-page .typography p,
  .article-page .typography li{font-size:17px}
}

/* 7. «ЧИТАЙТЕ ТАКЖЕ» — блок выходов под текстом статьи (у топа 14/29, медиана 3 ссылки;
   у нас было 0, у ЗАПОЯ в последней трети всего 2 инлайн-ссылки). Разметку печатает
   чанк sec.art-also, карточки — tpl.art-also-item. */
.nm-also{margin:34px 0 0;padding:22px 0 0;border-top:1px solid #dceaec}
.nm-also__h{font-size:clamp(22px,2vw,30px);line-height:1.2;margin:0 0 16px;color:#0a3c46}
.nm-also__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.nm-also__card{display:flex;flex-direction:column;gap:10px;text-decoration:none;border:1px solid #e1ecec;border-radius:14px;overflow:hidden;background:#fff;transition:box-shadow .2s ease}
.nm-also__card:hover{box-shadow:0 4px 16px rgba(11,74,82,.12)}
.nm-also__card img{display:block;width:100%;height:auto;aspect-ratio:16/9;object-fit:cover;background:#eef6f7}
.nm-also__t{display:block;padding:0 14px 14px;font-size:15px;line-height:1.35;font-weight:600;color:#0a3c46;border:0}
.nm-also__card:hover .nm-also__t{color:#007e8a}
@media (max-width:767.98px){
  .nm-also{margin-top:26px}
  .nm-also__grid{grid-template-columns:1fr;gap:12px}
  .nm-also__card{flex-direction:row;align-items:center;gap:12px}
  .nm-also__card img{width:112px;min-width:112px;aspect-ratio:4/3}
  .nm-also__t{padding:10px 12px 10px 0;font-size:15px}
}
/* NM-P27 2026-09-05 end */

/* NM-P27B 2026-09-06 — зазор между блоком «Читайте также» и кнопками «поделиться»
   был 0 px (замер 06.09.2026 на 390 и 1366). Отступ снизу, ритм как у соседних блоков. */
.nm-also{margin-bottom:18px}

/* NM-P31 2026-09-06 start — контент под липким стеком и первый экран статьи на низком телефоне.
   Основание: audit\UX-ARTICLES-AFTER-P27-2026-09-06.md, дефекты 1-2 (major).
   Откат: удалить блок между маркерами start/end и сменить ?v= в чанке 83. */

/* 1. ОТБИВКА ПОД НИЖНИМ СТЕКОМ. Чанк 83 держит body{padding-bottom:68px} на <=991 — это ровно
   панель .callbar (64 + 4). Пока cookie-баннер не отвечен, к панели добавляется он сам, и на
   максимальной прокрутке под стеком остаётся недостижимый контент: замер 06.09.2026 на
   390x664 — стек 182 px при отбивке 68, перекрыто 114 px низа страницы (подвал), а кнопка
   «Отправить заявку» боковой формы не выводится из-под баннера ничем, кроме доскролла,
   которого нет. Пока баннер виден, держим отбивку по ХУДШЕМУ состоянию (баннер + панель):
   на статье панель возвращается после 700 px прокрутки (NM-P27 п.2), и при отбивке «по факту»
   высота документа прыгала бы прямо во время прокрутки. Класс nm-cookie-on снимается при
   ответе на баннер — отбивка сама возвращается к 68 px чанка 83.
   --callbar-h пишет чанк 83, --nm-cookie-h — nm-l1.js (реальная высота плашки, 0 при скрытой). */
@media (max-width:991.98px){
  html.nm-cookie-on body{padding-bottom:calc(var(--callbar-h,64px) + var(--nm-cookie-h,56px) + 16px)}
}

/* 2. ПЕРВЫЙ ЭКРАН СТАТЬИ НА НИЗКОМ ТЕЛЕФОНЕ. Замер 06.09.2026, 390x664, scrollY=0, баннер не
   отвечен: лид p.svc-lead начинался на 457 px и имеет 9 строк по 27,2 px — до плашки успевали
   поместиться 3. Ужатый до 52 px баннер даёт +58 px, остальное берём ПУСТОТОЙ над лидом, не
   трогая ни кегль, ни тап-цели (крошки 24 px из NM-P27 п.5 сохранены):
   h1.headline 32/32 -> 12/12 (-40), .article-page__date 8/8 и отступ 32 -> 4/4 и 14 (-26),
   .crumbs 8 -> 4 (-4), ol.breadcrumb 16 -> 8 (-8) = -78 px. Итог замера: 8 строк лида из 9
   против 3 «до». Девятая строка недостижима: под неё плашка должна быть <=48 px вместе с
   отступом, а две кнопки с тап-целью 36 px в 44 px не влезают.
   Область — только статья (body:has(.article-page)) и только низкий телефон: на 390x844 и
   на десктопе ни одно правило не срабатывает, услуга и главная не затронуты. */
@media (max-width:575.98px) and (max-height:720px){
  body:has(.article-page) .crumbs{padding-top:4px}
  body:has(.article-page) .crumbs .breadcrumb{margin-bottom:8px}
  .article-page .headline{padding-top:12px;padding-bottom:12px}
  .article-page__date{padding-top:4px;padding-bottom:4px;margin-bottom:14px}
}
/* NM-P31 end */
