/* Десктопная обвязка публичного сайта (bikraapp.ru "/").
   Сами компоненты — карточки товара, хиты, цены, избранное, тосты — берутся
   из app.css, того же файла, что и в приложении: сайт не рисует свои
   карточки, а показывает наши. Здесь только то, чего в приложении нет:
   шапка сайта, герой, бегущая строка, баннер акций во всю ширину и подвал. */
:root {
    --site-navy: #0E1730;
    --site-navy-2: #14213D;
    /* Шрифт — тот же системный стек, что и в приложении (app.css). Из макетов
       взяты раскладка и анимации, но не гарнитура: PT Sans рядом с
       приложением читался бы как другой продукт. Крупные заголовки держим
       на весе и трекинге, а не на отдельной узкой гарнитуре. */
    --sans: -apple-system, BlinkMacSystemFont, "SF Pro Display", "Segoe UI", Roboto, sans-serif;
    --disp: var(--sans);
}

/* app.css рассчитан на полноэкранные .screen приложения — на сайте страница
   обычная, прокручивается целиком. */
body.site-page { display: block; height: auto; min-height: 100vh; overflow-x: hidden; overflow-y: auto; background: var(--bg); font-family: var(--sans); }
.site-page .container { width: min(1240px, 100%); margin: 0 auto; padding: 0 20px; }
/* Ни одна ссылка на сайте не подчёркивается: шапка, баннер акций, подвал —
   это кнопки и пункты меню, а не текстовые ссылки в абзаце. Исключение —
   правовые ссылки в самом низу (см. .ftr-copy a ниже). */
.site-page a { text-decoration: none; color: inherit; }
/* Элементы шапки и баннер акций — <button> (им нужен onclick в go()), а не
   ссылки. Без сброса браузер рисует им свою рамку outset и серый фон
   buttonface — именно из-за этого у иконок и адреса появлялась чёрная
   окантовка. appearance:none обязателен: с нативным видом кнопки часть
   движков игнорирует и заданный фон. */
.site-page .act,
.site-page .catbtn,
.site-page .topbar-address,
.site-page .promo-banner {
    appearance: none; -webkit-appearance: none;
    border: 0; background: none; padding: 0;
    font: inherit; color: inherit; text-align: left; cursor: pointer;
}

/* ── ШАПКА ────────────────────────────────────────────────────────── */
/* Закреплена и «наезжает» на страницу при прокрутке — как строка поиска
   в каталоге приложения. Второй ряд (быстрые ссылки + адрес) намеренно
   вынесен из .hdr и уезжает вверх под неё. */
/* Скруглённый низ — как у закреплённой строки поиска в каталоге приложения:
   плашка повторяет её форму, а не режет экран прямой линией. */
/* Фон сплошной: на светлой теме белый, на тёмной чёрный. Полупрозрачная
   «стеклянная» шапка просвечивала — под ней проступали фотографии товара, и
   строка поиска на них терялась. */
/* Шапка сайта видна и на карточке товара: логотип, поиск, каталог и кнопки
   нужны там же, где и везде. Карточка — накладка поверх страницы, поэтому
   она начинается под шапкой, а шапка лежит выше неё по слою. */
.site-page .hdr { position: sticky; top: 0; z-index: 300; background: var(--bg); border-radius: 0 0 22px 22px; transition: box-shadow .25s ease; }
.site-page .hdr.scrolled { box-shadow: 0 6px 18px rgba(14,23,48,.12); }
.hdr-in { display: flex; align-items: center; gap: 16px; height: 68px; }
/* Логотип двумя файлами вместо CSS-фильтра: на светлом фоне надпись чёрная,
   на тёмном — белая, а красный знак в обоих случаях остаётся ровно
   фирменным (любой invert/hue-rotate его бы «увёл» в другой оттенок). */
.site-page .logo { display: flex; align-items: center; flex: none; margin-right: 12px; }
.site-page .logo img { height: 34px; width: auto; }
.site-page .logo .logo-light { display: none; }
:root[data-theme="dark"] .site-page .logo .logo-dark { display: none; }
:root[data-theme="dark"] .site-page .logo .logo-light { display: block; }
@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) .site-page .logo .logo-dark { display: none; }
    :root:not([data-theme="light"]) .site-page .logo .logo-light { display: block; }
}

/* color задаётся с той же специфичностью, что и общее правило
   «.site-page a { color: inherit }» — иначе надпись на красной кнопке
   наследовала бы тёмный цвет текста страницы. */
.site-page .catbtn { flex: none; height: 44px; display: flex; align-items: center; gap: 8px; padding: 0 18px; border-radius: 16px; background: var(--red); color: #fff; font: 800 14px var(--sans); white-space: nowrap; transition: background .15s; }
.site-page .catbtn:hover { background: var(--red-dark); }
.catbtn svg { width: 18px; height: 18px; }

/* Поиск — тот же компонент .search из app.css (белая таблетка, лупа,
   крестик), тут только растягиваем его на всё свободное место. */
.site-page .hdr .search-wrap { flex: 1; min-width: 0; }
.site-page .hdr .search { height: 44px; padding: 0 16px; }
.site-page .hdr .search input { padding: 0; font-size: 15px; }
.site-page .hdr .search .clear { display: none; }
.site-page .hdr .search .clear.show { display: block; }

/* Подсказки поиска. Обёртка нужна только чтобы выпадающий список позиционировался
   по ширине поля, поэтому все размеры (flex, ширина) переехали с .search на неё. */
/* Именно block, а не flex-колонка: у .search из app.css есть свой flex: 1, и
   внутри колоночного контейнера он схлопывал таблетку по высоте до размера
   содержимого — поле выглядело сплющенным. */
.search-wrap { position: relative; display: block; min-width: 0; }
.site-page .hdr .search-wrap .search { width: 100%; box-sizing: border-box; }
.search-suggest { position: absolute; z-index: 60; top: calc(100% + 8px); left: 0; right: 0; max-height: min(64vh, 460px); overflow-y: auto; padding: 6px; border: 1px solid var(--line); border-radius: 18px; background: var(--white); box-shadow: 0 18px 44px rgba(14,23,48,.16); }
.search-suggest[hidden] { display: none; }
.site-page .sg-item { display: flex; width: 100%; align-items: center; gap: 12px; padding: 8px; border: 0; border-radius: 14px; background: none; text-align: left; cursor: pointer; }
.site-page .sg-item:hover, .site-page .sg-item[aria-selected="true"] { background: var(--surface-2, rgba(0,0,0,.04)); }
/* 3:4, как карточки товара в ленте, — квадрат обрезал рулоны по высоте. */
.sg-item img { flex: none; width: 42px; aspect-ratio: 3/4; object-fit: cover; border-radius: 9px; background: var(--surface-2, rgba(0,0,0,.05)); }
.sg-txt { min-width: 0; flex: 1; }
.sg-name { display: block; font-size: 14px; font-weight: 700; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sg-spec { display: block; margin-top: 2px; font-size: 12.5px; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sg-price { flex: none; font-size: 14px; font-weight: 800; color: var(--ink); white-space: nowrap; }
.sg-empty { padding: 14px 12px; font-size: 13.5px; color: var(--muted); }
.sg-all { display: block; width: 100%; margin-top: 4px; padding: 10px; border: 0; border-top: 1px solid var(--line); border-radius: 0 0 13px 13px; background: none; color: var(--red); font: 800 13px var(--sans); cursor: pointer; }

/* Иконки отбиты от строки поиска воздухом, без разделительной линии —
   она дробила шапку на части. Логотип от кнопки «Каталог» отделён так же. */
.acts { display: flex; gap: 20px; align-items: center; margin-left: 14px; padding-left: 28px; }
.site-page .act { position: relative; display: flex; flex-direction: column; align-items: center; gap: 3px; color: var(--ink); font-size: 11px; font-weight: 600; }
.site-page .act .act-ic { display: grid; place-items: center; width: 24px; height: 24px; }
.site-page .act .act-ic svg { width: 23px; height: 23px; }
/* Оптическая правка: у «облачка» сообщений рисунок шире остальных иконок
   (19 единиц против 13 у профиля) и на общей линии выглядит крупнее и ниже.
   Геометрию иконки не трогаем — она общая с приложением, поправляем только
   её видимый размер здесь. */
.site-page .act .act-ic[data-ic="chat"] svg { width: 21px; height: 21px; }
.site-page .act:hover { color: var(--red); }
/* line-height: 1 вместо 18px: у счётчика сообщений поверх этого правила своя
   рамка (см. .notification-count в app.css), из-за которой коробка выше
   строки — цифра стояла над центром кружка. Центрует place-items ниже. */
/* Счётчик корзины — кружок с цифрой у значка, как у избранного и сообщений. */

.site-page .act-badge { position: absolute; top: -5px; right: 2px; display: none; min-width: 18px; height: 18px; padding: 0 5px; box-sizing: border-box; border-radius: 999px; background: var(--red); color: #fff; font: 800 10px/1 var(--sans); font-style: normal; text-align: center; }
/* Счётчики избранного и сообщений app.js показывает классом .show — без
   этого правила бейдж оставался скрытым, сколько бы товаров ни добавили.
   Именно grid: у счётчика сообщений в app.css задан place-items: center, и
   с display: block цифра переставала центроваться в кружке. */
.site-page .act-badge.show { display: grid; place-items: center; }

.hdr-row2 { border-bottom: 1px solid var(--line); background: var(--surface-2, rgba(0,0,0,.02)); }
.hdr-row2-in { display: flex; align-items: center; gap: 20px; height: 40px; font-size: 13px; }
.quick-links { display: flex; align-items: center; gap: 20px; }
.site-page .quick-links a, .site-page .quick-links .quick-link-btn { appearance: none; -webkit-appearance: none; border: 0; background: none; padding: 0; font: inherit; color: var(--muted); cursor: pointer; transition: color .15s; }
.site-page .quick-links a:hover, .site-page .quick-links .quick-link-btn:hover { color: var(--red); }
.site-page .topbar-address { margin-left: auto; display: inline-flex; align-items: center; gap: 6px; color: var(--ink); font-weight: 700; }
.site-page .topbar-address svg { width: 14px; height: 14px; stroke: currentColor; fill: none; stroke-width: 2; transform: rotate(-90deg); color: var(--muted); }

/* ── ЭКРАНЫ ПРИЛОЖЕНИЯ НА СТРАНИЦЕ САЙТА ──────────────────────────── */
/* Липкие шапки экранов (.sticky-head) рассчитаны на приложение, где они
   единственные вверху. На сайте сверху уже липнет своя шапка с z-index 50, и
   шапка экрана уезжала под неё: кнопка «Личный кабинет» с аватаром и именем
   оказывалась под строкой поиска, и нажать на неё было нельзя. */
.site-page .sticky-head { position: static; }
/* .screen из app.css рассчитан на полноэкранный слой мобильного приложения.
   На сайте экран — обычный блок в потоке страницы, под шапкой. */
.site-page .screen { position: static; inset: auto; height: auto; min-height: 0; padding: 0; overflow: visible; }
.site-page .screen:not(.active) { display: none; }
/* Главная приложения на сайте не показывается никогда: её роль играет
   витрина (герой + хиты + лента). В разметке она остаётся только потому,
   что assets/app.js обращается к её элементам (dirTrack и т.п.). */
.site-page #home { display: none !important; }
/* Нижняя панель вкладок — чисто мобильная навигация, на сайте её заменяют
   иконки в шапке. */
.site-page .tabbar, .site-page .notification-bell, .site-page .site-footer { display: none !important; }
/* Витринная часть видна только на экране каталога. */
/* Герой, бегущая строка, баннер акций и полоса приложения лежат на уровне
   страницы, а не внутри экрана, поэтому их видно откуда угодно, пока не
   спрячешь явно. Показываем только на витрине: на карточке товара, в корзине
   или в поддержке они не к месту. */
.site-page .site-hero, .site-page .ticker, .site-page .promo-banner, .site-page .app-strip { display: none; }
.site-page.site-showcase .site-hero { display: flex; }
.site-page.site-showcase .ticker { display: flex; }
.site-page.site-showcase .promo-banner { display: flex; }
.site-page.site-showcase .app-strip { display: flex; }
/* Лента на витрине показывает всё подряд, и отбор по характеристикам там ни к
   чему: кнопка над лентой только сбивала с толку. Отбор живёт на странице
   категории — у неё своя панель (.cat-filters). В приложении лента устроена
   иначе, и кнопка там нужна, поэтому правило только для сайта. */
.site-page.site-showcase .catalog-filter-row { display: none !important; }
.site-page:not(.site-showcase):not(.site-doc-active) .ftr { display: none !important; }
.site-page.site-doc-active .ftr { display: block; }
/* Корзина — законченная страница, а не промежуточный экран: подвал со
   ссылками и кнопками скачивания приложения нужен и под ней, сразу под
   «Рекомендуем». Оба :not() повторены, чтобы селектор перебил правило выше
   по специфичности, — иначе !important там оказывался сильнее. */
.site-page[data-active-screen="cart"]:not(.site-showcase):not(.site-doc-active) .ftr { display: block !important; }
/* В кабинете подвал тоже нужен: это законченные страницы, а не промежуточные
   экраны. Оба :not() повторены по той же причине — перебить правило выше. */
.site-page.site-cabinet:not(.site-showcase):not(.site-doc-active) .ftr { display: block !important; }
/* Внутренние экраны — в той же контентной колонке, что и витрина. */
.site-page .screen.active { width: min(1240px, 100%); margin: 0 auto; padding: 32px 20px 64px; }
.site-page #catalog.active { padding-top: 0; }

/* Кнопка «На главную» — только на внутренних экранах: на витрине возврат
   не нужен, там и так главная. */
.site-page .site-backbar { display: none; }
.site-page:not(.site-showcase) .site-backbar { display: block; padding: 14px 0 0; }
.site-page.site-has-own-back .site-backbar { display: none; }
/* На информационных страницах тёмный баннер прижат к шапке, а стрелка
   лежит поверх него слева — как в макетах. */
.site-page.site-doc-active .site-backbar { display: none; }
/* На странице приложения стрелка стоит в самом баннере — отдельная полоса
   над ним не нужна. */
.site-page.site-apps-back .site-backbar { display: none; }
.apps-hero .cat-crumbs .site-back {
    width: 34px; height: 34px; margin-right: 6px; border-radius: 50%;
    background: rgba(255,255,255,.12); color: #fff;
}
.apps-hero .cat-crumbs .site-back:hover { background: rgba(255,255,255,.2); }
.site-page.site-doc-active .site-back { position: absolute; top: 22px; color: #fff; }
.site-page.site-doc-active .site-back:hover { color: #fff; background: rgba(255,255,255,.14); }
.site-page.site-doc-active .screen.active { padding-top: 0; }
.site-page .site-back { width: 38px; height: 38px; color: var(--ink); transition: color .15s, background .15s; border-radius: 12px; }
.site-page .site-back:hover { color: var(--red); background: var(--surface-2, rgba(0,0,0,.04)); }

/* Личный кабинет — карточкой по центру, как окно входа, а не растянутым
   на всю ширину экраном приложения. Оформление наше: тот же белый
   surface, скругления и тени, что у остальных блоков. */
.site-page #profile .web-cabinet-login {
    width: min(640px, 100%); margin: 8px auto 0; padding: 44px 40px;
    background: var(--white); border: 1px solid var(--line); border-radius: 22px;
    box-shadow: 0 18px 48px rgba(14,23,48,.10);
}
.site-page #profile .web-cabinet-login h2 { font-size: 30px; text-transform: uppercase; letter-spacing: -.4px; }
@media (max-width: 640px) {
    .site-page #profile .web-cabinet-login { padding: 32px 20px; border-radius: 18px; }
}

/* ── ШТОРКИ → МОДАЛЬНЫЕ ОКНА ──────────────────────────────────────── */
/* В приложении это нижние шторки (палец у нижнего края экрана). На десктопе
   шторка во всю ширину смотрится чужеродно — те же самые окна показываем
   по центру, как это делают маркетплейсы, но в нашей стилистике: те же
   цвета, скругления и содержимое, меняется только позиционирование. */
@media (min-width: 768px) {
    .site-page .cart-sheet {
        left: 50%; right: auto; bottom: auto; top: 50%;
        width: min(520px, calc(100vw - 48px));
        max-height: min(80vh, 720px);
        border-radius: 22px;
        padding: 0 24px 24px;
        box-shadow: 0 24px 70px rgba(14,23,48,.28);
        transform: translate(-50%, -46%) scale(.98);
        opacity: 0;
        transition: transform .22s cubic-bezier(.2,.8,.2,1), opacity .22s ease;
    }
    .site-page .cart-sheet.show { transform: translate(-50%, -50%); opacity: 1; bottom: auto; }
    /* «Ручка» шторки — жест только для телефона, в окне она не нужна. */
    .site-page .cart-sheet .sheet-handle, .site-page .cart-sheet .cart-sheet-handle { display: none; }
}

/* ── ОФОРМЛЕНИЕ ЗАКАЗА ────────────────────────────────────────────────
   В приложении это отдельный экран во весь телефон. На сайте — окно по
   центру в две колонки, как на маркетплейсах: слева способ оплаты,
   получатель, доставка и состав заказа, справа промокод, итоги и оплата.
   Порядок блоков задаётся в buildCheckoutLayout() (assets/site.js). */
@media (min-width: 1024px) {
    /* box-shadow вместо отдельного элемента-подложки: затемнение фона нужно
       только на сайте, и заводить ради него узел в общей разметке не стоит. */
    /* Оформление — обычная страница, а не окно поверх сайта: человек тут
       вводит адрес и платит, и всплывающее окно с затемнением этому только
       мешает. Шапка сайта остаётся на месте, как на остальных страницах. */
    .site-page .checkout {
        inset: var(--site-header-height, 116px) 0 0 0;
        width: 100%; height: auto;
        border-radius: 0; overflow-y: auto;
        box-shadow: none;
        background: var(--bg);
        display: grid; grid-template-columns: minmax(0, 1fr) 372px; grid-template-rows: auto minmax(0, 1fr);
        align-content: start;
        transform: none;
        transition: opacity .18s ease, visibility .18s;
        /* Обязательно: в приложении закрытое оформление уезжает за правый край
           экрана своим transform, а мы этот transform заменили на «по центру».
           Без opacity/visibility окно оставалось на экране мёртвым слоем —
           перехватывало прокрутку страницы и не давало себя закрыть. */
        opacity: 0; visibility: hidden;
    }
    .site-page .checkout.show { transform: none; opacity: 1; visibility: visible; }
    .site-page .checkout .co-head { grid-column: 1 / -1; }
    .site-page .checkout .co-body { grid-column: 1; grid-row: 2; padding: 10px 20px 20px; }
    /* Итоги — правая колонка на всю высоту окна, со своей прокруткой. */
    .site-page .checkout .co-foot {
        grid-column: 2; grid-row: 2;
        display: flex; flex-direction: column; overflow-y: auto;
        padding: 20px; border-top: 0; border-left: 1px solid var(--line);
        background: var(--surface-2, rgba(0,0,0,.02));
    }
    /* Промокод — вверху колонки, итоги и «Оплатить» — внизу, у края окна:
       кнопка оплаты не должна прилипать к полю промокода. */
    .site-page .checkout .co-foot .co-promo-group { margin-bottom: 16px; }
    .site-page .checkout .co-foot .co-summary-lines { margin-top: auto; }
    .site-page .checkout .co-line-img { width: 60px; height: 80px; }

    /* Прокрутка внутри окна не должна «пробивать» на страницу под ним:
       без contain, докрутив колонку до края, человек начинал листать сайт. */
    .site-page .checkout .co-body, .site-page .checkout .co-foot { overscroll-behavior: contain; }

    /* Способы оплаты — тремя компактными плитками в ряд: вертикальный список
       из трёх широких строк занимал половину колонки. Иконка уезжает наверх,
       галочка выбранного — в угол, чтобы не растягивать плитку по ширине. */
    /* Колонок ровно столько, сколько способов оплаты показано. Жёсткие три
       оставляли физлицу дыру в треть ряда: «По счёту» есть только у юрлиц. */
    .site-page .checkout #coPay { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 10px; }
    .site-page .checkout #coPay .co-opt { position: relative; flex-direction: column; align-items: flex-start; gap: 8px; padding: 14px; border-radius: 16px; }
    .site-page .checkout #coPay .co-opt .co-ic { width: 26px; height: 26px; color: var(--muted); }
    .site-page .checkout #coPay .co-opt.active .co-ic { color: var(--red); }
    .site-page .checkout #coPay .co-opt .co-ic .ic-svg { width: 22px; height: 22px; }
    .site-page .checkout #coPay .co-opt > span { font-size: 13.5px; line-height: 1.25; }
    .site-page .checkout #coPay .co-opt small { margin-top: 4px; font-size: 11.5px; line-height: 1.35; }
    .site-page .checkout #coPay .co-opt.active::after { position: absolute; top: 12px; right: 12px; margin: 0; font-size: 13px; }
    .site-page .checkout .co-foot .cart-total { margin: 10px 0 14px; font-size: 16px; }
    .site-page .checkout .co-foot .cart-total b { font-size: 26px; }
    /* Карта пунктов самовывоза в широкой колонке может быть выше. */
    .site-page .checkout .co-map { height: 300px; }

    /* ── ПО МАКЕТУ «Корзина и оформление.dc.html» ────────────────────
       Шаги — белыми карточками, правая колонка — одной сводкой с кнопкой,
       путём до шага и подсказкой, что будет после оплаты. */
    /* Крошки над оформлением ужимаем сверху: на десктопе под шапкой оставалось
       лишнее поле, и первый шаг заказа начинался ниже, чем нужно. */
    .site-page .checkout .co-head { display: flex; align-items: center; gap: 14px; padding: 2px 20px 0; }
    .site-page .checkout .co-head h3 { display: none; }
    .co-crumbs { display: flex; align-items: center; gap: 8px; font: 500 13px var(--sans); color: var(--muted); }
    .co-crumbs b { color: var(--ink); font-weight: 700; }
    .site-page .co-crumbs button { padding: 0; border: 0; background: none; color: var(--muted); font: inherit; cursor: pointer; }
    .site-page .co-crumbs button:hover { color: var(--red); }
    .site-page .checkout .co-body { display: flex; flex-direction: column; gap: 14px; }
    /* Шаги заказа — на том же сером, что и вся страница: белая плита под серым
       фоном спорила с правой колонкой и делала оформление тяжелее, чем оно
       есть. Карточки внутри при этом становятся белыми, иначе они растворяются
       в фоне и выбор перестаёт читаться. */
    .site-page .checkout .co-body > .co-group {
        padding: 26px; border: 1px solid var(--line); border-radius: 20px; background: var(--bg);
    }
    .site-page .checkout .co-body > .co-group .co-opt,
    .site-page .checkout .co-body > .co-group .co-opt-row,
    .site-page .checkout .co-body > .co-group .co-input,
    .site-page .checkout .co-body > .co-group .co-address-btn,
    .site-page .checkout .co-body > .co-group .co-contact-summary { background: var(--white); }
    .site-page .checkout .co-step-title { display: flex; align-items: center; gap: 12px; font: 700 18px var(--sans); color: var(--ink); }
    .site-page .checkout .co-step-num {
        display: grid; place-items: center; width: 30px; height: 30px; border-radius: 50%;
        background: var(--red); color: #fff; font: 800 14px var(--sans);
    }
    /* Правая колонка — карточка со сводкой, а не полоса у края окна. */
    .site-page .checkout .co-foot {
        padding: 0; border: 0; background: none; gap: 12px;
    }
    .site-page .checkout .co-foot > .co-promo-group,
    .site-page .checkout .co-summary-card {
        padding: 20px 24px; border: 1px solid var(--line); border-radius: 20px; background: var(--white);
    }
    .site-page .checkout .co-summary-card { box-shadow: 0 4px 16px rgba(14,23,48,.07); }
    .site-page .checkout .co-foot .co-summary-lines { margin-top: 0; }
    .site-page .checkout .co-summary-card .co-secure { margin: 10px 0 0; text-align: center; }
    .site-page .checkout .co-back-to-cart {
        padding: 0; border: 0; background: none; color: var(--muted);
        font: 700 13.5px var(--sans); cursor: pointer;
    }
    .site-page .checkout .co-back-to-cart:hover { color: var(--red); }
    .co-next { padding: 20px 24px; border: 1px solid var(--line); border-radius: 20px; background: var(--white); }
    .co-next b { font: 700 14.5px var(--sans); color: var(--ink); }
    .co-next ul { margin: 12px 0 0; padding: 0; list-style: none; display: grid; gap: 9px; }
    .co-next li { position: relative; padding-left: 20px; font-size: 13px; line-height: 1.55; color: var(--muted); }
    .co-next li::before { content: ""; position: absolute; left: 0; top: 7px; width: 6px; height: 6px; border-radius: 50%; background: var(--red); }

    /* Строка корзины: фотография, название, а справа — сумма и количество. */
    /* Ячейки строки app.css расставляет по номерам столбцов и строк —
       переопределяем их все, иначе сумма и количество уезжают под фотографию. */
    .site-page #cart .cart-item {
        display: grid; grid-template-columns: 104px minmax(0, 1fr) 190px;
        gap: 8px 18px; align-items: start; padding: 20px;
        border: 1px solid var(--line); border-radius: 20px; background: var(--white);
    }
    /* Фотография со своей рамкой: галочка и «удалить» отсчитываются от неё, а
       не от края строки — иначе у товаров с разными снимками они разъезжались. */
    .site-page #cart .ci-photo {
        position: relative; grid-column: 1; grid-row: 1 / span 2;
        width: 104px; height: 132px; border-radius: 14px; overflow: hidden;
    }
    .site-page #cart .ci-photo > img { width: 100%; height: 100%; border-radius: 0; object-fit: cover; }
    .site-page #cart .ci-check { position: absolute; top: 8px; left: 8px; z-index: 1; }
    .site-page #cart .ci-check input { box-shadow: 0 2px 8px rgba(14,23,48,.28); }
    .site-page #cart .ci-info { grid-column: 2; grid-row: 1; }
    .site-page #cart .cart-item { position: relative; }
    /* Корзинки в строке нет: товар убирают минусом до нуля или галочкой и
       корзинкой в панели сверху. Пустой блок значков не занимает места. */
    .site-page #cart .ci-actions:empty { display: none; }
    /* Правый столбец строки — своя колонка: сумма, количество и «Купить
       сейчас» друг под другом. Раскладку ячеек им задаёт app.css по номерам
       столбцов строки — внутри этого столбца она не нужна и разбрасывала их
       в ряд. */
    .site-page #cart .ci-side {
        grid-column: 3; grid-row: 1 / span 2;
        display: flex; flex-direction: column; align-items: flex-end; gap: 12px;
    }
    .site-page #cart .ci-side > * { grid-column: auto; grid-row: auto; }
    .site-page #cart .ci-sum { white-space: nowrap; }
    /* Кнопка ровно по ширине счётчика: разной ширины они смотрелись как две
       случайные детали. */
    .site-page #cart .ci-side > .cart-qty,
    .site-page #cart .ci-side > .ci-buy { width: 100%; min-height: 44px; }
    .site-page #cart .ci-side > .cart-qty { justify-content: space-between; }
    .site-page #cart .ci-buy { padding: 0 18px; }
    /* Название и размер занимают свою колонку целиком, а сумма стоит справа —
       без этого длинное название и сумма наезжали друг на друга. */
    .site-page #cart .ci-info { min-width: 0; }
    .site-page #cart .ci-name { font-size: 16px; line-height: 1.3; }
    .site-page #cart .ci-side { display: grid; justify-items: end; gap: 12px; }
    .site-page #cart .ci-sum { text-align: right; }
    .site-page #cart .ci-sum b { display: block; font: 800 19px var(--sans); letter-spacing: -.4px; color: var(--ink); }
    .site-page #cart .ci-sum s { display: block; margin-top: 3px; font-size: 13px; color: var(--muted); }
    .site-page #cart .ci-sum span { display: block; margin-top: 3px; font-size: 12.5px; color: var(--muted); }
    /* Цена за единицу уехала в правый столбец — в описании она дублировалась. */
    .site-page #cart .cart-item .ci-price { display: none; }
    .site-page #cart .site-cart-discount b { font-weight: 800; color: var(--red); }
    .site-page #cart .site-cart-note { margin: 12px 0 0; font-size: 12.5px; line-height: 1.55; color: var(--muted); }
}

/* ── ИНФОРМАЦИОННЫЕ СТРАНИЦЫ (о компании, доставка, самовывоз, опт, возврат) ──
   Раскладка, плашки и анимации перенесены из макетов, но собраны на нашей
   палитре, нашем шрифте и наших иконках (штриховые, как ICONS в app.js) —
   чтобы страницы читались как часть того же продукта, что и каталог. */
.site-page .screen.site-doc { width: 100%; max-width: none; padding: 0 0 72px; }
.site-doc .doc-body { width: min(1240px, 100%); margin: 0 auto; padding: 56px 20px; }
.site-doc .doc-band { background: var(--surface-2, rgba(0,0,0,.025)); border-block: 1px solid var(--line); }

/* Тёмный герой страницы — та же гамма, что у баннера акций на витрине. */
.site-doc .doc-hero { background: linear-gradient(120deg, var(--site-navy) 0%, var(--site-navy-2) 60%, #2a1420 130%); color: #fff; }
.site-doc .doc-hero-in { width: min(1240px, 100%); margin: 0 auto; padding: 64px 20px; display: grid; grid-template-columns: 1fr 1fr; gap: 56px; align-items: center; }
.site-doc .doc-hero-narrow { grid-template-columns: 1fr; max-width: min(900px, 100%); }
.site-doc .doc-eyebrow { margin: 0 0 14px; color: #ff6d64; font: 800 11px var(--sans); letter-spacing: .2em; text-transform: uppercase; }
.site-doc .doc-title { margin: 0; font: 800 46px/1.08 var(--sans); letter-spacing: -1.2px; color: #fff; }
.site-doc .doc-lead { margin: 20px 0 0; max-width: 620px; font-size: 16px; line-height: 1.7; color: rgba(255,255,255,.72); }
.site-doc .doc-hero-badge { display: inline-block; margin-top: 22px; padding: 10px 16px; border: 1px solid rgba(255,255,255,.2); border-radius: 999px; background: rgba(255,255,255,.08); font-size: 13px; font-weight: 700; }

/* Показатели в герое — красная линия слева, как в макете. */
.site-doc .doc-hero-nums { display: grid; grid-template-columns: 1fr 1fr; gap: 28px 24px; }
.site-doc .doc-hero-num { padding-left: 18px; border-left: 3px solid var(--red); }
.site-doc .doc-hero-num b { display: block; font: 800 42px/1 var(--sans); letter-spacing: -1.5px; color: #fff; }
.site-doc .doc-hero-num b i { font-style: normal; font-size: 26px; color: var(--red); }
.site-doc .doc-hero-num span { display: block; margin-top: 6px; font-size: 12.5px; line-height: 1.45; color: rgba(255,255,255,.5); }

/* Заголовок секции. */
.site-doc .doc-head { margin-bottom: 30px; }
.site-doc .doc-head h2 { display: flex; align-items: center; gap: 12px; margin: 0; font: 800 32px/1.15 var(--sans); letter-spacing: -.7px; color: var(--ink); }
.site-doc .doc-head p { margin: 12px 0 0; max-width: 620px; color: var(--muted); font-size: 15px; line-height: 1.6; }
.site-doc .doc-step-no { display: grid; place-items: center; flex: none; width: 36px; height: 36px; border-radius: 50%; background: var(--red); color: #fff; font: 800 17px var(--sans); }
.site-doc .doc-label { margin: 0 0 14px; color: var(--red); font: 800 11px var(--sans); letter-spacing: .2em; text-transform: uppercase; }
.site-doc .doc-body > p { margin: 14px 0 0; max-width: 820px; font-size: 15px; line-height: 1.75; color: var(--ink); }

/* Две колонки «текст + фото». */
.site-doc .doc-split { display: grid; grid-template-columns: 1fr 1fr; gap: 56px; align-items: start; }
.site-doc .doc-split h2 { margin: 0 0 18px; font: 800 32px/1.15 var(--sans); letter-spacing: -.7px; color: var(--ink); }
.site-doc .doc-split p { margin: 0 0 14px; font-size: 15px; line-height: 1.8; color: var(--muted); }
.site-doc .doc-split p:last-child { margin-bottom: 0; }
.site-doc .doc-split-img { border-radius: 20px; overflow: hidden; aspect-ratio: 4/3; background: var(--surface-2, #f0f2f5); }
.site-doc .doc-split-img img { width: 100%; height: 100%; object-fit: cover; }

/* Карточки с круглой иконкой — подъём и заливка иконки при наведении. */
.site-doc .doc-cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; }
.site-doc .doc-cards-2 { grid-template-columns: repeat(2, 1fr); }
.site-doc .doc-card { position: relative; padding: 28px; border: 1px solid var(--line); border-radius: 20px; background: var(--white); transition: transform .25s ease, box-shadow .25s ease, border-color .25s ease; }
.site-doc .doc-card:hover { transform: translateY(-3px); border-color: var(--red); box-shadow: 0 14px 34px rgba(14,23,48,.10); }
.site-doc .doc-ic { display: grid; place-items: center; width: 52px; height: 52px; margin-bottom: 18px; border-radius: 50%; background: rgba(225,37,27,.10); transition: background .25s ease; }
.site-doc .doc-card:hover .doc-ic { background: var(--red); }
/* Штрих и скругления — как у ICONS в app.js, чтобы иконки не выбивались. */
.site-doc .doc-ic svg { width: 24px; height: 24px; fill: none; stroke: var(--red); stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round; transition: stroke .25s ease; }
.site-doc .doc-card:hover .doc-ic svg { stroke: #fff; }
.site-doc .doc-card h3 { margin: 0; font-size: 17px; font-weight: 800; color: var(--ink); }
.site-doc .doc-card p { margin: 10px 0 0; font-size: 14px; line-height: 1.65; color: var(--muted); }
.site-doc .doc-card .doc-card-note { margin-top: 6px; color: var(--red); font-size: 13px; font-weight: 700; }
.site-doc .doc-card ul { margin: 14px 0 0; padding: 0; list-style: none; }
.site-doc .doc-card ul li { position: relative; padding: 6px 0 6px 22px; font-size: 14px; line-height: 1.5; color: var(--muted); }
.site-doc .doc-card ul li::before { content: ''; position: absolute; left: 0; top: 13px; width: 7px; height: 7px; border-radius: 50%; background: var(--red); }
.site-doc .doc-card-ok ul li::before { background: #2E8B3E; }
.site-doc .doc-card-no ul li::before { background: var(--muted); }
.site-doc .doc-num { display: grid; place-items: center; width: 34px; height: 34px; margin-bottom: 16px; border-radius: 50%; background: var(--red); color: #fff; font: 800 15px var(--sans); }

/* Таймлайн: вертикальная линия, точки, год в отдельной колонке. */
.site-doc .doc-timeline { position: relative; list-style: none; margin: 0; padding: 0 0 0 122px; }
.site-doc .doc-timeline::before { content: ''; position: absolute; left: 122px; top: 8px; bottom: 8px; width: 2px; background: var(--line); }
.site-doc .doc-timeline li { position: relative; padding: 0 0 34px 34px; }
.site-doc .doc-timeline li:last-child { padding-bottom: 0; }
.site-doc .doc-timeline b { position: absolute; left: -122px; top: 0; width: 100px; text-align: right; font: 800 20px var(--sans); color: var(--muted); }
.site-doc .doc-timeline .tl-dot { position: absolute; left: -7px; top: 6px; width: 14px; height: 14px; border-radius: 50%; background: var(--red); box-shadow: 0 0 0 4px rgba(225,37,27,.15); }
.site-doc .doc-timeline h3 { margin: 0; font-size: 17px; font-weight: 800; color: var(--ink); }
.site-doc .doc-timeline p { margin: 8px 0 0; max-width: 560px; font-size: 14px; line-height: 1.65; color: var(--muted); }

/* Пронумерованные шаги. */
.site-doc .doc-steps { margin: 0; padding: 0; list-style: none; counter-reset: step; display: grid; gap: 14px; }
.site-doc .doc-steps li { counter-increment: step; position: relative; padding: 24px 28px 24px 76px; border: 1px solid var(--line); border-radius: 20px; background: var(--white); transition: border-color .25s ease, box-shadow .25s ease; }
.site-doc .doc-steps li:hover { border-color: var(--red); box-shadow: 0 12px 30px rgba(14,23,48,.08); }
.site-doc .doc-steps li::before { content: counter(step, decimal-leading-zero); position: absolute; left: 28px; top: 24px; font: 800 20px var(--sans); color: var(--red); }
.site-doc .doc-steps h3 { margin: 0; font-size: 16px; font-weight: 800; color: var(--ink); }
.site-doc .doc-steps p { margin: 8px 0 0; font-size: 14px; line-height: 1.65; color: var(--muted); }

/* Таблица. */
.site-doc .doc-table { margin-top: 22px; border: 1px solid var(--line); border-radius: 20px; overflow: hidden; background: var(--white); }
.site-doc .doc-tr { display: flex; justify-content: space-between; gap: 16px; padding: 15px 24px; border-bottom: 1px solid var(--line); font-size: 15px; color: var(--ink); }
.site-doc .doc-tr > * { flex: 1; }
.site-doc .doc-tr > *:last-child { text-align: right; }
.site-doc .doc-tr:last-child { border-bottom: 0; }
.site-doc .doc-th { background: var(--surface-2, rgba(0,0,0,.03)); color: var(--muted); font-size: 12.5px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; }
.site-doc .doc-tr span { color: var(--muted); }
.site-doc .doc-tr b { color: var(--ink); }

.site-doc .doc-note { margin-top: 22px; padding: 16px 20px; border-left: 3px solid var(--red); border-radius: 0 14px 14px 0; background: rgba(225,37,27,.06); font-size: 14px; line-height: 1.6; color: var(--ink); }

.site-doc .doc-cta { margin-top: 52px; padding: 48px; border-radius: 22px; text-align: center; color: #fff; background: linear-gradient(120deg, var(--site-navy) 0%, var(--site-navy-2) 55%, var(--red-dark) 130%); }
.site-doc .doc-cta h2 { margin: 0; font: 800 30px/1.15 var(--sans); letter-spacing: -.6px; color: #fff; }
.site-doc .doc-cta p { margin: 12px 0 24px; color: rgba(255,255,255,.75); font-size: 15px; }

@media (max-width: 1023px) {
    .site-doc .doc-hero-in { grid-template-columns: 1fr; gap: 36px; padding: 48px 20px; }
    .site-doc .doc-cards { grid-template-columns: repeat(2, 1fr); }
    .site-doc .doc-split { grid-template-columns: 1fr; gap: 32px; }
}
@media (max-width: 640px) {
    .site-doc .doc-title { font-size: 32px; letter-spacing: -.8px; }
    .site-doc .doc-head h2, .site-doc .doc-split h2 { font-size: 25px; }
    .site-doc .doc-hero-nums { grid-template-columns: 1fr; gap: 20px; }
    .site-doc .doc-cards, .site-doc .doc-cards-2 { grid-template-columns: 1fr; }
    .site-doc .doc-body { padding: 40px 20px; }
    .site-doc .doc-timeline { padding-left: 26px; }
    .site-doc .doc-timeline::before { left: 26px; }
    .site-doc .doc-timeline b { position: static; display: block; width: auto; margin-bottom: 6px; text-align: left; }
    .site-doc .doc-cta { padding: 30px 20px; }
    .site-doc .doc-tr { flex-direction: column; gap: 4px; }
    .site-doc .doc-tr > *:last-child { text-align: left; }
}
/* ── ГЕРОЙ ────────────────────────────────────────────────────────── */
/* Пока видео (1.8 МБ) грузится отложенно, за ним стоит фирменный градиент, а
   не кадр-заглушка: фотография успевала мелькнуть и подмениться видео, и это
   бросалось в глаза сильнее, чем спокойный тёмный фон. Видео проявляется
   поверх, когда действительно начало играть. */
.site-hero { position: relative; height: 72vh; min-height: 460px; max-height: 760px; display: flex; align-items: center; overflow: hidden; background: var(--site-navy); }
.site-hero .hero-media { background: linear-gradient(125deg, #0E1730 0%, #14213D 48%, #1B2E52 100%); }
.site-hero .hero-media video { opacity: 0; transition: opacity .6s ease; }
.site-hero .hero-media video.ready { opacity: 1; }
.site-hero .hero-media { position: absolute; inset: 0; z-index: 0; overflow: hidden; }
.site-hero .hero-media video { width: 100%; height: 100%; object-fit: cover; }
.site-hero .hero-media .scrim { position: absolute; inset: 0; background: linear-gradient(100deg, rgba(14,23,48,.86) 0%, rgba(14,23,48,.55) 55%, rgba(14,23,48,.15) 100%); }
.site-hero .eyebrow { display: inline-flex; align-items: center; gap: 8px; color: rgba(255,255,255,.75); font: 700 12px var(--sans); }
.site-hero .eyebrow .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--red); box-shadow: 0 0 0 4px rgba(225,37,27,.3); }
.site-hero h1 { margin: 16px 0 0; font: 700 58px/1.05 var(--disp); text-transform: uppercase; color: #fff; max-width: 640px; }
.site-hero h1 .accent { color: var(--red); }
/* Абзац лежит на полупрозрачной плашке с размытием — как в приложении
   (.hero p.lead в app.css). Без неё текст читался прямо по видео. */
/* Перенос строки задан в разметке (<br>), поэтому fit-content даёт ширину
   ровно по самой длинной строке, без пустой полосы справа. */
.site-hero .lead {
    display: block; width: fit-content; max-width: 100%;
    margin: 16px 0 0; padding: 14px 18px;
    font-size: 16px; line-height: 1.55; color: rgba(255,255,255,.92);
    background: rgba(255,255,255,.10);
    -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px);
    border: 1px solid rgba(255,255,255,.16); border-radius: 22px;
}
.site-hero .hero-greeting { margin: 16px 0 0; }
/* Текст героя прижат к левому краю контентной колонки. width обязателен:
   .container здесь — flex-элемент, и без явной ширины он сжимается по
   содержимому, а margin:auto центрует его — из-за этого текст «уезжал»
   в середину экрана вместо левого края. */
.site-hero-content { position: relative; z-index: 1; width: min(1240px, 100%); text-align: left; }
/* Затемнение у нижнего края — без него подсказка «Листать» терялась на
   светлых кадрах видео. */
.site-hero::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 190px; background: linear-gradient(to top, rgba(10,15,28,.82), rgba(10,15,28,.35) 45%, transparent); pointer-events: none; }
/* Подсказка «Листать» лежит поверх видео, а кадр бывает и тёмным, и почти
   белым (стена склада). Раньше полоска была полупрозрачно-белой и на светлых
   кадрах пропадала вместе с бегущим по ней бликом — со стороны выглядело так,
   будто анимация сломалась. Теперь у полоски своя тёмная подложка со светлым
   контуром, а у текста — тень: читаются на любом кадре. */
.site-hero-hint { position: absolute; z-index: 2; bottom: 22px; left: 0; right: 0; display: flex; flex-direction: column; align-items: center; gap: 8px; color: #fff; font: 700 10px var(--sans); letter-spacing: .1em; text-transform: uppercase; text-shadow: 0 1px 6px rgba(8,14,34,.6); }
.scroll-line { width: 3px; height: 38px; border-radius: 3px; background: rgba(8,14,34,.45); box-shadow: 0 0 0 1px rgba(255,255,255,.35), 0 2px 8px rgba(8,14,34,.35); position: relative; overflow: hidden; }
.scroll-line::after { content: ''; position: absolute; top: -100%; left: 0; width: 100%; height: 60%; background: linear-gradient(to bottom, rgba(255,255,255,0), #fff 45%, #fff 55%, rgba(255,255,255,0)); animation: scrollDrop 1.6s 1.4s ease infinite; }
@keyframes scrollDrop { 0% { top: -50%; } 100% { top: 150%; } }

/* ── БЕГУЩАЯ СТРОКА + БАННЕР АКЦИЙ (без зазора, во всю ширину) ────── */
.ticker { background: var(--site-navy); overflow: hidden; height: 40px; display: flex; align-items: center; }
.ticker-track { display: flex; white-space: nowrap; animation: tickerRoll 26s linear infinite; }
/* Пауза под курсором убрана намеренно: строка живёт во всю ширину страницы,
   и мышь оказывается над ней просто по пути — со стороны это выглядело как
   зависший сайт, а не как «остановил, чтобы прочитать». */
.t-item { display: inline-flex; align-items: center; }
.t-text { font: 700 11px var(--sans); letter-spacing: .08em; text-transform: uppercase; color: rgba(255,255,255,.55); padding: 0 22px; }
.t-dot { color: var(--red); }
@keyframes tickerRoll { 0% { transform: translateX(0); } 100% { transform: translateX(-50%); } }

/* color/text-decoration заданы явно: баннер — ссылка <a>, и без них он
   получал бы системный синий цвет и подчёркивание поверх градиента. */
/* display здесь намеренно НЕ задаём: показом баннера управляет только пара
   правил выше (скрыт по умолчанию, flex на витрине). Иначе это правило,
   стоящее ниже и с той же специфичностью, перебивало бы скрытие, и баннер
   висел бы на всех экранах — в профиле, корзине и поддержке тоже. */
.site-page .promo-banner {
    width: 100%;
    align-items: center; justify-content: space-between; gap: 16px;
    padding: 28px max(20px, calc((100vw - 1240px) / 2 + 20px));
    background: linear-gradient(120deg, var(--site-navy) 0%, var(--site-navy-2) 55%, var(--red-dark) 130%);
    color: #fff; text-decoration: none;
}
.site-page .promo-banner:hover .promo-cta { background: rgba(255,255,255,.26); }
.promo-content { display: flex; flex-direction: column; gap: 6px; color: #fff; }
.promo-content .t { font: 700 12px var(--sans); text-transform: uppercase; letter-spacing: .1em; color: rgba(255,255,255,.7); }
.promo-content .h { font: 700 24px var(--disp); text-transform: uppercase; }
.promo-cta { flex: none; padding: 10px 20px; border-radius: 999px; background: rgba(255,255,255,.16); color: #fff; font: 700 13px var(--sans); white-space: nowrap; }

/* ── СЕКЦИИ: хиты и умная лента (компоненты — из app.css) ─────────── */
/* Хиты — та же горизонтальная карусель, что и в приложении (.hits из app.css).
   Свои отступы 20px и ограничение ширины 1120px из app.css здесь сбрасываем:
   иначе лента вложена в .container с такими же отступами и выглядит зажатой
   и сдвинутой, а не во всю ширину контентной колонки. */
.site-page .hits-head { width: auto; margin: 0 0 16px; padding: 0; }
.site-page .hits-head .t { font: 700 22px/1.2 var(--sans); letter-spacing: -.3px; text-transform: none; }
.site-page .hits-head .t [data-ic] svg { width: 20px; height: 20px; }
.site-page .hits { width: auto; margin: 0; padding: 0 0 6px; }
.site-page .hit-card { width: 210px; }
/* «Умная лента» — заголовок раздела, а не подпись-счётчик: крупнее, чем
   такая же строка в каталоге приложения. */
.site-page .count-row { margin-bottom: 20px; align-items: baseline; }
.site-page .count-row .t { font: 700 22px/1.2 var(--sans); letter-spacing: -.3px; text-transform: none; }
.site-page .grid { width: auto; margin: 0; padding: 0; grid-template-columns: repeat(5, 1fr); gap: 16px; }

/* ── ПОДВАЛ ───────────────────────────────────────────────────────── */
.ftr { background: var(--site-navy); color: rgba(255,255,255,.7); padding: 48px 0 20px; }
/* align-items: start — иначе колонки растягиваются на высоту самой длинной
   и их содержимое «съезжает» относительно друг друга. */
.site-page .ftr-cols { display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr; align-items: start; gap: 32px; padding: 0 20px; margin-bottom: 8px; }
.ftr h5 { font: 700 11px var(--sans); color: #fff; text-transform: uppercase; letter-spacing: .06em; margin-bottom: 12px; }
.ftr ul { list-style: none; display: flex; flex-direction: column; gap: 8px; margin: 0; padding: 0; font-size: 13px; }
/* Явный цвет обязателен: tel:/mailto: без него получают системный синий
   цвет ссылок, который на тёмном подвале выглядит чужеродно. */
.site-page .ftr a, .site-page .ftr ul a, .site-page .ftr-link { appearance: none; -webkit-appearance: none; border: 0; background: none; padding: 0; font: inherit; text-align: left; cursor: pointer; color: rgba(255,255,255,.7); text-decoration: none; }
.site-page .ftr a:hover, .site-page .ftr ul a:hover, .site-page .ftr-link:hover { color: #fff; }
.site-page .ftr-copy a, .site-page .ftr-legal { appearance: none; -webkit-appearance: none; border: 0; background: none; padding: 0; font: inherit; cursor: pointer; color: rgba(255,255,255,.55); text-decoration: underline; text-underline-offset: 3px; }
.site-page .ftr-copy a:hover, .site-page .ftr-legal:hover { color: #fff; }
/* Подвал всегда тёмный — берём готовый вариант лого с белой надписью.
   Никаких фильтров: они бы ещё раз перекрасили уже белый текст в чёрный,
   а фирменный красный знак увели бы в грязно-тёмный оттенок. */
.ftr-logo img { height: 38px; width: auto; margin-bottom: 14px; }
.ftr-about { font-size: 13px; line-height: 1.6; max-width: 280px; color: rgba(255,255,255,.55); }
.ftr-stores { display: flex; flex-wrap: wrap; gap: 8px; }
.ftr-store { display: flex; align-items: center; gap: 8px; min-height: 44px; padding: 8px 14px; border: 1px solid rgba(255,255,255,.14); border-radius: 10px; background: rgba(255,255,255,.08); color: #fff; font: 700 11px var(--sans); }
.ftr-store:hover { background: rgba(255,255,255,.14); }
.ftr-store img { height: 22px; width: auto; }
.ftr-store.is-disabled { opacity: .6; cursor: default; }
/* .ftr-copy и .ftr-cols — это .container, у которого свои margin/padding с
   более высокой специфичностью: без .site-page отступы этих строк обнулялись,
   и «© 2008–2026 …» прилипало к разделительной линии. */
.site-page .ftr-copy { border-top: 1px solid rgba(255,255,255,.12); margin-top: 28px; padding: 28px 20px 24px; font-size: 12px; line-height: 1.8; color: rgba(255,255,255,.45); display: flex; justify-content: space-between; gap: 12px 28px; flex-wrap: wrap; }
/* Подвал показывается только после того, как лента догрузилась до конца —
   иначе при быстрой прокрутке он на долю секунды «подпрыгивал» вверх,
   пока подгружалась следующая страница товаров. */
.ftr { display: none; }
.ftr.show { display: block; }

/* ── АДАПТИВ ──────────────────────────────────────────────────────── */
@media (max-width: 1200px) {
    .site-page .hits, .site-page .grid { grid-template-columns: repeat(4, 1fr); }
}
@media (max-width: 1023px) {
    .site-hero h1 { font-size: 42px; }
    .site-page .hits, .site-page .grid { grid-template-columns: repeat(3, 1fr); }
    .ftr-cols { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 767px) {
    .hdr-in { flex-wrap: wrap; height: auto; padding: 10px 0; gap: 10px; }
    .site-page .hdr .search-wrap { order: 3; width: 100%; }
    .acts { gap: 14px; }
    .act > span:last-child { display: none; }
    .hdr-row2-in { flex-wrap: wrap; height: auto; padding: 8px 0; gap: 8px; }
    .quick-links { flex-wrap: wrap; gap: 12px; }
    .topbar-address { margin-left: 0; }
    .site-hero { height: auto; padding: 44px 0 56px; min-height: 0; }
    .site-hero h1 { font-size: 32px; }
    .site-page .hits, .site-page .grid { grid-template-columns: repeat(2, 1fr); gap: 10px; }
    .promo-banner { flex-direction: column; align-items: flex-start; padding: 24px 20px; }
    .ftr-cols { grid-template-columns: 1fr; }
}

/* ── ТОЧЕЧНЫЕ ПРАВКИ ВИТРИНЫ И ЭКРАНОВ ────────────────────────────── */
/* Адрес доставки живёт в шапке сайта — в корзине второй такой же не нужен. */
.site-page .cart-address { display: none !important; }

/* Баннер акций и полоса приложения идут одной лентой, без зазора между ними:
   отступ до блока хитов держит уже сама полоса. */
.site-page.site-showcase .promo-banner { margin-bottom: 0; }

/* «Лента» и счётчик позиций — по краям сетки карточек: у .count-row из
   app.css свои боковые отступы 20px, из-за которых заголовок стоял левее
   первой карточки, а счётчик — правее последней. */
.site-page #catalog .count-row { width: auto; margin-left: 0; margin-right: 0; padding-left: 0; padding-right: 0; }

/* ── ПРАВКИ ПОСЛЕ ПЕРЕНОСА СТРАНИЦ ИЗ МАКЕТОВ ─────────────────────── */
/* Заголовок личного кабинета — по центру карточки, а не у левого края. */
.site-page #profile .web-cabinet-login { text-align: center; }
.site-page #profile .web-cabinet-login h2 { text-align: center; }

/* Стрелка «назад» на перенесённых страницах — вплотную к левому краю
   контентной колонки, а не с отступом контейнера. */
.site-page.site-doc-active .site-backbar .container { padding-left: 8px; }

/* Тёмные блоки в конце страниц стыкуются с подвалом без светлой щели. */
.site-page.site-doc-active .screen.active > *:last-child { margin-bottom: 0; }
.site-page.site-doc-active .ftr { margin-top: 0; }
.site-doc .cta-section, .site-doc .cta-block, .site-doc .about-cta,
.site-doc .contacts-cta, .site-doc .wholesale-cta { margin-bottom: 0 !important; }

/* ── СТЫКОВКА И ПАЛИТРА ПЕРЕНЕСЁННЫХ СТРАНИЦ ──────────────────────── */
/* Финальные баннеры страниц — в той же тёмной гамме, что баннер акций и
   подвал, а не сплошным ярко-красным: так они читаются как один блок с
   подвалом, а не как чужая вставка. */
.site-doc .about-cta, .site-doc .cta-band, .site-doc .contacts-cta, .site-doc .ws-cta {
    background: linear-gradient(120deg, var(--site-navy) 0%, var(--site-navy-2) 55%, var(--red-dark) 130%) !important;
    margin-bottom: 0 !important;
}
/* Между последним блоком страницы и подвалом не должно быть светлой щели. */
.site-page.site-doc-active .screen.active { padding-bottom: 0; }
.site-doc > *:last-child { margin-bottom: 0; }

/* Плюсы и «т» в крупных числах были почти вровень с самой цифрой. */
.site-doc .num-val em, .site-doc .hero-num-val span { font-size: 46%; vertical-align: super; margin-left: 2px; }

/* Номера шагов на «Возврате» — кружком в фирменном красном вместо
   блёклого серого квадрата. !important: в перенесённых стилях это правило
   задано селектором с id (#pageReturn .step-num), который иначе выигрывает. */
.site-doc .step-num {
    width: 34px !important; height: 34px !important; border-radius: 50% !important;
    background: var(--red) !important; color: #fff !important;
    font: 800 13px var(--sans) !important; letter-spacing: 0 !important;
}

/* Липкая панель разделов «Возврата» прижата к нашей шапке и такая же
   полупрозрачная; на этой странице скругление низа шапки убираем, иначе
   панель стыкуется с ней по дуге. Высота шапки разная на десктопе и телефоне,
   поэтому берём её из переменной — иначе панель либо висела бы с зазором,
   либо уезжала под шапку. */
.site-page { --sec-nav-top: 68px; }
.site-doc .sec-nav {
    top: var(--sec-nav-top) !important;
    background: color-mix(in srgb, var(--bg) 72%, transparent) !important;
    -webkit-backdrop-filter: blur(16px) saturate(180%); backdrop-filter: blur(16px) saturate(180%);
    border-bottom: 1px solid var(--line) !important;
}
.site-page.site-doc-active:has(#pageReturn.active) .hdr { border-radius: 0; }

/* Иконки макетов — в нашей палитре и с нашей толщиной штриха. */
.site-doc svg[stroke]:not([stroke="none"]) { stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round; }
.site-doc .value-icon svg, .site-doc .pay-ic svg, .site-doc .adv-ic svg { stroke: var(--red); }

/* ── ФИНАЛЬНАЯ ОТДЕЛКА ПЕРЕНЕСЁННЫХ СТРАНИЦ ───────────────────────── */
/* Плюсы у крупных чисел стояли по базовой линии и «съезжали» вниз. */
.site-doc .num-val em, .site-doc .hero-num-val span { vertical-align: middle !important; position: relative; top: -.32em; }

/* Способ оплаты раскрывается поверх сетки, а не раздвигает её: раньше
   открытие одной карточки сдвигало вниз все соседние в той же строке. */
.site-doc .pay-card { position: relative; }
.site-doc .pay-card.open { z-index: 5; }
.site-doc .pay-card.open .pay-card-body {
    position: absolute; left: -1px; right: -1px; top: 100%;
    max-height: none !important; overflow: visible;
    background: var(--white); border: 1px solid var(--red); border-top: 0;
    border-radius: 0 0 14px 14px; box-shadow: 0 18px 40px rgba(14,23,48,.16);
    animation: payDrop .2s ease;
}
@keyframes payDrop { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } }

/* Иконки-значки в блоках «Возврата» стояли выше первой строки текста. */
.site-doc .warn-box, .site-doc .note-box, .site-doc .info-box,
.site-doc .kit-note, .site-doc .contact-note { display: flex; align-items: center; gap: 12px; }
.site-doc .warn-box svg, .site-doc .note-box svg, .site-doc .info-box svg,
.site-doc .kit-note svg, .site-doc .contact-note svg { flex: none; align-self: center; margin-top: 0 !important; }

/* Стрелка «назад» — в одну строку с первой надписью страницы. */
.site-page.site-doc-active .site-backbar { height: auto; padding: 0; }
.site-page.site-doc-active .site-backbar .container { padding: 0; }
.site-page.site-doc-active .site-back { position: absolute; top: 62px; left: max(12px, calc((100vw - 1240px) / 2 - 30px)); }

/* Заголовки оптовой страницы были заметно крупнее остальных страниц. */
.site-doc#pageWholesale h1 { font-size: 40px !important; letter-spacing: -1px; }
.site-doc#pageWholesale h2 { font-size: 26px !important; }
.site-doc#pageWholesale .num-val { font-size: 38px !important; }

/* Профиль: пока человек не вошёл, заголовок «Личный кабинет» над карточкой
   лишний — он уже есть внутри самой карточки. Лежит он не прямым потомком
   экрана, а внутри .sticky-head > button.page-head, поэтому и селектор такой.
   У вошедшего клиента этот блок оставляем: там аватар и имя, и по нему
   открывается редактирование профиля. */
.site-page:not(.profile-authenticated) #profile .sticky-head { display: none; }
.site-page #profile .web-cabinet-login h2 { font-size: 22px; letter-spacing: -.2px; }

/* ── КОРЗИНА ─────────────────────────────────────────────────────────
   Две колонки, как на Ozon: слева товары, справа сводка с кнопкой оформления.
   Разметка та же, что в приложении, — узлы просто разложены по колонкам в
   buildCartLayout() (assets/site.js), поэтому все обработчики app.js живы. */
/* Сетка — на самом .wrap, строками: заголовок / панель выбора / товары со
   сводкой / рекомендации во всю ширину. */
.site-cart { display: grid; grid-template-columns: minmax(0, 1fr) 340px; align-items: start; column-gap: 24px; }
.site-cart > .site-cart-title { grid-column: 1 / -1; grid-row: 1; }
.site-page .site-cart > .cart-toolbar { grid-column: 1; grid-row: 2; }
.site-cart > .site-cart-main { grid-column: 1; grid-row: 3; min-width: 0; }
/* Сводка стоит в той же строке, что и список товаров: верхний край вровень
   с первой карточкой. Ровно одна строка — ниже во всю ширину идут
   рекомендации, и растянутая колонка налезала бы на них. */
.site-cart > .site-cart-side { grid-column: 2; grid-row: 3; }
.site-cart > #cartRecoCarousel { grid-column: 1 / -1; grid-row: 4; }
/* «Вы смотрели» — следующей строкой под рекомендациями, во всю ширину. Без
   явного места сетка ставила блок в первую свободную ячейку — он оказывался
   справа над сводкой, а в левой колонке оставалась дыра на всю его высоту. */
.site-cart > #cartViewedCarousel { grid-column: 1 / -1; grid-row: 5; }
/* Пустая корзина — правой колонки нет (#cartFoot без .show), сетка схлопывается. */
.site-cart:not(:has(#cartFoot.show)) { grid-template-columns: minmax(0, 1fr); }
.site-cart:not(:has(#cartFoot.show)) .site-cart-side { display: none; }
.site-cart-title { display: flex; align-items: center; gap: 12px; margin: 0 0 14px; font: 800 30px/1.1 var(--sans); letter-spacing: -.7px; color: var(--ink); }
.site-cart-title span { font: 600 15px var(--sans); letter-spacing: 0; color: var(--muted); }
.site-page .site-cart-title .site-back { flex: none; margin-left: -8px; }
.site-page #cart .cart-toolbar { padding: 0 0 14px; }
/* Шапка экрана в приложении несёт адрес доставки; на сайте адрес скрыт, а
   панель выбора вынесена наверх — от .sticky-head остаётся пустая полоса. */
.site-page #cartStickyHead { display: none; }
/* Экран корзины начинается сразу под стрелкой «назад», без лишнего воздуха. */
.site-page #cart.screen.active { padding-top: 0; }
/* Товары крупнее, чем на телефоне: 96×128 — те же 3:4, что и карточки ленты,
   просто читаемого на десктопе размера. */
.site-page .site-cart .cart-item { grid-template-columns: auto 96px minmax(0, 1fr) auto; padding: 16px; }
.site-page .site-cart .cart-item img { width: 96px; height: 128px; border-radius: 16px; }
/* Управление товаром — правой колонкой: количество и иконки в строку, под ними
   «Купить». На телефоне они идут отдельными строками под карточкой. */
.site-page .site-cart .ci-actions { grid-column: 4; grid-row: 1; justify-content: flex-end; gap: 8px; }
.site-page .site-cart .ci-buy { grid-column: 4; grid-row: 2; align-self: end; width: 100%; min-width: 190px; }

/* Правая колонка закреплена на уровне первого товара: список прокручивается,
   а сводка с кнопкой оформления остаётся на месте. top — высота залипающей
   шапки сайта плюс воздух. В приложении это фиксированная плашка внизу
   экрана (.cart-foot-fixed), здесь — липкая карточка сбоку. */
/* Сводка — обычный блок в потоке: стоит справа от первого товара и уезжает
   вверх вместе со страницей. Ни sticky, ни fixed: панель, висящая на экране
   до самого низа страницы, здесь не нужна. */
.site-page .site-cart-side { position: static; }
.site-page #cartFoot { position: static; left: auto; right: auto; bottom: auto; width: auto; transform: none; display: none; gap: 4px; padding: 20px; border: 1px solid var(--line); border-radius: 20px; box-shadow: 0 10px 30px rgba(14,23,48,.07); }
.site-page #cartFoot.show { display: flex; }
.site-page #cartFoot .cart-total { margin: 8px 0 14px; font-size: 16px; }
.site-page #cartFoot .cart-total b { font-size: 24px; }

/* Рекомендации — во всю ширину под обеими колонками. */
.site-page #cart #cartRecoCarousel { margin-top: 40px; }
.site-page #cart #cartRecoCarousel .pc-title { font-size: 22px; font-weight: 800; letter-spacing: -.4px; }

/* На телефоне итог и кнопка оформления закреплены внизу экрана: список
   товаров длинный, и до кнопки приходилось листать до самого конца. Нижней
   панели вкладок на сайте нет, поэтому плашка стоит у самого низа. */
@media (max-width: 767px) {
    .site-page #cartFoot.show {
        position: fixed; z-index: 60; right: 0; bottom: calc(var(--site-tabbar-height, 62px) + env(safe-area-inset-bottom));
        left: 0; display: grid; box-sizing: border-box; gap: 10px; padding: 12px 14px;
        border: 0; border-top: 1px solid #e6e9ef; border-radius: 0;
        background: rgba(255, 255, 255, .98); box-shadow: 0 -8px 24px rgba(14, 23, 48, .1);
    }
    /* Разбивку по строкам («Товары», «Доставка») в плашке не держим: на
       телефоне она съедала половину экрана ради того, что и так написано в
       оформлении. Остаётся итог и кнопка — одной строкой. */
    .site-page #cartFoot #cartSummaryLines,
    .site-page #cartFoot .co-summary-lines,
    .site-page #cartFoot .co-secure { display: none; }
    .site-page #cartFoot.show { flex-direction: row; }
    .site-page #cartFoot .cart-total { display: flex; align-items: center; justify-content: space-between; width: auto; margin: 0; font-size: 14px; font-weight: 800; }
    .site-page #cartFoot .cart-total b { font-size: 21px; letter-spacing: -.5px; }
    .site-page #cartFoot .btn { width: 100%; min-height: 52px; border-radius: 14px; font-size: 15.5px; }
    /* Место под плашку, иначе она накрывает последний товар и рекомендации. */
    .site-page #cart .site-cart { padding-bottom: 210px; }
}

@media (max-width: 1023px) {
    .site-cart { grid-template-columns: minmax(0, 1fr); }
    .site-cart > .site-cart-side { grid-column: 1; grid-row: auto; }
    .site-cart > #cartRecoCarousel,
    .site-cart > #cartViewedCarousel { grid-row: auto; }
    /* На узком экране колонок нет — сводка просто идёт в потоке под списком. */
    .site-page .site-cart-side { position: static; width: auto; }
    .site-page .site-cart .cart-item { grid-template-columns: auto 96px minmax(0, 1fr); }
    .site-page .site-cart .ci-actions { grid-column: 1 / -1; grid-row: 2; flex-direction: row; align-items: center; }
    .site-page .site-cart .ci-buy { grid-column: 1 / -1; grid-row: 3; justify-self: stretch; width: 100%; }
}

/* На телефоне действия товара идут одной строкой: избранное, счётчик и
   «Купить сейчас». Раньше кнопка занимала отдельную строку во всю ширину, и
   одна карточка съедала пол-экрана — до сводки приходилось листать. */
/* Карточка товара в корзине по макету: чекбокс, вертикальное фото 66 × 82,
   название с размером и ценой. Вторая строка — счётчик слева, «в избранное» и
   «удалить» справа. Кнопки покупки здесь нет: товар оформляют одной кнопкой
   внизу, а на телефоне лишняя красная кнопка в каждой карточке только
   отвлекала от неё. */
@media (max-width: 767px) {
    .site-page .site-cart .cart-item { grid-template-columns: auto 66px minmax(0, 1fr); gap: 8px 12px; padding: 13px; border-radius: 16px; }
    .site-page .site-cart .ci-actions { grid-column: 1 / -1; grid-row: 2; align-items: center; justify-content: flex-start; gap: 10px; }
    /* Счётчик — слева, иконки прижаты к правому краю. */
    .site-page .site-cart .ci-actions > .qty, .site-page .site-cart .ci-actions > .cart-qty { order: 1; }
    .site-page .site-cart .ci-actions > button, .site-page .site-cart .ci-actions > .ci-fav, .site-page .site-cart .ci-actions > .ci-remove { order: 2; }
    .site-page .site-cart .ci-actions > :nth-child(2) { margin-left: auto; }
    .site-page .site-cart .ci-buy { display: none; }
    .site-page .site-cart .cart-item .ci-title { font-size: 14px; line-height: 1.3; }
    .site-page .site-cart .cart-item .ci-spec, .site-page .site-cart .cart-item .ci-unit { font-size: 12px; }
    /* Фото не должно вылезать за свою колонку: оно раздвигало сетку, и
       название с размером сыпались по одному слову в строку. */
    .site-page .site-cart .cart-item .ci-photo,
    .site-page .site-cart .cart-item img { width: 66px; max-width: 66px; height: 82px; border-radius: 12px; object-fit: cover; }
}

/* Карточка товара на телефоне: внизу только цена и «В корзину» — как в
   макете. Раньше в панели стояли пять блоков во всю ширину («В корзину», срок
   доставки, «Купить сейчас» с пояснением, «Наша доставка», «Экспресс») и
   занимали пол-экрана. Способы купить никуда не делись: они переехали в саму
   карточку, под цену и наличие (см. placeProductBuyOptions в site.js). */
@media (max-width: 767px) {
    .site-page #product .co-foot {
        position: fixed; z-index: 20; right: 0; bottom: calc(var(--site-tabbar-height, 62px) + env(safe-area-inset-bottom));
        left: 0; display: flex; box-sizing: border-box; flex-direction: column; align-items: stretch; gap: 8px;
        padding: 10px 14px 12px; border-top: 1px solid #e6e9ef;
        background: rgba(255, 255, 255, .98); box-shadow: 0 -8px 24px rgba(14, 23, 48, .1);
    }
    /* Кнопка чата поверх панели покупки не нужна: две круглые кнопки в углу
       спорили с «В корзину». Нижнее меню при этом остаётся, как в макете. */
    .site-page.product-open .site-chat-fab { display: none; }
    .site-page #product .co-foot .pr-foot-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
    /* Цена в две строки, как в самой карточке: сверху мелко старая цена со
       скидкой, под ней крупно та, что человек заплатит. */
    .site-page #product .co-foot .pr-foot-price { display: flex; flex: 1 1 auto; flex-direction: column; align-items: flex-start; gap: 2px; min-width: 0; line-height: 1.15; }
    .site-page #product .co-foot .pr-foot-was { display: flex; align-items: center; gap: 8px; }
    .site-page #product .co-foot .pr-foot-now { color: var(--red); font-size: 20px; font-weight: 800; letter-spacing: -.5px; white-space: nowrap; }
    .site-page #product .co-foot .pr-foot-old { color: var(--muted); font-size: 13px; font-weight: 600; white-space: nowrap; }
    .site-page #product .co-foot .pr-foot-off {
        padding: 2px 7px; border-radius: 7px; background: rgba(214, 69, 56, .12);
        color: var(--red); font-size: 11.5px; font-style: normal; font-weight: 800; white-space: nowrap;
    }
    .site-page #product .co-foot .pr-cart-control .btn { width: 100%; min-height: 52px; border-radius: 14px; font-size: 15.5px; }
    /* У товара без остатка покупки нет — в панели остаётся заявка менеджеру.
       Выглядит она как обычная покупка: сверху цена, под ней два действия во
       всю ширину. Срок доставки и пояснение про менеджера отсюда убраны: срока
       у товара, которого нет на складе, всё равно нет, а пояснение занимало
       треть панели и оттесняло сами кнопки вниз. */
    .site-page #product .co-foot #prFootExtra { display: flex; flex-wrap: wrap; gap: 8px; margin: 0; }
    .site-page #product .co-foot #prFootExtra > * { flex: 1 1 auto; min-width: 0; }
    .site-page #product .co-foot .pr-delivery-estimate,
    .site-page #product .co-foot .pr-order-request > small { display: none; }
    .site-page #product .co-foot .pr-order-request { display: flex; flex: 1 1 100%; flex-wrap: wrap; gap: 8px; margin: 0; }
    .site-page #product .co-foot .pr-order-request > button { flex: 1 1 0; min-width: 0; min-height: 52px; margin: 0; border-radius: 14px; }
    /* Счётчик количества появляется по нажатию — ему нужна своя строка. */
    .site-page #product .co-foot .pr-order-request-qty { flex: 1 1 100%; }
    /* Запас под панель покупки и нижнее меню под ней. */
    .site-page #product .pr-body { padding-bottom: 190px; }

    /* Способы купить внутри карточки: сразу под ценой и наличием, до описания
       и характеристик. Строками во всю ширину — здесь место есть. */
    .site-page #product .pr-foot-extra-inline { display: grid; gap: 8px; margin: 12px 0 4px; }
    .site-page #product .pr-foot-extra-inline > * { margin: 0; }
    .site-page #product .pr-foot-extra-inline .pr-buy-now,
    .site-page #product .pr-foot-extra-inline .pr-express,
    .site-page #product .pr-foot-extra-inline .pr-own-delivery,
    .site-page #product .pr-foot-extra-inline .pr-own-delivery-box > button {
        /* Все три кнопки — одного размера. Высота задана жёстко, а не «не
           меньше»: у «Нашей доставки» подпись бывает длиннее, и на две строки
           она вырастала вдвое — три кнопки под ценой переставали читаться
           одним взглядом. */
        box-sizing: border-box; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1px;
        width: 100%; height: 52px; padding: 6px 14px; border-radius: 14px; line-height: 1.2;
    }
    /* Подпись — одной строкой: длинную обрезаем многоточием, подробности
       человек читает в оформлении. */
    .site-page #product .pr-foot-extra-inline .pr-buy-now small,
    .site-page #product .pr-foot-extra-inline .pr-express small,
    .site-page #product .pr-foot-extra-inline .pr-own-delivery small {
        display: block; max-width: 100%; overflow: hidden; font-size: 11.5px; text-overflow: ellipsis; white-space: nowrap;
    }
    .site-page #product .pr-delivery-info small { font-size: 11.5px; opacity: .75; }
}

/* Страницы со своим героем (акции) на телефоне: заголовок экрана из оболочки
   приложения оставался пустой полосой на сотню пикселей — в ней только стрелка
   «назад», а название и так написано в самом герое. Полосу из потока убираем,
   а стрелка переезжает в хлебные крошки героя (см. renderSitePromoPage) —
   слева от названия, как на странице приложения. */
@media (max-width: 767px) {
    .site-page #promotions > .page-head.section-head-with-back { display: none; }
}

/* Заголовок профиля на телефоне: раньше здесь была пустая полоса с одной
   стрелкой — аватар и имя скрыты (они и так в карточке ниже), а место
   осталось. Показываем название страницы рядом со стрелкой. */


/* Заказ, который ждёт оплаты (или доплаты): на телефоне текст и кнопка идут
   одной строкой. Кнопка во всю ширину блока раздувала карточку заказа вдвое
   ради одного действия. */
@media (max-width: 767px) {
    .site-page .my-order-unpaid { gap: 8px 10px; padding: 10px 12px; font-size: 12.5px; }
    .site-page .my-order-unpaid span { flex: 1 1 140px; }
    .site-page .my-order-pay { flex: none; width: auto; min-height: 40px; padding: 0 16px; font-size: 13.5px; }
}

/* Лента и каталог на телефоне: фото карточки — вертикальное 3:4, как в макете.
   Квадрат при двух колонках занимал почти весь экран, а горизонтальное фото
   обрезало рулон по длине — товар на нём не узнать. */
@media (max-width: 767px) {
    .site-page #grid .card .card-img,
    .site-page #catGrid .card .card-img { aspect-ratio: 3 / 4; }
    .site-page #grid .card .card-body,
    .site-page #catGrid .card .card-body { padding: 10px 12px 12px; }
    .site-page #grid .card .card-title,
    .site-page #catGrid .card .card-title { font-size: 13.5px; line-height: 1.25; }
}

/* Разделы кабинета на телефоне — списком строк: значок, название, шеврон.
   Ровно те же пункты, что в боковой панели десктопа. */
.cab-mobile-nav { display: grid; margin: 14px 0 18px; padding: 6px; border: 1px solid var(--line); border-radius: 18px; background: var(--white); }
.cab-mobile-nav button { display: flex; align-items: center; gap: 12px; padding: 13px 12px; border: 0; border-radius: 12px; background: none; color: var(--ink); font: 600 15px var(--sans); text-align: left; cursor: pointer; }
.cab-mobile-nav button + button { border-top: 1px solid var(--line); border-radius: 0; }
.cab-mobile-nav button:active { background: var(--bg); }
.cab-mobile-nav .cab-ic { display: flex; flex: none; width: 20px; height: 20px; color: var(--red); }
.cab-mobile-nav .cab-label { flex: 1; min-width: 0; }
.cab-mobile-nav .cab-chevron { flex: none; width: 8px; height: 8px; border-top: 2px solid #99a1b3; border-right: 2px solid #99a1b3; transform: rotate(45deg); }
.cab-mobile-nav .cab-mobile-logout { justify-content: center; color: var(--red); font-weight: 700; }

/* Пустая корзина — по центру экрана, а не прижата влево. */
.site-page #cart .cart-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; min-height: 46vh; }

/* Стрелка «назад» внутри героя перенесённых страниц: стоит в одной строке
   с надстрочником, поэтому не «плавает» — у каждой страницы своя высота
   этой строки, и абсолютное позиционирование туда не попадало. */
.site-doc [class*="eyebrow"], .site-doc [class*="kicker"] { display: inline-flex; align-items: center; gap: 8px; }
.site-doc .site-doc-back { width: 30px; height: 30px; margin-left: -6px; color: #fff; vertical-align: middle; }
.site-doc .site-doc-back:hover { color: #fff; background: rgba(255,255,255,.16); border-radius: 10px; }

/* Тост «товар в корзине»: в app.css он привязан к высоте нижней панели
   вкладок (--nav-h), которой на сайте нет, поэтому уводился за экран.
   Видимость дублируем здесь же — в паре с нашим правилом положения
   состояние .show иначе не отрабатывало. */
.site-page .toast { bottom: 28px; }
.site-page .toast.show { opacity: 1; visibility: visible; transform: translateX(-50%) translateY(0); }

/* Подробности способа оплаты показываем отдельной панелью под сеткой:
   выпадающая внутри сетки карточка либо раздвигала соседей, либо
   перекрывала их — теперь ничего не смещается и ничего не закрывается. */
.site-doc .pay-detail { display: none; margin-top: 18px; padding: 24px 26px; border: 1px solid var(--red); border-radius: 16px; background: var(--white); animation: payDrop .2s ease; }
.site-doc .pay-detail.show { display: block; }
.site-doc .pay-detail h4 { margin: 0 0 10px; font-size: 17px; font-weight: 800; color: var(--ink); }
.site-doc .pay-card.open { border-color: var(--red); box-shadow: 0 10px 26px rgba(225,37,27,.14); }
.site-doc .pay-card.open .pay-card-body { display: none !important; }

/* Правая колонка на оптовой странице — карточка «Свяжитесь с нами». */
.site-doc .ws-contact-card { padding: 28px; border-radius: 18px; color: #fff; background: linear-gradient(140deg, var(--site-navy) 0%, var(--site-navy-2) 60%, var(--red-dark) 140%); }
.site-doc .ws-contact-card h3 { margin: 0 0 10px; font-size: 20px; font-weight: 800; color: #fff; }
.site-doc .ws-contact-card p { margin: 0 0 18px; font-size: 14px; line-height: 1.6; color: rgba(255,255,255,.78); }
.site-doc .ws-contact-list { display: grid; gap: 10px; margin-bottom: 18px; }
.site-doc .ws-contact-list a { display: flex; align-items: center; gap: 10px; color: #fff; font-weight: 700; font-size: 15px; }
.site-doc .ws-contact-list svg { width: 18px; height: 18px; fill: none; stroke: #ff6d64; stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round; }
.site-doc .ws-contact-note { padding-top: 16px; border-top: 1px solid rgba(255,255,255,.16); font-size: 13px; color: rgba(255,255,255,.6); }

/* Иконки шапки стоят на равных расстояниях независимо от счётчиков:
   у каждой одинаковая ширина, а бейдж вынесен из потока (absolute), иначе
   «Сообщения» с цифрой распирало шире соседей. */
.site-page .acts { gap: 4px; }
.site-page .act { width: 76px; justify-content: flex-start; text-align: center; }
.site-page .act > span:last-child { display: block; width: 100%; }
.site-page .act-badge { right: 14px; }

/* На экране регистрации карточка кабинета поднимается к самому верху —
   отдельного заголовка над ней нет, и пустое место сверху не нужно. */
.site-page #profile.screen.active { padding-top: 12px; }
.site-page #profile .web-cabinet-login { min-height: 0; margin-top: 0; padding-top: 34px; }

/* ── ШТОРКИ ПРИЛОЖЕНИЯ КАК ОКНА НА ДЕСКТОПЕ ───────────────────────── */
/* У формы заявки и формы адреса в app.css есть мобильные правила «на всю
   высоту экрана» (#leadSheet.show, #addressSheet.address-form-open) — они
   рассчитаны на телефон с клавиатурой и перебивали центрирование, из-за
   чего на сайте вылезала белая полоса во весь экран с одной кнопкой. */
@media (min-width: 768px) {
    .site-page #leadSheet.show,
    .site-page #addressSheet.show {
        top: 50% !important; bottom: auto !important;
        left: 50%; right: auto;
        width: min(520px, calc(100vw - 48px));
        max-height: min(80vh, 720px) !important;
        border-radius: 22px !important;
        padding: 0 24px 24px !important;
        transform: translate(-50%, -50%) !important;
        overflow-y: auto !important;
    }
    /* Выбор адреса и заведение нового — разные по объёму дела. Список коротких
       строк помещается в узкое окно, а форма — это адрес, четыре уточнения,
       ориентир и строка «как увидит курьер»: в 520 пикселей она сжималась в
       колодец. Поэтому у формы своё окно, шире, и в две колонки. */
    .site-page #addressSheet.address-form-open {
        width: min(940px, calc(100vw - 48px));
        padding: 0 28px 28px !important;
    }
    .site-page #leadSheet .lead-body { display: block; flex: none; overflow: visible; }
    .site-page #addressSheet.address-form-open .address-form {
        display: grid;
        grid-template-columns: minmax(0, 1fr) 300px;
        align-items: start;
        gap: 20px;
        flex: none;
        overflow: visible;
    }
    .site-page #addressSheet.address-form-open .address-form-lead { grid-column: 1 / -1; }
    /* Кнопки — под полями в левой колонке, а не во всю ширину под боковой
       карточкой: «Сохранить адрес» относится к форме, а не к пояснению. */
    .site-page #addressSheet.address-form-open .address-form-main { grid-column: 1; grid-row: 2; }
    .site-page #addressSheet.address-form-open .address-form-aside { grid-column: 2; grid-row: 2; }
    .site-page #addressSheet.address-form-open .address-form-actions { grid-column: 1; grid-row: 3; }
    .site-page #addressSheet.address-form-open .address-field { display: block; flex: none; }
    .site-page #addressSheet.address-form-open .address-suggestions { position: static; max-height: 220px; }
}

/* Правая карточка на оптовой странице заканчивается вровень с формой. */
.site-doc .form-section { align-items: stretch !important; }
.site-doc .ws-contact-card { display: flex; flex-direction: column; height: 100%; }
.site-doc .ws-contact-note { margin-top: auto; }

/* ── ТЁМНАЯ ТЕМА: ЦВЕТНЫЕ ПЛАШКИ И ПОДСВЕТКИ ──────────────────────── */
/* Пастельные заливки макета (#f0fdf4, #fff5f5, #fffbeb) в тёмной теме
   светятся белесыми пятнами. Меняем на полупрозрачный тон того же цвета
   с читаемым светлым текстом — смысл (зелёный/красный/жёлтый) сохраняется. */
:root[data-theme="dark"] .site-doc .green,
:root[data-theme="dark"] .site-doc .ok { background: rgba(34,197,94,.12) !important; border-color: rgba(34,197,94,.35) !important; color: #86efac !important; }
:root[data-theme="dark"] .site-doc .red,
:root[data-theme="dark"] .site-doc .bad { background: rgba(239,68,68,.12) !important; border-color: rgba(239,68,68,.35) !important; color: #fca5a5 !important; }
:root[data-theme="dark"] .site-doc .warn,
:root[data-theme="dark"] .site-doc .info-box { background: rgba(234,179,8,.12) !important; border-color: rgba(234,179,8,.35) !important; color: #fde68a !important; }
:root[data-theme="dark"] .site-doc .green *, :root[data-theme="dark"] .site-doc .ok *,
:root[data-theme="dark"] .site-doc .red *, :root[data-theme="dark"] .site-doc .bad *,
:root[data-theme="dark"] .site-doc .warn *, :root[data-theme="dark"] .site-doc .info-box * { color: inherit !important; }

/* Поиск отделён от иконок заметным воздухом (разделительной линии не рисуем):
   поле не тянется до самых иконок, между ними остаётся широкий зазор. */
/* flex: 0 1 — поле НЕ растягивается на всё свободное место: раньше оно
   упиралось прямо в иконки, и «воздух» между ними съедался. */
/* Поле тянется до упора, но не вплотную к иконкам: 10px + gap шапки дают
   ~30px воздуха — раньше зазор был 60px и выглядел провалом. */
.site-page .hdr .search-wrap { flex: 0 1 660px; margin-right: 10px; }
.site-page .acts { margin-left: auto; padding-left: 0; }
.site-page .hdr-in { gap: 20px; }

/* Стрелка «назад» на «Опте» и «Возврате»: их надстрочник — плашка-пилюля,
   внутри неё кнопка смотрелась вложенной. Выносим её из потока плашки. */
.site-doc .page-kicker { position: relative; padding-left: 0 !important; background: none !important; border: 0 !important; }
.site-doc .page-kicker .site-doc-back { margin-left: -8px; }

/* ── ТАЙМЛАЙН «ИСТОРИЯ КОМПАНИИ» ──────────────────────────────────── */
/* Линия — светло-красная. Пульсируют только крайние точки (начало и
   сегодняшний день), тихо: кольцо расходится наружу и растворяется, назад
   не сжимается — обратный ход читался как мигание. Промежуточные точки
   не анимируем: шесть пульсаций разом выглядели пёстро.
   Цвет из --red, поэтому в тёмной теме приглушается сам. */
.site-doc .timeline::before, .site-doc .tl-line { background: color-mix(in srgb, var(--red) 30%, transparent) !important; }
.site-doc .tl-item:first-child .tl-dot,
.site-doc .tl-item:last-child .tl-dot { animation: tlPulse 3s ease-out infinite; }
@keyframes tlPulse {
    from { box-shadow: 0 0 0 0 color-mix(in srgb, var(--red) 32%, transparent); }
    to { box-shadow: 0 0 0 7px color-mix(in srgb, var(--red) 0%, transparent); }
}
@media (prefers-reduced-motion: reduce) {
    .site-doc .tl-item .tl-dot { animation: none !important; }
}

/* ── ЛИЧНЫЙ КАБИНЕТ ──────────────────────────────────────────────────
   Слева карточка клиента и меню разделов, справа — выбранный раздел.
   Сами разделы — обычные экраны приложения (#profileEdit, #orders,
   #favorites, #support, #promotions, #settings); панель переезжает внутрь
   активного экрана (см. syncCabinet в assets/site.js), и экран становится
   двухколоночным. Своей копии разделов на сайте нет. */
.site-page.site-cabinet .screen.active {
    display: grid;
    grid-template-columns: 320px minmax(0, 1fr);
    align-items: start;
    column-gap: 28px;
}
/* Всё содержимое экрана уходит в правую колонку — панель занимает левую. */
.site-page.site-cabinet .screen.active > .cab-rail { grid-column: 1; grid-row: 1; }
/* Раздел прокручивается внутри своего окна, а не растягивает страницу:
   длинные списки заказов и избранного должны кончаться на высоте панели.
   Содержимое экрана собирает в .cab-panel syncCabinet (assets/site.js). */
.site-page.site-cabinet .screen.active > .cab-panel {
    grid-column: 2; grid-row: 1; min-width: 0;
    /* Без своей прокрутки: раздел — часть страницы, и листаться должна вся
       страница целиком, а не окно внутри неё. */
    /* Место под тень и фокусные обводки карточек, которые иначе срезал бы
       край прокручиваемой области. */
    padding: 2px 4px 2px 2px;
}

.cab-rail { display: flex; flex-direction: column; gap: 12px; }
/* Карточка клиента по макету «Профиль.dc.html»: тёмная, с итогами за год.
   Цифры подставляет syncCabinet — в разметке их нет. */
.cab-user {
    padding: 22px; border-radius: 20px; color: #fff;
    background: linear-gradient(135deg, #111C38 0%, var(--site-navy-2) 45%, #8E1810 150%);
}
.cab-user-top { display: flex; align-items: center; gap: 14px; }
.cab-avatar { flex: none; display: grid; place-items: center; width: 54px; height: 54px; border-radius: 15px; background: rgba(255,255,255,.14); color: #fff; font: 800 20px var(--sans); }
.cab-user-id { min-width: 0; }
.cab-name { font: 800 19px var(--sans); letter-spacing: -.3px; color: #fff; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cab-method { margin-top: 3px; font-size: 12.5px; color: rgba(255,255,255,.76); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cab-method[hidden] { display: none; }
.cab-user-stats { display: grid; gap: 10px; margin-top: 16px; padding-top: 14px; border-top: 1px solid rgba(255,255,255,.12); }
.cab-user-stats[hidden] { display: none; }
.cab-user-stats div { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.cab-user-stats b { font: 800 19px var(--sans); white-space: nowrap; }
.cab-user-stats span { font-size: 11.5px; color: rgba(255,255,255,.66); text-align: right; }
.cab-user-tags { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
.cab-user-tags:empty { display: none; }
.cab-tag { padding: 7px 12px; border-radius: 999px; background: rgba(255,255,255,.14); font: 800 11.5px var(--sans); color: rgba(255,255,255,.8); white-space: nowrap; }
.cab-tag.is-ok { background: rgba(225,37,27,.9); color: #fff; }

.cab-nav { display: flex; flex-direction: column; padding: 8px; border: 1px solid var(--line); border-radius: 20px; background: var(--white); overflow: hidden; }
.site-page .cab-item, .site-page .cab-logout {
    appearance: none; -webkit-appearance: none;
    display: flex; align-items: center; gap: 12px; width: 100%;
    padding: 12px 14px; border: 0; border-radius: 14px; background: none;
    color: var(--ink); font: 600 14.5px var(--sans); text-align: left; cursor: pointer;
    transition: background .15s, color .15s;
}
.site-page .cab-item[hidden] { display: none; }
.site-page .cab-item:hover { background: var(--surface-2, rgba(0,0,0,.04)); }
/* Активный раздел — красной заливкой и полосой слева, как в макете. */
.site-page .cab-item.active { position: relative; background: rgba(225,37,27,.08); color: var(--red); font-weight: 800; }
.site-page .cab-item.active::before { content: ''; position: absolute; left: 0; top: 9px; bottom: 9px; width: 3px; border-radius: 0 3px 3px 0; background: var(--red); }
.cab-ic { display: grid; place-items: center; width: 20px; height: 20px; flex: none; }
.cab-ic .ic-svg { width: 19px; height: 19px; }

/* Подпись справа в пункте меню: сколько активного в разделе. */
.cab-label { flex: 1; min-width: 0; }
.cab-note { flex: none; max-width: 45%; font: 700 12.5px var(--sans); color: var(--muted); text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cab-note:empty { display: none; }
.site-page .cab-item.active .cab-note { color: var(--red); }

/* Выход — отдельной карточкой, как в макете: обычный и на всех устройствах. */
.cab-exit { overflow: hidden; border: 1px solid var(--line); border-radius: 20px; background: var(--white); }
.site-page .cab-logout { justify-content: flex-start; padding: 15px 18px; border: 0; border-radius: 0; background: none; color: var(--ink); font-weight: 700; }
.site-page .cab-logout + .cab-logout { border-top: 1px solid var(--line); color: var(--red); }
.site-page .cab-logout:hover { background: var(--surface-2, rgba(0,0,0,.04)); }
.site-page .cab-logout.is-danger:hover { background: rgba(225,37,27,.06); }
.cab-help { margin: 0; padding: 0 4px; font-size: 12px; line-height: 1.6; color: var(--muted); }

/* ── ОБЗОР КАБИНЕТА ─────────────────────────────────────────────────
   Три карточки: активный заказ, своя скидка и что ждёт отзыва, — и плитки
   быстрых разделов под ними. */
.cab-overview { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; margin-bottom: 20px; }
.cab-card { display: flex; flex-direction: column; padding: 22px; border: 1px solid var(--line); border-radius: 20px; background: var(--white); }
.cab-card.is-accent { border-color: rgba(225,37,27,.2); background: rgba(225,37,27,.05); }
.cab-card-top { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
/* Номер заказа не переносим по буквам: «Заказ BK-WAIT-0001» разрывался
   посреди кода. Если не помещается — на новую строку уходит плашка. */
.cab-card-top b { display: flex; align-items: center; gap: 6px; min-width: 0; font: 700 15px var(--sans); color: var(--ink); white-space: nowrap; }
/* Значок копирования стоит в одной строке с номером, а не под ним: в столбик
   номер переносится посередине, значок падает на отдельную строку и карточка
   вырастает на пустом месте. Рядом с длинным состоянием («Готов к выдаче»)
   номер ужимаем, а не обрезаем многоточием: обрезок номера бесполезен —
   его-то и просят назвать. */
.cab-card-top .copy-code { flex: 0 1 auto; min-width: 0; font-size: clamp(9.75px, 4vw, 15px); }
.cab-chip { flex: none; padding: 5px 11px; border-radius: 999px; background: rgba(225,37,27,.1); color: var(--red); font: 800 11px var(--sans); letter-spacing: .5px; text-transform: uppercase; }
.cab-card-text { margin: 10px 0 0; font-size: 13.5px; line-height: 1.6; color: var(--muted); }
.cab-big { display: flex; align-items: baseline; gap: 8px; margin-top: 12px; }
.cab-big em { font: 800 34px var(--sans); font-style: normal; letter-spacing: -1px; color: var(--red); }
.cab-big span { font-size: 13px; color: var(--muted); }
.cab-bar { position: relative; height: 10px; margin-top: 14px; border-radius: 999px; background: var(--surface-2); overflow: hidden; }
.cab-bar i { display: block; height: 100%; border-radius: 999px; background: var(--red); }
.cab-steps { display: flex; gap: 4px; margin-top: 14px; }
.cab-steps i { flex: 1; height: 4px; border-radius: 2px; background: var(--surface-2); }
.cab-steps i.done { background: var(--red); }
.site-page .cab-card-link {
    align-self: flex-start; margin-top: 14px; padding: 0; border: 0; background: none;
    color: var(--red); font: 800 13.5px var(--sans); cursor: pointer;
}
.site-page .cab-card-link:hover { color: var(--red-dark); }

.cab-quick { grid-column: 1 / -1; padding: 26px; border: 1px solid var(--line); border-radius: 20px; background: var(--white); }
.cab-quick h2 { margin: 0; font: 800 20px var(--sans); letter-spacing: -.4px; color: var(--ink); }
.cab-quick-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; margin-top: 18px; }
.site-page .cab-quick-tile {
    display: flex; flex-direction: column; gap: 5px; padding: 18px; text-align: left; cursor: pointer;
    border: 1px solid var(--line); border-radius: 16px; background: var(--surface-2); color: var(--ink);
    transition: border-color .15s, background .15s;
}
.site-page .cab-quick-tile:hover { border-color: var(--red); background: var(--white); }
.cab-quick-tile b { font: 700 14.5px var(--sans); }
.cab-quick-tile span { font-size: 12.5px; color: var(--muted); }

/* Кнопки «+» на плитках нет: товар кладут в корзину из его карточки, где
   видно наличие, размеры и цену за единицу. На плитке она добавляла первый
   попавшийся размер и путала: человек думал, что добавил другой. */
/* Кнопки быстрого добавления «+» на плитках больше нет нигде — её убрали
   из самой разметки карточки (assets/app/08-showcase.js). */

/* Быстрые карточки приложения на витрине профиля дублируют плитки обзора. */
.site-page.site-cabinet #profile .profile-quick-cards { display: none; }
/* В обзоре под быстрыми разделами остаются только подборка и просмотры:
   заказы, акции и отзывы — свои разделы в меню слева, и повторять их здесь
   значит выдавать одно и то же трижды. */
.site-page.site-cabinet #profile .profile-carousel:not(#profileRecoCarousel):not(#profileViewedCarousel),
.site-page.site-cabinet #profile .profile-reviews,
.site-page.site-cabinet #profile .profile-legal,
.site-page.site-cabinet #profile .cabinet-documents { display: none; }
/* Документы открываются из меню — тогда и показываем. */
.site-page.site-cabinet #profile.show-documents .cabinet-documents { display: block; }

@media (max-width: 1279px) {
    .cab-overview { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .cab-quick-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* Заголовки разделов в приложении — компактные шапки экрана с кнопкой
   «назад». В кабинете назад некуда: раздел выбирается слева, а путь до него
   показывают хлебные крошки над колонками. */
.site-page.site-cabinet .screen.active .section-back { display: none; }
/* На десктопе стрелка «назад» из оболочки приложения недостижима: она
   приходится на липкую шапку, и нажатие попадало в логотип. Там возврат даёт
   своя кнопка внизу страницы. На телефоне шапка оформления своя, стрелка в ней
   и есть возврат — скрывать её нельзя, без неё заголовок к тому же сжимался в
   узкую колонку и разваливался по буквам. */
@media (min-width: 768px) {
    .site-page .checkout .co-back { display: none; }
}

/* Оформление на телефоне — отдельная страница под шапкой сайта, а не окно
   поверх неё. Слой начинался от самого верха, и его собственная шапка со
   стрелкой «назад» пряталась под шапкой сайта: вернуться в корзину было
   нечем, а заголовок не читался вовсе. */
@media (max-width: 767px) {
    /* Нижнего меню на оформлении нет — слой идёт до самого низа экрана; поднятый
       над меню, он оставлял кнопку «Оплатить» за краем. */
    /* height из оболочки приложения (100dvh) перебивал пару top/bottom, и слой
       свисал ниже экрана вместе с кнопкой оплаты. */
    .site-page .checkout { top: var(--site-header-height, 62px); bottom: 0; height: auto; }
    .site-page .checkout .co-head { position: sticky; z-index: 2; top: 0; background: var(--bg); }
    /* Сумма и «Оплатить» держатся у нижнего края, а содержимое над ними
       прокручивается: раньше кнопка уезжала за экран и терялась. */
    .site-page .checkout { display: flex; flex-direction: column; }
    .site-page .checkout .co-body { flex: 1; min-height: 0; overflow-y: auto; }
    .site-page .checkout .co-foot { flex: none; padding-bottom: calc(14px + env(safe-area-inset-bottom)); }
}
/* Эта кнопка на телефоне оставалась без оформления — стиль лежал в
   десктопном медиазапросе, и выглядела она как системная кнопка браузера. */
.site-page .checkout .co-back-to-cart {
    padding: 0; border: 0; background: none; color: var(--muted);
    font: 700 13.5px var(--sans); cursor: pointer;
}
.site-page .checkout .co-back-to-cart:hover { color: var(--red); }
.site-page.site-cabinet .cab-crumbs {
    grid-column: 1 / -1; grid-row: 1;
    display: flex; align-items: center; gap: 8px;
    padding-top: 22px; margin-bottom: 12px;
    font: 500 13px var(--sans); color: var(--muted);
}
.site-page.site-cabinet .cab-crumbs b { color: var(--ink); font-weight: 700; }
.site-page .cab-crumbs button { padding: 0; border: 0; background: none; color: var(--muted); font: inherit; cursor: pointer; }
.site-page .cab-crumbs button:hover { color: var(--red); }
.site-page.site-cabinet .screen.active > .cab-rail { grid-row: 2; }
.site-page.site-cabinet .screen.active > .cab-panel { grid-row: 2; }
/* Заголовок раздела — слева и крупно, как в макете: по центру он читался
   как заголовок страницы, а страница здесь — весь кабинет. */
.site-page.site-cabinet .cab-panel > .page-head,
.site-page.site-cabinet .cab-panel > .sticky-head > .page-head { padding: 0 0 14px; text-align: left; }
.site-page.site-cabinet .cab-panel .page-head h1 {
    margin: 0; font: 800 28px var(--sans); letter-spacing: -.8px; text-align: left; color: var(--ink);
}
/* Шапка витрины профиля («Б Профиль ›») в кабинете лишняя: имя, почта и
   переход к данным уже есть в панели слева. */
.site-page.site-cabinet #profile > .cab-panel .profile-page-head,
.site-page.site-cabinet #profile > .cab-panel .sticky-head { display: none; }
/* Стрелка «назад» сайта в кабинете тоже не нужна — есть крошки. */
.site-page.site-cabinet .site-backbar { display: none; }

@media (max-width: 1023px) {
    /* Узкий экран — панель сверху, раздел под ней, как в приложении. */
    .site-page.site-cabinet .screen.active { grid-template-columns: minmax(0, 1fr); }
    /* Узкий экран — панель сверху, раздел под ней и без своей прокрутки:
       на телефоне листается вся страница целиком, как в приложении. */
    .site-page.site-cabinet .screen.active > .cab-panel { grid-column: 1; grid-row: auto; max-height: none; overflow: visible; }
    .site-page.site-cabinet .screen.active > .cab-rail { grid-column: 1; grid-row: auto; }
}

/* Раздел «Профиль» в кабинете — карточка с заголовком, полями в две колонки
   и ссылкой «Редактировать» справа (см. enhanceProfileSection в site.js). */
.site-page.site-cabinet .cab-card-head { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin: -4px 0 18px; }
.site-page.site-cabinet .cab-card-head h2 { margin: 0; font: 800 20px var(--sans); letter-spacing: -.3px; color: var(--ink); }
/* Кнопка «Редактировать» в шапке карточки — ссылкой, а не плашкой во всю ширину. */
.site-page.site-cabinet .cab-card-head .profile-edit-btn { width: auto; margin: 0; padding: 0; border: 0; background: none; color: var(--red); font: 700 14px var(--sans); }
/* align-content/align-items: start обязательны. Карточку профиля растягивает
   по высоте окружение экрана, и сетка без них раздавала лишнее место между
   строками — поля разъезжались по всей карточке. */
.site-page.site-cabinet .cab-fields { display: grid; grid-template-columns: 1fr 1fr; gap: 22px 28px; align-content: start; align-items: start; }
/* И сама карточка должна быть по содержимому, а не во всю высоту колонки. */
.site-page.site-cabinet #webProfileView { display: block; height: auto; align-self: start; }
.cab-field { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.cab-field-l { font: 700 11px var(--sans); letter-spacing: .08em; text-transform: uppercase; color: var(--muted); }
.cab-field-v { font-size: 15.5px; font-weight: 600; color: var(--ink); overflow-wrap: anywhere; }
.cab-field.cab-empty .cab-field-v { font-weight: 500; color: var(--muted); }
/* Выход из аккаунта уже есть в левой панели — второй такой же строкой
   в разделе профиля он только дублируется. */
.site-page.site-cabinet #webCabinetLogout { display: none; }
@media (max-width: 640px) {
    .site-page.site-cabinet .cab-fields { grid-template-columns: 1fr; }
}

/* Форма редактирования профиля — под карточкой данных, поля в две колонки,
   как в макете. Разметку формы рисует app.js, здесь только раскладка. */
.site-page.site-cabinet #webProfileForm.show { display: grid; grid-template-columns: 1fr 1fr; gap: 14px 28px; margin-top: 20px; padding-top: 20px; border-top: 1px solid var(--line); }
.site-page.site-cabinet #webProfileForm .web-profile-title { grid-column: 1 / -1; }
/* E-mail, телефон и кнопки — во всю ширину: в макете рядом стоят только имя
   с фамилией. */
.site-page.site-cabinet #webProfileForm #webProfileEmail,
.site-page.site-cabinet #webProfileForm #webProfilePhone,
.site-page.site-cabinet #webProfileForm .web-profile-form-actions { grid-column: 1 / -1; }

/* Карточка «Реквизиты» — только на чтение, поэтому без кнопки
   редактирования; вместо неё подпись, кто эти данные меняет. */
.site-page.site-cabinet .cab-card-note { color: var(--muted); font-size: 12.5px; }
.site-page.site-cabinet #siteBusinessCard { margin-top: 16px; }

/* ── КАРТОЧКА ТОВАРА НА ДЕСКТОПЕ ─────────────────────────────────────
   Слева галерея, справа сведения и кнопка покупки, снизу во всю ширину
   рекомендации. Разметку рисует openProduct() в app.js; здесь только
   раскладка, а два узла переносит buildProductLayout() (assets/site.js). */
@media (min-width: 1024px) {
    /* Тело карточки — сетка. Прокрутка остаётся на нём же, как в приложении. */
    .site-page .product .pr-body {
        display: grid;
        /* Миниатюры · фото · сведения · покупка — как на маркетплейсе. */
        grid-template-columns: 76px minmax(0, 1fr) minmax(0, 1fr) minmax(0, 340px);
        align-items: start;
        /* align-content обязателен: у .pr-body в app.css задан flex: 1, то есть
           определённая высота. Сетка в таком контейнере растягивает строки, и
           фотография, будучи выше своей строки, вылезала на следующую —
           характеристики и рекомендации наезжали на неё. */
        align-content: start;
        column-gap: 24px;
        /* Шире, чем было: карточка занимала середину экрана, а по бокам
           оставались пустые поля в треть ширины. */
        width: min(1600px, 100%);
        margin: 0 auto;
        padding: 0 24px 48px;
        box-sizing: border-box;
    }
    /* Миниатюры — вертикальной лентой левее фотографии. */
    .site-page .product .pr-thumbs { grid-column: 1; grid-row: 1; flex-direction: column; gap: 10px; padding: 0; overflow: visible; }
    .site-page .product .pr-thumb { width: 76px; height: 101px; }
    .site-page .product .pr-gallery { grid-column: 2; grid-row: 1; }
    .site-page .product .pr-content { grid-column: 3; grid-row: 1; padding: 0; }
    /* Блок покупки стоит вровень с фотографией и остаётся на месте: при
       прокрутке он не едет за страницей. */
    .site-page .product .pr-buy { grid-column: 4; grid-row: 1; display: flex; flex-direction: column; gap: 14px; padding: 20px; border: 1px solid var(--line); border-radius: 20px; background: var(--white); }
    /* Описание и применение — под фотографией, во всю ширину карточки: в
       узкой средней колонке текст превращался в колодец из двух слов. */
    .site-page .product .pr-under { grid-column: 1 / -1; grid-row: 2; margin-top: 28px; }
    /* Отзывы — всегда отдельной строкой под описанием, никогда сбоку от
       фотографии. Без явного номера строки сетка ставила их в первый
       свободный угол, и на каждом товаре они оказывались в новом месте. */
    .site-page .product .pr-reviews { grid-column: 1 / -1; grid-row: 3; margin-top: 36px; }
    /* Разделы внизу прижаты к левому краю и ограничены по ширине: описание
       читают строкой, а не через весь монитор. */
    .site-page .product .pr-under .pr-details { width: min(100%, 1180px); margin: 0; }
    .site-page .product .pr-under .pr-desc { max-width: 780px; }
    /* Полные характеристики — в две колонки пар «ключ — значение» и без
       рамки: одной колонкой значение уезжало далеко от своего названия. */
    .site-page .product .pr-under .pr-specs {
        display: grid;
        /* Четыре дорожки на всю таблицу, а не своя сетка у каждой строки:
           только так названия и значения выстраиваются по общей вертикали.
           Раньше каждая строка делила свою ширину сама, и левый столбец шёл
           лесенкой. */
        /* Название характеристики занимает свою долю и переносится по словам:
           с max-content длинная строка вроде «Прочность на разрыв в продольном
           и поперечном направлении, кН/м» распирала сетку, и значение уезжало
           за край карточки. */
        grid-template-columns: minmax(0, 1fr) minmax(0, auto) minmax(0, 1fr) minmax(0, auto);
        column-gap: 20px;
        border: 0; border-radius: 0; background: none; overflow: visible;
    }
    /* Строка растворяется, а её ячейки встают прямо в общую сетку. */
    .site-page .product .pr-under .pr-specs .row { display: contents; }
    .site-page .product .pr-under .pr-specs .row > * { padding: 12px 0; border-top: 0; border-bottom: 1px solid var(--line); }
    .site-page .product .pr-under .pr-specs .row > .v,
    .site-page .product .pr-under .pr-specs .row > .v-tags { padding-right: 24px; }
    /* Ни название, ни значение не выходят за карточку: длинные слова и числа
       вроде «600/400» переносятся, а не выталкивают строку вбок. */
    .site-page .product .pr-under .pr-specs .row > .k,
    .site-page .product .pr-under .pr-specs .row > .v { min-width: 0; overflow-wrap: anywhere; }
    /* Метки значений не должны тянуться на всю высоту строки. Ячейка стала
       элементом общей сетки и по умолчанию растягивается до её высоты, а
       внутри так же растягивались сами метки — при высокой соседней ячейке
       («Назначение» с семью метками) они превращались в овалы. */
    .site-page .product .pr-under .pr-specs .row > .v-tags { align-items: flex-start; align-content: flex-start; }
    .site-page .product .pr-under .pr-specs .row > .v-tags i { align-self: flex-start; }
    /* Разделы внизу — отдельными блоками друг под другом, без переключателя. */
    /* Между карточками разделов — воздух: вплотную они читались как один
       длинный блок. */
    .site-page .product .pr-under .pr-detail-panels > * + * { margin-top: 28px; }
    .site-page .product .pr-under .pr-section + .pr-section { margin-top: 36px; }
    /* «О товаре» и ссылка на описание — в одну строку над краткой таблицей. */
    .site-page .product .pr-brief-head { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; margin-bottom: 10px; }
    .site-page .product .pr-brief-head h4 { margin: 0; }
    .site-page .product .pr-desc-jump {
        flex: none; padding: 0;
        border: 0; background: none; color: var(--red);
        font: 700 14.5px/1.3 var(--sans); text-align: left; cursor: pointer;
    }
    .site-page .product .pr-desc-jump:hover { text-decoration: underline; }
    .site-page .product .pr-desc-jump-all { margin-top: 12px; }
    /* Рекомендации — последней строкой под всеми колонками. */
    .site-page .product #prSimilarCarousel { grid-column: 1 / -1; grid-row: 4; margin-top: 40px; }
    /* Характеристики в средней колонке — компактной таблицей под названием и
       склейкой размеров, как в карточке маркетплейса: это первое, что
       смотрят, и прятать их за вкладку незачем. */
    .site-page .product .pr-content > .pr-section { margin-top: 20px; }
    .site-page .product .pr-content .pr-specs .row {
        display: flex; align-items: baseline; gap: 10px;
        padding: 9px 12px; border-bottom: 1px solid var(--line);
    }
    .site-page .product .pr-content .pr-specs .row:last-child { border-bottom: 0; }
    .site-page .product .pr-content .pr-specs .row > .k { flex: none; font-size: 14px; color: var(--muted); }
    .site-page .product .pr-content .pr-specs .row > .v { flex: none; margin-left: auto; font: 700 14px var(--sans); color: var(--ink); text-align: right; }
    .site-page .product .pr-content .pr-specs .row > .v-tags { flex: 1; justify-content: flex-end; }

    /* Кнопки над фотографией, а не поверх неё: стрелка «назад» слева,
       поиск, поделиться и избранное справа. */
    /* Ширина та же, что у сетки карточки: стрелка «назад» встаёт над левым
       краем фотографии, а поиск, сравнение и избранное — над блоком покупки
       справа. По центру страницы они висели посреди пустого места. */
    /* Над фотографией — путь до товара, справа значки: назад, поиск,
       поделиться, сравнить, избранное. */
    .site-page .product .pr-float-head .pr-cat { flex: 1; min-width: 0; }
    .site-page .product .pr-float-head {
        position: static; z-index: auto;
        width: min(1600px, 100%); margin: 0 auto;
        padding: 20px 24px 12px;
        box-sizing: border-box;
        pointer-events: auto;
    }
    /* Верхний отступ галереи в приложении оставлен под плавающие кнопки —
       здесь они в потоке, и он больше не нужен. */
    .site-page .product .pr-gallery { padding-top: 0; border-radius: 20px; overflow: hidden; }
    /* Фотография строго 3:4 — тот же формат, что у карточек в каталоге, иначе
       снимок в карточке обрезан не так, как на плитке. Строки сетки заданы
       номерами явно, поэтому высота из соотношения сторон её уже не ломает. */
    .site-page .product .pr-gallery { aspect-ratio: 3 / 4; height: auto; max-height: 820px; }
    .site-page .product .pr-gallery img { width: 100%; height: 100%; object-fit: cover; }
    /* Лента миниатюр — той же высоты, со своей прокруткой, если их много. */
    /* Лента миниатюр ровно по высоте фотографии, со своей прокруткой: при
       десятке снимков она раньше уезжала ниже кадра. height: 0 с
       align-self: stretch — способ занять всю строку сетки, не задавая её
       высоту самому (иначе строка растянулась бы под все миниатюры). */
    .site-page .product .pr-thumbs { align-self: stretch; height: 0; min-height: 100%; overflow-y: auto; }
    /* Кнопка покупки — внутри правой колонки, не плашкой. */
    .site-page .product .pr-buy > .co-foot { position: static; margin: 0; padding: 0; border: 0; background: none; box-shadow: none; }
    .site-page .product .pr-buy .pr-price { font-size: 28px; }
    /* ── ПО МАКЕТУ «Карточка товара.dc.html» ─────────────────────────
       Меняем только четыре места: путь до товара, блок покупки справа,
       характеристики с описанием и отзывы. Остальное в карточке остаётся
       как было. */

    /* Путь до товара: обычным текстом, а не капсом ссылками. */
    .site-page .product .pr-cat {
        flex-wrap: wrap; align-items: baseline; gap: 8px;
        color: var(--muted); font: 500 13px var(--sans); text-transform: none; letter-spacing: 0;
    }
    .site-page .product .pr-cat button { color: var(--muted); font: inherit; }
    .site-page .product .pr-cat button:hover { color: var(--red); text-decoration: none; }
    .site-page .product .pr-cat b { color: var(--ink); font-weight: 700; }
    .site-page .product .pr-crumb-step { color: var(--muted); }
    .site-page .product .pr-crumb-sep { color: var(--muted); opacity: .6; }

    /* Характеристики: две колонки пар с точечной линией между названием и
       значением — так глаз доводит строку до конца. */
    .site-page .product .pr-under .pr-specs {
        grid-template-columns: repeat(2, minmax(0, 1fr));
        column-gap: 48px;
        padding: 28px; border: 1px solid var(--line); border-radius: 20px; background: var(--white);
    }
    .site-page .product .pr-under .pr-specs .row {
        display: flex; align-items: baseline; gap: 10px;
        padding: 13px 0; border-bottom: 1px solid var(--line);
    }
    /* Сброс касается только ячеек: у точечной линии рамка — это она сама. */
    .site-page .product .pr-under .pr-specs .row > .k,
    .site-page .product .pr-under .pr-specs .row > .v,
    .site-page .product .pr-under .pr-specs .row > .v-tags { padding: 0; border: 0; }
    .site-page .product .pr-under .pr-specs .row > .k { flex: none; font-size: 14.5px; color: var(--muted); }
    .site-page .product .pr-under .pr-specs .row > .v { flex: none; margin-left: auto; font: 700 14.5px var(--sans); color: var(--ink); text-align: right; }
    .site-page .product .pr-under .pr-specs .row > .v-tags { flex: 1; justify-content: flex-end; }
    /* Метку не переносим по словам: в узкой колонке «для дорожного
       строительства» вставало в две строки и плашка вырастала вдвое. */
    .site-page .product .pr-specs .row > .v-tags i { white-space: nowrap; }
    .site-page .product .pr-leader { flex: 1; min-width: 20px; border-bottom: 1px dotted var(--muted); opacity: .5; transform: translateY(-4px); }
    .site-page .product .pr-under .pr-section > h4 { margin: 0 0 16px; font: 800 26px var(--sans); letter-spacing: -.7px; color: var(--ink); }

    /* Описание и применение — рядом в одной карточке. */
    .site-page .product .pr-about {
        display: grid; grid-template-columns: minmax(0, 1fr); gap: 32px;
        padding: 32px; border: 1px solid var(--line); border-radius: 20px; background: var(--white);
    }
    .site-page .product .pr-about.has-usage { grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr); }
    .site-page .product .pr-about .pr-section + .pr-section,
    .site-page .product .pr-about .pr-detail-panel + .pr-detail-panel { margin-top: 0; }
    .site-page .product .pr-about .pr-desc { max-width: none; font-size: 16px; line-height: 1.75; }
    .site-page .product .pr-about .pr-usage li { font-size: 15px; line-height: 1.6; }

    /* Отзывы: слева оценка, справа сами отзывы. */
    .site-page .product .pr-reviews {
        display: grid; grid-template-columns: 340px minmax(0, 1fr); gap: 24px; align-items: start;
    }
    .site-page .product .pr-reviews .rv-top {
        grid-column: 1 / -1; display: flex; align-items: center; justify-content: space-between;
        gap: 20px; flex-wrap: wrap;
    }
    .site-page .product .pr-reviews .rv-top h4 { margin: 0; font: 800 26px var(--sans); letter-spacing: -.7px; color: var(--ink); }
    .site-page .product .pr-reviews .rv-head {
        display: block; padding: 28px; border: 1px solid var(--line); border-radius: 20px; background: var(--white);
    }
    /* Отзывов нет — одна колонка и без пустой карточки с оценкой. */
    .site-page .product .pr-reviews.is-empty { grid-template-columns: minmax(0, 1fr); }
    .site-page .product .pr-reviews.is-empty .rv-head { display: none; }
    .site-page .product .pr-reviews .rv-goal {
        margin: 20px 0 0; padding-top: 18px; border-top: 1px solid var(--line);
        font-size: 13px; line-height: 1.6; color: var(--muted);
    }
    .site-page .product .pr-reviews .rv-list { display: grid; gap: 14px; }
    .site-page .product .pr-reviews .rv-item {
        padding: 24px; border: 1px solid var(--line); border-radius: 20px; background: var(--white);
    }
    .site-page .product .pr-reviews .rv-item-head { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
    .site-page .product .pr-reviews .rv-avatar {
        flex: none; display: grid; place-items: center; width: 40px; height: 40px; border-radius: 50%;
        background: var(--surface-2); font: 800 14px var(--sans); color: var(--ink);
    }
    .site-page .product .pr-reviews .rv-rating { margin-left: auto; font: 800 14px var(--sans); color: var(--red); }
    .site-page .product .pr-reviews .rv-item .rv-text { font-size: 15px; line-height: 1.7; }
    .site-page .product .pr-reviews .rv-more,
    .site-page .product .pr-reviews .rv-write { justify-self: start; }

    /* Рекомендации листаются вниз списком карточек, а не горизонтальной лентой. */
    .site-page .product #prSimilarCarousel .pc-track { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 16px; overflow: visible; }
    .site-page .product #prSimilarCarousel .pc-viewed-card { width: auto; }

}

/* ── АДРЕСА ДОСТАВКИ (макет «Профиль.dc.html») ──────────────────────
   Карточками, а не строчками в шторке: адрес доставки — это про склад,
   график приёма и въезд, и такие подробности в строку не помещаются. */
.site-addresses .addr-head { display: flex; justify-content: flex-end; margin-bottom: 14px; }
.site-page .site-addresses .addr-add {
    height: 44px; padding: 0 20px; border: 0; border-radius: 14px;
    background: var(--red); color: #fff; font: 700 14px var(--sans); cursor: pointer;
}
.site-page .site-addresses .addr-add:hover { background: var(--red-dark); }
.site-addresses .addr-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
.site-addresses .addr-card { padding: 24px; border: 1px solid var(--line); border-radius: 20px; background: var(--white); }
.site-addresses .addr-card.is-default { border-color: rgba(225,37,27,.22); }
.site-addresses .addr-card-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.site-addresses .addr-card-head b { font: 700 16px var(--sans); color: var(--ink); }
.site-addresses .addr-chip { padding: 4px 10px; border-radius: 999px; background: rgba(225,37,27,.1); color: var(--red); font: 800 11px var(--sans); }
.site-addresses .addr-card p { margin: 10px 0 0; font-size: 14px; line-height: 1.6; color: var(--muted); }
.site-addresses .addr-actions { display: flex; gap: 16px; margin-top: 16px; }
.site-page .site-addresses .addr-link { padding: 0; border: 0; background: none; color: var(--red); font: 800 13.5px var(--sans); cursor: pointer; }
.site-page .site-addresses .addr-link.is-muted { color: var(--muted); }
.site-page .site-addresses .addr-link:hover { color: var(--red); }
.site-addresses .addr-subtitle { margin: 28px 0 14px; font: 800 20px var(--sans); letter-spacing: -.4px; color: var(--ink); }
.site-addresses .addr-empty { margin: 0; grid-column: 1 / -1; font-size: 14px; line-height: 1.6; color: var(--muted); }
.site-addresses .addr-note {
    margin: 20px 0 0; padding: 16px 20px; border-left: 3px solid var(--red); border-radius: 0 14px 14px 0;
    background: rgba(225,37,27,.06); font-size: 13.5px; line-height: 1.6; color: var(--ink);
}
@media (max-width: 767px) {
    .site-addresses .addr-grid { grid-template-columns: minmax(0, 1fr); }
}

/* ── ВХОД В КАБИНЕТ (макет «Вход в кабинет.dc.html») ─────────────────
   Только на широком экране: на телефоне форма остаётся во всю ширину, как в
   приложении. */
@media (min-width: 1024px) {
    .site-login {
        display: grid; grid-template-columns: minmax(360px, 1fr) minmax(420px, 520px);
        gap: 20px; align-items: stretch; padding: 12px 0 40px;
    }
    .site-login-promo {
        position: relative; overflow: hidden;
        display: flex; flex-direction: column; justify-content: space-between;
        padding: 44px; border-radius: 24px; color: #fff;
        background: linear-gradient(135deg, var(--site-navy) 0%, var(--site-navy-2) 58%, var(--red-dark) 150%);
    }
    .site-login-promo::before {
        content: ""; position: absolute; bottom: -120px; left: -80px; width: 340px; height: 340px; border-radius: 50%;
        background: radial-gradient(circle, rgba(225,37,27,.42), transparent 65%); pointer-events: none;
    }
    .site-login-promo > * { position: relative; }
    .site-login-eyebrow { font: 800 11px var(--sans); letter-spacing: 1.9px; text-transform: uppercase; color: rgba(255,255,255,.6); }
    .site-login-promo h1 { margin: 14px 0 0; font: 800 42px/1.05 var(--disp); letter-spacing: -1.4px; color: #fff; }
    .site-login-promo p { margin: 16px 0 0; max-width: 420px; font-size: 15.5px; line-height: 1.65; color: rgba(255,255,255,.75); }
    .site-login-promo ul { margin: 36px 0 0; padding: 0; list-style: none; display: grid; gap: 14px; }
    .site-login-promo li { position: relative; padding-left: 19px; font-size: 14.5px; line-height: 1.55; color: rgba(255,255,255,.82); }
    .site-login-promo li::before { content: ""; position: absolute; left: 0; top: 8px; width: 7px; height: 7px; border-radius: 50%; background: var(--red); }
    .site-login-foot { margin-top: 36px; padding-top: 22px; border-top: 1px solid rgba(255,255,255,.14); font-size: 13px; line-height: 1.6; color: rgba(255,255,255,.6); }
    /* Карточка формы: та же разметка, что в приложении, только в рамке. */
    .site-page .site-login .web-cabinet-login {
        margin: 0; padding: 36px; border: 1px solid var(--line); border-radius: 24px;
        background: var(--white); box-shadow: 0 4px 16px rgba(14,23,48,.07);
    }
    /* Значок над заголовком в макете не нужен: слева и так тёмная панель с
       названием кабинета, а два заголовка подряд читаются как ошибка. */
    .site-page .site-login .web-cabinet-login .web-orders-icon { display: none; }
    /* Заголовок в приложении набран капсом и по центру — на широком экране он
       читается как баннер, а не как заголовок формы. */
    .site-page #profileContent .site-login .web-cabinet-login h2 {
        margin: 26px 0 0; font: 800 26px var(--sans); letter-spacing: -.7px;
        text-transform: none; text-align: left;
    }
    .site-page #profileContent .site-login .web-cabinet-login > p {
        margin: 8px 0 0; font-size: 14.5px; line-height: 1.6; text-align: left; color: var(--muted);
    }
    /* Заявка юрлица: подписи над полями и короткие номера в один ряд. */
    .site-page .site-login .site-field { display: grid; gap: 7px; min-width: 0; }
    .site-page .site-login .site-field > span { font: 800 12.5px var(--sans); color: var(--muted); }
    .site-page .site-login .site-field .co-input { width: 100%; }
    .site-page .site-login .site-field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
    .site-page .site-login .site-field-row.is-three { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    .site-page .site-login .site-field-note { margin: 4px 0 0; font-size: 12.5px; line-height: 1.6; color: var(--muted); }
    .site-page .site-login .business-cabinet .cabinet-form { width: 100%; gap: 12px; }
    .site-page .site-login .business-cabinet .web-orders-icon { display: none; }

    /* Вход через Яндекс и VK — без подписей «Быстрый вход» и «Аккаунта нет…»:
       кнопки и так говорят сами за себя, а две строки пояснений вокруг них
       читались как предупреждение. */
    .site-page .site-login .cabinet-social-title,
    .site-page .site-login .cabinet-social-note { display: none; }
    /* Форма — колонка с выравниванием по центру, поэтому блокам нужна явная
       ширина: иначе они сжимаются по содержимому и стоят уже кнопки входа. */
    .site-page .site-login .cabinet-social { width: 100%; align-self: stretch; margin-top: 14px; }
    .site-page .site-login .site-login-or { width: 100%; }
    /* «или» между входом по паролю и входом через Яндекс и VK. */
    .site-login-or { display: flex; align-items: center; gap: 14px; margin-top: 18px; }
    .site-login-or::before, .site-login-or::after { content: ""; flex: 1; height: 1px; background: var(--line); }
    .site-login-or span { font-size: 12.5px; color: var(--muted); }
    .site-page .site-login .cabinet-social-buttons { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; width: 100%; max-width: none; }
    .site-page .site-login .cabinet-social-btn { width: 100%; justify-content: center; height: 48px; }
    /* Значок «в корзине» и «удалить» — сверху строки, а не по её середине. */
    .site-page #cart .ci-actions { align-self: start; }
    /* Восстановление пароля и регистрация — кнопками в ряд, а не строчками
       мелким текстом. */
    .site-page #profileContent .site-login .cabinet-login-links {
        flex-direction: row; gap: 10px; margin-top: 10px; width: 100%;
    }
    .site-page #profileContent .site-login .cabinet-login-links .cabinet-switch {
        flex: 1; margin: 0; padding: 0 16px; height: 48px;
        border: 1px solid var(--line); border-radius: 14px; background: var(--white);
        color: var(--ink); font: 700 14px var(--sans); text-align: center;
    }
    .site-page #profileContent .site-login .cabinet-login-links .cabinet-switch:hover {
        border-color: var(--red); color: var(--red);
    }
}

/* На узком экране карточка остаётся такой же, как в приложении: строку
   количества, правила отгрузки и точечные линии собирает только широкая
   раскладка, а после сужения окна они остаются в разметке. */
@media (max-width: 1023px) {
    .site-page .product .pr-qty,
    .site-page .product .pr-terms,
    .site-page .product .pr-buy-total,
    .site-page .product .pr-price-note,
    .site-page .product .pr-leader { display: none; }
}

/* ── КАТЕГОРИИ НА ДЕСКТОПЕ ───────────────────────────────────────────
   Слева полный список направлений компании, справа — товары выбранного.
   Плитки направлений (их рисует renderCategoryMenu в app.js) на широком
   экране скрыты: они занимали всю страницу и не показывали, что внутри.
   Раскладку собирает buildCategoryLayout() в assets/site.js. */
/* Заголовок «Категории» со стрелкой «назад» — из разметки экрана приложения,
   где он и нужен. На сайте над меню каталога он лишний: сюда приходят из
   шапки, и путь показывают сами направления. */
.site-page #categories .page-head { display: none; }
/* Раскладка идёт во всю ширину окна, а не по колонке в 1240px (см. общее
   правило .site-page .screen.active): меню прижато к левому краю, и на
   широком мониторе рядом помещается больше плиток. */
.site-page #categories.screen.active.site-cat-two-col { width: 100%; max-width: none; padding: 24px 0 64px; }
.site-page #categories.site-cat-two-col .wrap { display: grid; grid-template-columns: 420px minmax(0, 1fr); align-items: start; align-content: start; column-gap: 32px; width: 100%; max-width: none; padding: 0 24px; }
/* Название направления должно умещаться в одну строку — на двух строках
   список выглядел рваным. */
.site-page #categories.site-cat-two-col .cat-nav-item { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Плитки направлений остаются на месте — они и есть правая часть, просто
   показываются только те, что входят в выбранное направление. Формат 3:4,
   как у карточек товара, поэтому в ряд их встаёт четыре, а не две широких. */
.site-page #categories.site-cat-two-col #categoryMenuGrid { grid-column: 2; grid-row: 2; grid-template-columns: repeat(auto-fill, minmax(215px, 1fr)); }
.site-page #categories.site-cat-two-col .cat-menu-card { min-height: 0; aspect-ratio: 3 / 4; }
.site-page #categories.site-cat-two-col .cat-menu-card[hidden] { display: none; }
.site-page #categories.site-cat-two-col .cat-side { grid-column: 2; grid-row: 1; }
/* Меню занимает всю левую часть по высоте, а не обрывается по содержимому. */
.site-page #categories.site-cat-two-col .cat-nav { grid-column: 1; grid-row: 1 / span 2; align-self: stretch; }
.cat-nav { display: flex; flex-direction: column; padding: 8px; border: 1px solid var(--line); border-radius: 20px; background: var(--white); }
.site-page .cat-nav-item {
    appearance: none; -webkit-appearance: none;
    display: block; width: 100%; padding: 13px 14px;
    border: 0; border-radius: 14px; background: none;
    color: var(--ink); font: 600 14.5px/1.35 var(--sans); text-align: left; cursor: pointer;
    transition: background .15s, color .15s;
}
.site-page .cat-nav-item:hover { background: var(--surface-2, rgba(0,0,0,.04)); }
.site-page .cat-nav-item.active { position: relative; background: rgba(225,37,27,.08); color: var(--red); font-weight: 800; }
.site-page .cat-nav-item.active::before { content: ''; position: absolute; left: 0; top: 10px; bottom: 10px; width: 3px; border-radius: 0 3px 3px 0; background: var(--red); }

.cat-side-head h2 { margin: 0 0 22px; font: 800 26px/1.15 var(--sans); letter-spacing: -.5px; color: var(--ink); }
.site-page .cat-side-cat { appearance: none; -webkit-appearance: none; padding: 0; border: 0; background: none; color: var(--red); font: 800 15px var(--sans); cursor: pointer; }
.site-page .cat-side-cat:hover { text-decoration: underline; text-underline-offset: 3px; }
.site-page .cat-side-item {
    appearance: none; -webkit-appearance: none;
    display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: baseline; gap: 2px 12px;
    padding: 8px 10px; border: 0; border-radius: 12px; background: none;
    text-align: left; cursor: pointer; transition: background .15s;
}
.site-page .cat-side-item:hover { background: var(--surface-2, rgba(0,0,0,.04)); }
.cat-side-empty { max-width: 560px; margin: 0 0 18px; font-size: 15px; line-height: 1.6; color: var(--muted); }
.site-page .cat-side-all { appearance: none; -webkit-appearance: none; padding: 12px 20px; border: 1px solid var(--line); border-radius: 14px; background: var(--white); color: var(--red); font: 800 14px var(--sans); cursor: pointer; }
.site-page .cat-side-all:hover { border-color: var(--red); }

/* ── СТРАНИЦА КАТЕГОРИИ (#category) ──────────────────────────────────
   Экран есть только на сайте. Карточки товаров — те же .card из app.css,
   поэтому здесь только обвязка: тёмный баннер, колонка фильтров, панель
   сортировки и вид «списком». Всё на переменных темы, поэтому тёмная тема
   работает без отдельных правил, кроме самого баннера — он фирменно тёмный
   в обеих темах, как герой на главной. */
.site-page #category { padding-top: 0; }
.cat-top { padding: 26px 0 30px; background: linear-gradient(115deg, var(--site-navy) 0%, var(--site-navy-2) 60%, #1B2E52 100%); border-radius: 0 0 28px 28px; }
.cat-crumbs { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; color: rgba(255,255,255,.55); font: 700 12px/1 var(--sans); letter-spacing: .04em; text-transform: uppercase; }
.site-page .cat-crumbs button { appearance: none; -webkit-appearance: none; padding: 0; border: 0; background: none; color: rgba(255,255,255,.72); font: inherit; letter-spacing: inherit; text-transform: inherit; cursor: pointer; }
.site-page .cat-crumbs button:hover { color: #fff; text-decoration: underline; text-underline-offset: 3px; }
.cat-crumbs b { color: #fff; font-weight: 800; }
.cat-top-in { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: 22px 36px; margin-top: 18px; }
.cat-top-text { min-width: 0; }
.cat-top h1 { margin: 0; font: 800 40px/1.05 var(--disp); letter-spacing: -1.2px; color: #fff; }
.cat-top-lead { margin: 10px 0 0; max-width: 620px; font-size: 15px; line-height: 1.55; color: rgba(255,255,255,.78); }
.cat-top-lead:empty { display: none; }
/* Счётчики: подпись сверху мелким, значение крупным — как показатели в
   тёмных блоках информационных страниц. */
.cat-stats { display: flex; flex-wrap: wrap; gap: 10px; margin: 0; }
.cat-stat { flex: none; padding: 12px 16px; border-radius: 16px; background: rgba(255,255,255,.08); }
.cat-stats dt { color: rgba(255,255,255,.6); font: 700 11px/1 var(--sans); letter-spacing: .06em; text-transform: uppercase; }
.cat-stats dd { margin: 8px 0 0; color: #fff; font: 800 18px/1 var(--sans); white-space: nowrap; }

/* Отступ от тёмного баннера заметный: панель сортировки и колонка фильтров
   не должны выглядеть приклеенными к нему. */
.cat-layout { display: grid; grid-template-columns: 268px minmax(0, 1fr); align-items: start; gap: 28px; padding-top: 40px; padding-bottom: 60px; }
/* Фильтры едут вместе со страницей, но прилипают под шапкой, чтобы при
   длинном списке товаров условия оставались под рукой. */
.cat-filters { position: sticky; top: 88px; max-height: calc(100vh - 108px); overflow: auto; padding: 6px 18px 18px; border: 1px solid var(--line); border-radius: 22px; background: var(--white); box-shadow: var(--shadow-sm); }
.cat-filters-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.cat-filters-head h2 { margin: 16px 0 6px; font: 800 17px/1 var(--sans); color: var(--ink); }
.site-page .cat-filters-close, .cat-filters-foot { display: none; }
.cat-group { padding: 14px 0; border-top: 1px solid var(--line); }
.cat-group:first-child { border-top: 0; }
.cat-group h3 { margin: 0 0 8px; font: 800 13px/1 var(--sans); letter-spacing: .04em; text-transform: uppercase; color: var(--muted); }
.cat-option { display: flex; align-items: center; gap: 10px; padding: 7px 8px; margin: 0 -8px; border-radius: 10px; cursor: pointer; transition: background .15s; }
.cat-option:hover { background: var(--surface-2); }
.cat-option input { width: 17px; height: 17px; flex: none; margin: 0; accent-color: var(--red); cursor: pointer; }
.cat-option-text { min-width: 0; flex: 1; font-size: 14px; color: var(--ink); }
.cat-option-count { flex: none; font-size: 12.5px; color: var(--muted); }
/* Недоступное значение — только приглушённое. Модификатор специально не
   называется .empty: в app.css такой класс уже занят заглушкой «Ничего не
   найдено», и её text-align: center с серым цветом утаскивал текст строки
   к правому краю. */
.cat-option.cat-option-off { cursor: default; opacity: .45; }
.cat-option.cat-option-off:hover { background: none; }
.site-page .cat-group-more { appearance: none; -webkit-appearance: none; margin-top: 6px; padding: 0; border: 0; background: none; color: var(--red); font: 700 13px var(--sans); cursor: pointer; }
.site-page .cat-group-more:hover { text-decoration: underline; text-underline-offset: 3px; }
.cat-filters-empty { margin: 12px 0; font-size: 13.5px; line-height: 1.5; color: var(--muted); }

.cat-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; margin-bottom: 16px; }
.cat-count { font-size: 14px; font-weight: 700; color: var(--muted); }
/* Сортировка всегда с новой строки. Раньше её прижимало к правому краю той
   же строки, и стоило появиться выбранным фильтрам, как она прыгала под них
   и обратно — читать было невозможно. */
.cat-sort { display: flex; align-items: center; gap: 8px; flex: 0 0 100%; margin: 4px 0 0; font-size: 13px; color: var(--muted); }
.site-page .cat-sort select { appearance: none; -webkit-appearance: none; padding: 9px 34px 9px 14px; border: 1px solid var(--line); border-radius: 12px; background: var(--white) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236B7385' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") no-repeat right 10px center / 16px; color: var(--ink); font: 700 13.5px var(--sans); cursor: pointer; }
.cat-view { display: flex; gap: 4px; padding: 3px; border: 1px solid var(--line); border-radius: 13px; background: var(--white); }
.site-page .cat-view button { appearance: none; -webkit-appearance: none; display: grid; width: 34px; height: 32px; padding: 0; border: 0; border-radius: 10px; background: none; color: var(--muted); place-items: center; cursor: pointer; }
.site-page .cat-view button svg { width: 18px; height: 18px; }
.site-page .cat-view button.active { background: var(--surface-2); color: var(--ink); }
/* Кнопка фильтров нужна только там, где колонка уезжает в шторку. */
.site-page .cat-filters-open { display: none; }

/* Поиск внутри категории — рядом с чипами условий, той же формы, что строка
   поиска в шапке. */
.cat-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-bottom: 16px; }
.site-page .cat-chip { appearance: none; -webkit-appearance: none; display: inline-flex; align-items: center; gap: 6px; padding: 8px 12px; border: 1px solid var(--line); border-radius: 999px; background: var(--white); color: var(--ink); font: 700 13px var(--sans); cursor: pointer; }
.site-page .cat-chip:hover { border-color: var(--red); color: var(--red); }
.site-page .cat-chip svg { width: 13px; height: 13px; }
.site-page .cat-chip-reset { appearance: none; -webkit-appearance: none; padding: 8px 6px; border: 0; background: none; color: var(--red); font: 700 13px var(--sans); cursor: pointer; }
.site-page .cat-chip-reset:hover { text-decoration: underline; text-underline-offset: 3px; }

.site-page .cat-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
/* «Списком»: та же карточка, но фото слева, а описание и цена — строкой. */
.site-page .cat-grid.list { grid-template-columns: minmax(0, 1fr); gap: 12px; }
.site-page .cat-grid.list .card { flex-direction: row; }
.site-page .cat-grid.list .card-img { flex: none; width: 190px; aspect-ratio: 1; }
.site-page .cat-grid.list .card-body { flex: 1; display: flex; flex-direction: column; justify-content: center; }
.site-page .cat-grid.list .card-foot { margin-top: 14px; }
/* Ярлык скидки и кнопка сравнения жались к правому краю фотографии. В сетке
   снимок заполняет карточку целиком, а в списке он вписан в квадрат и по
   бокам остаются поля — метки повисали наполовину на снимке, наполовину на
   белом. В строке разводим их по верхним углам колонки со снимком. */
.site-page .cat-grid.list .card { position: relative; }
.site-page .cat-grid.list .card .product-promo-badge { top: 10px; right: auto; left: 10px; }
.site-page .cat-grid.list .card .site-card-compare { top: 10px; right: 10px; bottom: auto; left: auto; }
/* В строке названию хватает ширины, поэтому сердечко остаётся на своём месте
   рядом с ним. Иначе оно вставало в тот же угол, что и ярлык скидки, и
   закрывало его — на телефоне это было особенно заметно. */
.site-page .cat-grid.list .card .card-name-row { display: flex; }
.site-page .cat-grid.list .card .card-name-row .card-favorite {
    position: static; width: auto; height: auto; border-radius: 0;
    background: none; box-shadow: none;
}

.cat-note { max-width: 620px; padding: 34px 0 10px; }
.cat-note p { margin: 0 0 16px; font-size: 15px; line-height: 1.6; color: var(--muted); }
.site-page .cat-note-action { appearance: none; -webkit-appearance: none; padding: 12px 20px; border: 1px solid var(--line); border-radius: 14px; background: var(--white); color: var(--red); font: 800 14px var(--sans); cursor: pointer; }
.site-page .cat-note-action:hover { border-color: var(--red); }

/* Подвал на странице категории нужен — это обычная страница витрины, а не
   внутренний экран приложения (см. общее правило скрытия .ftr выше).
   Своя стрелка «назад» здесь тоже лишняя: наверху хлебные крошки. */
/* Оба :not() обязательны: общее правило скрытия перечисляет их и без них
   выигрывает по весу селектора — ровно так же написано правило для корзины. */
.site-page[data-active-screen="category"]:not(.site-showcase):not(.site-doc-active) .ftr { display: block !important; }
.site-page[data-active-screen="category"] .site-backbar { display: none; }

@media (max-width: 1280px) {
    .site-page .cat-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 1023px) {
    /* Планшет и телефон: колонка фильтров уезжает в шторку справа, товары
       занимают всю ширину — как в референсе. */
    .cat-layout { grid-template-columns: minmax(0, 1fr); gap: 0; }
    /* Шторка выезжает снизу вверх — так до неё дотягивается большой палец, и
       это привычнее панели, приезжающей сбоку. */
    .cat-filters {
        position: fixed; z-index: 90; top: auto; right: 0; bottom: 0; left: 0;
        width: auto; max-height: 86vh; padding: 0 18px calc(18px + env(safe-area-inset-bottom));
        border: 0; border-radius: 22px 22px 0 0;
        transform: translate3d(0, 100%, 0); transition: transform .3s ease; visibility: hidden;
        display: flex; flex-direction: column;
    }
    .cat-filters.open { transform: none; visibility: visible; }
    /* Шапка шторки с «ручкой» сверху — привычный признак того, что панель
       тянется снизу и её можно закрыть. */
    .cat-filters-head { position: sticky; top: 0; z-index: 1; padding: 16px 0 6px; background: var(--white); }
    .cat-filters-head::before {
        content: ''; position: absolute; top: 7px; left: 50%; transform: translateX(-50%);
        width: 38px; height: 4px; border-radius: 3px; background: var(--surface-3);
    }
    .site-page .cat-filters-close { display: grid; width: 36px; height: 36px; padding: 0; border: 0; border-radius: 50%; background: var(--surface-2); color: var(--ink); place-items: center; cursor: pointer; }
    .site-page .cat-filters-close svg { width: 18px; height: 18px; }
    /* Небольшой запас справа: полоса прокрутки перекрывала числа у значений. */
    .cat-filters-body { flex: 1; overflow: auto; padding-right: 6px; }
    .cat-filters-foot { display: block; padding-top: 12px; border-top: 1px solid var(--line); }
    .site-page .cat-filters-apply { appearance: none; -webkit-appearance: none; width: 100%; padding: 14px; border: 0; border-radius: 14px; background: var(--red); color: #fff; font: 800 15px var(--sans); cursor: pointer; }
    .cat-filters-scrim { position: fixed; z-index: 89; inset: 0; background: rgba(14,23,48,.45); }
    .site-page .cat-filters-open { display: inline-flex; align-items: center; gap: 8px; padding: 10px 16px; border: 1px solid var(--line); border-radius: 13px; background: var(--white); color: var(--ink); font: 700 13.5px var(--sans); cursor: pointer; }
    .site-page .cat-filters-open svg { width: 17px; height: 17px; }
    .cat-filters-open-count { display: inline-grid; min-width: 20px; height: 20px; padding: 0 6px; border-radius: 999px; background: var(--red); color: #fff; font-size: 11.5px; font-weight: 800; place-items: center; }
    .cat-top h1 { font-size: 30px; }
    .site-page .cat-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 760px) {
    .cat-top { padding: 18px 0 22px; }
    /* Тот же воздух между баннером и панелью сортировки, что на десктопе. */
    .cat-layout { padding-top: 22px; }
    .cat-toolbar { margin-bottom: 18px; }
    .cat-top h1 { font-size: 25px; letter-spacing: -.8px; }
    .cat-stats dd { font-size: 16px; }
    .cat-layout { padding-bottom: 40px; }
    /* На телефоне панель занимает одну строку: «Фильтры», сортировка на всю
       оставшуюся ширину и переключатель вида. Счётчик уходит строкой ниже. */
    .cat-toolbar { gap: 8px; }
    .cat-count { order: 3; width: 100%; }
    .cat-sort { flex: 1; min-width: 0; margin-left: 0; }
    .cat-sort > span { display: none; }
    .site-page .cat-sort select { width: 100%; padding: 9px 28px 9px 11px; font-size: 12.5px; }
    /* Пока открыта шторка фильтров, страница под ней не прокручивается. */
    body.cat-filters-shown { overflow: hidden; }
    .site-page .cat-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
    .site-page .cat-grid.list .card-img { width: 120px; }
}

/* Плавающие кнопки экранов (телефон в поддержке, ☰ в профиле) переезжают в
   строку заголовка — см. dockScreenFabs() в site.js. Здесь снимаем с них
   фиксированное положение приложения и красим под светлую шапку сайта. */
.site-page .site-docked-fab {
    position: static; z-index: auto; flex: none; margin-left: auto;
    border: 1px solid var(--line); background: var(--white); color: var(--ink);
    box-shadow: var(--shadow-sm); backdrop-filter: none; -webkit-backdrop-filter: none;
}
/* Шапка профиля: аватар с именем слева, ☰ справа — на одной линии. */
.site-page #profile .sticky-head { display: flex; align-items: center; gap: 10px; }
.site-page #profile .profile-page-head { flex: 1; width: auto; }
/* Шапку кабинета делаем карточкой со стрелкой — как строка «Мои данные» в
   приложении: по ней и так открываются данные профиля, но выглядела она
   просто именем, и люди искали, куда нажать. ☰ рядом вёл туда же —
   на сайте оставляем один вход. */
.site-page #profile .profile-page-head {
    display: flex; align-items: center; gap: 12px;
    padding: 14px 16px; border: 1px solid var(--line); border-radius: 18px;
    background: var(--white); box-shadow: var(--shadow-sm); text-align: left;
}
.site-page #profile .profile-page-head::after {
    content: ""; flex: none; width: 9px; height: 9px; margin-left: auto;
    border: 2px solid var(--muted); border-width: 2px 2px 0 0; transform: rotate(45deg);
}
.site-page #profile .profile-page-head .profile-page-title { display: none; }
.site-page #profile .profile-page-head .profile-page-name { font: 800 17px var(--sans); color: var(--ink); }
.site-page #profile #profileMenuFab { display: none; }
/* Заголовок поддержки: телефон справа, вровень с названием экрана. */
.site-page #support .page-head { display: flex; align-items: center; gap: 10px; }
.site-page #support .page-head h1 { flex: 1; min-width: 0; }
/* На телефоне под заголовком сразу идёт карточка «Поддержка БИКРА» со
   своей кнопкой звонка — трубка в шапке дублировала и её, и слово
   «Поддержка». Оставляем одну, в карточке. */
@media (max-width: 767px) {
    .site-page #support .page-head #feedbackFab { display: none; }
}

/* ── БАЗА МОБИЛЬНОЙ ОБВЯЗКИ ──────────────────────────────────────────
   Нижняя панель, меню и плавающие сообщения существуют только на телефоне —
   на десктопе их разметка есть, но она скрыта. */
.site-burger, .site-tabbar, .site-chat-fab, .site-menu, .site-menu-scrim { display: none; }

/* ── ТЕЛЕФОН: ШАПКА, НИЖНЯЯ ПАНЕЛЬ, МЕНЮ И ВИТРИНА ───────────────────
   Блок стоит в конце файла намеренно. Ранний @media (max-width: 767px)
   выше по файлу почти не работал: медиазапрос не добавляет веса селектору,
   и десктопные правила вида «.site-page .act > span» перебивали его. Поэтому
   мобильные правила пишем здесь и с тем же префиксом .site-page.
   Всё, что ниже, — только сайт: приложение, PWA и нативные сборки берут
   свою вёрстку из app/index.html и app.css и сюда не заглядывают. */
@media (max-width: 767px) {
    /* ШАПКА: логотип, поиск и кнопка меню — одна строка вместо пяти.
       «Каталог», профиль, избранное и корзина переехали в нижнюю панель,
       сообщения — в плавающую кнопку (см. syncMobileChrome в site.js). */
    .site-page .hdr-in { display: flex; align-items: center; gap: 10px; height: auto; padding: 9px 16px; }
    .site-page .hdr .logo { margin-right: 0; }
    .site-page .hdr .logo img { height: 25px; }
    .site-page .hdr .search-wrap { order: 2; flex: 1; min-width: 0; }
    .site-page .hdr .search { height: 40px; padding: 0 14px; }
    /* Кнопка меню — у правого края, как гамбургер в приложении: в разметке
       она стоит раньше поиска, поэтому переставляем порядком. */
    .site-page .hdr .site-burger { order: 3; }
    .site-page .hdr .search input { font-size: 14.5px; }
    .site-page .site-burger {
        display: grid; flex: none; width: 44px; height: 44px; padding: 0;
        border: 1px solid var(--line); border-radius: 13px; background: var(--white);
        color: var(--ink); place-items: center; cursor: pointer;
    }
    .site-page .site-burger svg { width: 20px; height: 20px; }
    /* Второй ряд шапки пустеет: ссылки и адрес уехали в меню. */
    .site-page .hdr-row2 { display: none; }

    /* НИЖНЯЯ ПАНЕЛЬ — как вкладки в приложении: иконка и подпись, активная
       подсвечена фирменным красным. */
    .site-page { --site-tabbar-height: 62px; }
    .site-page .site-tabbar {
        position: fixed; z-index: 70; right: 0; bottom: 0; left: 0;
        display: flex; align-items: stretch;
        height: calc(62px + env(safe-area-inset-bottom)); padding-bottom: env(safe-area-inset-bottom);
        border-top: 1px solid var(--line); background: color-mix(in srgb, var(--white) 92%, transparent);
        -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px);
    }
    /* .acts остаётся обёрткой ради переноса целиком, но в раскладке панели
       участвуют сами кнопки — отсюда display: contents. */
    .site-page .site-tabbar .acts { display: contents; }
    /* Пять кнопок в ряд: подпись мельче, иначе «Избранное» переносится. */
    .site-page .site-tabbar { font-size: 10px; }
    .site-page .site-tabbar .site-tab-home,
    .site-page .site-tabbar .catbtn,
    .site-page .site-tabbar .act {
        flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px;
        height: auto; padding: 0; border-radius: 0; background: none;
        color: var(--muted); font: 600 10px var(--sans); white-space: nowrap;
    }
    .site-page .site-tabbar .catbtn svg,
    .site-page .site-tabbar .site-tab-home svg { width: 23px; height: 23px; }
    .site-page .site-tabbar .site-tab-home {
        appearance: none; -webkit-appearance: none; border: 0; cursor: pointer;
    }
    .site-page .site-tabbar .act .act-ic, .site-page .site-tabbar .act .act-ic svg { width: 23px; height: 23px; }
    .site-page .site-tabbar .act > span:last-child { display: block; }
    /* Активная вкладка подсвечена фирменным красным — класс tab-active
       ставит syncTabbarActive() по текущему экрану. «Каталог» больше не
       красный всегда: он горит, только когда открыт каталог. */
    .site-page .site-tabbar .catbtn { color: var(--muted); }
    .site-page .site-tabbar .site-tab-home,
    .site-page .site-tabbar .catbtn { color: var(--muted); }
    .site-page .site-tabbar .site-tab-home.tab-active,
    .site-page .site-tabbar .catbtn.tab-active,
    .site-page .site-tabbar .act.tab-active { color: var(--red); }
    /* Счётчики — у верхнего угла иконки, а не поверх неё. */
    .site-page .site-tabbar .act { position: relative; }
    .site-page .site-tabbar .act-badge { top: 2px; right: calc(50% - 24px); line-height: 1; display: none; }
    .site-page .site-tabbar .act-badge.show { display: grid; place-items: center; }
    /* Порядок вкладок: каталог, избранное, корзина, профиль. Профиль в
       разметке шапки идёт первым, поэтому расставляем через order. */
    .site-page .site-tabbar .site-tab-home { order: 1; }
    .site-page .site-tabbar .catbtn { order: 2; }
    .site-page .site-tabbar #favoritesFilter { order: 3; }
    .site-page .site-tabbar .acts .act:last-child { order: 4; }
    .site-page .site-tabbar .acts .act:first-child { order: 5; }

    /* СООБЩЕНИЯ — плавающей кнопкой над панелью, как в каталоге приложения. */
    .site-page .site-chat-fab { display: block; position: fixed; z-index: 69; right: 14px; bottom: calc(74px + env(safe-area-inset-bottom)); }
    /* place-content обязателен рядом с place-items: place-items центрует
       иконку внутри её дорожки, а саму дорожку (24px) grid прижимал к левому
       краю круга — иконка стояла у самого края и казалась обрезанной. */
    .site-page .site-chat-fab .act {
        display: grid; width: 46px; height: 46px; border-radius: 50%;
        background: var(--white); color: var(--ink); box-shadow: var(--shadow);
        place-items: center; place-content: center;
    }
    .site-page .site-chat-fab .act > span:last-child { display: none; }
    /* Счётчик прижат к краю круга и не обрезается краем кнопки. */
    /* line-height: 1 обязателен: в базовом правиле строка 18px, а рамка делает
       коробку выше — цифра съезжала ниже центра кружка. */
    .site-page .site-chat-fab .act-badge { top: -4px; right: -4px; border: 2px solid var(--bg); line-height: 1; }
    .site-page .site-chat-fab .act-badge.show { display: grid; place-items: center; }

    /* Карточка товара и оформление открываются во весь экран со своей нижней
       плашкой — на это время панель и кнопка сообщений убираются. */
    .site-page.site-overlay-open .site-tabbar,
    .site-page.site-overlay-open .site-chat-fab { display: none; }
    /* На входе в кабинет и в корзине главная кнопка стоит внизу справа — там же,
       где кружок сообщений: он накрывал «Войти в кабинет» и «Перейти к
       оформлению». На этих экранах кружок убираем, поддержка остаётся в меню. */
    .site-page:has(#profile.screen.active) .site-chat-fab,
    .site-page:has(#cart.screen.active) .site-chat-fab { display: none; }
    /* Запас под нижнюю панель даём всей странице, а не каждому экрану: с
       отступом на экране между контентом и подвалом зияла пустая полоса. */
    body.site-page.site-mobile-chrome { padding-bottom: calc(74px + env(safe-area-inset-bottom)); }

    /* КАРТОЧКА ТОВАРА В СЕТКЕ. На телефоне колонка узкая — 147px, и сердечко
       рядом с названием отнимало у него ещё 37px. Слову «Геотекстиль» не
       хватало места целиком, и оно разрывалось посередине: «Геотексти‑ль».
       Сердечко переносим в свободный левый верхний угол фотографии (справа
       там ярлык скидки), название получает всю ширину, а цену держим в одну
       строку — она тоже ломалась пополам перед знаком рубля. */
    .site-page .card { position: relative; }
    .site-page .card .card-name-row { display: block; }
    .site-page .card .card-name-row .card-favorite {
        position: absolute; z-index: 3; top: 8px; left: 8px; margin: 0;
        width: 30px; height: 30px; border-radius: 50%;
        background: var(--white); box-shadow: 0 4px 12px rgba(14,23,48,.14);
    }
    /* break-word вместо anywhere: перенос внутри слова — только когда слово
       и на всю ширину не помещается. */
    .site-page .card .card-name { overflow-wrap: break-word; }
    .site-page .card .card-foot { gap: 8px; }
    .site-page .card .card-foot .price { min-width: 0; }
    .site-page .card .card-foot b { font-size: 15px; white-space: nowrap; }

    /* МЕНЮ — выезжает справа: адрес доставки и разделы сайта. */
    .site-page .site-menu-scrim { display: block; position: fixed; z-index: 88; inset: 0; background: rgba(14,23,48,.45); }
    .site-page .site-menu {
        display: flex; flex-direction: column; position: fixed; z-index: 89; top: auto; right: 0; bottom: 0; left: 0;
        max-height: 86vh; padding: 0 18px calc(18px + env(safe-area-inset-bottom)); background: var(--white);
        border-radius: 22px 22px 0 0; box-shadow: var(--shadow);
        transform: translate3d(0, 100%, 0); transition: transform .3s ease; visibility: hidden;
    }
    .site-page .site-menu.open { transform: none; visibility: visible; }
    /* «Ручка» сверху — тот же признак шторки, что у фильтров. */
    .site-page .site-menu-head { position: relative; display: flex; align-items: center; justify-content: space-between; padding: 18px 0 10px; font: 800 17px var(--sans); color: var(--ink); }
    .site-page .site-menu-head::before {
        content: ''; position: absolute; top: 7px; left: 50%; transform: translateX(-50%);
        width: 38px; height: 4px; border-radius: 3px; background: var(--surface-3);
    }
    .site-page .site-menu-close { display: grid; width: 36px; height: 36px; padding: 0; border: 0; border-radius: 50%; background: var(--surface-2); color: var(--ink); place-items: center; cursor: pointer; }
    .site-page .site-menu-close svg { width: 18px; height: 18px; }
    .site-page .site-menu-body { flex: 1; overflow: auto; }
    /* Внутри меню ссылки — крупными строками в столбик, а не мелкой лентой. */
    .site-page .site-menu .quick-links { display: flex; flex-direction: column; align-items: stretch; gap: 0; margin-top: 6px; }
    .site-page .site-menu .quick-links .quick-link-btn { padding: 14px 2px; border-top: 1px solid var(--line); color: var(--ink); font: 600 15px var(--sans); text-align: left; }
    /* Раздел, на котором человек сейчас: раньше его подчёркивала красная
       линия во всю ширину — она читалась как разделитель и выглядела
       случайной. Теперь красный жирный текст с точкой слева. */
    .site-page .site-menu .quick-links .quick-link-btn.active {
        /* Цвет перебиваем намеренно: базовое правило кнопки красит текст
           чернильным независимо от состояния. */
        position: relative; padding-left: 14px; color: var(--red) !important; font-weight: 800;
    }
    .site-page .site-menu .quick-links .quick-link-btn.active::before {
        content: ""; position: absolute; top: 50%; left: 0; transform: translateY(-50%);
        width: 6px; height: 6px; border-radius: 50%; background: var(--red);
    }
    /* Панель разделов документа приклеена к шапке и рисовалась поверх
       открытой шторки меню — прячем её, пока меню открыто. */
    .site-page:has(.site-menu.open) .sec-nav { visibility: hidden; }
    .site-page .site-menu .topbar-address { display: flex; width: 100%; margin: 0; padding: 12px 14px; border: 1px solid var(--line); border-radius: 14px; font-size: 14px; }
    .site-page .site-menu .topbar-address > span:first-child { min-width: 0; flex: 1; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
    body.site-menu-shown { overflow: hidden; }

    /* ГЕРОЙ: заголовок больше не вылезает за экран, подпись компактнее,
       подсказка «Листать» убрана — экран и так короткий. */
    .site-page .site-hero { height: auto; min-height: 0; padding: 28px 0 34px; }
    .site-page .site-hero h1 { font-size: clamp(25px, 7.2vw, 31px); letter-spacing: -1px; }
    .site-page .site-hero .eyebrow { font-size: 11px; }
    .site-page .site-hero .lead { margin-top: 14px; padding: 12px 14px; font-size: 14px; line-height: 1.5; border-radius: 16px; }
    .site-page .site-hero::after { height: 90px; }
    .site-page .site-hero-hint { display: none; }

    /* Старая цена и скидка в карточке: в двух колонках на телефоне пара
       «1 118 ₽ · −10%» ломалась на две строки и разъезжала карточку. */
    .site-page .card .price-now { flex-wrap: nowrap; }
    .site-page .card .price-old { font-size: 10.5px; white-space: nowrap; }
    .site-page .card .price-off { font-size: 9.5px; white-space: nowrap; }
    .site-page .card .price b { font-size: 15.5px; }

    /* Витрина: заголовки блоков и карточки хитов под ширину телефона. */
    .site-page .hits-head .t { font-size: 18px; }
    .site-page .hit-card { width: 156px; }
    .site-page .promo-banner { gap: 14px; padding: 20px 18px; }
    .site-page .ticker { font-size: 11px; }

    /* Заголовки экранов и стрелки «назад»: в приложении они рассчитаны на
       полноэкранный слой, на сайте оказывались то великанами, то у самого
       края. Приводим к одному размеру и отступу. */
    .site-page .screen.active { padding-top: 18px; }
    .site-page .page-head h1 { font-size: 22px; letter-spacing: -.6px; }
    .site-page .page-head { gap: 8px; padding-left: 0; padding-right: 0; }
    .site-page .section-back { width: 36px; height: 36px; flex: none; }
    .site-page .site-backbar .container { padding-left: 6px; }
    .site-page .count-row .t { font-size: 18px; }

    /* Корзина: колонка с итогом рядом со списком на телефон не помещается —
       раскладываем всё в одну колонку по порядку разметки (список, итог,
       рекомендации), как в приложении. */
    .site-page .site-cart { display: block; }
    /* «Корзина» — по центру, стрелка «назад» остаётся у левого края.
       Счётчик товаров syncMobileChrome() уводит в строку «Выбрать все». */
    .site-page .site-cart-title { position: relative; justify-content: center; text-align: center; font-size: 23px; }
    .site-page .site-cart-title .section-back { position: absolute; left: 0; top: 50%; transform: translateY(-50%); }
    /* Каталог: сначала список направлений во всю ширину, после выбора —
       плитки категорий направления и кнопка возврата к списку
       (см. buildCategoryLayout в site.js). */
    .site-page #categories .cat-nav { margin-top: 4px; border: 0; background: none; padding: 0; }
    .site-page #categories .cat-nav-item {
        padding: 15px 16px; margin-bottom: 8px;
        border: 1px solid var(--line); border-radius: 16px; background: var(--white);
        font-size: 15px; box-shadow: var(--shadow-sm);
    }
    .site-page .cat-mobile-back {
        appearance: none; -webkit-appearance: none; display: block;
        margin: 4px 0 12px; padding: 0; border: 0; background: none;
        color: var(--red); font: 800 15px var(--sans); text-align: left; cursor: pointer;
    }
    .cat-mobile-empty { margin: 8px 2px; font-size: 14.5px; line-height: 1.6; color: var(--muted); }

    /* Вход в кабинет: капча Яндекса не сжимается уже 300px, и поля вместе с
       ней вылезали за правый край карточки. Даём карточке всю ширину экрана
       и ужимаем её собственные поля — 300px теперь помещаются внутри. */
    .site-page #profile .web-cabinet-login { width: calc(100% + 40px); margin-inline: -20px; padding: 26px 10px; }
    /* Колонка сетки не должна раздуваться под самый широкий элемент: капча
       задаёт 300px, и поля вместе с кнопкой вырастали до неё, вылезая за
       карточку. minmax(0, 1fr) держит их по ширине карточки. */
    .site-page #profile .cabinet-form { width: 100%; grid-template-columns: minmax(0, 1fr); }
    /* На совсем узких экранах (320px) 300px капчи всё равно не помещаются —
       пусть прокручивается она сама, а не вся страница. */
    .site-page #profile .bikra-captcha { width: 100%; max-width: 100%; overflow-x: auto; }

    /* Подсказки поиска на телефоне: название переносится в две строки, а
       цена уходит под него — раньше всё это ужималось в одну строку, и от
       названия оставалось «Геоте…». */
    /* Подсказки во всю ширину экрана: в узкой колонке под полем от
       названия оставалось «Ге…». */
    .site-page .search-suggest {
        position: fixed; left: 8px; right: 8px; top: 62px; width: auto;
        max-height: 62vh; padding: 4px;
    }
    .site-page .sg-item { align-items: flex-start; gap: 10px; padding: 9px 8px; }
    .site-page .sg-item img { width: 46px; }
    .site-page .sg-name { white-space: normal; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
    .site-page .sg-txt { display: flex; flex-direction: column; gap: 2px; }
    .site-page .sg-price { align-self: flex-start; margin-top: 2px; font-size: 14px; white-space: nowrap; }
    .site-page .sg-item { display: grid; grid-template-columns: 46px 1fr auto; align-items: center; }

    /* Подвал в одну колонку — четыре не помещались, контакты уезжали за край. */
    .site-page .ftr { padding-top: 34px; }
    .site-page .ftr-cols { grid-template-columns: 1fr; gap: 26px; }
    .site-page .ftr-copy { margin-top: 22px; padding-top: 22px; }
}

/* ── СРАВНЕНИЕ ТОВАРОВ (вид сайта) ───────────────────────────────────
   Логика общая с приложением, вид свой: внизу полоса с выбранными товарами,
   на экране сравнения — широкая таблица во всю страницу. В приложении на этом
   же месте плашка над вкладками и колонки со свайпом (см. app.css). */
.site-compare-dock {
    position: fixed; z-index: 65; right: 0; bottom: 0; left: 0;
    padding: 12px 0 calc(12px + env(safe-area-inset-bottom));
    border-top: 1px solid var(--line); background: color-mix(in srgb, var(--white) 94%, transparent);
    -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px);
    box-shadow: 0 -8px 26px rgba(14,23,48,.10);
    transform: translate3d(0, 110%, 0); transition: transform .3s ease; visibility: hidden;
}
.site-compare-dock.show { transform: none; visibility: visible; }
.site-compare-in { display: flex; align-items: center; gap: 18px; }
.site-compare-items { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; overflow-x: auto; scrollbar-width: none; }
.site-compare-items::-webkit-scrollbar { display: none; }
.site-page .site-compare-item { position: relative; flex: none; width: 54px; padding: 0; border: 1px solid var(--line); border-radius: 12px; background: var(--white); cursor: pointer; overflow: hidden; }
.site-compare-item img { display: block; width: 100%; aspect-ratio: 3/4; object-fit: cover; }
.site-compare-item-x { position: absolute; top: 2px; right: 2px; display: grid; place-items: center; width: 18px; height: 18px; border-radius: 50%; background: rgba(14,23,48,.6); color: #fff; font-size: 12px; line-height: 1; }
.site-compare-hint { flex: none; font-size: 13px; color: var(--muted); }
.site-page .site-compare-clear { appearance: none; -webkit-appearance: none; padding: 0 6px; border: 0; background: none; color: var(--muted); font: 700 13.5px var(--sans); cursor: pointer; }
.site-page .site-compare-clear:hover { color: var(--red); }
.site-page .site-compare-open { appearance: none; -webkit-appearance: none; flex: none; padding: 13px 22px; border: 0; border-radius: 14px; background: var(--red); color: #fff; font: 800 14.5px var(--sans); cursor: pointer; }
.site-page .site-compare-open:hover { background: var(--red-dark); }
.site-compare-actions { display: flex; align-items: center; gap: 12px; flex: none; }

/* Кнопка сравнения на карточке каталога — в углу фотографии, как «сердечко»
   в приложении, но появляется мягко и не мешает нажать саму карточку. */
.site-page .site-card-compare {
    position: absolute; z-index: 2; right: 8px; bottom: 8px;
    display: grid; place-items: center; width: 32px; height: 32px; padding: 0;
    border: 1px solid var(--line); border-radius: 10px;
    background: color-mix(in srgb, var(--white) 88%, transparent); color: var(--muted);
    -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); cursor: pointer;
}
.site-page .site-card-compare svg { width: 17px; height: 17px; }
.site-page .site-card-compare:hover { color: var(--ink); border-color: var(--ink); }
.site-page .site-card-compare.active { color: #fff; background: var(--red); border-color: var(--red); }
@media (pointer: coarse) {
    /* Кнопка остаётся компактной внутри фото, а реальная зона касания
       соответствует мобильным рекомендациям и не требует точного тапа. */
    .site-page .site-card-compare::before {
        content: "";
        position: absolute;
        inset: -6px;
    }
}

/* Экран сравнения: колонки товаров и таблица во всю ширину контентной зоны. */
.site-page #compare .compare-scroll { padding: 0; }
.site-page #compare .compare-tools { padding: 0 0 16px; }
.site-page #compare .compare-cols { grid-auto-columns: 210px; gap: 16px; }
.site-page #compare .compare-table { width: 100%; margin-top: 22px; font-size: 14px; }
.site-page #compare .compare-table th { width: 220px; padding: 12px 16px 12px 0; }
.site-page #compare .compare-table td { width: 210px; padding: 12px 16px 12px 0; }
/* Строки-различия подсвечены подложкой: на широком экране их видно сразу. */
.site-page #compare .compare-diff-row td { background: rgba(225,37,27,.05); }
.site-page #compare .compare-diff-row th { background: rgba(225,37,27,.05); }

@media (max-width: 767px) {
    /* На телефоне полоса сравнения встаёт над нижней панелью вкладок. */
    .site-page.site-mobile-chrome .site-compare-dock { bottom: calc(62px + env(safe-area-inset-bottom)); padding-bottom: 12px; }
    .site-compare-in { gap: 12px; }
    .site-compare-hint { display: none; }
    .site-page .site-compare-open { padding: 11px 16px; font-size: 13.5px; }
    .site-page .site-compare-clear { display: none; }
    .site-page #compare .compare-cols { grid-auto-columns: 150px; gap: 10px; }
    .site-page #compare .compare-table th { width: 140px; }
    .site-page #compare .compare-table td { width: 150px; }
}

/* ── «СООБЩИТЬ О ПОСТУПЛЕНИИ» (вид сайта) ────────────────────────────
   В приложении это широкая кнопка под наличием (app.css). На сайте карточка
   товара трёхколоночная, и кнопка живёт в правой колонке под ценой — там же,
   где «В корзину», поэтому выглядит как её замена, а не как второй призыв. */
.site-page .pr-restock {
    margin-top: 12px; padding: 14px 18px; border-radius: 16px;
    border-color: var(--line); font-size: 14.5px;
}
.site-page .pr-restock:hover { border-color: var(--red); color: var(--red); }
.site-page .pr-restock:hover .ic-svg { color: var(--red); }
.site-page .pr-restock.done:hover { border-color: rgba(34,160,107,.5); color: #22a06b; }

/* ── ТЕКУЩИЙ РАЗДЕЛ В ШАПКЕ ──────────────────────────────────────────
   Ссылка того экрана, на котором человек сейчас, подсвечена и подчёркнута —
   иначе по второму ряду шапки не понять, где находишься. */
.site-page .quick-links .quick-link-btn.active { position: relative; color: var(--ink); font-weight: 700; }
.site-page .quick-links .quick-link-btn.active::after {
    content: ''; position: absolute; left: 0; right: 0; bottom: -9px;
    height: 2px; border-radius: 2px; background: var(--red);
}
/* В меню на телефоне разделы идут строками, и та же подчёркивающая полоса
   ложилась ровно на линию-разделитель: получалась красная черта во всю
   ширину, будто это рамка блока. Там метка одна — точка слева. */
.site-page .site-menu .quick-links .quick-link-btn.active::after { content: none; }

/* ── ПОДДЕРЖКА НА ДЕСКТОПЕ ───────────────────────────────────────────
   Чат — основная работа на этом экране, и держать его в узкой колонке
   посреди пустого монитора незачем: разворачиваем на всю ширину страницы и
   на высоту окна, чтобы переписка листалась внутри, а не растягивала сайт. */
@media (min-width: 768px) {
    .site-page #support.screen.active {
        width: 100%; max-width: none; padding-left: 28px; padding-right: 28px;
        /* Экран занимает ровно окно под шапкой сайта: переписка листается
           внутри, а страница целиком не прокручивается. */
        height: calc(100vh - var(--site-header-height, 116px));
        display: flex; flex-direction: column; overflow: hidden;
    }
    /* Заголовок «Поддержка» повторял карточку чата под ним — в ней то же
       название. Убираем повтор, а стрелку «назад» переносим внутрь карточки
       (см. site.js): она освобождает себе место слева. */
    .site-page #support > .page-head { display: none; }
    .site-page #support .wrap {
        width: 100%; max-width: none;
        flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: hidden;
    }
    .site-page #support .support-hero { flex: none; }
    .site-page #support .support-hero .section-back {
        flex: none; margin-right: 4px;
        display: grid; place-items: center; width: 38px; height: 38px;
        border: 0; border-radius: 12px; background: rgba(255, 255, 255, .12); cursor: pointer;
    }
    .site-page #support #supportContent {
        flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: hidden;
    }
    .site-page #support .support-chat { flex: 1; min-height: 0; display: flex; flex-direction: column; }
    /* Переписка листается сама, а строка ввода стоит на месте: до этого
       прокручивалась вся страница, и поле ввода уезжало вниз. */
    .site-page #support .support-thread { flex: 1; min-height: 0; max-height: none; overflow-y: auto; }
    .site-page #support .support-form { flex: none; }
}

/* ── ПОДДЕРЖКА НА ТЕЛЕФОНЕ ───────────────────────────────────────────
   Раздел занимает весь экран, как в приложении: сверху строка с кнопкой
   назад и карточкой поддержки, посередине переписка со своей прокруткой,
   внизу — строка ввода. Она прижата к низу и поднимается вместе с
   клавиатурой: раньше поле уезжало под неё, а переписка прокручивалась
   вместе со всей страницей. */
@media (max-width: 767px) {
    .site-page #support.screen.active {
        /* Начинается под шапкой сайта: она липкая и лежит выше по слою, и
           строка со стрелкой «назад» уходила под логотип — стрелку было не
           видно и не нажать. */
        position: fixed; z-index: 70; inset: var(--site-header-height, 62px) 0 0;
        /* Высоту задают top и bottom, а не 100dvh из общего app.css: с ней
           панель уходила ниже экрана на высоту шапки вместе со строкой ввода. */
        height: auto; max-height: none;
        display: flex; flex-direction: column;
        padding: 0; background: var(--bg);
    }
    /* Заголовок «Поддержка» со своей стрелкой повторял карточку под собой:
       там то же название и та же кнопка звонка. Строку убираем, стрелка
       переезжает в карточку (см. buildSupportLayout). */
    .site-page #support > .page-head { display: none; }
    .site-page #support .support-hero { display: flex; align-items: center; gap: 10px; padding: 12px; }
    .site-page #support .support-hero .section-back {
        flex: none; display: grid; place-items: center; width: 36px; height: 36px; padding: 0;
        border: 0; border-radius: 12px; background: rgba(255, 255, 255, .12); color: inherit; cursor: pointer;
    }
    .site-page #support .wrap {
        flex: 1; display: flex; flex-direction: column; min-height: 0;
        padding: 0 12px; overflow: hidden;
    }
    .site-page #support .support-hero { flex: none; margin: 10px 0; }
    .site-page #support #supportContent {
        flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: hidden;
    }
    .site-page #support .support-chat { flex: 1; min-height: 0; }
    .site-page #support .support-thread { flex: 1; min-height: 0; max-height: none; overflow-y: auto; }
    .site-page #support .support-form {
        flex: none; position: sticky; bottom: 0; z-index: 2;
        padding-bottom: calc(10px + env(safe-area-inset-bottom));
        background: var(--bg);
    }
    /* Нижняя панель вкладок в переписке только мешает: экран занят целиком. */
    .site-page.site-support-screen .tabbar { display: none; }

    /* Пока печатают в поддержке, шапка сайта не нужна — экран занят перепиской,
       а на iPhone липкая строка поиска перекрывала поле ввода. Класс ставится,
       только когда печатают именно здесь (assets/app/18-push.js). */
    .site-page.keyboard-open #hdr { display: none; }
    .site-page.keyboard-open #support.screen.active { top: 0; }
}

/* Панель сортировки и колонка фильтров отделены от тёмного баннера заметным
   воздухом. Селектор с .container обязателен: у него самого задан padding
   («.site-page .container { padding: 0 20px }»), и правило только по
   .cat-layout проигрывало ему по весу — отступ обнулялся, поэтому панель и
   выглядела приклеенной к баннеру. */
.site-page .container.cat-layout { padding-top: 52px; }
@media (max-width: 767px) { .site-page .container.cat-layout { padding-top: 26px; } }

/* Лента разделов «Возврата» на телефоне: прилипает выше (второго ряда шапки
   там нет) и компактнее по высоте — вкладок больше, чем ширины экрана, и
   лишние 2 пикселя высоты здесь ни к чему. */
@media (max-width: 767px) {
    .site-page { --sec-nav-top: 58px; }
    .site-page #pageReturn .sec-nav-in { padding: 0 16px; height: 46px; }
    .site-page #pageReturn .sec-nav a { padding: 0 14px; font-size: 12.5px; }
}

/* ── ПОЛОСА «УСТАНОВИТЕ ПРИЛОЖЕНИЕ» И СТРАНИЦА #pageApps ─────────────
   Полоса идёт сразу за баннером акций и повторяет его ритм, но взята другая
   гамма — синяя вместо красной, чтобы две плашки подряд не сливались в одну.
   Высота втрое меньше баннера: заметно, но не отвлекает от каталога. */
/* display здесь намеренно не задан: показ полосы решает правило витрины выше
   (.site-page.site-showcase .app-strip). Если задать display: flex тут, оно
   перебьёт скрытие — полоса вылезет на всех экранах сайта. */
/* Полоса идёт сразу за баннером акций и составляет с ним одну ленту: поэтому
   без скруглений, без зазора сверху и во всю ширину окна — содержимое при этом
   выровнено по той же сетке 1240px, что и у баннера. */
.site-page .app-strip {
    appearance: none; -webkit-appearance: none; align-items: center; gap: 16px;
    width: 100%; margin: 0 0 26px; padding: 16px max(20px, calc((100vw - 1240px) / 2 + 20px)); border: 0; border-radius: 0;
    background: linear-gradient(100deg, #14213D 0%, #1B2E52 55%, #24406F 100%);
    color: #fff; text-align: left; cursor: pointer; box-shadow: var(--shadow-sm);
}
.site-page .app-strip:hover { background: linear-gradient(100deg, #1B2E52 0%, #24406F 55%, #2C4E86 100%); }
.app-strip-ic { display: grid; flex: none; width: 42px; height: 42px; border-radius: 13px; background: rgba(255,255,255,.12); place-items: center; }
.app-strip-ic svg { width: 22px; height: 22px; }
.app-strip-text { display: flex; flex-direction: column; gap: 3px; flex: 1; min-width: 0; }
.app-strip-text b { font: 800 16px var(--sans); }
.app-strip-text span { font-size: 13.5px; color: rgba(255,255,255,.72); }
.app-strip-cta { flex: none; padding: 10px 18px; border-radius: 12px; background: var(--red); font: 800 13.5px var(--sans); }

/* ── СТРАНИЦА «ПРИЛОЖЕНИЕ» ───────────────────────────────────────────
   Собрана по макету «Приложение.dc.html» из проекта «Акции и приложение
   Bikra». В макете всё было инлайновыми стилями с зашитыми цветами — здесь
   те же значения берутся из переменных темы, иначе одна и та же краска в
   двух местах разъезжается при первой правке. */
.apps-hero {
    position: relative; overflow: hidden;
    padding: 26px 0 60px;
    background: linear-gradient(120deg, var(--site-navy) 0%, var(--site-navy-2) 55%, var(--red-dark) 130%);
}
/* Красное свечение в углу — из макета: без него градиент выглядит плоским. */
.apps-hero::before {
    content: ""; position: absolute; top: -160px; right: -100px;
    width: 460px; height: 460px; border-radius: 50%;
    background: radial-gradient(circle, rgba(225,37,27,.45) 0%, transparent 65%);
    pointer-events: none;
}
.apps-hero > .container { position: relative; }
.apps-hero .cat-crumbs { color: rgba(255,255,255,.55); }
.apps-hero .cat-crumbs button { color: rgba(255,255,255,.55); }
.apps-hero .cat-crumbs b { color: #fff; }
.apps-hero-in { display: grid; grid-template-columns: 1.25fr .9fr; gap: 48px; align-items: center; margin-top: 34px; }
.apps-hero-text { min-width: 0; }
.apps-hero-top { display: flex; align-items: center; gap: 18px; }
.apps-hero-icon { flex: none; width: 76px; height: 76px; border-radius: 20px; box-shadow: 0 12px 30px rgba(0,0,0,.35); }
.apps-eyebrow { font: 700 12px var(--sans); letter-spacing: 1.5px; text-transform: uppercase; color: rgba(255,255,255,.55); }
.apps-eyebrow-red { color: var(--red); }
.apps-hero h1 { margin: 6px 0 0; font: 800 46px/1.04 var(--disp); letter-spacing: -1.6px; color: #fff; }
.apps-hero-lead { margin: 22px 0 0; max-width: 540px; font-size: 16px; line-height: 1.6; color: rgba(255,255,255,.75); }
.apps-hero-actions { display: flex; align-items: center; gap: 16px; margin-top: 30px; flex-wrap: wrap; }
.apps-hero-meta { font-size: 13px; line-height: 1.5; color: rgba(255,255,255,.6); }
.site-page .apps-download {
    display: inline-flex; align-items: center; gap: 12px;
    height: 60px; padding: 0 30px; border-radius: 18px;
    background: var(--red); color: #fff; font: 700 16px var(--sans);
    box-shadow: 0 12px 30px rgba(225,37,27,.42);
}
.site-page .apps-download:hover { background: var(--red-dark); color: #fff; }
.site-page .apps-download svg { width: 22px; height: 22px; }
.apps-stores { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 22px; }
.apps-store {
    padding: 9px 15px; border: 1px solid rgba(255,255,255,.16); border-radius: 999px;
    background: rgba(255,255,255,.07); font: 700 12.5px var(--sans); color: rgba(255,255,255,.72);
}
.apps-qr {
    display: flex; flex-direction: column; align-items: center; gap: 16px;
    padding: 28px; border: 1px solid rgba(255,255,255,.14); border-radius: 22px;
    background: rgba(255,255,255,.07);
}
.apps-qr-code { width: 180px; height: 180px; border-radius: 16px; background: #fff; padding: 8px; box-sizing: border-box; }
.apps-qr-note { text-align: center; font-size: 13.5px; line-height: 1.55; color: rgba(255,255,255,.72); }

/* Колонка страницы приложения — minmax(0, 1fr), а не auto: у столбца по
   умолчанию есть нижняя граница по самому широкому содержимому, и на телефоне
   вся страница вылезала за правый край экрана — плашки упирались в него без
   отступа, хотя слева отступ был. */
.site-page .container.apps-body { padding: 44px 0 64px; display: grid; grid-template-columns: minmax(0, 1fr); gap: 56px; }
.site-page .container.apps-body > * { min-width: 0; }
.apps-warning {
    display: flex; align-items: flex-start; gap: 16px; padding: 24px 26px;
    border: 1px solid rgba(225,37,27,.22); border-radius: 20px; background: rgba(225,37,27,.05);
}
.apps-warning-ic { flex: none; display: grid; place-items: center; width: 44px; height: 44px; border-radius: 14px; background: var(--red); color: #fff; }
.apps-warning-ic svg { width: 22px; height: 22px; }
.apps-warning b { font-size: 16px; color: var(--ink); }
.apps-warning p { margin: 8px 0 0; max-width: 900px; font-size: 14.5px; line-height: 1.65; color: var(--ink); }

.apps-section h2 { margin: 8px 0 0; font: 800 32px var(--sans); letter-spacing: -.9px; color: var(--ink); }
.apps-section-lead { margin: 12px 0 0; max-width: 760px; font-size: 15px; line-height: 1.65; color: var(--muted); }

/* Шаги установки: номер, текст и снимок экрана телефона справа. Снимок
   нарисован разметкой, а не картинкой — текст в нём живой. */
.apps-steps-list { display: grid; gap: 14px; margin-top: 26px; }
.apps-step {
    display: grid; grid-template-columns: 56px minmax(0, 1fr) 300px; gap: 24px; align-items: center;
    padding: 26px 28px; border: 1px solid var(--line); border-radius: 20px; background: var(--white);
    transition: border-color .15s, box-shadow .15s;
}
.apps-step:hover { border-color: var(--red); box-shadow: 0 12px 30px rgba(14,23,48,.08); }
.apps-step-no { font: 800 20px var(--sans); color: var(--red); }
.apps-step-body h3 { margin: 0; font: 800 17px var(--sans); color: var(--ink); }
.apps-step-body p { margin: 8px 0 0; font-size: 14px; line-height: 1.65; color: var(--muted); }
/* Приписка под шагом: это не действие, а объяснение, почему предупреждение
   безопасно. Отделена чертой и набрана мельче — иначе читается как ещё один
   шаг, и человек ищет, что ему нажать. */
.apps-step-body p.apps-step-note { margin-top: 10px; padding-left: 10px; border-left: 2px solid var(--line); font-size: 13px; }
.apps-step-shot:empty { display: none; }
.apps-step-shot { padding: 16px; border: 1px solid var(--line); border-radius: 16px; background: var(--surface-2); }
.apps-shot-title { font: 700 13px/1.4 var(--sans); color: var(--ink); }
.apps-shot-note { margin-top: 4px; font-size: 12px; line-height: 1.45; color: var(--muted); }
.apps-shot-buttons { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
/* Подпись в кнопке бывает длинной («Всё равно установить») и в две строки —
   поэтому высота минимальная, а не жёсткая: текст вылезал за красный
   прямоугольник. */
.apps-shot-btn {
    /* min-width: 0 обязателен: без него кнопка не сжимается уже своего текста,
       и на узком экране пара «Не устанавливать» + «Всё равно установить»
       распирала страницу вбок — на шрифтах, шире наших, это и происходило. */
    flex: 1 1 0; min-width: 0; display: grid; place-items: center;
    min-height: 38px; padding: 7px 10px; border-radius: 12px;
    border: 1px solid var(--line); background: var(--white);
    font: 700 12.5px/1.25 var(--sans); color: var(--muted); text-align: center;
}
.apps-shot-btn.is-primary { border-color: transparent; background: var(--red); color: #fff; font-weight: 800; }
.apps-shot-toggle { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-top: 14px; padding: 10px 12px; border-radius: 12px; background: var(--white); font: 700 12.5px var(--sans); color: var(--ink); }
.apps-shot-switch { position: relative; flex: none; width: 36px; height: 20px; border-radius: 999px; background: var(--red); }
.apps-shot-switch::after { content: ""; position: absolute; top: 2px; right: 2px; width: 16px; height: 16px; border-radius: 50%; background: #fff; }

.apps-two { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
.apps-card { padding: 32px; border: 1px solid var(--line); border-radius: 22px; background: var(--white); }
.apps-card h3 { margin: 10px 0 0; font: 800 26px var(--sans); letter-spacing: -.7px; color: var(--ink); }
.apps-card-lead { margin: 12px 0 0; font-size: 14.5px; line-height: 1.65; color: var(--muted); }
.apps-card > p { margin: 12px 0 0; font-size: 13.5px; line-height: 1.6; color: var(--muted); }
.apps-checklist { margin: 20px 0 0; padding: 0; list-style: none; display: grid; gap: 14px; }
.apps-checklist li { position: relative; padding-left: 24px; font-size: 14.5px; line-height: 1.6; color: var(--muted); }
.apps-checklist li::before { content: ""; position: absolute; left: 0; top: 8px; width: 8px; height: 8px; border-radius: 50%; background: #2E8B3E; }
.apps-checklist b { color: var(--ink); }
.apps-note-line { margin-top: 22px; padding: 16px 20px; border-left: 3px solid var(--red); border-radius: 0 14px 14px 0; background: rgba(225,37,27,.06); font-size: 13.5px; line-height: 1.6; color: var(--ink); }
.apps-ios-steps { margin: 22px 0 0; padding: 0; list-style: none; display: grid; gap: 12px; }
.apps-ios-steps li { display: flex; gap: 14px; align-items: flex-start; padding: 14px 16px; border: 1px solid var(--line); border-radius: 16px; background: var(--surface-2); font-size: 14px; line-height: 1.55; color: var(--ink); }
.apps-ios-no { flex: none; display: grid; place-items: center; width: 28px; height: 28px; border-radius: 50%; background: var(--red); color: #fff; font: 800 13px var(--sans); }

.apps-features-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 16px; margin-top: 24px; }
.apps-features-grid div { padding: 26px; border: 1px solid var(--line); border-radius: 20px; background: var(--white); }
.apps-features-grid b { display: block; margin-bottom: 10px; font-size: 16px; color: var(--ink); }
.apps-features-grid span { font-size: 13.5px; line-height: 1.6; color: var(--muted); }

.apps-promo { display: flex; align-items: center; justify-content: space-between; gap: 32px; flex-wrap: wrap; padding: 32px 36px; border: 1px solid rgba(225,37,27,.2); border-radius: 22px; background: rgba(225,37,27,.05); }
.apps-promo h3 { margin: 10px 0 0; font: 800 26px var(--sans); letter-spacing: -.7px; color: var(--ink); }
.apps-promo p { margin: 10px 0 0; max-width: 560px; font-size: 14px; line-height: 1.6; color: var(--muted); }
.apps-promo-side { display: flex; align-items: center; gap: 16px; }
.apps-promo-code { padding: 16px 24px; border: 1px dashed rgba(225,37,27,.45); border-radius: 16px; background: var(--white); font: 800 24px var(--sans); letter-spacing: 2px; color: var(--red); }
.apps-promo-link { border: 0; background: none; font: 800 14px var(--sans); color: var(--red); cursor: pointer; }
.apps-promo-link:hover { text-decoration: underline; }

.apps-stores-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; margin-top: 24px; }
.apps-stores-grid .apps-card { padding: 26px; }
.apps-store-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.apps-store-head b { font-size: 17px; color: var(--ink); }
.apps-badge { padding: 5px 11px; border-radius: 999px; background: rgba(225,37,27,.1); color: var(--red); font: 800 11px var(--sans); letter-spacing: .6px; text-transform: uppercase; }
.apps-badge.is-plain { background: var(--surface-2); color: var(--muted); }

/* Вопросы раскрываются через details/summary: работает без скриптов и с
   клавиатуры, а стрелка меняется по состоянию open. */
.apps-faq { display: grid; gap: 10px; margin-top: 24px; }
.apps-faq-item { border: 1px solid var(--line); border-radius: 18px; background: var(--white); overflow: hidden; }
.apps-faq-item summary { display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 20px 24px; font: 800 16px var(--sans); color: var(--ink); cursor: pointer; list-style: none; }
.apps-faq-item summary::-webkit-details-marker { display: none; }
.apps-faq-item summary::after { content: "+"; flex: none; display: grid; place-items: center; width: 28px; height: 28px; border-radius: 50%; background: var(--surface-2); color: var(--red); font: 800 18px var(--sans); }
.apps-faq-item[open] summary::after { content: "−"; }
.apps-faq-item p { margin: 0; padding: 0 24px 22px; font-size: 14.5px; line-height: 1.7; color: var(--muted); }

.apps-help { display: flex; align-items: center; justify-content: space-between; gap: 32px; flex-wrap: wrap; padding: 40px; border-radius: 22px; background: linear-gradient(120deg, var(--site-navy) 0%, var(--site-navy-2) 55%, var(--red-dark) 130%); color: #fff; }
.apps-help h3 { margin: 0; font: 800 28px var(--sans); letter-spacing: -.7px; color: #fff; }
.apps-help p { margin: 10px 0 0; max-width: 560px; font-size: 14.5px; line-height: 1.6; color: rgba(255,255,255,.72); }
.apps-help-phones { display: flex; gap: 12px; flex-wrap: wrap; }
.site-page .apps-help-call { display: inline-flex; align-items: center; justify-content: center; height: 56px; padding: 0 26px; border-radius: 16px; background: var(--red); color: #fff; font: 700 15px var(--sans); }
.site-page .apps-help-call:hover { background: var(--red-dark); color: #fff; }
.site-page .apps-help-call.is-ghost { border: 1px solid rgba(255,255,255,.2); background: rgba(255,255,255,.1); }
.site-page .apps-help-call.is-ghost:hover { border-color: #fff; background: rgba(255,255,255,.16); }

@media (max-width: 1023px) {
    .apps-hero-in { grid-template-columns: minmax(0, 1fr); gap: 26px; }
    .apps-qr { justify-self: start; }
    /* Снимок экрана телефона на планшете уходит под текст шага. */
    .apps-step { grid-template-columns: 44px minmax(0, 1fr); }
    .apps-step-shot { grid-column: 2; }
    .apps-two { grid-template-columns: minmax(0, 1fr); }
    .apps-features-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .apps-stores-grid { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 767px) {
    /* На телефоне полоса становится в две строки: подпись уходит под заголовок,
       кнопка — вниз во всю ширину, иначе всё это не помещается. */
    .site-page .app-strip { flex-wrap: wrap; gap: 12px; padding: 14px 16px; border-radius: 0; }
    .app-strip-text b { font-size: 15px; }
    .app-strip-text span { font-size: 12.5px; }
    .app-strip-cta { width: 100%; text-align: center; }
    .apps-hero { padding: 18px 0 34px; }
    .apps-hero-icon { width: 58px; height: 58px; border-radius: 16px; }
    .apps-hero h1 { font-size: 28px; letter-spacing: -.8px; }
    .apps-hero-lead { font-size: 14.5px; }
    .site-page .apps-download { width: 100%; justify-content: center; height: 54px; padding: 0 18px; font-size: 15px; }
    .apps-hero-actions { gap: 12px; }
    .site-page .container.apps-body { padding: 32px 0 48px; gap: 40px; }
    .apps-section h2 { font-size: 24px; letter-spacing: -.5px; }
    .apps-step { grid-template-columns: minmax(0, 1fr); gap: 12px; padding: 20px; }
    .apps-step-shot { grid-column: 1; }
    .apps-features-grid { grid-template-columns: minmax(0, 1fr); }
    .apps-promo { padding: 24px; }
    .apps-promo-side { width: 100%; justify-content: space-between; }
    .apps-help { padding: 24px; }
    .apps-help-phones { width: 100%; }
    .site-page .apps-help-call { flex: 1; justify-content: center; }
}

/* ── СТРАНИЦА «АКЦИИ» ───────────────────────────────────────────────
   Тот же приём, что на странице «Приложение»: тёмный первый экран во всю
   ширину, дальше светлые карточки в общей колонке. В приложении у раздела
   свой вид — эти блоки там скрыты атрибутом hidden, снимает его только
   site.js. */
/* Свой заголовок «Акции» у раздела остаётся только на телефоне и только как
   стрелка «назад»: название несёт первый экран, а два заголовка подряд —
   это уже не страница, а список. На широком экране назад ведёт шапка сайта,
   поэтому там прячем всю строку (правило ниже, в @media). */
.site-page #promotions > .page-head h1 { display: none; }
.promo-hero {
    /* Фон тянется до краёв окна, а содержимое остаётся в общей колонке:
       обрезанный по колонке баннер выглядел как случайный прямоугольник.
       Вылет считает site.js и кладёт в --promo-bleed — через 100vw нельзя:
       там, где полоса прокрутки обычная, а не поверх содержимого, окно на её
       толщину уже, и баннер вылезал бы за край, добавляя прокрутку вбок. */
    position: relative; overflow: hidden; padding: 26px 0 52px;
    margin-right: calc(var(--promo-bleed-right, 0px) * -1);
    margin-left: calc(var(--promo-bleed-left, 0px) * -1);
    background: linear-gradient(120deg, var(--site-navy) 0%, var(--site-navy-2) 55%, var(--red-dark) 130%);
    color: #fff;
}
.promo-hero::before {
    content: ""; position: absolute; top: -140px; right: -120px; width: 420px; height: 420px; border-radius: 50%;
    background: radial-gradient(circle, rgba(225,37,27,.45) 0%, transparent 65%); pointer-events: none;
}
.promo-hero > .container { position: relative; }
.promo-hero .cat-crumbs, .promo-hero .cat-crumbs button { color: rgba(255,255,255,.55); }
.promo-hero .cat-crumbs b { color: #fff; }
.promo-hero-in { display: flex; align-items: flex-end; justify-content: space-between; gap: 40px; flex-wrap: wrap; margin-top: 34px; }
.promo-hero-text { max-width: 640px; }
.promo-live {
    display: inline-flex; align-items: center; gap: 8px; padding: 7px 14px;
    border: 1px solid rgba(255,255,255,.14); border-radius: 999px; background: rgba(255,255,255,.08);
    font: 700 12px var(--sans); letter-spacing: .5px;
}
.promo-live i { width: 7px; height: 7px; border-radius: 50%; background: var(--red); box-shadow: 0 0 0 4px rgba(225,37,27,.25); }
.promo-hero h1 { margin: 20px 0 0; font: 800 52px/1.03 var(--disp); letter-spacing: -1.8px; color: #fff; }
.promo-hero h1 span { color: var(--red); }
.promo-hero p { margin: 16px 0 0; max-width: 520px; font-size: 16px; line-height: 1.55; color: rgba(255,255,255,.75); }
.promo-stats { display: flex; gap: 12px; }
.promo-stat { padding: 20px 24px; border: 1px solid rgba(255,255,255,.14); border-radius: 18px; background: rgba(255,255,255,.07); }
.promo-stat b { display: block; font: 800 34px var(--sans); letter-spacing: -1px; }
.promo-stat b i { font-style: normal; color: var(--red); }
.promo-stat span { display: block; margin-top: 4px; font-size: 12px; line-height: 1.35; color: rgba(255,255,255,.6); }

/* Список акций из приложения (.promo-showcase в app.css) на сайте не
   показываем: рядом с карточками ниже он выглядел как чужой кусок. */
.site-page #promotions .wrap { display: none; }

/* Карточки акций: слева большая, справа столбик остальных — по макету. */
.promo-cards { display: grid; grid-template-columns: 1.35fr 1fr; gap: 16px; }
.promo-cards[hidden] { display: none; }
.promo-card-hero {
    position: relative; overflow: hidden; display: flex; flex-direction: column; justify-content: space-between;
    min-height: 300px; padding: 32px; border-radius: 22px; color: #fff;
    background: linear-gradient(135deg, var(--site-navy-2) 0%, var(--site-navy) 60%, var(--red-dark) 150%);
    box-shadow: 0 14px 34px rgba(14,23,48,.18);
}
.promo-card-hero::before {
    content: ""; position: absolute; bottom: -90px; left: -60px; width: 280px; height: 280px; border-radius: 50%;
    background: radial-gradient(circle, rgba(225,37,27,.4), transparent 65%); pointer-events: none;
}
.promo-card-hero > * { position: relative; }
.promo-card-hero h2 { margin: 18px 0 0; font: 800 38px/1.08 var(--disp); letter-spacing: -1.2px; color: #fff; }
.promo-card-hero p { margin: 14px 0 0; max-width: 420px; font-size: 14.5px; line-height: 1.6; color: rgba(255,255,255,.72); }
.promo-card-badge {
    display: inline-block; padding: 6px 12px; border-radius: 8px; background: var(--red);
    font: 800 11px var(--sans); letter-spacing: 1px; text-transform: uppercase; color: #fff;
}
.promo-card-badge.is-soft { background: rgba(225,37,27,.1); color: var(--red); }
.promo-card-badge.is-solid { background: var(--red); color: #fff; }
.promo-card-foot { display: flex; align-items: center; gap: 14px; margin-top: 26px; flex-wrap: wrap; }
.promo-card-term { font-size: 13px; color: rgba(255,255,255,.6); }
.site-page .promo-card-cta {
    display: inline-flex; align-items: center; height: 52px; padding: 0 24px; border: 0; border-radius: 16px;
    background: var(--red); color: #fff; font: 700 15px var(--sans); cursor: pointer;
    box-shadow: 0 10px 26px rgba(225,37,27,.4);
}
.site-page .promo-card-cta:hover { background: var(--red-dark); }
.promo-card-column { display: grid; gap: 16px; align-content: start; }
.promo-card { position: relative; overflow: hidden; padding: 26px; border: 1px solid var(--line); border-radius: 22px; background: var(--white); }
.promo-card.is-code { border-color: rgba(225,37,27,.18); background: rgba(225,37,27,.04); }
.promo-card-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; }
.promo-card h3 { margin: 14px 0 0; font: 800 23px/1.15 var(--sans); letter-spacing: -.6px; color: var(--ink); }
.promo-card p { margin: 10px 0 0; font-size: 14px; line-height: 1.6; color: var(--muted); }
.promo-card-amount {
    flex: none; display: grid; place-items: center; width: 78px; height: 78px; border-radius: 20px;
    background: var(--red); color: #fff; font: 800 24px var(--sans); letter-spacing: -1px;
}
.promo-card-code { display: flex; align-items: center; gap: 12px; margin-top: 16px; flex-wrap: wrap; }
.promo-card-code b {
    padding: 12px 18px; border: 1px dashed rgba(225,37,27,.45); border-radius: 14px; background: var(--white);
    font: 800 20px var(--sans); letter-spacing: 2px; color: var(--red);
}
.promo-card-code span { font-size: 13px; line-height: 1.4; color: var(--muted); }
.promo-card-terms { margin: 16px 0 0; padding: 0; list-style: none; display: grid; gap: 7px; }
.promo-card-terms li { position: relative; padding-left: 20px; font-size: 13.5px; line-height: 1.5; color: var(--muted); }
.promo-card-terms li::before { content: ""; position: absolute; left: 0; top: 7px; width: 7px; height: 7px; border-radius: 50%; background: var(--red); }
.site-page .promo-card-link {
    margin-top: 16px; padding: 0; border: 0; background: none;
    color: var(--red); font: 800 14px var(--sans); cursor: pointer;
}
.site-page .promo-card-link:hover { color: var(--red-dark); }
.site-page .container.promo-body { padding: 44px 20px 64px; display: grid; gap: 44px; }
.promo-section-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 20px; flex-wrap: wrap; }
.promo-section-head h2 { margin: 8px 0 0; font: 800 32px var(--sans); letter-spacing: -.9px; color: var(--ink); }
.promo-section-note { font-size: 13.5px; color: var(--muted); }

/* Карточка акционного товара: фотография три на четыре, как в каталоге. */
.promo-goods { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 16px; margin-top: 24px; }
.promo-good {
    min-width: 0; display: flex; flex-direction: column; overflow: hidden; cursor: pointer;
    border: 1px solid var(--line); border-radius: 20px; background: var(--white);
    transition: border-color .15s, box-shadow .15s;
}
.promo-good:hover { border-color: var(--red); box-shadow: 0 14px 34px rgba(14,23,48,.1); }
.promo-good-photo { position: relative; aspect-ratio: 3 / 4; background: var(--surface-2); }
.promo-good-photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
.promo-good-badge {
    position: absolute; top: 10px; left: 10px; padding: 5px 9px; border-radius: 8px;
    background: var(--red); color: #fff; font: 800 11px var(--sans); letter-spacing: .4px;
    box-shadow: 0 3px 8px rgba(225,37,27,.4);
}
.promo-good-body { display: flex; flex-direction: column; gap: 6px; flex: 1; padding: 14px; }
.promo-good-name { font: 700 14px/1.3 var(--sans); color: var(--ink); }
.promo-good-spec { font-size: 12.5px; line-height: 1.35; color: var(--muted); }
.promo-good-price { display: flex; align-items: baseline; gap: 8px; margin-top: auto; padding-top: 10px; }
.promo-good-price b { font: 800 18px var(--sans); letter-spacing: -.4px; color: var(--red); }
.promo-good-price s { font-size: 13px; color: var(--muted); }
.promo-good-unit { font-size: 12px; color: var(--muted); }

/* Две скидки, которые включаются сами. */
.promo-extra { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
.promo-card { padding: 32px; border: 1px solid var(--line); border-radius: 22px; background: var(--white); }
.promo-card h3 { margin: 10px 0 0; font: 800 26px var(--sans); letter-spacing: -.7px; color: var(--ink); }
.promo-card h3 span { color: var(--red); }
.promo-card > p { margin: 12px 0 0; font-size: 14.5px; line-height: 1.65; color: var(--muted); }
.promo-goal { margin-top: 26px; }
.promo-goal-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.promo-goal-head b { font: 800 15px var(--sans); color: var(--ink); }
.promo-goal-head span { font-size: 13px; color: var(--muted); }
.promo-goal-bar { position: relative; height: 12px; margin-top: 12px; border-radius: 999px; background: var(--surface-2); overflow: hidden; }
.promo-goal-bar i { display: block; height: 100%; width: 0; border-radius: 999px; background: var(--red); transition: width .35s ease; }
#sitePromoGoal.reached .promo-goal-bar i { background: #2E8B3E; }
.promo-goal-scale { display: flex; justify-content: space-between; margin-top: 8px; font-size: 12px; color: var(--muted); }
.promo-note { margin: 24px 0 0; padding: 16px 20px; border-left: 3px solid var(--red); border-radius: 0 14px 14px 0; background: rgba(225,37,27,.06); font-size: 13.5px; line-height: 1.6; color: var(--ink); }
.promo-tiers { display: grid; gap: 10px; margin-top: 24px; }
.promo-tier {
    display: flex; align-items: center; justify-content: space-between; gap: 16px;
    padding: 16px 20px; border: 1px solid var(--line); border-radius: 16px; background: var(--surface-2);
}
.promo-tier b { display: block; font: 800 15px var(--sans); color: var(--ink); }
.promo-tier span { display: block; margin-top: 3px; font-size: 12.5px; color: var(--muted); }
.promo-tier em { font: 800 24px var(--sans); font-style: normal; letter-spacing: -.6px; color: var(--ink); }
/* Своя ступень: её видно первой, поэтому она и выделена. */
.promo-tier.mine { border-color: rgba(225,37,27,.22); background: rgba(225,37,27,.05); }
.promo-tier.mine em { color: var(--red); }
.promo-mine { margin: 16px 0 0; font: 700 13.5px/1.55 var(--sans); color: var(--ink); }
.promo-fine { margin: 18px 0 0; font-size: 12.5px; line-height: 1.55; color: var(--muted); }

.promo-terms { padding: 32px; border: 1px solid var(--line); border-radius: 22px; background: var(--white); }
.promo-terms h3 { margin: 0; font: 800 20px var(--sans); letter-spacing: -.4px; color: var(--ink); }
.promo-terms-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 28px; margin-top: 20px; }
.promo-terms-grid p { margin: 0; font-size: 13.5px; line-height: 1.65; color: var(--muted); }

.promo-app {
    display: flex; align-items: center; justify-content: space-between; gap: 32px; flex-wrap: wrap; padding: 40px;
    border-radius: 22px; background: linear-gradient(120deg, var(--site-navy) 0%, var(--site-navy-2) 55%, var(--red-dark) 130%);
    color: #fff;
}
.promo-app-text { display: flex; align-items: center; gap: 24px; }
.promo-app-text img { flex: none; width: 86px; height: 86px; border-radius: 22px; display: block; box-shadow: 0 12px 30px rgba(0,0,0,.35); }
.promo-app h3 { margin: 0; font: 800 28px var(--sans); letter-spacing: -.7px; color: #fff; }
.promo-app p { margin: 10px 0 0; max-width: 520px; font-size: 14.5px; line-height: 1.6; color: rgba(255,255,255,.72); }
.site-page .promo-app-cta {
    display: inline-flex; align-items: center; justify-content: center; height: 56px; padding: 0 28px;
    border-radius: 16px; background: var(--red); color: #fff; font: 700 15px var(--sans);
    box-shadow: 0 10px 26px rgba(225,37,27,.4);
}
.site-page .promo-app-cta:hover { background: var(--red-dark); }

@media (min-width: 768px) {
    .site-page #promotions > .page-head { display: none; }
}
@media (max-width: 1023px) {
    .promo-cards { grid-template-columns: minmax(0, 1fr); }
    .promo-card-hero { min-height: 0; }
    .promo-goods { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .promo-extra { grid-template-columns: minmax(0, 1fr); }
    .promo-terms-grid { grid-template-columns: minmax(0, 1fr); gap: 16px; }
    .promo-stats { width: 100%; }
    .promo-stat { flex: 1; }
}
@media (max-width: 767px) {
    .promo-cards { gap: 10px; }
    .promo-card-hero { padding: 22px 18px; }
    .promo-card-hero h2 { font-size: 26px; letter-spacing: -.6px; }
    .site-page .promo-card-cta { width: 100%; justify-content: center; height: 48px; }
    .promo-card { padding: 20px 18px; }
    .promo-card h3 { font-size: 19px; }
    .promo-card-amount { width: 62px; height: 62px; font-size: 20px; border-radius: 16px; }
    .promo-hero { padding: 16px 0 30px; }
    .promo-hero-in { margin-top: 22px; gap: 24px; }
    .promo-hero h1 { font-size: 30px; letter-spacing: -.9px; }
    .promo-hero p { font-size: 14.5px; }
    .promo-stat { padding: 14px 16px; }
    .promo-stat b { font-size: 26px; }
    .site-page #promotions .wrap { padding: 24px 16px 0; }
    .site-page .container.promo-body { padding: 28px 16px 44px; gap: 32px; }
    .promo-section-head h2 { font-size: 24px; letter-spacing: -.5px; }
    /* Товары на телефоне — в два столбца, как каталог: одна колонка растянула
       бы страницу, а карточка и так узкая. */
    .promo-goods { gap: 10px; margin-top: 18px; }
    .promo-good-body { padding: 10px; gap: 4px; }
    .promo-good-name { font-size: 13px; }
    .promo-good-price b { font-size: 16px; }
    .promo-card { padding: 22px 18px; }
    .promo-card h3 { font-size: 21px; letter-spacing: -.4px; }
    .promo-card > p { font-size: 14px; }
    .promo-note { padding: 14px 16px; font-size: 13px; }
    .promo-tier { padding: 14px 16px; }
    .promo-tier em { font-size: 20px; }
    .promo-terms { padding: 22px 18px; }
    .promo-app { padding: 24px 20px; gap: 20px; }
    .promo-app-text { gap: 16px; align-items: flex-start; }
    .promo-app-text img { width: 62px; height: 62px; border-radius: 16px; }
    .promo-app h3 { font-size: 20px; letter-spacing: -.3px; }
    .promo-app p { font-size: 13.5px; }
    .site-page .promo-app-cta { width: 100%; height: 52px; }
}

/* Экраны из приложения на широком экране: без ограничения ширины карточка
   поддержки и ветки растягивались на всю страницу и читались полосой.
   Держим их в колонке разумной ширины, как остальные разделы кабинета. */
@media (min-width: 900px) {
    .site-page #messages .msg-support-card,
    .site-page #messages .msg-all-title,
    .site-page #messages .msg-threads,
    .site-page #messages .msg-read-all-btn,
    .site-page #messages .push-optional,
    .site-page #support .support-hero,
    .site-page #support .push-optional { width: min(720px, 100%); margin-inline: auto; }
    /* Карточка поддержки на десктопе шире по внутренним отступам: две кнопки
       в ряд не должны занимать всю строку. */
    .site-page #messages .msg-support-actions { max-width: 420px; }
    /* Шаги оформления в широком окне: номер и заголовок крупнее, карточка
       с большими полями — иначе на 1440 они выглядели мелко. */
    .site-page .checkout .co-step { padding: 18px 20px; }
    .site-page .checkout .co-step-title { font-size: 16px; }
}

/* Направления на телефоне — строкой с фотографией, числом позиций и
   стрелкой: тот же вид, что в приложении. */
.site-page .cat-nav-item { display: flex; align-items: center; gap: 12px; width: 100%; padding: 10px; text-align: left; }
.site-page .cat-nav-cover { flex: none; width: 58px; height: 58px; border-radius: 10px; overflow: hidden; background: var(--surface-3, rgba(0,0,0,.05)); }
.site-page .cat-nav-cover img { width: 100%; height: 100%; object-fit: cover; display: block; }
.site-page .cat-nav-copy { display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1; }
.site-page .cat-nav-copy b { font-size: 15px; line-height: 1.25; }
.site-page .cat-nav-copy small { color: var(--muted); font-size: 12px; }
.site-page .cat-nav-chevron { flex: none; color: var(--muted); }
.site-page .cat-nav-chevron .ic-svg { width: 16px; height: 16px; }
.site-page .cat-nav-item:disabled { opacity: .55; cursor: default; }
.site-page .cat-nav-item:disabled .cat-nav-chevron { display: none; }

/* На широком экране трубка тоже дублировалась: она есть в карточке
   поддержки прямо под заголовком. Оставляем одну — в карточке, а
   карточку растягиваем на всю ширину колонки. */
@media (min-width: 768px) {
    /* Перебиваем правило плавающей кнопки: оно задаёт ей display грид и
       выигрывает по весу. */
    .site-page #support .page-head #feedbackFab { display: none !important; }
    .site-page #support .page-head { justify-content: flex-start; text-align: left; }
    .site-page #support .page-head h1 { flex: 1; text-align: left; }
    .site-page #support .support-hero { width: 100% !important; max-width: none !important; margin-inline: 0 !important; }
}


/* Карточка товара на сайте — обычная страница, а не окно поверх каталога.
   Накладкой она перекрывала всё разом: кнопки шапки переключали экран под
   ней и выглядели нерабочими, а шторка выбора адреса открывалась позади.
   position: relative, а не static: плавающие кнопки над фотографией
   отмеряются от карточки, и без него они уехали бы к краю страницы. */
.site-page .product {
    position: relative; inset: auto; z-index: auto; transform: none;
    display: none; width: 100%;
}
.site-page .product.show { display: flex; }
/* Прокрутка теперь общая, страницы: своей у карточки больше нет. */
.site-page .product .pr-body { flex: none; overflow: visible; padding-top: 8px; }
/* Пока открыта карточка, всё остальное содержимое страницы не показываем —
   иначе к товару тянулись бы следом первый экран с баннерами и лента
   каталога, одной длинной полосой. */
/* Класс ставит сам код карточки (assets/app/16-product.js). Через :has()
   переключение состояния стоило браузеру пересчёта стилей всего документа. */
.site-page.product-open .site-hero,
.site-page.product-open .ticker,
.site-page.product-open .promo-banner,
.site-page.product-open .app-strip { display: none; }
.site-page.product-open .screen.active { display: none; }


/* Плитки товара за пределами экрана браузер может не считать вовсе. У
   геотекстиля в ленте тысяча карточек и двадцать тысяч узлов разметки: без
   этого каждый кадр прокрутки пересчитывал их все, и страница дёргалась.
   contain-intrinsic-size задаёт высоту невидимой плитки — без неё полоса
   прокрутки прыгала бы по мере досчёта. 484px — фактическая высота карточки
   в ленте (3:4 снимок плюс название с ценой). */
.site-page #catGrid .card,
.site-page #grid .card { content-visibility: auto; contain-intrinsic-size: auto 484px; }

/* Карточка поддержки в сообщениях. На телефоне она узкая и содержимое
   заполняет её целиком, а на широком экране заголовок и обе кнопки жались к
   левому краю, оставляя пустой половину карточки. */
@media (min-width: 1024px) {
    .site-page .msg-support-card { padding: 22px; }
    .site-page .msg-support-top { justify-content: center; }
    /* Ряд кнопок ограничен по ширине (см. app.css) — без margin: auto он
       оставался прижатым к левому краю карточки. */
    .site-page .msg-support-actions { justify-content: center; margin-inline: auto; }
    .site-page .msg-support-chat,
    .site-page .msg-support-call { flex: 0 1 240px; }
}

/* Баннеры акций листаются: карточки лежат стопкой, видна одна. */
.site-page .promo-hero-stage { position: relative; display: grid; }
.site-page .promo-hero-stage > .promo-card-hero { position: absolute; inset: 0; grid-area: 1 / 1; visibility: hidden; opacity: 0; transition: opacity .35s ease; }
/* Высоту сцены задаёт видимый баннер, а не самый длинный из всех: у акции без
   описания под заголовком оставалась пустая половина экрана — ровно та, что
   занимает текст соседней акции. */
.site-page .promo-hero-stage > .promo-card-hero.is-shown { position: relative; visibility: visible; opacity: 1; }
.site-page .promo-hero-dots { position: absolute; z-index: 2; right: 18px; bottom: 16px; display: flex; gap: 7px; }
.site-page .promo-hero-dot { width: 9px; height: 9px; padding: 0; border: 0; border-radius: 50%; background: rgba(255,255,255,.45); cursor: pointer; transition: background .2s ease, transform .2s ease; }
.site-page .promo-hero-dot.is-active { background: #fff; transform: scale(1.25); }
.site-page .promo-hero-dot:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }

/* Заглушки на время загрузки категории: карточки той же формы, что и товары.
   Без этих правил они схлопывались в узкие полоски — на экране это выглядело
   как обрывки разметки, а не как «сейчас загрузим». */
.site-page .cat-grid .skeleton-card { width: 100%; min-width: 0; min-height: 320px; }
.site-page .cat-grid.list .skeleton-card { min-height: 140px; }

/* Стрелки листания баннеров акций и кнопка «Показать ещё» под товарами. */
.site-page .promo-hero-arrows { position: absolute; z-index: 2; inset: 0; display: flex; align-items: center; justify-content: space-between; padding: 0 10px; pointer-events: none; }
.site-page .promo-hero-arrow { display: grid; place-items: center; width: 38px; height: 38px; padding: 0; border: 0; border-radius: 50%; background: rgba(255,255,255,.16); color: #fff; cursor: pointer; pointer-events: auto; transition: background .2s ease; }
.site-page .promo-hero-arrow:hover { background: rgba(255,255,255,.3); }
.site-page .promo-hero-arrow svg { width: 20px; height: 20px; }
.site-page .promo-hero-arrow.is-next svg { transform: rotate(180deg); }
/* На телефоне стрелок листания нет: кружки лежали поверх текста акции ровно
   там, где его читают. Листается точками под баннером и само по времени. */
@media (max-width: 767px) {
    .site-page .promo-hero-arrows { display: none; }
}
.site-page .promo-goods-more { display: block; margin: 18px auto 0; padding: 13px 26px; border: 1px solid var(--line); border-radius: 14px; background: var(--white); color: var(--ink); font: 700 14px var(--sans); cursor: pointer; }
.site-page .promo-goods-more:hover { border-color: var(--red); color: var(--red); }

/* Цена в фильтрах категории: диапазон «от — до». */
.site-page .cat-group-price .cat-price-row { display: flex; align-items: center; gap: 8px; }
.site-page .cat-price-input { width: 100%; min-width: 0; height: 40px; padding: 0 10px; border: 1px solid var(--line); border-radius: 10px; background: var(--white); color: var(--ink); font: 600 14px var(--sans); }
.site-page .cat-price-input:focus { border-color: var(--red); outline: none; }

/* Промокод для приложения: виден и на сайте, но подписан честно — применить
   его здесь нельзя, и кнопки «Применить в заказе» у него нет. */
.site-page .promo-card.is-app-only { border-color: var(--line); }
.site-page .promo-card-app { display: inline-flex; align-items: center; margin-left: 8px; padding: 4px 9px; border-radius: 999px; background: #0e1730; color: #fff; font-size: 11px; font-weight: 800; letter-spacing: .02em; text-transform: uppercase; }
.site-page .promo-card-app-note { margin: 10px 0 0; color: var(--muted); font-size: 13px; line-height: 1.45; }


/* «Показать ещё» под лентой: дальше первых страниц каталог не растёт сам. */
.site-page .feed-more { display: block; width: min(100%, 320px); margin: 18px auto 8px; padding: 14px 18px; border: 1px solid var(--line); border-radius: 14px; background: var(--white); color: var(--ink); font: 700 15px var(--sans); cursor: pointer; }
.site-page .feed-more:hover { border-color: var(--red); color: var(--red); }

/* ── ПРОФИЛЬ НА ТЕЛЕФОНЕ ПО МАКЕТУ «Мобильная версия» ──────────────
   Тёмная шапка с аватаром, почтой, метками и тремя плитками; под ней разделы
   кабинета строками. Значения (цвета, радиусы, кегли) перенесены из макета. */
@media (max-width: 767px) {
    /* Своя шапка из оболочки приложения на сайте не нужна: её заменяет герой. */
    .site-page.site-cabinet-mobile #profile > .sticky-head { display: none; }
    .site-page #cabMobile { display: grid; gap: 14px; }
    .cab-hero { padding: 20px 16px; border-radius: 20px; background: linear-gradient(135deg, #111C38 0%, #14213D 48%, #8E1810 165%); color: #fff; }
    .cab-hero-top { display: flex; align-items: center; gap: 13px; }
    .cab-hero-ava { display: grid; flex: none; width: 52px; height: 52px; border-radius: 15px; background: rgba(255, 255, 255, .14); font-size: 19px; font-weight: 800; place-items: center; }
    .cab-hero-id { min-width: 0; }
    .cab-hero-name { overflow: hidden; font-size: 19px; font-weight: 800; letter-spacing: -.3px; text-overflow: ellipsis; white-space: nowrap; }
    .cab-hero-mail { margin-top: 3px; overflow: hidden; color: rgba(255, 255, 255, .74); font-size: 12.5px; text-overflow: ellipsis; white-space: nowrap; }
    .cab-hero-settings { display: grid; flex: none; width: 38px; height: 38px; margin-left: auto; border: 0; border-radius: 12px; background: rgba(255, 255, 255, .14); color: #fff; cursor: pointer; place-items: center; }
    .cab-hero-settings span { display: flex; width: 18px; height: 18px; }
    .cab-hero-tags { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 14px; }
    .cab-hero-tag { padding: 6px 11px; border-radius: 999px; background: rgba(255, 255, 255, .14); color: rgba(255, 255, 255, .82); font-size: 11px; font-weight: 800; white-space: nowrap; }
    .cab-hero-tag.is-ok { background: rgba(225, 37, 27, .9); color: #fff; }
    .cab-hero-stats { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; margin-top: 16px; }
    .cab-hero-stats > div { min-width: 0; padding: 11px; border-radius: 13px; background: rgba(255, 255, 255, .1); }
    .cab-hero-stats b { display: block; font-size: 16px; }
    .cab-hero-stats span { display: block; margin-top: 2px; color: rgba(255, 255, 255, .68); font-size: 10.5px; line-height: 1.3; }
    /* Витрина из оболочки приложения под героем не нужна — те же разделы уже
       есть строками, а карусели дублируют главную. */
    .site-page.site-cabinet-mobile #profile .profile-quick-cards,
    .site-page.site-cabinet-mobile #profile .profile-legal { display: none; }
}

/* ── КОРЗИНА НА ТЕЛЕФОНЕ ПО МАКЕТУ ────────────────────────────────
   Сверху «Корзина N» и «Удалить всё», ниже адрес доставки и «Выбрать все · N».
   Иконки без подписей из оболочки приложения на сайте не нужны: что делает
   «корзина со стрелкой», приходилось угадывать. */
@media (max-width: 767px) {
    .site-page #cart .site-cart-title { display: flex; position: static; align-items: center; gap: 10px; padding: 0; }
    /* Стрелки «назад» в корзине по макету нет: выход — нижнее меню, а стрелка
       налезала на заголовок. */
    .site-page #cart .site-cart-title .site-back { display: none; }
    .site-page #cart .site-cart-count-inline { color: #9aa3b2; }
    .site-page #cart .cart-mobile-clear { margin-left: auto; padding: 0; border: 0; background: none; color: var(--muted); font: 700 13px var(--sans); cursor: pointer; }
    .site-page #cart .cart-toolbar .cart-tool-btn { display: none; }
    .site-page #cart .cart-select-all { font-size: 13.5px; font-weight: 700; }
    .site-page #cart .cart-address { border-radius: 15px; }
}

/* ── КАРТОЧКА ТОВАРА НА ТЕЛЕФОНЕ: ФОТО И ПАНЕЛЬ ПОКУПКИ ПО МАКЕТУ ──
   Остальное в карточке не трогаем — только пропорции фото и нижняя панель. */
@media (max-width: 767px) {
    /* Стрелка «назад» слева, четыре значка справа — и никак иначе: при любой
       правке раскладки они сползались в кучу к левому краю. */
    .site-page #product .pr-float-head { display: flex; align-items: center; justify-content: space-between; }
    .site-page #product .pr-float-actions { margin-left: auto; }
    /* Фото 3:4, как плитки в ленте: горизонтальное обрезало рулон по длине.
       Сама фотография не двигается по вертикали, но вертикальный жест по ней
       листает страницу (pan-y): иначе по снимку нельзя было прокрутить
       карточку дальше. */
    .site-page #product .pr-gallery { aspect-ratio: 3 / 4; overflow-y: hidden; touch-action: pan-x pan-y; }
    .site-page #product .pr-gallery img { width: 100%; height: 100%; object-fit: cover; }
    /* Саму панель покупки собирает блок выше (цена в две строки и «В
       корзину»); здесь остаётся только счётчик количества и высота кнопки. */
    .site-page #product .co-foot .qty, .site-page #product .co-foot .pr-qty {
        display: flex; flex: none; height: 44px; align-items: center; border-radius: 13px; background: #f2f4f8;
    }
    .site-page #product .co-foot .qty button, .site-page #product .co-foot .pr-qty button {
        width: 40px; height: 44px; border: 0; background: none; color: var(--red); font-size: 20px; font-weight: 800;
    }
    .site-page #product .pr-cart-control .btn { width: 100%; min-height: 52px; border-radius: 14px; font-size: 15.5px; font-weight: 700; }

}

/* ── ОФОРМЛЕНИЕ НА ТЕЛЕФОНЕ ПО МАКЕТУ ─────────────────────────────
   Шапка со стрелкой и полоской шагов, секции карточками с круглым номером,
   выбор получения — сегментами, пункты выдачи — карточками с радиокнопкой. */
@media (max-width: 767px) {
    .site-page .checkout .co-head { display: flex; align-items: center; gap: 10px; padding: 12px 14px 10px; }
    .site-page .checkout .co-head h3 { flex: 1; font-size: 17px; font-weight: 800; letter-spacing: -.3px; text-align: left; }
    .site-page .checkout .co-back {
        display: grid; flex: none; width: 38px; height: 38px; border: 0; border-radius: 12px;
        background: #f2f4f8; color: var(--ink); place-items: center;
    }
    /* Секции — карточками, номер шага в красном круге. */
    .site-page .checkout .co-body > .co-group,
    .site-page .checkout .co-body > section { padding: 16px; border: 1px solid #e6e9ef; border-radius: 16px; background: var(--bg); }
    .site-page .checkout .co-body .co-opt,
    .site-page .checkout .co-body .co-opt-row,
    .site-page .checkout .co-body .co-input,
    .site-page .checkout .co-body .co-address-btn,
    .site-page .checkout .co-body .co-contact-summary { background: var(--white); }
    .site-page .checkout .co-title { display: flex; align-items: center; gap: 10px; font-size: 15.5px; font-weight: 800; }
    .site-page .checkout .co-title .co-step, .site-page .checkout .co-title > span:first-child {
        display: grid; flex: none; width: 26px; height: 26px; border-radius: 50%;
        background: var(--red); color: #fff; font-size: 12.5px; font-weight: 800; place-items: center;
    }
    /* Самовывоз/доставка — два сегмента на серой подложке. */
    .site-page .checkout #coDelivery { display: flex; gap: 5px; padding: 4px; border: 0; border-radius: 13px; background: #f2f4f8; }
    .site-page .checkout #coDelivery .co-opt {
        flex: 1; min-height: 42px; margin: 0; padding: 0 10px; border: 0; border-radius: 10px;
        background: transparent; font-size: 13.5px; font-weight: 600;
    }
    .site-page .checkout #coDelivery .co-opt.active { background: var(--white); font-weight: 800; box-shadow: 0 2px 8px rgba(14, 23, 48, .08); }
    /* Пункты выдачи и способы доставки — карточками с кружком выбора. */
    .site-page .checkout #coPickupList .co-opt, .site-page .checkout #coDeliveryKinds .co-opt {
        display: flex; align-items: flex-start; gap: 12px; padding: 14px; border: 1px solid #dfe4ec; border-radius: 14px; text-align: left;
    }
    .site-page .checkout #coPickupList .co-opt.active, .site-page .checkout #coDeliveryKinds .co-opt.active { border: 2px solid var(--red); }
    /* Пункт выдачи Ozon: способ доставки и кнопка карты — одной строкой.
       Рамка у неё одна, общая: своя рамка способа внутри давала вторую, и на
       месте разделителя выходила двойная линия. */
    .site-page .checkout #coDeliveryKinds .co-opt-row { display: flex; align-items: stretch; border: 1px solid #dfe4ec; border-radius: 14px; overflow: hidden; background: var(--white); }
    .site-page .checkout #coDeliveryKinds .co-opt-row.active { border: 2px solid var(--red); }
    .site-page .checkout #coDeliveryKinds .co-opt-row .co-opt,
    .site-page .checkout #coDeliveryKinds .co-opt-row .co-opt.active { flex: 1; min-width: 0; border: 0; border-radius: 0; background: transparent; }
}

/* Пункты самовывоза на телефоне: названия и адреса мельче и спокойнее —
   крупный текст в каждой карточке перебивал сам выбор. */
@media (max-width: 767px) {
    .site-page .checkout #coPickupList .co-opt b,
    .site-page .checkout #coPickupList .co-opt-title { font-size: 14px; font-weight: 700; }
    .site-page .checkout #coPickupList .co-opt small,
    .site-page .checkout #coPickupList .co-opt span { font-size: 12.5px; line-height: 1.45; }
    .site-page .checkout #coPickupList .co-opt-stock { font-size: 11.5px; opacity: .85; }
    .site-page .checkout .co-subtitle { font-size: 11.5px; letter-spacing: .04em; }
}

/* ── ТЁМНАЯ ТЕМА ДЛЯ НОВЫХ МОБИЛЬНЫХ БЛОКОВ ──────────────────────
   Белые подложки и светлые рамки, взятые из макета, в тёмной теме светили
   как фонарь. Берём цвета из переменных темы, чтобы блоки жили вместе с ней. */
@media (max-width: 767px) {
    :root[data-theme="dark"] .site-page #cartFoot.show,
    :root[data-theme="dark"] .site-page #product .co-foot,
    :root[data-theme="dark"] .site-page .checkout .co-foot {
        border-top-color: var(--line); background: var(--surface, #171a21);
        box-shadow: 0 -8px 24px rgba(0, 0, 0, .5);
    }
    :root[data-theme="dark"] .site-page .checkout .co-back { background: var(--surface-2, #22262f); color: var(--ink); }
    :root[data-theme="dark"] .site-page .checkout #coDelivery { background: var(--surface-2, #22262f); }
    :root[data-theme="dark"] .site-page .checkout #coDelivery .co-opt.active { background: var(--surface, #171a21); box-shadow: 0 2px 8px rgba(0, 0, 0, .45); }
    :root[data-theme="dark"] .site-page .checkout .co-body > .co-group,
    :root[data-theme="dark"] .site-page .checkout .co-body > section,
    :root[data-theme="dark"] .site-page .checkout #coPickupList .co-opt,
    :root[data-theme="dark"] .site-page .checkout #coDeliveryKinds .co-opt { border-color: var(--line); background: var(--surface, #171a21); }
    :root[data-theme="dark"] .site-page #product .co-foot .qty,
    :root[data-theme="dark"] .site-page #product .co-foot .pr-qty { background: var(--surface-2, #22262f); }
    :root[data-theme="dark"] .cab-mobile-nav { border-color: var(--line); background: var(--surface, #171a21); }
    :root[data-theme="dark"] .cab-mobile-nav button { color: var(--ink); }
    :root[data-theme="dark"] .cab-mobile-nav button + button { border-top-color: var(--line); }
    :root[data-theme="dark"] .cab-mobile-nav button:active { background: var(--surface-2, #22262f); }
    :root[data-theme="dark"] .site-page .site-cart .cart-item { border-color: var(--line); background: var(--surface, #171a21); }
}

/* Шторка — модальный слой и должна быть выше шапки (z-index 300): липкая
   строка с поиском накрывала верх шторки со стрелкой «назад» и крестиком, и
   «Написать нам» было нечем закрыть. Порядок между шторками сохранён. */
.site-page .cart-overlay { z-index: 310; }
.site-page .cart-sheet { z-index: 320; }
.site-page #addressOverlay { z-index: 330; }
.site-page #addressSheet { z-index: 340; }
.site-page .toast { z-index: 360; }

/* Тёмная тема: основной текст документации. Приглушённый серый макета на белом
   фоне читается спокойно, а на тёмном — тускло, будто текст выключен. Поднимаем
   основной текст до почти белого; подписи под заголовками остаются тише — иначе
   страница превращается в белое полотно без иерархии. */
:root[data-theme="dark"] :is(.site-doc, .site-apps) :is(p, li, dd, .step-text) { color: #edf0f6; }
:root[data-theme="dark"] :is(.site-doc, .site-apps) :is(small, .doc-note, .apps-section-lead, .apps-card-lead) { color: #b9c1d1; }

/* Телефон и почта в шапке: подсветка наведением была прописана атрибутами
   onmouseover/onmouseout прямо в разметке — из-за них политика безопасности
   вынуждена была разрешать встроенный код. Наведение — дело стилей. */
.contact-hover { font: 700 14px var(--sans); color: var(--fg1); text-decoration: none; transition: color .15s; }
.contact-hover-lg { font-size: 16px; }
.contact-hover:hover { color: var(--red); }

/* Слой с картой выбора адреса: страница карты открывается поверх всего, как
   отдельный экран. Своей карты здесь нет — это та же страница, что открывает
   приложение. */
/* Выше шапки сайта (.hdr, z-index 300): иначе она перекрывает крестик
   закрытия на самой карте — человек попадает на экран, из которого не выйти.
   Ровно так же однажды залипал экран поддержки. */
.map-layer { position: fixed; inset: 0; z-index: 400; background: var(--bg, #0b1020); }
.map-layer iframe { width: 100%; height: 100%; border: 0; display: block; }

/* Кнопки шаблонов под сводкой заказа: тот же отступ, что между карточками
   колонки, и одинаковая ширина — две ровные кнопки, а не разнобой. */
.site-cart-side .cart-template-row { margin-top: 12px; gap: 10px; }
.site-cart-side .cart-template-row .btn { min-height: 46px; padding: 12px; font-size: 13.5px; }

/* Стрелки у горизонтальных лент — только там, где указатель точный: на
   телефоне ленту листают пальцем, и кнопки поверх карточек только мешают.
   Карусель у нас в потоке страницы, поэтому стрелка висит над ней кружком,
   как в маркетплейсах, а не отодвигает содержимое. */
.rail-arrow { display: none; }
@media (pointer: fine) {
    .site-page .hits-rail,
    .site-page .profile-carousel { position: relative; }
    .site-page .rail-arrow {
        position: absolute;
        top: 38%;
        z-index: 3;
        display: grid;
        place-items: center;
        width: 40px;
        height: 40px;
        margin: 0;
        padding: 0;
        border: 1px solid var(--line);
        border-radius: 50%;
        background: var(--white);
        color: var(--navy);
        box-shadow: 0 6px 18px rgba(15, 23, 42, .16);
        cursor: pointer;
        transition: transform .15s ease, box-shadow .2s ease;
    }
    .site-page .rail-arrow[hidden] { display: none; }
    .site-page .rail-arrow:hover { transform: scale(1.06); box-shadow: 0 8px 22px rgba(15, 23, 42, .22); }
    .site-page .rail-arrow svg { width: 18px; height: 18px; }
    .site-page .rail-arrow-back { left: -18px; }
    .site-page .rail-arrow-next { right: -18px; transform: rotate(180deg); }
    .site-page .rail-arrow-next:hover { transform: rotate(180deg) scale(1.06); }
}

/* «Мои заказы» — окном со своей прокруткой, а не бесконечной лентой на всю
   страницу. У покупателя их бывает три десятка, и меню кабинета слева уезжало
   далеко вверх: чтобы перейти в другой раздел, приходилось прокручивать всё
   обратно. Высота считается от окна, поэтому список всегда виден целиком
   вместе с меню. */
@media (min-width: 768px) {
    .site-page #myOrders {
        /* Окно списка заканчивается там же, где меню слева: раньше высота
           считалась от экрана, и низ списка не совпадал с «Выйти на всех
           устройствах» — страница выглядела развалившейся на две половины. */
        max-height: calc(100dvh - var(--site-header-height, 116px) - 120px);
        min-height: 320px;
        overflow-y: auto;
        overscroll-behavior: contain;
        padding: 4px 12px 4px 4px;
        border-radius: 18px;
        background: var(--white);
        box-shadow: 0 2px 10px rgba(14, 23, 48, .05);
    }
    /* Полоса прокрутки — тонкая и появляется по наведению: постоянная широкая
       полоса рядом с карточками читается как граница таблицы. */
    .site-page #myOrders::-webkit-scrollbar { width: 8px; }
    .site-page #myOrders::-webkit-scrollbar-thumb { border: 2px solid transparent; border-radius: 8px; background: rgba(14, 23, 48, .16); background-clip: content-box; }
    .site-page #myOrders:hover::-webkit-scrollbar-thumb { background: rgba(14, 23, 48, .28); background-clip: content-box; }
}
:root[data-theme="dark"] .site-page #myOrders { background: var(--surface, #171a21); box-shadow: none; }


/* Реквизиты компании на сайте показываются дважды: карточкой из общего кода
   («Для компании») и своей, двухколоночной («Реквизиты»). Данные одни и те же,
   поэтому на сайте оставляем вторую — она читается лучше и стоит рядом с
   остальными карточками кабинета. В приложении карточка из общего кода
   остаётся единственной, её не трогаем. */
.site-page .profile-business-card { display: none; }

/* Пустой список заказов — по центру карточки, а не строкой в углу: в широком
   окне надпись у левого края выглядит обрезанной, будто список не догрузился. */
.site-page #myOrders .my-orders-empty,
.site-page #myOrders > p:only-child {
    display: grid; place-items: center; min-height: 220px; margin: 0;
    color: var(--muted); text-align: center;
}

/* Крошки над оформлением — на том же сером, что и страница: белая полоса под
   шапкой читалась как отдельная плашка. Селектор с id: у .co-head в общем
   коде свой белый фон, и без этого он побеждал. */
.site-page #checkout,
.site-page #checkout .co-head,
.site-page .checkout .co-head { background: var(--bg); border-bottom: 0; }

/* Галочка выбранного способа — по центру строки. У способа с длинной подписью
   строка выше одной строки текста, и галочка прилипала к верхнему краю. */
.site-page .checkout .co-opt.active::after,
.site-page .checkout .co-opt-row .co-opt.active::after { align-self: center; }

/* Характеристики тянутся на всю высоту фотографии: карточка растёт, а не
   оставляет под собой пустое место. Колонке нужна высота строки сетки —
   без align-self она была ровно по содержимому. */
.site-page #product .pr-content { display: flex; flex-direction: column; align-self: stretch; }
.site-page #product .pr-content .pr-specs-brief { display: flex; flex: 1 1 auto; flex-direction: column; }
/* Высоту фотографии колонка добирает строками, а не растянутыми строками.
   Растягивать было неправильно: таблица с пятью характеристиками выглядела
   разреженной, будто её раздули под картинку. Сколько строк поместится —
   считает fitBriefSpecs (assets/site.js); здесь строки остаются своего
   обычного роста, как в нижней таблице. */
.site-page #product .pr-content .pr-specs-brief .pr-specs { display: flex; flex-direction: column; }
.site-page #product .pr-content .pr-specs-brief .pr-specs .row { align-items: center; }
/* Кнопка идёт сразу за таблицей: место она больше не добирает. */
.site-page #product .pr-content .pr-specs-brief .pr-desc-jump-all { flex: none; margin-top: 12px; }
