/* ============================================================
   zt-home-unify.css — приведение главной к единому виду
   Создан 2026-08-04. Подключается ПОСЛЕ zt-redesign.css.

   Основано на замерах живой страницы (стенд, 1440px):

     заголовки секций H2   5 разных размеров: 14, 25, 30, 40, 43 px
     цвета текста          11 оттенков серого
     кегли                 20 значений от 7 до 43 px
     радиусы карточек      7 значений: 3, 4, 6, 7, 14, 16, 24
     радиусы кнопок        4 значения: 0, 4, 10, 50
     жёлтый на кнопках     3 оттенка: #FFB800, #FFC400, #FFBD00
     начертания            5: 400, 500, 600, 700, 800

   Файл отдельный от zt-redesign.css намеренно: тот чинит
   поломки, этот выравнивает вид. Их можно катить порознь
   и откатывать порознь.
   ============================================================ */

:root {
    /* ---- Заголовки секций ----
       Сам токен адаптивный: переопределяется по брейкпоинтам ниже.
       Так любое правило, использующее var(--zt-h2-size), меняется
       вместе со шкалой — не нужно дублировать медиазапрос в каждом
       модуле. Раньше ступени были отдельными токенами (-md, -sm),
       и модуль, прибитый к литеральным 32 px, выпадал из шкалы
       в полосе 641–1023: остальные заголовки шли по 28.
       Старые имена оставлены — на них ссылается часть правил. */
    --zt-h2-size: 32px;
    --zt-h2-size-md: 28px;
    --zt-h2-size-sm: 22px;
    --zt-h3-size: 20px;

    /* ---- Три оттенка текста вместо одиннадцати ---- */
    --zt-ink: #333A43;        /* основной — самый частый на странице (71 элемент) */
    --zt-ink-soft: #6B7480;   /* вторичный: описания, подписи */
    --zt-ink-muted: #929AA1;  /* третичный: мета, даты, служебное */

    /* ---- Геометрия ---- */
    --zt-radius-card: 12px;
    --zt-radius-btn: 8px;
    --zt-radius-pill: 999px;

    /* ---- Вертикальный ритм секций ---- */
    --zt-section-gap: 64px;
    --zt-section-gap-sm: 40px;
}

/* ------------------------------------------------------------
   1. ЗАГОЛОВКИ СЕКЦИЙ — ОДИН РАЗМЕР

   Было: «Подбор запчастей» 25px, «Категории» 30px, «Бренды» 30px,
   «Популярные товары» 30px, «ZIPTEH SERVICE — надёжный партнёр» 43px,
   «Новости и статьи» 14px, «Сертификаты и дипломы» 14px,
   «Быстрый подбор запчастей» 40px.

   Один уровень иерархии — один размер. Разброс 14→43 читается
   как разные по важности блоки, хотя они равнозначны.
   ------------------------------------------------------------ */
.zip-home-hero h2,
.zip-category-strip h2,
.zip-brands h2,
#ztSaleProducts h2,
#ztCompanyAdvantages > * h2,
#ztHomeMediaV2 h2,
#ziptehLeadModule h2,
.zt-section-title,
[class*="__section-title"] {
    font-size: var(--zt-h2-size) !important;
    font-weight: 700 !important;
    line-height: 1.2 !important;
    color: var(--zt-ink) !important;
    letter-spacing: -0.01em;
    margin-bottom: 20px !important;
}

/* Главный заголовок страницы — на ступень крупнее остальных.
   Это единственное осмысленное исключение: блок «ZIPTEH SERVICE —
   надёжный партнёр» несёт роль H1 на главной. */
#ztCompanyAdvantages > h2:first-of-type {
    font-size: 40px !important;
}

/* Подзаголовки внутри секций */
#ztCompanyAdvantages h3,
.zip-home-hero h3,
#ziptehLeadModule h3 {
    font-size: var(--zt-h3-size) !important;
    font-weight: 600 !important;
    line-height: 1.25 !important;
    color: var(--zt-ink) !important;
}

/* Названия товаров в карточках — 12px было слишком мелко
   для основного элемента карточки, ради которого её и открывают */
.zt-product-card__name,
.zt-product-card__name a,
.poisk-product__name {
    font-size: 14px !important;
    font-weight: 500 !important;
    line-height: 1.35 !important;
    color: var(--zt-ink) !important;
}

@media (max-width: 1023px) {
    .zip-home-hero h2, .zip-category-strip h2, .zip-brands h2,
    #ztSaleProducts h2, #ztHomeMediaV2 h2, #ziptehLeadModule h2 {
        font-size: var(--zt-h2-size-md) !important;
    }
    #ztCompanyAdvantages > h2:first-of-type { font-size: 32px !important; }
}

@media (max-width: 640px) {
    .zip-home-hero h2, .zip-category-strip h2, .zip-brands h2,
    #ztSaleProducts h2, #ztHomeMediaV2 h2, #ziptehLeadModule h2 {
        font-size: var(--zt-h2-size-sm) !important;
        margin-bottom: 14px !important;
    }
    #ztCompanyAdvantages > h2:first-of-type { font-size: 26px !important; }
    #ztCompanyAdvantages h3, .zip-home-hero h3, #ziptehLeadModule h3 {
        font-size: 18px !important;
    }
}

/* ------------------------------------------------------------
   2. ШРИФТ ВЕЗДЕ ОДИН

   Замер показал: заголовки «Новости и статьи», «Сертификаты
   и дипломы» и названия товаров в карточках всё ещё рисуются
   Arial'ом — их правила задают семейство с !important,
   и общее правило из zt-redesign.css до них не достаёт.
   ------------------------------------------------------------ */
#ztHomeMediaV2 h2,
#ztHomeMediaV2 *,
.zt-product-card__name,
.zt-product-card__name a,
.zt-product-card *,
.home-news-card *,
.home-certificate-card * {
    font-family: var(--zt-font, 'Inter', Arial, sans-serif) !important;
}

/* ------------------------------------------------------------
   3. ЦВЕТА ТЕКСТА — сведены в самих исходниках

   Первая попытка задавала цвета селекторами по маскам вида
   [class*="__desc"]. Это добавляло ещё один оттенок там, куда
   попадало, и не убирало старые там, куда не попадало:
   после правки цветов стало 26 вместо 11.

   Правильный путь — переписать значения в самих файлах.
   Сделано отдельным проходом: шесть почти-чёрных сведены
   в #333A43, средние серые в #6B7480, светлые в #929AA1.
   ------------------------------------------------------------ */

/* ------------------------------------------------------------
   4. КНОПКИ — ОДИН ЖЁЛТЫЙ, ОДИН РАДИУС, ЧИТАЕМЫЙ ТЕКСТ

   Замер нашёл три жёлтых: #FFB800 (герой), #FFC400 («Все бренды»),
   #FFBD00 («В корзину») — и белый текст на двух из них,
   что даёт контраст 1,7:1 при норме 4,5:1.
   ------------------------------------------------------------ */
.yellow-button,
.zip-home-hero__button,
.zip-home-search__submit,
.zt-product-card__cart,
[class*="__submit"],
button[class*="yellow"],
a[class*="yellow"] {
    background-color: var(--zt-yellow, #FFB800) !important;
    color: #1A1A1A !important;
    border-radius: var(--zt-radius-btn) !important;
    font-weight: 700 !important;
    border-color: var(--zt-yellow, #FFB800) !important;
}

.yellow-button:hover,
.zip-home-hero__button:hover,
.zip-home-search__submit:hover,
.zt-product-card__cart:hover,
[class*="__submit"]:hover {
    background-color: var(--zt-yellow-hover, #E8A600) !important;
    color: #1A1A1A !important;
}

/* Круглые стрелки каруселей оставляем круглыми */
.zip-brands__arrow,
.zt-sale-products__arrow,
[class*="__arrow"] {
    border-radius: var(--zt-radius-pill) !important;
}

/* Табы: общая геометрия для «По артикулу / По бренду / По типу»
   и «Хит продаж / Новинки / Акции» — сейчас у них радиус 10 и 0 */
.zip-home-search__tab,
.zt-sale-products__tab {
    border-radius: var(--zt-radius-btn) !important;
    font-size: 14px !important;
    font-weight: 600 !important;
}

/* ------------------------------------------------------------
   5. РАДИУСЫ КАРТОЧЕК — ОДИН

   Было семь: 3, 4, 6, 7, 14, 16, 24 px.
   ------------------------------------------------------------ */
.zip-category-card,
.zt-product-card,
.home-news-card,
.home-certificate-card,
.zip-brands__item,
[class*="-card"]:not([class*="__"]),
section [class*="__card"] {
    border-radius: var(--zt-radius-card) !important;
}

/* ------------------------------------------------------------
   9. ГАМБУРГЕР СПРАВА НА ВСЕХ ШИРИНАХ, ГДЕ ОН ЕСТЬ

   Ниже 1400 сайт переключается на бургер. Раньше он стоял
   слева — до него неудобно дотягиваться большим пальцем.
   Порядок: логотип · каталог · поиск · бургер.
   ------------------------------------------------------------ */
@media (min-width: 768px) and (max-width: 1399px) {
    .zt-header .zt-header__top-inner {
        grid-template-columns: auto auto minmax(0, 1fr) 52px !important;
        align-items: center !important;
        column-gap: 16px !important;
    }

    .zt-header .zt-header__logo {
        grid-column: 1 !important;
        grid-row: 1 !important;
        justify-self: start !important;
    }

    .zt-header .zt-catalog-button {
        grid-column: 2 !important;
        grid-row: 1 !important;
    }

    .zt-header .zt-search {
        grid-column: 3 !important;
        grid-row: 1 !important;
    }

    .zt-header .zt-mobile-trigger {
        grid-column: 4 !important;
        grid-row: 1 !important;
        justify-self: end !important;
        margin-left: 0 !important;
    }
}

/* ------------------------------------------------------------
   ОТКАЧЕНО 2026-08-04: блоки геометрии

   Я задал всем секциям одинаковые max-width, поля и фон через
   !important. У каждой секции была своя внутренняя раскладка,
   и принудительные поля её сломали — выравнивание стало хуже,
   чем до правок.

   Урок тот же, что с цветами: насильно выравнивать чужую
   геометрию снаружи нельзя. Ширины и отступы надо приводить
   к общему виду в самих секциях, по одной, с проверкой каждой.

   Убранные блоки сохранены в zt-home-unify.geometry-rollback.txt
   на случай, если из них что-то понадобится точечно.

   Осталось в файле только то, что геометрию не трогает:
   размеры заголовков, шрифт, кнопки, радиусы.
   ------------------------------------------------------------ */

/* ============================================================
   СИСТЕМА КНОПОК

   Замер главной: 52 кнопки, 19 разных вариантов.

   Только жёлтых CTA было шесть, и все разные:
     «Найти»                52px / 14px / 700 / поля 0 20
     «Бесплатная консульт.» 52px / 16px / 700 / поля 0 24
     «Отправить»            50px / 16px / 600 / поля 0 20
     «В корзину»            34px / 11px / 700 / поля 0 12
     «Подробнее о компании» 48px / 14px / 700 / поля 0 22
     «КАТАЛОГ»              62px / 14px / 700 / поля 0 10 + UPPERCASE

   Плюс 4 варианта круглых стрелок (46, 50, 34, 26 px — последняя
   вдвое меньше нормы тач-цели) и 2 высоты табов.

   Сводим к четырём ролям: основная, компактная, вторичная, круглая.
   ============================================================ */

:root {
    --zt-btn-h: 48px;          /* основная высота */
    --zt-btn-h-sm: 40px;       /* компактная — в карточках */
    --zt-btn-fs: 15px;
    --zt-btn-fs-sm: 13px;
    --zt-btn-pad: 24px;
    --zt-btn-pad-sm: 16px;
    --zt-btn-weight: 700;
}

/* ---------- Основная: жёлтая заливка ---------- */
.zip-home-search__submit,
.zip-home-hero__button,
.yellow-button,
.zt-company-advantages__button,
.zt-catalog-button,
.zt-header .zt-catalog-button {
    min-height: var(--zt-btn-h) !important;
    height: auto !important;
    padding: 0 var(--zt-btn-pad) !important;
    font-size: var(--zt-btn-fs) !important;
    font-weight: var(--zt-btn-weight) !important;
    line-height: 1.2 !important;
    letter-spacing: 0 !important;
    text-transform: none !important;
    border-radius: var(--zt-radius-btn, 8px) !important;
    border: 1px solid var(--zt-yellow, #FFB800) !important;
    background-color: var(--zt-yellow, #FFB800) !important;
    color: #1A1A1A !important;
    -webkit-text-fill-color: #1A1A1A !important;
    align-items: center !important;
    justify-content: center !important;
    gap: 10px !important;
    box-shadow: none !important;
    transition: background-color .15s ease !important;
}

.zip-home-search__submit:hover,
.zip-home-hero__button:hover,
.yellow-button:hover,
.zt-company-advantages__button:hover,
.zt-catalog-button:hover {
    background-color: var(--zt-yellow-hover, #E8A600) !important;
    border-color: var(--zt-yellow-hover, #E8A600) !important;
    color: #1A1A1A !important;
}

/* Подпись внутри кнопки каталога тоже тёмная и без верхнего регистра */
.zt-catalog-button__label,
.zt-header .zt-catalog-button__label {
    color: #1A1A1A !important;
    -webkit-text-fill-color: #1A1A1A !important;
    text-transform: none !important;
    letter-spacing: 0 !important;
    font-size: var(--zt-btn-fs) !important;
    font-weight: var(--zt-btn-weight) !important;
}

/* ---------- Компактная: та же роль, меньше размер ---------- */
.zt-product-card__cart {
    min-height: var(--zt-btn-h-sm) !important;
    height: auto !important;
    padding: 0 var(--zt-btn-pad-sm) !important;
    font-size: var(--zt-btn-fs-sm) !important;
    font-weight: var(--zt-btn-weight) !important;
    letter-spacing: 0 !important;
    text-transform: none !important;
    border-radius: var(--zt-radius-btn, 8px) !important;
    border: 1px solid var(--zt-yellow, #FFB800) !important;
    background-color: var(--zt-yellow, #FFB800) !important;
    color: #1A1A1A !important;
    -webkit-text-fill-color: #1A1A1A !important;
}

/* ---------- Вторичная: обводка ---------- */
.zt-callback-button,
.zt-header .zt-callback-button {
    min-height: var(--zt-btn-h) !important;
    height: auto !important;
    padding: 0 var(--zt-btn-pad) !important;
    font-size: var(--zt-btn-fs) !important;
    font-weight: var(--zt-btn-weight) !important;
    letter-spacing: 0 !important;
    text-transform: none !important;
    border-radius: var(--zt-radius-btn, 8px) !important;
    border: 1px solid var(--zt-yellow, #FFB800) !important;
    background-color: #FFFFFF !important;
    color: #333A43 !important;
    -webkit-text-fill-color: #333A43 !important;
}

.zt-callback-button:hover {
    background-color: var(--zt-yellow, #FFB800) !important;
    color: #1A1A1A !important;
    -webkit-text-fill-color: #1A1A1A !important;
}

/* ---------- Круглые стрелки каруселей ----------
   Было 46, 50, 34 и 26 px. Последняя вдвое меньше минимальной
   тач-цели 44px — на телефоне в неё не попасть. */
/* Карусель документов (#ztHomeMediaV2) из списка исключена:
   по ТЗ доработки от 06.08.2026 её стрелки 50 px и со своей тенью —
   размеры задаёт home-media-v2.css */
.zip-brands__arrow,
.zt-sale-products__arrow,
.zt-product-card__more,
.zip-home-hero .swiper-button-prev,
.zip-home-hero .swiper-button-next {
    width: 44px !important;
    height: 44px !important;
    min-width: 44px !important;
    /* N-027…N-035 (06.08.2026): квадрат со скруглением вместо круга —
       единый стиль стрелок каруселей по указанию заказчика */
    border-radius: 10px !important;
    border: 1px solid #E3E6E9 !important;
    background-color: #FFFFFF !important;
    color: #333A43 !important;
    box-shadow: none !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
}

.zip-brands__arrow:hover,
.zt-sale-products__arrow:hover,
.zt-product-card__more:hover {
    border-color: var(--zt-yellow, #FFB800) !important;
}

/* Штатные стрелки Swiper рисуют иконку через ::after — размер тоже сводим */
.zip-home-hero .swiper-button-prev::after,
.zip-home-hero .swiper-button-next::after {
    font-size: 15px !important;
}

/* ---------- Табы ---------- */
.zip-home-search__tab,
.zt-sale-products__tab {
    min-height: 40px !important;
    height: auto !important;
    padding: 0 16px !important;
    font-size: 14px !important;
    font-weight: 600 !important;
    letter-spacing: 0 !important;
    text-transform: none !important;
    border-radius: var(--zt-radius-btn, 8px) !important;
    border: 1px solid transparent !important;
    background-color: transparent !important;
    color: #6B7480 !important;
}

.zip-home-search__tab.is-active,
.zip-home-search__tab[aria-selected="true"],
.zt-sale-products__tab.is-active,
.zt-sale-products__tab[aria-selected="true"] {
    background-color: #FFFFFF !important;
    border-color: #E3E6E9 !important;
    color: #333A43 !important;
}

/* ---------- Тач-цели: ничего меньше 44px по высоте ---------- */
@media (max-width: 1023px) {
    .zip-home-search__submit,
    .zip-home-hero__button,
    .yellow-button,
    .zt-company-advantages__button,
    .zt-callback-button,
    .zt-product-card__cart,
    .zip-home-search__tab,
    .zt-sale-products__tab {
        min-height: 44px !important;
    }
}

/* ============================================================
   ПАНЕЛЬ «О КОМПАНИИ» — ПО ОБРАЗЦУ «СЕРВИСА»

   Было: «Сервис» — панель 1527px во всю ширину, сетка из трёх
   колонок с заголовком, списком ссылок и блоком преимуществ.
   «О компании» — узкая выпадашка 360px, прижатая вправо,
   с четырьмя ссылками в столбик. Два разных меню в одной строке.

   Разметка у них отличается: у «Сервиса» .zt-mega__body с
   .zt-mega__column, у «О компании» — .zt-company-menu со своим
   списком. HTML не трогаем, приводим к общему виду стилями:
   панель во всю ширину, ссылки раскладываются в колонки.
   ============================================================ */
.zt-header .zt-mega--company,
/* N-022/N-062 (06.08.2026): панель «О компании» переведена
   на структуру и ширину панели «Сервис» — компактные правила
   старой всплывашки сведены к общей геометрии .zt-mega */
#zt-mega-company {
    left: 28px !important;
    right: 28px !important;
    width: auto !important;
    max-width: 1992px !important;
    margin-left: auto !important;
    margin-right: auto !important;
    border-radius: 8px !important;
}

#zt-mega-company .zt-company-menu {
    display: block !important;
    padding: 26px 32px 28px !important;
}

/* Надзаголовок — как .zt-mega__heading у «Сервиса» */
#zt-mega-company .zt-company-menu__eyebrow {
    margin: 0 0 18px !important;
    font-size: 16px !important;
    font-weight: 700 !important;
    line-height: 1.2 !important;
    color: #333A43 !important;
    letter-spacing: 0 !important;
    text-transform: none !important;
}

/* Ссылки — в колонки, а не в столбик */
#zt-mega-company .zt-company-menu__links {
    display: grid !important;
    grid-template-columns: repeat(4, minmax(0, 1fr)) !important;
    gap: 10px 32px !important;
    align-content: start !important;
}

#zt-mega-company .zt-company-menu__links > a {
    display: flex !important;
    align-items: center !important;
    min-height: 40px !important;
    padding: 8px 12px !important;
    border-radius: 8px !important;
    font-size: 15px !important;
    font-weight: 500 !important;
    color: #333A43 !important;
    text-decoration: none !important;
    transition: background-color .14s ease, color .14s ease !important;
}

#zt-mega-company .zt-company-menu__links > a:hover {
    background-color: #F7F7F5 !important;
    color: #1A1A1A !important;
}

@media (max-width: 1200px) {
    #zt-mega-company .zt-company-menu__links {
        grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
    }
}

/* ---------- Добор по кнопкам ----------
   После первого прохода осталось три расхождения. */

/* «Найти» была 52px — единственная выше общей высоты */
.zip-home-search__submit,
.zip-home-search .zip-home-search__submit {
    min-height: 48px !important;
    height: 48px !important;
}

/* Вторая копия .yellow-button приходила из инлайна формы: 50px/16px/600 */
form .yellow-button,
#ziptehLeadModule .yellow-button,
.zt-lead-form .yellow-button {
    min-height: 48px !important;
    height: auto !important;
    font-size: 15px !important;
    font-weight: 700 !important;
}

/* Стрелки в «Новостях» оставались 44x26 — высота не бралась.
   Карусель документов исключена: её геометрию (50 px, вертикальное
   центрирование через margin-top) задаёт home-media-v2.css */
.swiper-button-prev:not(.zt-home-cert-v2__prev),
.swiper-button-next:not(.zt-home-cert-v2__next) {
    height: 44px !important;
    min-height: 44px !important;
    margin-top: 0 !important;
}

/* Текст на «В корзину» — как на остальных жёлтых */
.zt-product-card__cart {
    color: #1A1A1A !important;
    -webkit-text-fill-color: #1A1A1A !important;
}

/* ------------------------------------------------------------
   ИСПРАВЛЕНИЕ: кнопка «КАТАЛОГ» вылезала под поиском

   В системе кнопок я задал display: inline-flex !important —
   и это перебило display: none, которым кнопка пряталась
   на узких экранах. На 414px она вернулась и встала третьей
   строкой сетки под поиском: строки стали 52px 48px 48px,
   шапка выросла со 129 до 185px.

   Урок: общее правило оформления не должно решать, видим
   элемент или нет. Выравнивание — отдельно, показ — отдельно.
   ------------------------------------------------------------ */

/* Выравнивание содержимого — без управления видимостью */
.zip-home-search__submit,
.zip-home-hero__button,
.yellow-button,
.zt-company-advantages__button,
.zt-product-card__cart,
.zt-callback-button {
    align-items: center !important;
    justify-content: center !important;
    gap: 10px !important;
}

.zt-header .zt-catalog-button:not([hidden]) {
    align-items: center !important;
    justify-content: center !important;
}

/* На узких экранах каталог живёт в нижней панели, а не в шапке */
@media (max-width: 767px) {
    .zt-header .zt-catalog-button,
    .zt-catalog-button {
        display: none !important;
    }
}

/* ------------------------------------------------------------
   БУРГЕР СПРАВА — БЕЗ ПРИВЯЗКИ К НОМЕРУ КОЛОНКИ

   Было два правила: мобильное (≤767) с сеткой из двух колонок
   и планшетное (768–1399) с сеткой из четырёх. На стыке они
   накладывались: при клиентской ширине 752px вьюпорт из-за полосы
   прокрутки ~768, и срабатывала смесь — каталог прятался
   мобильным правилом, а колонки брались планшетные. Бургер
   оказывался слева.

   grid-column: -2 / -1 означает «последняя колонка», сколько бы
   их ни было. Одно правило на весь диапазон, стыка больше нет.
   ------------------------------------------------------------ */
@media (max-width: 1399px) {
    .zt-header .zt-mobile-trigger {
        grid-column: -2 / -1 !important;
        grid-row: 1 !important;
        justify-self: end !important;
        align-self: center !important;
        margin-left: 0 !important;
        margin-right: 0 !important;
        order: 99 !important;
    }

    .zt-header .zt-header__logo {
        grid-column: 1 !important;
        grid-row: 1 !important;
        justify-self: start !important;
        margin-left: 0 !important;
        order: 1 !important;
    }
}

/* Мобильные: две колонки, поиск во всю ширину второй строкой */
@media (max-width: 767px) {
    .zt-header .zt-header__top-inner {
        grid-template-columns: minmax(0, 1fr) 52px !important;
        align-items: center !important;
    }

    .zt-header .zt-search {
        grid-column: 1 / -1 !important;
        grid-row: 2 !important;
        order: 50 !important;
    }
}

/* Планшеты: логотип, каталог, поиск, бургер — одной строкой */
@media (min-width: 768px) and (max-width: 1399px) {
    .zt-header .zt-header__top-inner {
        grid-template-columns: auto auto minmax(0, 1fr) 52px !important;
        align-items: center !important;
        column-gap: 16px !important;
    }

    .zt-header .zt-catalog-button {
        grid-column: 2 !important;
        grid-row: 1 !important;
        order: 2 !important;
    }

    .zt-header .zt-search {
        grid-column: 3 !important;
        grid-row: 1 !important;
        order: 3 !important;
    }
}

/* ------------------------------------------------------------
   БУРГЕР: ПРИЖИМАЕМ К КРАЮ НАПРЯМУЮ

   В диапазоне 768–1399 бургер стабильно оставался в 72px от края
   при любой ширине — это 52px последней колонки плюс 20px поля
   контейнера. Значит justify-self в этой сетке не отрабатывает:
   элемент занимает колонку целиком, а не прижимается к её краю.

   Гадать, какое из правил мешает, дороже, чем поставить бургер
   абсолютно. Он выходит из потока сетки, лишняя колонка
   схлопывается, положение задаётся однозначно.

   На мобильных (≤767) сетка работает правильно — 14px от края,
   там ничего не трогаем.
   ------------------------------------------------------------ */
@media (min-width: 768px) and (max-width: 1399px) {
    .zt-header .zt-header__top-inner {
        position: relative !important;
        /* последняя колонка больше не нужна — бургер вне потока */
        grid-template-columns: auto auto minmax(0, 1fr) !important;
        padding-right: 76px !important;
    }

    .zt-header .zt-mobile-trigger {
        position: absolute !important;
        right: 20px !important;
        top: 50% !important;
        transform: translateY(-50%) !important;
        grid-column: auto !important;
        grid-row: auto !important;
        margin: 0 !important;
        z-index: 3 !important;
    }
}

/* ------------------------------------------------------------
   БУРГЕР: ОДНО ПРАВИЛО НА ВЕСЬ ДИАПАЗОН, БЕЗ СТЫКА

   После абсолютного позиционирования осталась ровно одна битая
   ширина — клиентские 752px, то есть вьюпорт ~768. Это точка
   стыка max-width:767 и min-width:768: из-за дробного значения
   вьюпорта срабатывала смесь правил, и бургер уезжал на 72px
   от края при высоте шапки от планшетной раскладки.

   Ловить дробные пиксели бессмысленно. Убираем стык: абсолютное
   позиционирование действует на всём диапазоне ≤1399, где бургер
   вообще есть. Одно правило — нечему разъезжаться.
   ------------------------------------------------------------ */
@media (max-width: 1399px) {
    .zt-header .zt-header__top-inner {
        position: relative !important;
        padding-right: 76px !important;
    }

    .zt-header .zt-mobile-trigger {
        position: absolute !important;
        right: 20px !important;
        top: 26px !important;
        transform: translateY(-50%) !important;
        grid-column: auto !important;
        grid-row: auto !important;
        margin: 0 !important;
        z-index: 3 !important;
    }
}

/* Планшеты и выше в этом диапазоне — шапка в одну строку,
   центрируем бургер по её высоте */
@media (min-width: 768px) and (max-width: 1399px) {
    .zt-header .zt-mobile-trigger {
        top: 50% !important;
    }
}

/* Мобильные: логотип и бургер в первой строке, поиск во второй */
@media (max-width: 767px) {
    .zt-header .zt-header__top-inner {
        grid-template-columns: minmax(0, 1fr) !important;
        padding-right: 70px !important;
    }

    .zt-header .zt-mobile-trigger {
        right: 14px !important;
    }

    .zt-header .zt-search {
        grid-column: 1 / -1 !important;
    }
}

/* ------------------------------------------------------------
   БУРГЕР: СДЕЛАТЬ ЗАМЕТНЫМ

   Скриншот показал то, чего не видели замеры: кнопка есть,
   позиция правильная, три полоски на месте — но она белая
   (#fff) с рамкой #e6e8eb на белой шапке. На снимке — пустое
   место. Замер размеров не проверяет, видно ли элемент.

   Стало заметнее после того, как фон шапки стал сплошным белым:
   раньше кнопка хоть немного отделялась от серого.

   Делаем: заливка фирменным жёлтым, тёмные полоски.
   Контраст полосок на жёлтом ~10:1, кнопка читается сразу.
   ------------------------------------------------------------ */
@media (max-width: 1399px) {
    .zt-header .zt-mobile-menu-button {
        background: var(--zt-yellow, #FFB800) !important;
        border: 1px solid var(--zt-yellow, #FFB800) !important;
        border-radius: 8px !important;
        width: 44px !important;
        height: 44px !important;
    }

    .zt-header .zt-mobile-menu-button span,
    .zt-header .zt-mobile-menu-button::before,
    .zt-header .zt-mobile-menu-button::after {
        background: #1A1A1A !important;
        height: 2px !important;
        width: 22px !important;
        left: 11px !important;
        border-radius: 2px !important;
    }

    .zt-header .zt-mobile-menu-button::before { top: 14px !important; }
    .zt-header .zt-mobile-menu-button span    { top: 21px !important; }
    .zt-header .zt-mobile-menu-button::after  { top: 28px !important; }

    .zt-header .zt-mobile-menu-button:hover,
    .zt-header .zt-mobile-menu-button:focus-visible {
        background: var(--zt-yellow-hover, #E8A600) !important;
        border-color: var(--zt-yellow-hover, #E8A600) !important;
    }
}

/* ------------------------------------------------------------
   ШАПКА НИЖЕ 1400 — НА FLEX, БЕЗ АБСОЛЮТА

   Абсолютное позиционирование бургера решало задачу, но давало
   два побочных эффекта: элемент не попадал в снимки (absolute
   внутри fixed) и требовал ручного padding-right у контейнера.

   Flex надёжнее: margin-left: auto прижимает бургер вправо
   при любом числе соседей, ничего не надо считать руками
   и незачем знать номер колонки.
   ------------------------------------------------------------ */
@media (max-width: 1399px) {
    .zt-header .zt-header__top-inner {
        display: flex !important;
        flex-wrap: wrap !important;
        align-items: center !important;
        gap: 12px 16px !important;
        grid-template-columns: none !important;
        grid-template-rows: none !important;
        padding-right: 20px !important;
        position: relative !important;
    }

    .zt-header .zt-header__logo {
        order: 1 !important;
        flex: 0 0 auto !important;
        margin: 0 !important;
    }

    .zt-header .zt-catalog-button {
        order: 2 !important;
        flex: 0 0 auto !important;
    }

    /* Бургер — всегда крайний справа */
    .zt-header .zt-mobile-trigger {
        order: 9 !important;
        flex: 0 0 auto !important;
        margin-left: auto !important;
        position: static !important;
        right: auto !important;
        top: auto !important;
        transform: none !important;
    }

    .zt-header .zt-search {
        order: 5 !important;
        flex: 1 1 240px !important;
        min-width: 0 !important;
        grid-column: auto !important;
        grid-row: auto !important;
    }
}

/* Мобильные: поиск переносится на вторую строку целиком */
@media (max-width: 767px) {
    .zt-header .zt-search {
        order: 20 !important;
        flex: 1 0 100% !important;
    }

    .zt-header .zt-header__top-inner {
        padding-right: 14px !important;
        padding-left: 14px !important;
    }
}

/* ============================================================
   АУДИТ ГЛАВНОЙ — ИСПРАВЛЕНИЯ
   Замеры на стенде 2026-08-04, ширины 1440 и 390.
   ============================================================ */

/* ------------------------------------------------------------
   1. ВЕРТИКАЛЬНЫЙ РИТМ

   Было (зазор между секциями):
     ПК   40, 62, 67, 56, 70, 0, 0
     Моб  18, 40, 48, 28, 45, 0, 0

   Разброс почти двукратный, а два последних стыка вообще
   слиплись: «Новости → Лид-форма» и «Лид-форма → Подвал».

   Трогаем ТОЛЬКО вертикальные отступы. Ширину и поля не
   касаемся — прошлый раз именно это сломало выравнивание.
   ------------------------------------------------------------ */
/* Шкала из §9 ТЗ: ПК 80–96, планшет 64–72, мобильный 48–56.
   Раньше стояло 64 на всех ширинах — на десктопе это ниже нормы,
   на мобильном выше. Берём нижнюю границу каждого диапазона:
   страница длинная, лишний воздух её только растягивает. */
.zip-category-strip,
.zip-brands,
#ztSaleProducts,
#ztCompanyAdvantages,
#ztHomeMediaV2,
#ziptehLeadModule {
    margin-top: 80px !important;
    margin-bottom: 0 !important;
}

.footer-2 {
    margin-top: 80px !important;
}

.zip-home-hero {
    margin-top: 32px !important;
    margin-bottom: 0 !important;
}

@media (max-width: 1024px) {
    .zip-category-strip,
    .zip-brands,
    #ztSaleProducts,
    #ztCompanyAdvantages,
    #ztHomeMediaV2,
    #ziptehLeadModule,
    .footer-2 {
        margin-top: 64px !important;
    }

    .zip-home-hero {
        margin-top: 24px !important;
    }
}

@media (max-width: 767px) {
    .zip-category-strip,
    .zip-brands,
    #ztSaleProducts,
    #ztCompanyAdvantages,
    #ztHomeMediaV2,
    #ziptehLeadModule,
    .footer-2 {
        margin-top: 48px !important;
    }

    .zip-home-hero {
        margin-top: 16px !important;
    }
}

/* ------------------------------------------------------------
   2. ЗАГОЛОВОК ГЕРОЯ

   Единственный из восьми выбивался: 41 px вместо 20 на ПК
   и 30 вместо 14 на мобильном. Это внутренний отступ карточки
   подбора, а не сдвиг секции.
   ------------------------------------------------------------ */
.zip-home-hero > .zt-shell > *:first-child,
.zip-home-hero__panel,
.zip-home-search {
    padding-left: 0 !important;
    margin-left: 0 !important;
}

.zip-home-hero h2 {
    margin-left: 0 !important;
    padding-left: 0 !important;
}

/* ------------------------------------------------------------
   3. ТАЧ-ЦЕЛИ — МИНИМУМ 44px НА СЕНСОРНЫХ ЭКРАНАХ

   Аудит нашёл 43 элемента меньше 44px: табы 34 px,
   мобильные кнопки 38 px, ссылки высотой 13 px.
   44×44 — минимум, при котором палец попадает надёжно.
   ------------------------------------------------------------ */
@media (max-width: 1023px) {
    .zip-category-strip__mobile-all,
    .zip-category-strip__scroll-btn,
    .zip-brands__mobile-all,
    .zip-brands__mobile-arrow,
    .zt-sale-products__tab,
    .zip-home-search__tab,
    .zt-sale-products__arrow,
    .zip-brands__arrow,
    [class*="__mobile-all"],
    [class*="__mobile-arrow"],
    [class*="__scroll-btn"] {
        min-height: 44px !important;
        min-width: 44px !important;
    }

    /* Мелкие ссылки в подвале и мете — увеличиваем область нажатия,
       не раздувая сам текст */
    .footer-2 a,
    #ztHomeMediaV2 a[class*="__more"],
    section a[class*="__all"] {
        display: inline-flex !important;
        align-items: center !important;
        min-height: 44px !important;
    }
}

/* ------------------------------------------------------------
   4. ОБРЕЗКА ТЕКСТА

   На 390 px обрезался пункт «Оригинальные и сертифицированные
   запчасти» — не хватало 10 px. Разрешаем перенос вместо обрезки.
   ------------------------------------------------------------ */
@media (max-width: 767px) {
    /* Преимущества модуля новостей исключены: ТЗ доработки §6 требует
       кламп описания в две строки — home-media-v2.css сам управляет
       обрезкой, это правило её раскрывало */
    section [class*="__benefit"]:not(#ztHomeMediaV2 *),
    section [class*="__advantage"],
    section li:not(#ztHomeMediaV2 *),
    .zt-benefit__text,
    .zt-benefit__title {
        white-space: normal !important;
        overflow: visible !important;
        text-overflow: clip !important;
        overflow-wrap: anywhere;
    }
}

/* ------------------------------------------------------------
   5. СКАЧКИ ВЁРСТКИ ПРИ ЗАГРУЗКЕ

   81 изображение из 81 без width/height. Пока размеры не
   проставлены в шаблонах, резервируем место соотношением
   сторон — картинка не будет «прыгать» после подгрузки.

   Это полумера: правильное решение — атрибуты width и height
   в разметке, но это правка PHP-шаблонов, отдельная задача.
   ------------------------------------------------------------ */
.zt-product-card__image img,
.zip-category-card img,
.zip-brands__logo img,
.home-news-card img,
.home-certificate-card img {
    display: block;
    width: 100%;
    height: auto;
    aspect-ratio: 4 / 3;
    object-fit: contain;
}

.home-news-card img {
    aspect-ratio: 16 / 9;
    object-fit: cover;
}

/* ============================================================
   ПОМОДУЛЬНЫЕ ИСПРАВЛЕНИЯ
   Замеры: Вики/05 Аудит/Аудит главной по модулям.md
   ============================================================ */

/* ------------------------------------------------------------
   МОДУЛЬ 1. ТОВАРЫ — самый мелкий текст на странице

   Замер: 12 элементов по 9 px и 12 по 10 px. Это карточки
   товара — артикул, наличие, цена. Ровно то, ради чего
   покупатель пришёл, и оно набрано вдвое мельче основного текста.

   Плюс карточки разной высоты: название в одну или две строки
   даёт 34 и 38 px, и нижние края кнопок не совпадают.
   ------------------------------------------------------------ */
.zt-product-card__article,
.zt-product-card__article-mobile,
.zt-product-card__brand,
.zt-product-card__stock,
.zt-product-card__property-label,
.zt-product-card__client-price-label,
.zt-product-card__added,
.zt-product-card__image-label,
#ztSaleProducts [class*="__label"],
#ztSaleProducts [class*="__meta"],
#ztSaleProducts [class*="__article"],
#ztSaleProducts [class*="__stock"],
#ztSaleProducts [class*="__brand"] {
    font-size: 12px !important;
    line-height: 1.35 !important;
}

#ztSaleProducts .zt-product-card__price,
#ztSaleProducts [class*="__price"]:not([class*="label"]) {
    /* N-097 → N-111: цена ещё заметнее */
    font-size: 24px !important;
    font-weight: 700 !important;
    line-height: 1.2 !important;
}

/* N-109: старая цена — в одну строку с основной, справа */
#ztSaleProducts .zt-product-card__prices {
    flex-direction: row !important;
    justify-content: flex-end !important;
    align-items: baseline !important;
    gap: 8px !important;
}

#ztSaleProducts .zt-product-card__old-price {
    margin: 0 !important;
    font-size: 13px !important;
    line-height: 1.2 !important;
    text-decoration: line-through;
    white-space: nowrap;
}

/* «Цена по запросу» остаётся компактной и не растёт до 24px
   (селектор не слабее правила 24px выше: id + два класса) */
#ztSaleProducts .zt-product-card__prices .zt-product-card__price--request,
#ztSaleProducts .zt-product-card__price.zt-product-card__price--request {
    font-size: 13px !important;
    text-align: right;
}

/* Карточки одной высоты: название резервирует две строки,
   кнопка прижимается к низу */
.zt-product-card {
    display: flex !important;
    flex-direction: column !important;
}

.zt-product-card__name {
    min-height: 2.7em !important;
    display: -webkit-box !important;
    -webkit-line-clamp: 2 !important;
    -webkit-box-orient: vertical !important;
    overflow: hidden !important;
}

.zt-product-card__cart,
.zt-product-card [class*="__footer"],
.zt-product-card [class*="__actions"] {
    margin-top: auto !important;
}

/* Раскладку модуля «Новости и сертификаты» задаёт его собственный
   файл home-media-v2.css: модуль переверстан по отдельному ТЗ
   от 05.08.2026, старых классов __column и __header в нём нет. */

/* ------------------------------------------------------------
   МОДУЛЬ 3. ПОДВАЛ — самый неровный блок страницы

   Замер: колонки 190, 231, 251, 306 px (разброс 116),
   высоты 89–266 (разброс 177), промежутки 345, 269, 289, 230.
   Пять колонок, и ни одна пара не совпадает.
   ------------------------------------------------------------ */
.footer-2 .zt-shell > .columns,
.footer-2 [class*="columns"],
.footer-2 > .zt-shell > div:has(> .column) {
    display: grid !important;
    grid-template-columns: repeat(5, minmax(0, 1fr)) !important;
    gap: 32px !important;
    align-items: start !important;
}

.footer-2 .column {
    min-width: 0 !important;
    width: 100% !important;
    margin: 0 !important;
}

@media (max-width: 1023px) {
    .footer-2 .zt-shell > .columns,
    .footer-2 [class*="columns"] {
        grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
        gap: 28px !important;
    }
}

@media (max-width: 560px) {
    .footer-2 .zt-shell > .columns,
    .footer-2 [class*="columns"] {
        grid-template-columns: minmax(0, 1fr) !important;
        gap: 24px !important;
    }
}

/* ------------------------------------------------------------
   МОДУЛЬ 4. ЛИД-ФОРМА — поля разной высоты

   Замер: .form-item высоты 93, 139 и 20 px; .zl-normalized-field
   52 и 96. Плюс 11 цветов — больше, чем в любом другом модуле.

   Причина разнобоя известна из [[Формы]]: разметку дорисовывает
   JavaScript поверх готового DOM.
   ------------------------------------------------------------ */
#ziptehLeadModule .form-item,
#ziptehLeadModule .zl-normalized-field {
    margin-bottom: 16px !important;
}

#ziptehLeadModule input[type="text"],
#ziptehLeadModule input[type="tel"],
#ziptehLeadModule input[type="email"],
#ziptehLeadModule select {
    height: 48px !important;
    min-height: 48px !important;
    box-sizing: border-box !important;
    padding: 0 14px !important;
    font-size: 15px !important;
    border-radius: 8px !important;
}

#ziptehLeadModule textarea {
    min-height: 96px !important;
    box-sizing: border-box !important;
    padding: 12px 14px !important;
    font-size: 15px !important;
    border-radius: 8px !important;
}

#ziptehLeadModule label,
#ziptehLeadModule [class*="__label"] {
    font-size: 13px !important;
    line-height: 1.3 !important;
    margin-bottom: 6px !important;
    display: block !important;
}

/* Сводим палитру модуля к общей */
#ziptehLeadModule,
#ziptehLeadModule p,
#ziptehLeadModule li,
#ziptehLeadModule span:not([class*="star"]):not([class*="required"]) {
    color: #333A43 !important;
}

#ziptehLeadModule [class*="__note"],
#ziptehLeadModule [class*="__hint"],
#ziptehLeadModule small {
    color: #6B7480 !important;
}

/* ------------------------------------------------------------
   МОДУЛЬ 5. ГЕРОЙ — правка отменена

   Замер показал ширины 230 и 238 px у четырёх кнопок, и я
   выровнял их через width: 100%. Кнопки стали 909 px.

   Разбор структуры объяснил, почему выравнивать было нечего:
   кнопки лежат в четырёх РАЗНЫХ слайдах карусели
   (.zip-home-hero__slide-inner) и никогда не видны
   одновременно. Разница в 8 px была невидима.

   Урок: прежде чем выравнивать «неровные повторы», проверять,
   показываются ли они вместе. Замер видит все элементы разом,
   посетитель — нет.
   ------------------------------------------------------------ */

/* ------------------------------------------------------------
   МОДУЛЬ 6. ПРЕИМУЩЕСТВА — кегли вне шкалы

   Замер: 17 px (×4) и 11 px (×1). Общая шкала —
   12, 14, 16, 18, 20, 22, 28, 32, 40.
   ------------------------------------------------------------ */
#ztCompanyAdvantages [class*="__title"] {
    font-size: 18px !important;
    font-weight: 600 !important;
}

#ztCompanyAdvantages [class*="__text"],
#ztCompanyAdvantages [class*="__desc"],
#ztCompanyAdvantages p {
    font-size: 16px !important;
    line-height: 1.55 !important;
}

#ztCompanyAdvantages [class*="__caption"],
#ztCompanyAdvantages [class*="__note"],
#ztCompanyAdvantages [class*="__label"] {
    font-size: 14px !important;
}

/* ------------------------------------------------------------
   ДОБОР ПО МОДУЛЯМ

   Три правки не сработали, потому что селекторы не совпали
   с реальной разметкой. Уточнено осмотром DOM.
   ------------------------------------------------------------ */

/* ПОДВАЛ. Колонки лежат в .zt-shell.footer-2__inner, а не в .columns.
   Там жёстко заданы пять разных ширин:
   305.7 / 230.6 / 250.6 / 190.5 / 250.6 px */
.footer-2 .footer-2__inner,
.footer-2 .zt-shell.footer-2__inner {
    display: grid !important;
    grid-template-columns: repeat(5, minmax(0, 1fr)) !important;
    gap: 32px !important;
    align-items: start !important;
}

.footer-2 .footer-2__inner > .column {
    min-width: 0 !important;
    /* Ширину не задаём. Первая колонка .column.left намеренно
       занимает всю строку (grid-column: 1 / -1) — там логотип
       и слоган. Остальные четыре и так по 308px, разброс 0.
       Две мои попытки «выровнять» (auto, потом 100%) чинили
       несуществующую проблему: замер сравнивал полноширинную
       колонку с обычными и считал разницу дефектом. */
    margin: 0 !important;
}

@media (max-width: 1023px) {
    .footer-2 .footer-2__inner,
    .footer-2 .zt-shell.footer-2__inner {
        grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
        gap: 28px !important;
    }
}

@media (max-width: 560px) {
    .footer-2 .footer-2__inner,
    .footer-2 .zt-shell.footer-2__inner {
        grid-template-columns: minmax(0, 1fr) !important;
        gap: 24px !important;
    }
}

/* ПРЕИМУЩЕСТВА. 17px — это счётчики «10», «950 000», «5 000», «80».
   Для главных цифр блока это мелко: они должны читаться первыми.
   11px — подпись «лет» рядом с числом. */
#ztCompanyAdvantages .js-zt-company-counter,
#ztCompanyAdvantages [class*="counter"] {
    font-size: 28px !important;
    font-weight: 700 !important;
    line-height: 1.1 !important;
    color: #333A43 !important;
}

#ztCompanyAdvantages small,
#ztCompanyAdvantages [class*="__unit"],
#ztCompanyAdvantages [class*="__suffix"] {
    font-size: 14px !important;
    color: #6B7480 !important;
}

@media (max-width: 767px) {
    #ztCompanyAdvantages .js-zt-company-counter,
    #ztCompanyAdvantages [class*="counter"] {
        font-size: 22px !important;
    }
}

/* ТОВАРЫ. 9px — бейдж «ХИТ» на карточке. */
.zt-product-card__badge,
#ztSaleProducts [class*="__badge"] {
    font-size: 12px !important;
    font-weight: 700 !important;
    line-height: 1.2 !important;
    padding: 3px 8px !important;
    border-radius: 6px !important;
}

/* ============================================================
   ПРОГОН ПО ВСЕМ ШИРИНАМ — ОСТАТКИ
   7 ширин × 8 модулей. Вылезаний и обрезок нет нигде.
   Осталось: мелкие кегли и тач-цели.
   ============================================================ */

/* ПРЕИМУЩЕСТВА. Два элемента по 9px:
   «+» рядом со счётчиком и подпись «лет».
   На 1903 они уже 12px, ниже — 9px. */
#ztCompanyAdvantages .zt-company-advantages__metric-plus,
#ztCompanyAdvantages [class*="__metric"] span,
#ztCompanyAdvantages small {
    font-size: 14px !important;
    line-height: 1.2 !important;
}

/* ТОВАРЫ. На сенсорных ширинах 26 целей меньше 44px:
   табы 34px, кнопка «ещё» 30×30, мобильная кнопка каталога 38px. */
@media (max-width: 1023px) {
    #ztSaleProducts .zt-sale-products__tab {
        min-height: 44px !important;
        padding: 0 14px !important;
    }

    #ztSaleProducts .zt-product-card__more,
    #ztSaleProducts [class*="__more"] {
        width: 44px !important;
        height: 44px !important;
        min-width: 44px !important;
    }

    #ztSaleProducts .zt-sale-products__mobile-catalog,
    #ztSaleProducts [class*="__mobile-catal"] {
        min-height: 44px !important;
    }

    /* Ссылки-названия и цены в карточке: увеличиваем область нажатия,
       не меняя кегль текста */
    #ztSaleProducts .zt-product-card__name a,
    #ztSaleProducts .zt-product-card a[class*="__image"] {
        display: block !important;
        min-height: 44px !important;
    }
}

/* ГЕРОЙ. Три ссылки 37×13, 46×13, 79×13 — примеры артикулов
   под строкой поиска. Текст оставляем, область нажатия растим. */
@media (max-width: 1023px) {
    .zip-home-hero .zip-home-search__examples a,
    .zip-home-hero__examples a,
    .zip-home-hero a:not([class]) {
        display: inline-flex !important;
        align-items: center !important;
        min-height: 44px !important;
        padding: 0 4px !important;
    }
}

/* КАТЕГОРИИ. Кнопка прокрутки ленты 38×38. */
@media (max-width: 1023px) {
    .zip-category-strip__scroll-btn,
    .zip-category-strip [class*="__scroll"] {
        width: 44px !important;
        height: 44px !important;
        min-width: 44px !important;
    }
}

/* ЛИД-ФОРМА. Телефон и почта 21px по высоте, ссылка согласия 32px. */
@media (max-width: 1023px) {
    #ziptehLeadModule .zl-contact__value,
    #ziptehLeadModule .zl-consent-link {
        display: inline-flex !important;
        align-items: center !important;
        min-height: 44px !important;
    }
}

/* ПОДВАЛ. Иконки соцсетей 38×44 — узкие по горизонтали. */
@media (max-width: 1023px) {
    .footer-2 [class^="social-"],
    .footer-2 [class*=" social-"] {
        width: 44px !important;
        height: 44px !important;
        min-width: 44px !important;
        display: inline-flex !important;
        align-items: center !important;
        justify-content: center !important;
    }
}

/* ============================================================
   ДОБОР ПО РАЗМЕТКЕ, А НЕ ПО ДОГАДКАМ

   Осмотр DOM показал: 15 «мелких целей» в товарах — это всего
   4 типа элементов, а не 15 разных. И два из трёх моих
   предыдущих селекторов просто не совпадали с реальными классами.
   ============================================================ */

/* Табы блока товаров оставались 34px: min-height не перебивает
   явно заданную height. Нужно снять её вместе с установкой минимума. */
@media (max-width: 1023px) {
    #ztSaleProducts .zt-sale-products__tab,
    .zt-sale-products__title-row .zt-sale-products__tab,
    .zt-sale-products__tabs > * {
        height: auto !important;
        min-height: 44px !important;
        display: inline-flex !important;
        align-items: center !important;
        padding: 0 14px !important;
    }
}

/* Кнопки в карточке товара.

   ⚠️ Здесь была моя ошибка. Правило квадратило 44×44 ВСЕ кнопки
   карточки, чтобы дотянуть иконку 30×30 до тач-цели. Но под тот же
   селектор попала «В корзину» — кнопка с подписью. Её сжимало
   до 44 px, а текст «В корзину» шириной 63–78 px вылезал наружу
   и наезжал на соседнюю карточку. На 390, 768, 920 и 1024 px.

   Та же ошибка, что с системой кнопок: широкая маска по классу
   вместо разбора по назначению.

   Вторая попытка (растянуть ряд кнопок на всю карточку) тоже
   провалилась: контейнер — flex-элемент внутри `__body`, ширину
   100% он не взял, а `flex: 1 1 auto` с `min-width: 0` сжал
   «В корзину» до 14 px. Стало хуже, чем было.

   Третья ошибка в том же месте: селектор `[class^="zt-product-card__button"]`
   ловил и КОНТЕЙНЕР `zt-product-card__buttons` — его имя тоже
   начинается с «zt-product-card__button». Ряд кнопок ужимался
   до 44 px, и кнопка внутри снова становилась квадратом.

   Итог: правило удалено целиком. Кнопка-стрелка `__more`, ради
   которой оно писалось, убрана из разметки по ТЗ §8.7, а размеры
   «В корзину» считает собственная раскладка карточки — и считает
   верно: 110×44 на 390 px, 181×40 на 1440.

   Урок на будущее: `[class^=...]` и `[class*=...]` по имени блока
   почти всегда захватывают и контейнер, и элементы внутри него.
   Проверять список совпадений до, а не после. */

/* Подпись «лет» рядом со счётчиком — 9px.
   Класс zt-company-advantages__metric-cop…, а не просто span. */
#ztCompanyAdvantages [class*="__metric-cop"],
#ztCompanyAdvantages [class*="__metric-"] {
    font-size: 14px !important;
    line-height: 1.2 !important;
}

/* ============================================================
   ВЫПОЛНЕНИЕ ТЗ — P0 и критерии приёмки
   Реестр: Редизайн/Реестр ТЗ — визуальная переработка главной.md
   ============================================================ */

/* ------------------------------------------------------------
   ТЗ P0-5 / критерий 12. РЕКЛАМНЫЙ РАСТР ВМЕСТО ФОТО ТОВАРА

   Замер: на 12 карточках всего 2 уникальных изображения —
   c79c3kq4tn43rcwt3zz3w71z2xilkbe5.jpg и
   4ziinx151auz9aqegxadaywaj6uq5f5l.jpeg. Это баннер
   «ТОВАР НА ФОТОСЕССИИ» — рекламный растр с текстом.

   ТЗ §8.7: «placeholder не должен выглядеть как рекламный
   баннер». Подменяем на нейтральный SVG.

   Это временная мера до появления реальных фото (вопрос В-6).
   Правильное решение — подмена файлов в медиабиблиотеке
   или логика «нет фото → placeholder» на стороне шаблона.
   ------------------------------------------------------------ */
/* Подмена через content: работает для замещаемых элементов
   и не оставляет пустое место, в отличие от opacity + :has(),
   который в этой сборке браузера не сработал — карточки
   становились пустыми. */
.zt-product-card img[src*="c79c3kq4tn43rcwt3zz3w71z2xilkbe5"],
.zt-product-card img[src*="4ziinx151auz9aqegxadaywaj6uq5f5l"] {
    content: url("/local/templates/zipteh/assets/images/product-placeholder.svg") !important;
    object-fit: contain !important;
    background: #F6F7F8 !important;
    width: 100% !important;
    height: 100% !important;
}

/* ------------------------------------------------------------
   ТЗ критерий 15. ЛОГОТИПЫ БРЕНДОВ В ОДНОЙ ОПТИЧЕСКОЙ ОБЛАСТИ

   Замер: две области — 20×20 и 189×90. Логотипы разного
   формата подаются в разных боксах.
   ТЗ §8.6: «логотипы поместить в одинаковый optical box»,
   «использовать object-fit: contain».
   ------------------------------------------------------------ */
.zip-brands [class*="__logo"],
.zip-brands__item [class*="logo"] {
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    width: 100% !important;
    height: 90px !important;
    padding: 12px 16px !important;
    box-sizing: border-box !important;
}

.zip-brands [class*="__logo"] img,
.zip-brands__item img {
    max-width: 100% !important;
    max-height: 100% !important;
    width: auto !important;
    height: auto !important;
    object-fit: contain !important;
}

@media (max-width: 767px) {
    .zip-brands [class*="__logo"],
    .zip-brands__item [class*="logo"] {
        height: 72px !important;
    }
}

/* ------------------------------------------------------------
   ТЗ P0-4 / критерий 20. СЛУЖЕБНАЯ ПЛАШКА НЕ ПЕРЕКРЫВАЕТ ПАНЕЛЬ

   На скриншоте плашка «СТЕНД — не боевой сайт» лежала поверх
   подписей «Каталог» и «Поиск» нижней панели.
   ТЗ §8.14: «разместить выше панели, не перекрывать навигацию,
   не менять её содержание».
   ------------------------------------------------------------ */
#zt-stand-badge {
    bottom: calc(64px + env(safe-area-inset-bottom, 0px)) !important;
    z-index: 9989 !important;
}

@media (min-width: 1400px) {
    #zt-stand-badge {
        bottom: 0 !important;
    }
}

/* ------------------------------------------------------------
   ТЗ P2-1 / критерии 9 и 22. СОСТОЯНИЯ КНОПОК

   Было только hover. ТЗ §7.1 требует шесть состояний:
   default, hover, active, focus-visible, disabled, loading.
   ------------------------------------------------------------ */
.zip-home-search__submit,
.zip-home-hero__button,
.yellow-button,
.zt-company-advantages__button,
.zt-catalog-button,
.zt-callback-button,
.zt-product-card__cart,
.zip-home-search__tab,
.zt-sale-products__tab,
.zt-bottombar__item,
.zt-mobile-menu-button {
    transition: background-color .18s ease, border-color .18s ease,
                color .18s ease, transform .12s ease !important;
}

/* active / pressed */
.zip-home-search__submit:active,
.zip-home-hero__button:active,
.yellow-button:active,
.zt-company-advantages__button:active,
.zt-catalog-button:active,
.zt-callback-button:active,
.zt-product-card__cart:active {
    transform: scale(.985) !important;
}

/* focus-visible вынесен ниже, в блок «Фокус с клавиатуры» — там он
   перебивает 18 правил outline:none из старых файлов. Здесь дубля нет. */

/* disabled */
button:disabled,
.is-disabled,
[aria-disabled="true"] {
    opacity: .5 !important;
    cursor: not-allowed !important;
    pointer-events: none !important;
}

/* loading — кнопка не меняет ширину, повторная отправка блокируется */
.is-loading,
[data-loading="true"] {
    position: relative !important;
    pointer-events: none !important;
    color: transparent !important;
    -webkit-text-fill-color: transparent !important;
}

.is-loading::after,
[data-loading="true"]::after {
    content: "" !important;
    position: absolute !important;
    top: 50% !important;
    left: 50% !important;
    width: 18px !important;
    height: 18px !important;
    margin: -9px 0 0 -9px !important;
    border: 2px solid currentColor !important;
    border-top-color: transparent !important;
    border-radius: 50% !important;
    color: #1A1A1A !important;
    animation: zt-spin .7s linear infinite !important;
}

@keyframes zt-spin { to { transform: rotate(360deg); } }

/* ТЗ §10.3: при prefers-reduced-motion отключаем необязательные движения */
@media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
        transition-duration: .01ms !important;
        animation-duration: .01ms !important;
        animation-iteration-count: 1 !important;
    }

    .is-loading::after,
    [data-loading="true"]::after {
        animation: none !important;
        border-top-color: currentColor !important;
    }
}

/* ------------------------------------------------------------
   ТЗ критерий 22 / доступность §11.4. FOCUS-VISIBLE ВИДИМ

   Замер: outline-style приходил как none. Обводку гасят
   9 правил в живых файлах, из них 3 с !important:
     header-nav-v28.css:130   outline: none !important
     feedback-form.php:334    outline: none !important
     feedback-form.php:450    outline: none !important
   плюс outline: none/0 в header-commerce, header-new,
   header-polish, hero-combo.

   Ставим обводку с той же силой и позже по порядку.
   Важно: гасим только для мыши (:focus:not(:focus-visible)),
   а клавиатурный фокус оставляем видимым — это и есть смысл
   разделения :focus и :focus-visible.
   ------------------------------------------------------------ */
:where(a, button, input, select, textarea, summary, [tabindex]):focus-visible,
.zt-header a:focus-visible,
.zt-header button:focus-visible,
#ziptehLeadModule input:focus-visible,
#ziptehLeadModule textarea:focus-visible,
#ziptehLeadModule button:focus-visible,
.zt-bottombar a:focus-visible,
.zt-bottombar button:focus-visible,
.footer-2 a:focus-visible {
    outline: 3px solid #1A6FD4 !important;
    outline-offset: 2px !important;
    outline-style: solid !important;
}

/* На жёлтом синий теряется — тёмная обводка */
.zip-home-search__submit:focus-visible,
.zip-home-hero__button:focus-visible,
.yellow-button:focus-visible,
.zt-company-advantages__button:focus-visible,
.zt-catalog-button:focus-visible,
.zt-product-card__cart:focus-visible,
.zt-mobile-menu-button:focus-visible {
    outline: 3px solid #1A1A1A !important;
    outline-offset: 3px !important;
    outline-style: solid !important;
}

/* Мышиный фокус не подсвечиваем — только клавиатурный */
:where(a, button, input, select, textarea):focus:not(:focus-visible) {
    outline: none !important;
}

/* ==================================================================
   Состояния формы (ТЗ §5, критерий 10)

   Было: только hover. Отправка ничем не отличалась от простоя,
   ошибка выводилась серым абзацем без роли, невалидное поле
   не отличалось от валидного.
   ================================================================== */

/* --- Отправляется ---
   Курсор прописан и через #ziptehLeadModule: базовое правило кнопки
   в feedback-form.php выше по специфичности и возвращало pointer. */
.yellow-button.is-loading,
#ziptehLeadModule .zl-form-component .yellow-button.is-loading,
#ziptehLeadModule .yellow-button.is-loading,
#form_callback .yellow-button.is-loading,
.form-area .yellow-button.is-loading {
    position: relative !important;
    cursor: progress !important;
    opacity: .82 !important;
}

#ziptehLeadModule .zl-form-component .yellow-button:disabled,
#ziptehLeadModule .yellow-button:disabled,
#form_callback .yellow-button:disabled,
.form-area .yellow-button:disabled,
.form-area .yellow-button[aria-disabled="true"] {
    cursor: not-allowed !important;
}

.yellow-button.is-loading .icon-area {
    opacity: 0 !important;
}

.yellow-button.is-loading::after {
    content: "" !important;
    position: absolute !important;
    top: 50% !important;
    right: 16px !important;
    width: 16px !important;
    height: 16px !important;
    margin-top: -8px !important;
    border: 2px solid rgba(26, 26, 26, .28) !important;
    border-top-color: #1A1A1A !important;
    border-radius: 50% !important;
    animation: zt-spin .7s linear infinite !important;
}

@keyframes zt-spin {
    to { transform: rotate(360deg); }
}

@media (prefers-reduced-motion: reduce) {
    .yellow-button.is-loading::after {
        animation-duration: 2.4s !important;
    }
}

/* --- Заблокирована --- */
.yellow-button:disabled,
.yellow-button[disabled],
.yellow-button[aria-disabled="true"] {
    opacity: .45 !important;
    cursor: not-allowed !important;
    box-shadow: none !important;
    filter: grayscale(.35) !important;
}

.yellow-button:disabled:hover,
.yellow-button[disabled]:hover {
    transform: none !important;
}

/* --- Невалидное поле ---
   :user-invalid, а не :invalid: последний срабатывает на пустом
   обязательном поле сразу при загрузке и красит форму до того,
   как посетитель что-либо ввёл. */
#ziptehLeadModule input:user-invalid,
#ziptehLeadModule textarea:user-invalid,
#ziptehLeadModule [aria-invalid="true"],
.form-area input:user-invalid,
.form-area textarea:user-invalid,
.form-area [aria-invalid="true"] {
    border-color: #C8322B !important;
    background-color: #FEF6F5 !important;
    box-shadow: 0 0 0 3px rgba(200, 50, 43, .12) !important;
}

/* Зелёной рамки у заполненного поля намеренно нет: она добавляла
   на страницу ещё один цвет ради состояния, которое и так очевидно. */

/* --- Ошибка сервера --- */
.form-area .errortext,
#ziptehLeadModule .errortext {
    display: block !important;
    margin: 0 0 14px !important;
    padding: 12px 14px 12px 40px !important;
    position: relative !important;
    border: 1px solid #E7B0AC !important;
    border-radius: 12px !important;
    background: #FEF3F2 !important;
    color: #8E241E !important;
    font-size: 14px !important;
    line-height: 1.45 !important;
}

.form-area .errortext::before,
#ziptehLeadModule .errortext::before {
    content: "!" !important;
    position: absolute !important;
    top: 12px !important;
    left: 14px !important;
    width: 18px !important;
    height: 18px !important;
    border-radius: 50% !important;
    background: #C8322B !important;
    color: #fff !important;
    font-size: 12px !important;
    font-weight: 700 !important;
    line-height: 18px !important;
    text-align: center !important;
}

/* --- Успех --- */
.zt-form-note {
    padding: 18px 18px 18px 52px !important;
    position: relative !important;
    border: 1px solid #B7DFC6 !important;
    border-radius: 14px !important;
    background: #F2FAF5 !important;
    color: #1F5B38 !important;
}

.zt-form-note::before {
    content: "" !important;
    position: absolute !important;
    top: 20px !important;
    left: 18px !important;
    width: 20px !important;
    height: 20px !important;
    border-radius: 50% !important;
    background: #2E7D4F !important;
}

.zt-form-note::after {
    content: "" !important;
    position: absolute !important;
    top: 26px !important;
    left: 24px !important;
    width: 8px !important;
    height: 4px !important;
    border-left: 2px solid #fff !important;
    border-bottom: 2px solid #fff !important;
    transform: rotate(-45deg) !important;
}

.zt-form-note .style_h2 {
    margin: 0 0 4px !important;
    color: #1F5B38 !important;
}

.zt-form-note:focus {
    outline: none !important;
}

.zt-form-note:focus-visible {
    outline: 3px solid #2E7D4F !important;
    outline-offset: 2px !important;
}

/* ==================================================================
   Резерв места под изображения (ТЗ §7.5 «закрепить aspect ratio
   на уровне контейнера»)

   Товары, категории, бренды и новости место уже держат — у них
   либо фиксированная высота, либо aspect-ratio. Оставались два
   блока, где контейнер схлопывался до высоты картинки и после
   загрузки страница дёргалась.
   ================================================================== */

/* Фото в «Преимуществах»: figure повторяла высоту картинки
   (227,663 px и там, и там) — до загрузки высота была нулевой */
#ztCompanyAdvantages .zt-company-advantages__photo {
    aspect-ratio: 16 / 9 !important;
    overflow: hidden !important;
}

#ztCompanyAdvantages .zt-company-advantages__photo img {
    width: 100% !important;
    height: 100% !important;
    object-fit: cover !important;
}


/* Запасная картинка вместо битой ссылки (ТЗ §7.5 «предусмотреть
   fallback при ошибке загрузки») */
img.zt-image-failed {
    content: url("/local/templates/zipteh/assets/images/product-placeholder.svg") !important;
    object-fit: contain !important;
    background: #F6F7F8 !important;
}

/* Логотип. Разметка шапки приходит из включаемого файла, который
   в наш комплект не входит, поэтому пропорцию задаём стилем —
   для резерва места это равнозначно атрибутам width/height. */
.zt-header__logo img,
.zt-mobile-drawer__logo img,
#ziptehSiteFooter .logo img {
    aspect-ratio: 1024 / 203 !important;
    height: auto !important;
    object-fit: contain !important;
}

/* ==================================================================
   Тач-цели каруселей и логотипа (ТЗ, критерий 21 — не меньше 44×44)

   Точки перелистывания — 4×4 и 18×3 px. Попасть пальцем нельзя,
   а промах по точке листает слайд. Увеличиваем зону нажатия
   прозрачным слоем, сама точка остаётся прежнего размера:
   визуально ничего не меняется.
   ================================================================== */
.swiper-pagination-bullet {
    position: relative !important;
}

.swiper-pagination-bullet::after {
    content: "" !important;
    position: absolute !important;
    top: 50% !important;
    left: 50% !important;
    width: 44px !important;
    height: 44px !important;
    transform: translate(-50%, -50%) !important;
    background: transparent !important;
    border: 0 !important;
    border-radius: 50% !important;
}

/* Точки лежат вплотную — при зоне 44 px соседние зоны наложатся
   друг на друга, и палец будет попадать не туда. Шаг между
   центрами должен быть не меньше ширины зоны, поэтому 20 px
   с каждой стороны: 4 px точка + 40 px полей = шаг 44. */
/* Карусель документов исключена: ТЗ доработки §5.5 требует компактную
   пагинацию без больших промежутков — поля задаёт home-media-v2.css */
.swiper-pagination-bullets .swiper-pagination-bullet:not(#ztHomeMediaV2 *),
.swiper-pagination .swiper-pagination-bullet:not(#ztHomeMediaV2 *),
/* Модули задают свои поля инлайном в body — там правило с такой же
   специфичностью выигрывает по порядку. Поэтому селекторы длиннее. */
.zip-home-hero__swiper .swiper-pagination .swiper-pagination-bullet,
.zip-home-hero__swiper .swiper-pagination-bullets .swiper-pagination-bullet,
#ztSaleProducts .swiper-pagination .swiper-pagination-bullet {
    margin-right: 20px !important;
    margin-left: 20px !important;
}

@media (min-width: 1025px) {
    /* На мыши зона в 44 px не нужна, а промежутки лишние */
    .swiper-pagination-bullet::after {
        width: 24px !important;
        height: 24px !important;
    }

    .swiper-pagination-bullets .swiper-pagination-bullet:not(#ztHomeMediaV2 *) {
        margin-right: 6px !important;
        margin-left: 6px !important;
    }
}

/* Ссылка-логотип была 180×36 — не дотягивала по высоте.
   Размер самой картинки не трогаем, растёт только зона нажатия. */
@media (max-width: 1024px) {
    .zt-header__logo {
        display: inline-flex !important;
        align-items: center !important;
        min-height: 44px !important;
    }
}

/* ==================================================================
   Текст, скрытый визуально, но доступный (ТЗ §11 п.12)

   Заголовки баннеров героя вшиты в растр. Пока нет картинок без
   надписей, тот же текст лежит в разметке этим классом: экранный
   диктор и поисковик его читают, глазами он не виден и вёрстку
   не двигает.

   clip-path вместо display:none намеренно — скрытое через display
   содержимое скринридер не озвучивает.
   ================================================================== */
.zt-visually-hidden {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    margin: -1px !important;
    padding: 0 !important;
    overflow: hidden !important;
    clip: rect(0 0 0 0) !important;
    clip-path: inset(50%) !important;
    white-space: nowrap !important;
    border: 0 !important;
}

/* Если посетитель дойдёт до ссылки внутри такого блока клавиатурой,
   блок должен стать видимым — иначе фокус уедет «в никуда». */
.zt-visually-hidden:focus-within {
    position: static !important;
    width: auto !important;
    height: auto !important;
    margin: 0 !important;
    overflow: visible !important;
    clip: auto !important;
    clip-path: none !important;
    white-space: normal !important;
}

/* ==================================================================
   Шкала теней (ТЗ, критерий 7 — «тени в общей системе»)

   На странице насчитывалось 14 разных теней, в исходниках — 60
   объявлений. Разница между многими из них на глаз не видна:
   .045 против .05 против .055 при одинаковом размытии.

   Четыре уровня по назначению. Ниже по файлам near-дубли заменены
   на эти переменные; тени с иным направлением (боковая у выдвижного
   меню) оставлены как есть — они решают другую задачу.
   ================================================================== */
:root {
    /* приподнятый элемент: кнопка, таб */
    --zt-shadow-1: var(--zt-shadow-1);
    /* карточка в покое */
    --zt-shadow-2: 0 8px 24px rgba(29, 34, 40, .06);
    /* оторванный от страницы слой: модалка, выпадающее меню */
    --zt-shadow-3: 0 24px 70px rgba(17, 24, 32, .22);
    /* акцентная жёлтая кнопка */
    --zt-shadow-accent: 0 12px 28px rgba(255, 184, 0, .24);
    /* она же под курсором — заметно выше, иначе наведение не читается */
    --zt-shadow-accent-hover: 0 16px 32px rgba(255, 184, 0, .28);
}

/* ==================================================================
   Тач-цели каталога и карточки товара

   ТЗ описывает главную, но файлы стилей общие, и на каталоге —
   главной странице покупки — на 390 px было 82 элемента мельче
   44×44: сердечко избранного 40×40, кнопки количества 32×42,
   страницы пагинации 17×16.

   Приём тот же, что на главной: зону нажатия расширяет прозрачный
   слой, видимый размер элемента не меняется.
   ================================================================== */
@media (max-width: 1024px) {
    .poisk-product__favorite,
    .poisk-product__quantity-button,
    .poisk-filters__close,
    .main-ui-pagination-page,
    .main-ui-pagination-arrow {
        position: relative !important;
    }

    .poisk-product__favorite::after,
    .poisk-product__quantity-button::after,
    .poisk-filters__close::after,
    .main-ui-pagination-page::after,
    .main-ui-pagination-arrow::after {
        content: "" !important;
        position: absolute !important;
        top: 50% !important;
        left: 50% !important;
        width: 44px !important;
        height: 44px !important;
        transform: translate(-50%, -50%) !important;
        background: transparent !important;
        border: 0 !important;
    }

    /* Пагинация Битрикса — цифры 17×16 стоят вплотную.
       Разводим, иначе зоны нажатия наложатся друг на друга. */
    .main-ui-pagination-page,
    .main-ui-pagination-arrow {
        margin-right: 14px !important;
        margin-left: 14px !important;
    }

    /* Кнопки с подписью: высоту добираем полями, ширина уже достаточна */
    .poisk-results__filter-toggle,
    .poisk-filters__reset,
    .poisk-filters__apply {
        min-height: 44px !important;
        display: inline-flex !important;
        align-items: center !important;
        justify-content: center !important;
    }
}

/* Контакты: телефон и почта — это то, ради чего страницу открывают
   с мобильного. Ссылки были 287×18 — тонкая полоска в один текстовый
   ряд. Здесь расширяем не зоной, а реальными полями: элементы
   блочные и стоят по одному в строке, layout не ломается. */
@media (max-width: 1024px) {
    .zt-contact-card dd > a,
    .zt-contacts dd > a,
    dd > a[href^="tel:"],
    dd > a[href^="mailto:"] {
        display: inline-flex !important;
        align-items: center !important;
        min-height: 44px !important;
    }

    .zt-contact-card__route,
    .zt-region-tab {
        min-height: 44px !important;
    }
}

/* ==================================================================
   Общий контейнер (ТЗ §6.3)

   Требование ТЗ: на 1440 px контент — 1320 px, внешние поля ~60 px;
   на 1280 — поля не меньше 32–40; планшет 24; мобильный 16.

   Было: `.zt-shell` с `max-width: 2048px` и полями 28/20/14 —
   на 1440 контент растягивался на 1383 px, то есть почти во всю
   ширину экрана. Длинные строки текста читаются хуже, а сетка
   карточек расползается.

   ТЗ §6.3 отдельно требует: «если в проекте уже есть общий
   контейнер, скорректировать его, а не создавать второй
   конкурирующий класс». Поэтому правим `.zt-shell`, новый класс
   не заводим.

   ⚠️ На каталоге и в карточке товара есть ВТОРОЙ контейнер
   `.container` из темы 2019 года: 1200 px со стартом на x=112,
   тогда как шапка начиналась на x=20. Они и раньше не совпадали.
   После этой правки расхождение уменьшается со 183 до 120 px,
   но полностью уйдёт только вместе с переработкой каталога —
   это вне рамок ТЗ на главную.
   ================================================================== */
:root {
    /* Исходные значения сайта: max-width 2048 и поля 28/20/14.
       ТЗ §6.3 предлагало контент 1320 px, но по решению заказчика
       (06.08.2026) ширина возвращена к исходной — на 1320 сайт
       выглядел заметно уже. Выравнивание по одной оси сохранено:
       все обёртки модулей берут эти же токены. */
    --container-max: 1992px;
    --page-gutter: 28px;
}

@media (max-width: 1480px) {
    :root { --page-gutter: 20px; }
}

@media (max-width: 680px) {
    :root { --page-gutter: 14px; }
}

.zt-shell {
    width: 100% !important;
    max-width: calc(var(--container-max) + 2 * var(--page-gutter)) !important;
    margin-right: auto !important;
    margin-left: auto !important;
    padding-right: var(--page-gutter) !important;
    padding-left: var(--page-gutter) !important;
}

/* Полноширинные секции держат свой фон во всю ширину, но их
   внутренние обёртки обязаны идти по той же оси (ТЗ §6.3).

   Селекторы намеренно длинные. Каждый модуль задаёт своей обёртке
   `max-width: 2048px` правилом вида `#ztSaleProducts .zt-sale-products__shell`
   — это 1 идентификатор + 1 класс. При такой же специфичности
   выигрывает тот файл, который подключён позже, а стили модулей
   лежат в <body> и грузятся после нашего. Поэтому добавлен второй
   класс — специфичность становится выше, и порядок уже не решает. */
#ziptehSiteFooter > .zt-shell.footer-2__inner,
#ziptehSiteFooter .zt-shell.footer-2__copyright-inner,
#ztSaleProducts .zt-shell.zt-sale-products__shell,
#ztHomeMediaV2 .zt-shell.zt-home-media-v2__inner,
#ziptehLeadModule .zt-shell.zl-shell,
/* .zl-inner намеренно НЕ здесь: он лежит внутри .zl-shell,
   который отступ уже получил, и поле удваивалось (292 → 352). */
.zt-header .zt-shell,
.zt-header__top .zt-shell,
.zt-header__bottom .zt-shell {
    width: 100% !important;
    max-width: calc(var(--container-max) + 2 * var(--page-gutter)) !important;
    margin-right: auto !important;
    margin-left: auto !important;
    padding-right: var(--page-gutter) !important;
    padding-left: var(--page-gutter) !important;
}

/* Карточки товара в карусели — одинаковая высота (ТЗ, критерий 13).

   На ПК разброс был 0, а на мобильном 81 px: 304 / 323 / 385.
   Swiper задаёт слайдам высоту по содержимому, и рядом стояли
   карточки разной длины. Растягиваем слайд и карточку на всю
   высоту строки — тогда нижние края цены и кнопки совпадают.

   Тонкость: карточка САМА является слайдом — у неё сразу два
   класса, `swiper-slide zt-product-card`. Селектор вида
   `.swiper-slide > .zt-product-card` не совпадает ни с чем. */
#ztSaleProducts .zt-sale-products__slider .swiper-wrapper,
#ztSaleProducts .swiper .swiper-wrapper {
    align-items: stretch !important;
}

#ztSaleProducts .zt-sale-products__slider .swiper-slide,
#ztSaleProducts .swiper-slide.zt-product-card {
    height: auto !important;
    align-self: stretch !important;
}

/* ==================================================================
   Заголовки секций — вторая попытка (ТЗ §6.6, критерий 29)

   Первый заход целился в `#ztHomeMediaV2 h2` — специфичность (1,0,1).
   Модули задают свои заголовки классом: `#ztHomeMediaV2
   .zt-home-media-v2__heading` — (1,1,0), и грузятся из <body>.
   Правило не срабатывало, а я записал пункт как сделанный,
   потому что замерил только три секции из семи.

   Замер после перепроверки (1440 px):
     Категории 32 · Бренды 32 · Популярные 32   — в шкале
     О компании          18/600                 — вне
     Новости и статьи    14                     — вне, мельче текста
     Сертификаты         14                     — вне, мельче текста

   Заголовок «Новости и статьи» был 14 px при основном тексте 16 —
   он не читался как заголовок вообще.

   Селекторы ниже включают класс самой секции: (1,2,0) против
   (1,1,0) у модулей — порядок загрузки больше не решает.
   ================================================================== */
#ztHomeMediaV2.zt-home-media-v2 .zt-home-media-v2__heading,
#ztCompanyAdvantages .zt-company-advantages__surface .zt-company-advantages__title,
#ztCompanyAdvantages .zt-company-advantages__copy .zt-company-advantages__title {
    font-size: var(--zt-h2-size) !important;
    font-weight: 700 !important;
    line-height: 1.2 !important;
    color: var(--zt-ink) !important;
    letter-spacing: -0.01em !important;
}

@media (max-width: 1023px) {
    #ztHomeMediaV2.zt-home-media-v2 .zt-home-media-v2__heading,
    #ztCompanyAdvantages .zt-company-advantages__surface .zt-company-advantages__title,
    #ztCompanyAdvantages .zt-company-advantages__copy .zt-company-advantages__title {
        font-size: var(--zt-h2-size-md) !important;
    }
}

@media (max-width: 640px) {
    #ztHomeMediaV2.zt-home-media-v2 .zt-home-media-v2__heading,
    #ztCompanyAdvantages .zt-company-advantages__surface .zt-company-advantages__title,
    #ztCompanyAdvantages .zt-company-advantages__copy .zt-company-advantages__title {
        font-size: var(--zt-h2-size-sm) !important;
    }
}

/* Заголовок лид-блока намеренно на ступень крупнее: это призыв
   к действию в конце страницы, а не рядовая секция. 40 / 36 / 28
   против 32 / 28 / 22 — соотношение выдержано, шкала одна. */

/* Ступени шкалы заголовков. Переопределяем сам токен — тогда
   правила модулей, написанные через var(--zt-h2-size), меняются
   автоматически и медиазапрос не нужно повторять в каждом файле. */
@media (max-width: 1023px) {
    :root {
        --zt-h2-size: 28px;
        --zt-h3-size: 18px;
    }
}

@media (max-width: 640px) {
    :root {
        --zt-h2-size: 22px;
        --zt-h3-size: 16px;
    }
}

/* Карточки преимуществ — одинаковая высота в ряду (ТЗ §8.9:
   «карточки не должны иметь случайно разную высоту без выравнивания
   контента»).

   Раньше высота держалась жёстким `height: 88px` у первых четырёх,
   а текст обрезался многоточием — ТЗ это запрещает. Многоточие снято,
   высоту теперь выравнивает сетка: строка тянется по самой высокой
   карточке, а карточка занимает строку целиком. */
#ztCompanyAdvantages .zt-company-advantages__benefit-grid {
    align-items: stretch !important;
}

#ztCompanyAdvantages .zt-company-advantages__benefit-grid > .zt-company-advantages__benefit {
    height: 100% !important;
    min-height: 0 !important;
    display: flex !important;
    flex-direction: column !important;
}

/* ==================================================================
   Карусели до инициализации (FOUC)

   Swiper раскладывает слайды скриптом. До этого момента браузер
   рисует их так, как они лежат в разметке: все подряд в строку.
   На главной это выглядит как «страница поехала» — в баннере видно
   сразу два слайда с обрезанным текстом, второй уходит за край.

   Промежуток небольшой, но он есть на каждой загрузке, и именно
   его поймал скриншот. Пока у контейнера нет класса
   `swiper-initialized`, показываем только первый слайд.
   ================================================================== */
.swiper:not(.swiper-initialized) {
    overflow: hidden !important;
}

.swiper:not(.swiper-initialized) > .swiper-wrapper {
    display: flex !important;
    flex-wrap: nowrap !important;
    transform: none !important;
}

.swiper:not(.swiper-initialized) > .swiper-wrapper > .swiper-slide {
    flex: 0 0 100% !important;
    width: 100% !important;
    max-width: 100% !important;
}

/* Второй и дальше не показываем: их место займёт Swiper */
.swiper:not(.swiper-initialized) > .swiper-wrapper > .swiper-slide:not(:first-child) {
    visibility: hidden !important;
}

/* Стрелки и точки до инициализации ещё не работают — не показываем,
   иначе по ним можно нажать вхолостую. */
.swiper:not(.swiper-initialized) .swiper-button-prev,
.swiper:not(.swiper-initialized) .swiper-button-next,
.swiper:not(.swiper-initialized) .swiper-pagination {
    opacity: 0 !important;
    pointer-events: none !important;
}

.swiper.swiper-initialized .swiper-button-prev,
.swiper.swiper-initialized .swiper-button-next,
.swiper.swiper-initialized .swiper-pagination {
    transition: opacity .2s ease;
}

/* Контролы карусели не должны перехватывать клики (ТЗ §8.3:
   «контролы карусели не перекрывают текст и CTA»).

   Замер: контейнер `.swiper-pagination` растянут во всю ширину
   слайдера, `z-index: 10` против 5 у кнопки, и накрывает нижние
   15 px кнопки «Подобрать запчасти» на 230 px по горизонтали.
   Сами точки при этом далеко — на x 935–1167, кнопка 659–889.
   То есть клик пропадал на пустом месте контейнера.

   Контейнер делаем прозрачным для мыши, точки — кликабельными. */
.swiper-pagination {
    pointer-events: none !important;
}

.swiper-pagination .swiper-pagination-bullet {
    pointer-events: auto !important;
}

/* ==================================================================
   Верхняя строка шапки — гибкие колонки (ТЗ §8.1)

   ⚠️ Регрессия от перехода на контейнер 1320 px.

   `header-polish.css` при ≥1600 задаёт строку жёстко:
       274px 250px minmax(320px, 1fr) 300px 70px 180px, gap 24
   Минимум такой сетки — 1514 px (1394 треков + 120 зазоров).
   Контейнер после §6.3 даёт 1320. Grid с фиксированными треками
   не сжимается: кнопка «ЗАКАЗ» вылезала на 194 px за контейнер
   и на 30 px за край экрана — её было видно обрезанной.

   Замер до правки на 1648: строка 104…1544, кнопка 1498…1678.

   ТЗ §8.1 прямо говорит: «поиск должен занимать доступное
   свободное пространство через flex: 1 1 auto и min-width: 0».
   Делаем именно так: все треки по содержимому, поиск забирает
   остаток и умеет сжиматься до нуля.
   ================================================================== */
@media (min-width: 1400px) {
    .zt-header .zt-header__top-inner {
        grid-template-columns: auto auto minmax(0, 1fr) auto auto auto !important;
        gap: 20px !important;
        align-items: center !important;
    }

    /* Поиск обязан уметь сжиматься, иначе 1fr не спасёт */
    .zt-header .zt-search {
        min-width: 0 !important;
        width: auto !important;
    }

    /* Остальные — по содержимому, без фиксированной ширины */
    .zt-header .zt-header__logo,
    .zt-header .zt-catalog-button,
    .zt-header .zt-contact,
    .zt-header .zt-max-button,
    .zt-header .zt-callback-button {
        width: auto !important;
        min-width: 0 !important;
    }

    /* Логотип не должен растягиваться сверх своей пропорции */
    .zt-header .zt-header__logo {
        max-width: 264px !important;
    }
}

/* Меню помещается целиком (ТЗ, критерий 3 «ничего не обрезается»).

   Замер на 1663: пункту «Контакты» нужно 153 px, доставалось 92 —
   не хватало 61. Список режет по `overflow: hidden`, поэтому
   обрезка не ловилась проверкой самого пункта: у ссылки
   overflow: visible, её scrollWidth равен clientWidth.

   Полоса 1400–1780 самая тесная: контейнер уже 1320, а пунктов
   девять. Снижаем кегль на одну ступень — 14 вместо 15. Это
   даёт около 70 px и не требует резать подписи. */
@media (min-width: 1400px) and (max-width: 1780px) {
    .zt-header .zt-nav__link,
    .zt-header .zt-nav__trigger {
        /* кегль пунктов задаётся лестницей в zt-home-unify.css (аудит 02.09.2026) */
        /* 3 px, а не 5: последнему пункту «Контакты» не хватало
           2 px и его резало по краю списка (overflow: hidden). */
        padding-left: 3px !important;
        padding-right: 3px !important;
        gap: 6px !important;
    }

    .zt-header .zt-nav__list {
        column-gap: 8px !important;
    }

    .zt-header .zt-nav__icon {
        width: 17px !important;
        height: 17px !important;
        flex: 0 0 17px !important;
    }
}

/* ≥1781: кегль 15 сохраняем, добираем место зазором.
   Замер: «Контакты» выходили за край списка на 7 px. */
@media (min-width: 1781px) {
    .zt-header .zt-nav__list {
        column-gap: 12px !important;
    }

    .zt-header .zt-nav__link,
    .zt-header .zt-nav__trigger {
        padding-left: 5px !important;
        padding-right: 5px !important;
    }
}

/* Последние 8 px для пункта «Контакты».

   Уменьшать поля пунктов бесполезно: список — flex с фиксированной
   шириной, освободившееся место он раздаёт всем пунктам, и последний
   всё равно не добирает. Место надо именно освободить.

   Берём его у иконок пунктов: 9 иконок × 2 px ширины + 9 × 1 px
   зазора = 27 px. Иконка 15 px против 17 читается так же.

   06.08.2026 (правка N-001): экономия ограничена тесной полосой
   1400–1780 — раньше 15 px действовали и на широких экранах. */
@media (min-width: 1400px) and (max-width: 1780px) {
    .zt-header .zt-nav__icon {
        width: 15px !important;
        height: 15px !important;
        flex: 0 0 15px !important;
    }

    .zt-header .zt-nav__link,
    .zt-header .zt-nav__trigger {
        gap: 5px !important;
    }
}

/* N-001 → N-043…N-052: на широких экранах иконки пунктов
   ещё крупнее — заказчик попросил 1,25× от прежних 18 */
@media (min-width: 1781px) {
    .zt-header .zt-nav__icon {
        width: 22px !important;
        height: 22px !important;
        flex: 0 0 22px !important;
    }
}

/* Список не должен резать подписи: если места вдруг не хватит,
   пусть лучше будет видно, что пункт не поместился, чем молча
   обрезанное слово. */
@media (min-width: 1400px) {
    .zt-header .zt-nav__list {
        overflow: visible !important;
    }
}


/* ==================================================================
   Шкала кнопок (П-3 аудита типографики, согласовано 06.08.2026)

   Три роли: главная 15/700, вторичная 14/600, вкладка 14/600.
   Правило П-1 (наследование) покрывает span без класса; здесь —
   кнопки, у которых подпись лежит в span С классом, и кнопки,
   на которых шрифт вообще не был задан (их текст брал 16/400
   из reset). Подписи наследуют кнопку явно.
   ================================================================== */

/* --- Главные (15/700): жёлтые кнопки действий ---
   .zip-home-mini__more перенесена сюда из вторичных 06.08.2026
   по правке заказчика N-009 («шрифт не как везде на кнопках») */
html body .zip-brands .zip-brands__all,
.zip-home-search__submit,
.zip-home-hero .zip-home-mini__more {
    font-size: 15px !important;
    font-weight: 700 !important;
}

/* --- Вторичные (14/600) --- */
#ztSaleProducts .zt-sale-products__catalog-link,
#ztSaleProducts.zt-sale-products .zt-product-card__cart,
#ztCompanyAdvantages .zt-company-advantages__button {
    font-size: 14px !important;
    font-weight: 600 !important;
}

/* Подписи в span с классом наследуют кнопку */
.zt-product-card__cart .zt-product-card__cart-label,
.zt-product-card__cart .zt-product-card__cart-success,
.zip-home-mini__more .zip-home-mini__more-text,
.zip-home-mini__more [class*="more-text"],
.zip-home-search__submit [class*="submit-text"],
.zt-company-advantages__button span,
.zip-brands__all span {
    font-size: inherit !important;
    font-weight: inherit !important;
    letter-spacing: inherit !important;
}


/* П-4: бейджи капсом через CSS — в данных обычный регистр
   («Хит», «Новинка», «Акция») */
.zt-product-card__badge,
#ztSaleProducts [class*="__badge"] {
    text-transform: uppercase !important;
    letter-spacing: .05em !important;
}

/* N-111, мобильная ступень: 24px в узкой карточке (2 в ряду) не
   помещается — на телефоне цена 18px; селектор той же силы, что
   правило 24px выше, иначе его группа [class*="__price"] победит */
@media (max-width: 680px) {
    #ztSaleProducts .zt-product-card__price:not([class*="label"]),
    #ztSaleProducts [class*="__price"]:not([class*="label"]):not([class*="old"]):not([class*="request"]) {
        font-size: 18px !important;
    }
}


/* N-116: артикул — главный идентификатор (ищут по нему),
   название — вторая строка. N-117: цена прижата влево,
   наличие — вправо. Селекторы в конце unify — последнее слово каскада */
#ztSaleProducts .zt-product-card__id-row .zt-product-card__article,
#ztSaleProducts .zt-product-card__article {
    margin: 0 !important;
    /* двойной селектор: инлайн модуля красит артикул в muted
       с той же специфичностью — перебиваем связкой id-row */
    color: #1e2428 !important;
    font-size: 15px !important;
    font-weight: 800 !important;
    line-height: 1.2 !important;
    letter-spacing: .01em;
}

/* N-121: название — в стилистике бейджей («ХИТ», «НОВИНКА»):
   шрифт бейджей, капс, разрядка */
#ztSaleProducts .zt-product-card__name:not(#zt_):not(#zt_),
#ztSaleProducts .zt-product-card__name:not(#zt_):not(#zt_) a {
    color: #6b747c !important;
    /* двойной :not(#zt_) — иначе шрифтовой слой заголовков
       (body h3:not(#zt_):not(#zt_) → Russo One) сильнее */
    font-family: var(--zt-font-badge, 'Manrope', Arial, sans-serif) !important;
    font-size: 11px !important;
    font-weight: 700 !important;
    line-height: 1.4 !important;
    letter-spacing: .04em;
    text-transform: uppercase;
}

/* N-120: старая цена НАД новой (обе слева), наличие — справа
   по центру двух строк. Грид переживает карточки без старой цены:
   тогда цена в первом ряду, наличие рядом */
#ztSaleProducts .zt-product-card__prices {
    display: grid !important;
    grid-template-columns: minmax(0, 1fr) auto !important;
    align-items: center !important;
    gap: 0 8px !important;
}

#ztSaleProducts .zt-product-card__old-price {
    grid-column: 1;
    order: -1;
    margin: 0 !important;
}

#ztSaleProducts .zt-product-card__price:not([class*="request"]) {
    grid-column: 1;
    margin-left: 0 !important;
    text-align: left !important;
}

#ztSaleProducts .zt-product-card__avail {
    grid-column: 2;
    grid-row: 1 / span 2;
    align-self: center;
    margin-left: 0 !important;
}


/* N-124: карточка компактнее — убираем вертикальную распорку
   (авто-маржа перед ценой) и запас высоты тела карточки */
#ztSaleProducts .zt-product-card__body {
    min-height: 0 !important;
}

#ztSaleProducts .zt-product-card__prices {
    margin: 10px 0 0 !important;
}

#ztSaleProducts .zt-product-card__buttons {
    margin-top: 10px !important;
}

/* N-125: название — максимум 2 строки, отступ от артикула чуть больше */
#ztSaleProducts .zt-product-card__name:not(#zt_):not(#zt_) {
    display: -webkit-box !important;
    overflow: hidden !important;
    max-height: 32px;
    margin: 7px 0 0 !important;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
}

/* ============================================================
   N-402…N-413: единый бургер и стабильная шапка до 1400 px
   ============================================================ */

/* Кнопка одна. Второй «бургер» рисовали псевдоэлементы вложенного
   span поверх штатных ::before/::after самой кнопки. Оставляем
   ровно три линии: button::before + span + button::after. */
@media (max-width: 1399px) {
    .zt-header #open-mobile-menu {
        position: relative !important;
    }

    .zt-header #open-mobile-menu::before,
    .zt-header #open-mobile-menu::after,
    .zt-header #open-mobile-menu > span {
        position: absolute !important;
        left: 11px !important;
        width: 22px !important;
        height: 2px !important;
        margin: 0 !important;
        border-radius: 2px !important;
        background: #1A1A1A !important;
        transform: none !important;
    }

    .zt-header #open-mobile-menu::before {
        top: 14px !important;
    }

    .zt-header #open-mobile-menu > span {
        top: 21px !important;
    }

    .zt-header #open-mobile-menu::after {
        top: 28px !important;
    }

    .zt-header #open-mobile-menu > span::before,
    .zt-header #open-mobile-menu > span::after {
        content: none !important;
        display: none !important;
    }
}

/* На 1280 шапку ломали унаследованные order: контакт становился
   первым, поиск и бургер переносились на отдельные строки. В
   диапазоне 1081–1399 все элементы снова идут одной строкой. */
@media (min-width: 1081px) and (max-width: 1399px) {
    .zt-header .zt-header__top-inner {
        display: flex !important;
        flex-wrap: nowrap !important;
        align-items: center !important;
        min-height: 72px !important;
        padding: 12px 20px !important;
        gap: 16px !important;
    }

    .zt-header .zt-header__top-inner .zt-header__logo {
        order: 1 !important;
        flex: 0 0 auto !important;
        margin: 0 !important;
    }

    .zt-header .zt-header__top-inner .zt-catalog-button {
        order: 2 !important;
        flex: 0 0 auto !important;
    }

    .zt-header .zt-header__top-inner .zt-search.zt-live-search {
        order: 3 !important;
        flex: 1 1 auto !important;
        width: auto !important;
        min-width: 0 !important;
    }

    .zt-header .zt-header__top-inner .zt-contact {
        order: 4 !important;
        flex: 0 0 auto !important;
        width: auto !important;
        margin: 0 !important;
    }

    .zt-header .zt-header__top-inner .zt-mobile-trigger {
        order: 5 !important;
        flex: 0 0 auto !important;
        margin: 0 !important;
        align-self: center !important;
    }
}

/* N-414/N-415: свободное место списка не скапливается после
   «Контактов», а поровну распределяется между девятью пунктами.
   Корзина и избранное находятся вне .zt-nav__list и не меняются. */
@media (min-width: 1400px) {
    .zt-header .zt-nav__list {
        justify-content: space-between !important;
        column-gap: 0 !important;
    }
}

/* N-416: на планшете 1024 компактный режим не должен убирать
   логотип и бургер. Схлопывание до одной строки поиска остаётся
   только на телефонах (≤767 px). */
@media (min-width: 768px) and (max-width: 1023px) {
    .zt-header.zt-header--compact .zt-header__logo,
    .zt-header.zt-header--compact .zt-mobile-trigger {
        opacity: 1 !important;
        max-height: none !important;
        margin-top: 0 !important;
        margin-bottom: 0 !important;
        padding-top: 0 !important;
        padding-bottom: 0 !important;
        overflow: visible !important;
        pointer-events: auto !important;
        transform: none !important;
    }

    .zt-header.zt-header--compact .zt-header__top-inner {
        min-height: 72px !important;
        padding-top: 10px !important;
        padding-bottom: 10px !important;
    }
}

/* N-417/N-418: отдельный визуальный зазор между «Контактами»
   и избранным. Список становится немного уже, но space-between
   продолжает давать одинаковые интервалы между его пунктами. */
@media (min-width: 1400px) {
    .zt-header .zt-nav__list {
        margin-right: clamp(24px, 2vw, 40px) !important;
    }
}

/* N-419…N-421: внешняя тач-цель уже равна высоте строки логотипа
   (44 px), увеличиваем только видимую трёхполосную пиктограмму. */
@media (max-width: 767px) {
    .zt-header #open-mobile-menu::before,
    .zt-header #open-mobile-menu::after,
    .zt-header #open-mobile-menu > span {
        left: 6px !important;
        width: 32px !important;
        height: 3px !important;
    }

    .zt-header #open-mobile-menu::before {
        top: 8px !important;
    }

    .zt-header #open-mobile-menu > span {
        top: 21px !important;
    }

    .zt-header #open-mobile-menu::after {
        top: 34px !important;
    }
}

/* =========================================================
   N-568: на широких экранах пункты меню прижимаются вправо.

   Список растягивался на всю доступную ширину, и свободное место
   уходило в зазоры: 1438 px — 12 px, 1600 — 27, 1920 — 40,
   от 2200 и выше — 49, потому что дальше растёт не список,
   а поля шапки.

   Заказчик утвердил шаг, который получается на 1438 px, поэтому
   от 1500 px список перестаёт растягиваться, встаёт по правому краю
   рядом с избранным и корзиной, а шаг фиксируется теми же 12 px.
   На 1438 и ниже всё остаётся как было.

   Правило живёт здесь, а не в header-nav-v28.css: в этом же файле
   ниже по каскаду стоит `justify-content: space-between !important`
   для ширин от 1400 px, и слой унификации подключается последним —
   правка из файла шапки ему проигрывала.
   ========================================================= */
@media (min-width: 1081px) {
    .zt-header .zt-nav__list {
        /* N-585 / N-586: шаг 12 px заказчик принял, а выравнивание попросил
           поменять на левый край шапки. Список по-прежнему не
           растягивается — иначе свободное место снова уйдёт в зазоры,
           — но прижимается влево, а не вправо.

           Порог опущен с 1500 до 1081 px после N-586: когда «Акции
           и спецпредложения» стали короткими «Акциями», освободившиеся
           190 px при `space-between` просто ушли в зазоры (шаг вырос
           с 12 до 31 px) и шапка занимала столько же места. С фиксированным
           шагом строка меню действительно становится короче. */
        flex: 0 0 auto !important;
        justify-content: flex-start !important;
        margin-left: 0 !important;
        margin-right: auto !important;
        gap: 12px !important;
    }
}

/* =========================================================
   N-587: контакты в шторке — одной строкой и тем же кеглем,
   что пункты меню.

   Замер на 358 px: пункт меню 14 px, контакт 16 px, и при таком
   кегле телефон с почтой не помещались в строку и переносились.
   Кегль сведён к 14 px, иконка ужата, промежуток уменьшен —
   обе ссылки встают в одну строку.
   ========================================================= */
.zt-mobile-contacts a {
    font-size: 14px !important;
    grid-template-columns: 20px minmax(0, 1fr) !important;
    gap: 8px !important;
    min-height: 40px !important;
}

.zt-mobile-contacts svg {
    width: 20px !important;
    height: 20px !important;
}

@media (max-width: 400px) {
    .zt-mobile-contacts {
        flex-wrap: nowrap !important;
        gap: 12px !important;
    }

    .zt-mobile-contacts a {
        font-size: 13px !important;
    }
}

/* =========================================================
   N-600 / N-601: значки избранного и корзины в шапке уменьшены
   в масштабе вместе со счётчиками.

   Было на 1438 px: область 44 и 50 px, иконка 34×34, счётчик
   24×23 при кегле 12. Для этой полосы ширин всё уменьшено
   примерно на пятую часть — пропорции сохранены.
   ========================================================= */
@media (min-width: 1081px) and (max-width: 1499px) {
    .zt-header .zt-header-favorite,
    .zt-header .zt-header-cart .cart-area {
        width: 40px !important;
        min-width: 40px !important;
        flex-basis: 40px !important;
    }

    .zt-header .zt-header-favorite svg,
    .zt-header .zt-header-cart .cart-area img,
    .zt-header .zt-header-cart .cart-area svg {
        width: 27px !important;
        height: 27px !important;
    }

    .zt-header .zt-header-action-count {
        min-width: 19px !important;
        height: 19px !important;
        font-size: 11px !important;
        line-height: 19px !important;
    }
}

/* =========================================================
   N-602 + аудит 02.09.2026: единственная лестница кегля
   пунктов меню.

   Раньше кегль задавали 17 правил в пяти файлах, все одной
   специфичности и с перекрывающимися диапазонами. Побеждало
   последнее в каскаде, и на ширинах 1500 и 1881 подписи
   становились МЕЛЬЧЕ при более широком экране:
   15 → 14 → 16 → 14,67 → 16.

   Теперь кегль живёт только здесь. Во всех остальных файлах
   объявления font-size у пунктов сняты (padding и gap там
   остались — они отвечают за упаковку строки, а не за кегль).
   Ниже 1400 px меню скрыто, там работает гамбургер, и базовые
   18 px из header-new.css ни на что не влияют.
   ========================================================= */
@media (min-width: 1400px) and (max-width: 1599px) {
    .zt-header .zt-nav__link,
    .zt-header .zt-nav__trigger {
        font-size: 15px !important;
    }
}

@media (min-width: 1600px) {
    .zt-header .zt-nav__link,
    .zt-header .zt-nav__trigger {
        font-size: 16px !important;
    }
}

/* =========================================================
   N-606…N-610: обе кнопки в шторке набраны одинаково.

   Замер на 412 px: «Каталог запчастей» — Tektur 16/700, высота 48;
   «Оставить заявку» — Manrope 16/700, высота 52. Разные гарнитура
   и высота у соседних кнопок одного блока. Приводим вторую к первой.
   ========================================================= */
/* Кнопка заявки — та же гарнитура и высота, что у кнопки каталога.

   Почему так сложно: кнопка каталога это `<a>`, а заявка — `<button>`,
   и в zt-redesign.css на кнопки навешено
   `body button:not(...)  { font-family: var(--zt-font-btn) !important }`.
   Ссылка под это правило не попадала и набиралась `--zt-font` (Tektur),
   кнопка — `--zt-font-btn` (Manrope). Отсюда и разные шрифты у соседних
   кнопок одного блока. Перебиваем адресно, с `body` и id в селекторе,
   и берём ту же переменную, что у ссылки.

   `:not(#zt_)` — приём из самого zt-redesign.css: несуществующий id
   добавляет селектору вес, не меняя того, что он выбирает. У правила
   на кнопки там стоит два таких `:not`, поэтому и здесь их два —
   иначе оно снова перебивает. */
body #mobile-menu button.zt-mobile-actions__order:not(#zt_):not(#zt_),
body .zt-mobile-drawer button.zt-mobile-actions__order:not(#zt_):not(#zt_) {
    font-family: var(--zt-font, "Tektur", "Inter", Arial, sans-serif) !important;
    font-size: 16px !important;
    font-weight: 700 !important;
    letter-spacing: .16px !important;
    text-transform: uppercase !important;
    min-height: 48px !important;
}

/* Высота у обеих кнопок одна: у заявки была 52 против 48 у каталога —
   рамка и внутренние отступы добавляли четыре пикселя. */
body #mobile-menu .zt-mobile-actions__catalog:not(#zt_):not(#zt_),
body #mobile-menu .zt-mobile-actions__order:not(#zt_):not(#zt_),
body .zt-mobile-drawer .zt-mobile-actions__catalog:not(#zt_):not(#zt_),
body .zt-mobile-drawer .zt-mobile-actions__order:not(#zt_):not(#zt_) {
    min-height: 48px !important;
    height: 48px !important;
    padding-top: 0 !important;
    padding-bottom: 0 !important;
}

/* =========================================================
   N-603…N-605: кнопка гамбургера меньше.

   Была 44×44 с полоской 32×3 — крупнее остальных элементов шапки
   на узких экранах. Стала 38×38 с полоской 26×2,5; площадь нажатия
   остаётся в пределах рекомендованных 38 px.

   N-615…N-619: размер выровнен по всей полосе, где кнопка видна.
   Прежний порог 1080 px оставлял на 1278 и 1381 старые 44×44
   с полосками 22 px — кнопка была то больше, то меньше. Все три
   полоски явно одной длины.
   ========================================================= */
@media (max-width: 1399px) {
    .zt-header #open-mobile-menu,
    .zt-header .zt-mobile-menu-button {
        width: 38px !important;
        height: 38px !important;
        min-width: 38px !important;
        flex-basis: 38px !important;
    }

    /* Иконка меню — присланный заказчиком SVG, а не три полоски
       на псевдоэлементах. Прежняя сборка рисовала середину самим
       `<span>`, а верх и низ — `::before` и `::after`, и они
       расходились: разный цвет (#1a1a1a против #333a43) и на 1022 px
       съезжали с центра. Вместо этого одна маска: три штриха 16×2
       в сетке 24×24, шаг ровный по построению. Цвет задаётся фоном,
       поэтому иконка остаётся управляемой из CSS.

       Рисунок — первый присланный `menu.svg`: три штриха 16×2
       в сетке 24×24, шаг задан самим путём. */
    .zt-header #open-mobile-menu span,
    .zt-header .zt-mobile-menu-button span {
        /* Заказчик выбрал первый вариант рисунка и попросил крупнее.
           Глиф 44×44 при кнопке 38×38: у этой иконки штрихи занимают
           16 из 24 единиц сетки, то есть чернила — это 29 px в ширину
           и 3,7 в толщину, и они с запасом помещаются в кнопку.
           Размер кнопки и место в шапке не меняются. */
        width: 44px !important;
        height: 44px !important;
        left: 50% !important;
        right: auto !important;
        top: 50% !important;
        margin: -22px 0 0 -22px !important;
        border-radius: 0 !important;
        background-color: #333a43 !important;
        background-image: none !important;
        -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M4 6h16v2H4zm0 5h16v2H4zm0 5h16v2H4z'/%3E%3C/svg%3E") center / 44px 44px no-repeat;
        mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M4 6h16v2H4zm0 5h16v2H4zm0 5h16v2H4z'/%3E%3C/svg%3E") center / 44px 44px no-repeat;
    }

    /* Полоски из псевдоэлементов больше не нужны — ни у самого
       `<span>`, ни у кнопки. Псевдоэлементы висят на обоих: сначала
       я выключил только span-овские, и на экране остались ещё две
       чёрточки от кнопки — поверх маски. Отсюда и «кривой» вид:
       три штриха маски плюс два чужих. */
    .zt-header #open-mobile-menu span::before,
    .zt-header #open-mobile-menu span::after,
    .zt-header #open-mobile-menu::before,
    .zt-header #open-mobile-menu::after,
    .zt-header .zt-mobile-menu-button span::before,
    .zt-header .zt-mobile-menu-button span::after,
    .zt-header .zt-mobile-menu-button::before,
    .zt-header .zt-mobile-menu-button::after {
        display: none !important;
        content: none !important;
    }
}

/* =========================================================
   N-611…N-614: кнопки «Каталог» и «Заказать запчасти» в шапке —
   капсом и той же гарнитурой, что кнопки в шторке.

   Было: Manrope 15 px, `text-transform: none`, подписи со строчными.
   Стало: та же переменная `--zt-font` (Tektur), что у кнопок шторки,
   и верхний регистр. Сами подписи переведены в капс в разметке,
   `text-transform` оставлен для страховки, если текст придёт
   из другого источника.

   `:not(#zt_)` — тот же приём, что в zt-redesign.css: у правила
   на кнопки там два таких `:not`, и без них это правило проигрывает.
   ========================================================= */
body .zt-header .zt-catalog-button:not(#zt_):not(#zt_),
body .zt-header .zt-catalog-button > span:not(#zt_):not(#zt_),
body .zt-header button.zt-callback-button:not(#zt_):not(#zt_) {
    font-family: var(--zt-font, "Tektur", "Inter", Arial, sans-serif) !important;
    font-weight: 700 !important;
    text-transform: uppercase !important;
    letter-spacing: .16px !important;
}

/* =========================================================
   N-620 / N-621: пункты меню — одна жирность, без жёлтой
   размытой подсветки. Подчёркивание остаётся.
   ========================================================= */

/* Жирность. У «Акций» подпись лежит в двух вложенных `span`
   (полное и короткое название), и правило на `.zt-nav__link > span`
   до внутренних не доставало — они падали на 400 против 500
   у остальных пунктов. */
/* Жирность пунктов закреплена на 500 — это Medium, средняя ступень.
   Tektur здесь вариативный, ось веса 400–900, поэтому 500 отрисовывается
   именно средним начертанием, а не подделкой браузера. */
.zt-header .zt-nav__link,
.zt-header .zt-nav__trigger {
    font-weight: 500 !important;
}

.zt-header .zt-nav__link > span,
.zt-header .zt-nav__trigger > span,
.zt-header .zt-nav__link .zt-nav__label,
.zt-header .zt-nav__link .zt-nav__label > span,
.zt-header .zt-nav__trigger .zt-nav__label,
.zt-header .zt-nav__trigger .zt-nav__label > span {
    font-weight: inherit !important;
}

/* Подсветка. При наведении подпись получала
   `text-shadow: 0 5px 14px rgba(--zt-header-accent-rgb, .17)`,
   а иконка — `drop-shadow` тем же жёлтым: вокруг текста висело
   размытое пятно. Снимаем оба, подчёркивание не трогаем —
   его рисует `span::after`, оно живёт своей жизнью. */
.zt-header .zt-nav__item:hover .zt-nav__link > span,
.zt-header .zt-nav__item:hover .zt-nav__trigger > span,
.zt-header .zt-nav__item:focus-within .zt-nav__link > span,
.zt-header .zt-nav__item:focus-within .zt-nav__trigger > span,
.zt-header .zt-nav__trigger[aria-expanded="true"] > span {
    text-shadow: none !important;
}

.zt-header .zt-nav__item:hover .zt-nav__icon,
.zt-header .zt-nav__item:focus-within .zt-nav__icon,
.zt-header .zt-nav__trigger[aria-expanded="true"] .zt-nav__icon {
    filter: none !important;
}

/* ------------------------------------------------------------------
   N-623. Контакты в шапке — без иконок телефона и почты.
   Иконки убраны из разметки (header-new.js). Пункт был сеткой
   «колонка под иконку + колонка под текст»; без иконки текст падал
   в 24-пиксельную колонку и обрезался многоточием. Схлопываем сетку
   в одну колонку на всех ширинах.
   ------------------------------------------------------------------ */
.zt-header .zt-contact__item {
    grid-template-columns: minmax(0, auto);
    gap: 0;
}

/* ------------------------------------------------------------------
   N-627…N-634. Почта из шапки убрана (снята из разметки в
   header-new.js), телефон стал кнопкой по образцу «Заказать
   запчасти» и переехал вправо от иконки MAX.

   Значения кнопки-образца сняты замером и одинаковы на всех
   ширинах: рамка 1px, скругление 8, белый фон, 15/700 Tektur,
   uppercase, трекинг .01em, поля 24px, высота 48.

   Класс `.zt-callback-button` телефону не даём намеренно:
   zt-bottom-nav.js ищет кнопку «Связаться» через
   `querySelector('.zt-callback-button, …)` и взял бы первый
   элемент в DOM — то есть телефон, и нижняя панель открывала бы
   набор номера вместо формы заявки.

   Перестановка — через `order`. Столбцы шапки на ≥1400 заданы как
   `auto auto minmax(0,1fr) auto auto auto`, ширина привязана
   к позиции, а не к элементу, поэтому поле поиска остаётся
   на своей `1fr`, а телефон и MAX просто меняются местами.
   Ниже 1400 MAX и кнопка заявки скрыты, там переставлять нечего.
   ------------------------------------------------------------------ */
@media (min-width: 1400px) {
    .zt-header .zt-contact {
        order: 1;
    }

    .zt-header .zt-callback-button {
        order: 2;
    }

    /* MAX — последней в строке, правее «Заказать запчасти». */
    .zt-header .zt-max-button {
        order: 3;
    }
}

.zt-header .zt-contact {
    align-items: center;
}

.zt-header .zt-contact__item--phone {
    display: inline-flex !important;
    height: 48px;
    min-height: 48px;
    box-sizing: border-box;
    align-items: center;
    justify-content: center;
    padding: 0 24px;
    border: 1px solid var(--zt-header-accent, #ffb800);
    border-radius: 8px;
    background: #fff;
    color: #333a43;
    font-family: var(--zt-font, "PT Sans Caption", "Montserrat", Arial, sans-serif);
    font-size: 15px;
    font-weight: 700;
    letter-spacing: .01em;
    text-transform: uppercase;
    white-space: nowrap;
    transform: translate3d(0, 0, 0);
    transition: transform .18s cubic-bezier(.2, .75, .25, 1), box-shadow .18s ease, letter-spacing .18s ease;
}

.zt-header .zt-contact__item--phone .zt-contact__text {
    overflow: visible;
    text-overflow: clip;
}

/* Наведение — один в один как у кнопки «Заказать запчасти».
   Её поведение снято замером: подъём на 2 px, мягкая тень,
   жёлтая заливка и тёмная подпись #1a1a1a. Анимируются подъём
   и тень (0,18 s), цвет переключается сразу — в списке transition
   у образца его нет.

   Подпись пришлось задать отдельным правилом с !important:
   header-polish.css красит `.zt-contact__text` при наведении
   в фирменный жёлтый — наследство прежнего вида «просто ссылка».
   Вместе с жёлтой заливкой получалось жёлтое по жёлтому, и номер
   пропадал. Причём сильнее всех там правило с типом элемента
   `a.zt-contact__item:hover` — вес 0-4-1, поэтому наш селектор
   тоже начинается с `a` и несёт оба класса пункта: 0-5-1. */
.zt-header .zt-contact__item--phone:hover,
.zt-header .zt-contact__item--phone:focus-visible {
    transform: translate3d(0, -2px, 0);
    border-color: var(--zt-header-accent, #ffb800);
    background: var(--zt-yellow, #ffb800);
    /* Ровно как у образца: та же переменная и без запасного
       значения. Токен --zt-shadow-1 в проекте не объявлен, поэтому
       тени при наведении нет ни у кнопки, ни у телефона. Появится
       токен — появится у обоих сразу. */
    box-shadow: var(--zt-shadow-1);
}

.zt-header a.zt-contact__item.zt-contact__item--phone:hover,
.zt-header a.zt-contact__item.zt-contact__item--phone:focus-visible,
.zt-header a.zt-contact__item.zt-contact__item--phone:hover .zt-contact__text,
.zt-header a.zt-contact__item.zt-contact__item--phone:focus-visible .zt-contact__text {
    color: #fff !important;
}

/* ------------------------------------------------------------------
   Кнопка MAX — заказчик 02.09.2026: вернуть, поставить последней,
   после «Заказать запчасти», и дать подпись рядом с иконкой.

   Из квадрата 70×70 (54×54 на 1400–1599) кнопка стала обычной
   кнопкой строки шапки: высота 48, ширина по содержимому, обводка
   1px — тот же вес, что у «Заказать запчасти». Подпись набрана
   так же, как у кнопки-образца.
   ------------------------------------------------------------------ */
/* Ширину квадрата держало правило с типом элемента в
   zt-redesign.css — `.zt-header a.zt-max-button { width/min-width/
   max-width: 48px !important }`, вес 0-2-1. Поэтому селектор здесь
   начинается с `body`: 0-2-2. Место под подпись даёт поле поиска —
   его столбец `minmax(0, 1fr)` сжимается сам. */
body .zt-header a.zt-max-button,
body .zt-header .zt-max-button {
    display: inline-flex !important;
    width: auto !important;
    min-width: 0 !important;
    max-width: none !important;
    height: 48px !important;
    min-height: 48px !important;
    box-sizing: border-box;
    align-items: center;
    justify-content: center;
    gap: 10px;
    padding: 0 18px !important;
    border-width: 1px !important;
    border-radius: 8px;
}

/* Ниже 1400 px кнопки в шапке нет — там гамбургер, и MAX уезжает
   в шторку. Скрытие задаёт header-polish.css, но его вес (0-2-0)
   ниже нашего правила выше, поэтому повторяем здесь с тем же
   весом 0-2-2. */
@media (max-width: 1399px) {
    body .zt-header a.zt-max-button,
    body .zt-header .zt-max-button {
        display: none !important;
    }
}

.zt-header .zt-max-button__icon {
    width: 24px !important;
    height: 24px !important;
    flex: 0 0 auto;
}

.zt-header .zt-max-button__label {
    color: #333a43;
    font-family: var(--zt-font, "PT Sans Caption", "Montserrat", Arial, sans-serif);
    font-size: 15px;
    font-weight: 700;
    letter-spacing: .01em;
    text-transform: uppercase;
    white-space: nowrap;
}

/* При наведении подпись ведёт себя как у кнопки-образца — белая
   на жёлтой заливке. Заливку и подъём рисует header-polish.css. */
.zt-header .zt-max-button:hover .zt-max-button__label,
.zt-header .zt-max-button:focus-visible .zt-max-button__label {
    color: #fff;
}

/* Иконка на жёлтой заливке перекрашивается в белый — иначе жёлтая
   маска сливается с фоном. */
.zt-header .zt-max-button:hover .zt-max-button__icon,
.zt-header .zt-max-button:focus-visible .zt-max-button__icon {
    background-color: #fff !important;
}

/* ------------------------------------------------------------------
   Правка из чата 02.09.2026: у поля поиска в шапке при клике
   пропадает синяя рамка браузера.

   Своё состояние фокуса у поля уже есть — жёлтая рамка #f9c12e
   и мягкое свечение, — а браузер рисовал поверх свою
   `outline: 2px solid #1a6fd4`. Гасим только её: фокус остаётся
   видимым, с клавиатуры поле по-прежнему читается.

   Замер показал, что синяя рамка была ровно у одного поля на сайте:
   у остальных (подбор запчастей, форма заявки) `outline` уже снят.
   ------------------------------------------------------------------ */
.zt-header .zt-search input:focus,
.zt-header .zt-search input:focus-visible,
.zt-header .zt-live-search input:focus,
.zt-header .zt-live-search input:focus-visible {
    outline: none !important;
}

/* Взамен снятого кольца поле получает собственную видимую метку
   фокуса в фирменном цвете — с клавиатуры оно должно оставаться
   заметным. */
.zt-header .zt-search input:focus,
.zt-header .zt-search input:focus-visible,
.zt-header .zt-live-search input:focus,
.zt-header .zt-live-search input:focus-visible {
    border-color: var(--zt-header-accent, #ffb800) !important;
    box-shadow: 0 0 0 3px rgba(255, 184, 0, .22) !important;
}

/* ------------------------------------------------------------------
   N-622. Модуль заявки: телефон и почта — под кнопкой формы.
   До 1199 px карточка модуля одноколоночная, и контакты стояли между
   заголовком и формой, то есть над кнопкой «Подобрать запчасть».
   Раскрываем обёртку .zlc-info (display: contents), чтобы её дети стали
   строками карточки, и переставляем порядок: текст → картинка → форма →
   контакты. Специфичность 1-2-0 — выше инлайновых правил модуля (1-1-0),
   поэтому порядок подключения файлов роли не играет.
   grid-area: auto снимает жёсткую привязку contacts к третьей строке,
   заданную на ≤599 px: она сильнее order и держала бы блок на месте.
   !important и набор классов нужны потому, что home-lead-form.css держит
   колонку правилом display: flex !important (1-3-0). Класс --home-ref
   в селекторы не берём: он есть только на главной, а модуль подключается
   подвалом на каждой странице. Вес добираем парными классами блоков
   (.zlc-info.zt-request__info) — 1-4-0, выше и без него.
   ------------------------------------------------------------------ */
@media (max-width: 1199px) {
    #ziptehLeadModule.zt-request .zlc-card > .zlc-info.zt-request__info {
        display: contents !important;
    }

    #ziptehLeadModule.zt-request .zlc-card > .zlc-info.zt-request__info > .zlc-intro {
        order: 1 !important;
        grid-area: auto !important;
    }

    #ziptehLeadModule.zt-request .zlc-card > .zt-request__art {
        order: 2 !important;
        grid-area: auto !important;
    }

    #ziptehLeadModule.zt-request .zlc-card > .zlc-form.zt-request__form {
        order: 3 !important;
        grid-area: auto !important;
    }

    /* На 600–1199 карточка двухколоночная, и контакты без этого встали бы
       рядом с формой, а не под ней. Растягиваем на все колонки — блок
       уходит в новую строку, ниже кнопки. */
    #ziptehLeadModule.zt-request .zlc-card > .zlc-info.zt-request__info > .zlc-contacts.zt-request__contacts {
        order: 4 !important;
        grid-row: auto !important;
        grid-column: 1 / -1 !important;
        align-self: start !important;
    }
}

/* ------------------------------------------------------------------
   Правка заказчика 02.09.2026: полоса навигации на десктопе стала ниже.
   Высоту держали три правила: min-height 76 у .zt-nav__list и такое же
   у корзины с избранным в header-nav-v28.css — там оно с !important,
   поэтому и на 1440 полоса оставалась 77 px, хотя базовый файл ниже
   1480 просит 68. Сводим все три к 56 px.
   Кнопки корзины и избранного остаются выше 44 px — минимальная
   площадь нажатия не нарушена.
   ------------------------------------------------------------------ */
@media (min-width: 1081px) {
    /* 02.09.2026, вторая просьба заказчика: поднять строку ещё чуть
       выше — 56 → 48. Ниже опускаться некуда: 44 px это минимальная
       площадь нажатия для корзины и избранного, останется всего
       4 px запаса. */
    /* 02.09.2026: подписи и иконки подняты — под ними добавлено
       поле 8 px. Оно задано ряду целиком, а не списку пунктов,
       чтобы вместе с ними поднялись корзина и избранное.

       Высота самих элементов при этом 44 px — минимальная площадь
       нажатия. Итог по строке: 44 + 8 поля + 1 граница = 53 px
       против прежних 49; исходные, до всех правок, были 77. */
    .zt-header .zt-nav__list,
    .zt-header .zt-nav__inner {
        min-height: 44px !important;
    }

    .zt-header .zt-nav > .zt-shell {
        min-height: 44px !important;
        padding-bottom: 8px !important;
    }

    .zt-header .zt-header-favorite,
    .zt-header .zt-header-cart {
        min-height: 44px !important;
    }

    /* Настоящую высоту полосы держала ссылка внутри корзины: 76 px
       жёстко, с !important. Пока она выше остальных, полоса тянется
       за ней — оба соседних блока растянуты по stretch. */
    .zt-header .zt-header-cart .cart-area,
    .zt-header .zt-header-cart .cart-button,
    .zt-header .zt-header-cart > a,
    .zt-header .zt-header-favorite > a {
        height: 44px !important;
        min-height: 44px !important;
    }
}

/* ------------------------------------------------------------------
   N-624 / N-625 / N-626. Логотип на мобильных и планшете меньше.
   Ширину держит header-polish.css: до 479 px — 180, до 767 px — 205,
   оба с !important. Снижаем обе ступени примерно на пятую часть.
   Ссылке оставляем min-height 44px (задан ниже по файлу) — картинка
   уменьшается, а площадь нажатия остаётся в норме.
   ------------------------------------------------------------------ */
@media (max-width: 767px) {
    .zt-header .zt-header__logo {
        width: min(165px, 100%) !important;
        max-width: 165px !important;
    }
}

@media (max-width: 479px) {
    .zt-header .zt-header__logo {
        width: min(145px, 100%) !important;
        max-width: 145px !important;
    }
}

/* ------------------------------------------------------------------
   Правки из чата 02.09.2026.

   1. Линия между первой и второй строками шапки убрана. Её рисовал
      `border-bottom` у `.zt-header__top`. Нижняя граница всей шапки
      (`.zt-nav`) остаётся — она отделяет шапку от страницы.

   2. Счётчики корзины и избранного подняты. `zt-redesign.css` держит
      их на `top: 20px !important` селектором с удвоенным классом
      (вес 0-4-0) — значение подбиралось под прежнюю полосу высотой
      76 px, где иконка начиналась на 24,5 px. После снижения полосы
      до 56 px иконка поднялась на 15 px, и счётчик оказался ниже её
      верхнего края. Возвращаем прежнее соотношение: счётчик на
      4,5 px выше верха иконки, то есть top 10 px.
   ------------------------------------------------------------------ */
.zt-header .zt-header__top {
    border-bottom: 0 !important;
}

@media (min-width: 1081px) {
    .zt-header .zt-header-cart .zt-header-action-count.zt-header-action-count,
    .zt-header .zt-header-favorite .zt-header-action-count.zt-header-action-count,
    .zt-header .zt-header-cart .items-count.items-count,
    .zt-header .zt-header-cart .basket-count.basket-count {
        top: 9px !important;
    }
}

/* ------------------------------------------------------------------
   Закреплённая шапка при скролле — скруглённый низ вместо ровной
   линии. Правка из чата 02.09.2026, референс — Ozon.

   Только там, где после скролла наверху остаётся одна строка поиска:
   до 767 px включительно. От 768 px в компактной шапке остаются ещё
   логотип и контакты, и форма там другая — её не трогаем.

   Скругляем и саму шапку, и `.zt-header__top`: у обоих белый фон,
   и без скругления внутреннего блока углы внешнего были бы закрашены.
   Тень нужна, чтобы белая плашка читалась над светлым фоном
   страницы, — без неё скругление на светлом почти не видно.
   ------------------------------------------------------------------ */
/* Скругление на всех ширинах. До 767 px закругляется компактная
   плашка с одной строкой поиска, выше — вся шапка целиком: там она
   при скролле не сжимается, но точно так же закреплена сверху.
   Признак `--stuck` ставит zt-bottom-nav.js на любой ширине.

   Скруглить одну только `.zt-header` мало: на ПК нижняя строка шапки —
   это `.zt-nav` с собственным белым фоном и прямыми углами, и она
   закрашивала скругление изнутри. Обрезать всё разом через
   `overflow: hidden` нельзя — из шапки должны выпадать выпадающие
   меню. Поэтому скругляем и внешний блок, и ту строку, что реально
   оказывается нижней: `__top` до 767 px, `.zt-nav` выше. */
.zt-header.zt-header--stuck,
.zt-header.zt-header--stuck .zt-header__top,
.zt-header.zt-header--stuck .zt-nav,
.zt-header.zt-header--compact,
.zt-header.zt-header--compact .zt-header__top {
    border-bottom-right-radius: 20px;
    border-bottom-left-radius: 20px;
}

/* Плашка прокрученной шапки описана ниже по файлу одним блоком
   `.zt-header::after`: там её ширина через `--zt-plate-width`,
   белая заливка и слой. Здесь до 03.09.2026 лежал прежний вариант
   той же плашки — «форму рисует не заливка, а граница». Заливку он
   давно уступил, но одно объявление от него продолжало действовать:
   `border-bottom: 1px solid #e6e9ee`. Оно и рисовало светлую линию
   ровно по нижней грани шапки — то есть по стыку с выпавшим
   подменю, и только на ширину плашки, а не во всю ширину экрана.
   Именно её было видно как «срез» между шапкой и подменю.
   Блок снят целиком: геометрию и скругление задают правила ниже. */
@media (min-width: 1400px) {

    /* Собственные скругление и границу строк на этих ширинах гасим —
       иначе они спорят со слоем и обрезают белое поле по краям. */
    .zt-header.zt-header--stuck,
    .zt-header.zt-header--stuck .zt-header__top,
    .zt-header.zt-header--stuck .zt-nav {
        border-bottom-right-radius: 0;
        border-bottom-left-radius: 0;
    }

    .zt-header.zt-header--stuck .zt-nav {
        border-bottom-color: transparent !important;
    }

    /* !important, потому что общее правило тени объявлено ниже
       по файлу и иначе перебивает: тень должна быть только
       у плашки, иначе она тянется по всей ширине экрана. */
    .zt-header.zt-header--stuck {
        box-shadow: none !important;
    }
}

@media (max-width: 1399px) {
    .zt-header.zt-header--stuck .zt-header__top,
    .zt-header.zt-header--compact .zt-header__top {
        border-bottom: 1px solid var(--zt-line, #e6e9ee) !important;
    }
}

/* Тень чуть плотнее, чем была: на белом фоне она вместе с границей
   и отделяет шапку, и подчёркивает скруглённые углы. */
.zt-header.zt-header--stuck,
.zt-header.zt-header--compact {
    box-shadow: 0 18px 32px -14px rgba(16, 24, 40, .18), 0 0 18px -8px rgba(16, 24, 40, .14);
}

/* ------------------------------------------------------------------
   Плавное сворачивание шапки при скролле. Правка из чата 02.09.2026.

   Само сворачивание в zt-redesign.css уже сделано анимируемыми
   свойствами — opacity, max-height, transform, отступы, — но
   переход нигде не объявлен, поэтому состояние менялось рывком.
   Здесь только длительности.

   max-height в обычном состоянии задан явно (80 px): переход
   из `none` в `0` браузер не анимирует, ему нужно число.

   grid-template-rows в сжатом состоянии жёстко ставил первую строку
   в 0px — это схлопывало её мгновенно, мимо анимации детей. Меняем
   на auto: высота строки сама следует за сжимающимся содержимым,
   а нулевую высоту ей дают max-height, padding и margin, которые
   уже обнулены в zt-redesign.css.
   ------------------------------------------------------------------ */
@media (max-width: 1023px) {
    .zt-header .zt-mobile-trigger,
    .zt-header .zt-header__logo {
        max-height: 80px;
        transition: opacity .26s ease,
                    max-height .26s ease,
                    transform .26s ease,
                    margin .26s ease,
                    padding .26s ease !important;
    }

    .zt-header .zt-header__top-inner {
        transition: min-height .26s ease,
                    padding .26s ease,
                    row-gap .26s ease !important;
    }

    .zt-header .zt-header__top {
        transition: min-height .26s ease !important;
    }

    .zt-header {
        transition: border-radius .26s ease, box-shadow .26s ease !important;
    }

    .zt-header.zt-header--compact .zt-header__top-inner {
        grid-template-rows: auto auto !important;
    }
}

/* ------------------------------------------------------------------
   Сжатая шапка на телефоне: строка поиска — к самому верху.
   Замечание заказчика 17.09.2026 (снимок с телефона и из приложения);
   впервые — 03.09.2026, «при скроле над строкой поиска много места».

   Сжатие прячет логотип через `max-height: 0` (zt-redesign.css), но
   тач-цель логотипа выше по этому файлу — `min-height: 44px !important`,
   а `min-height` по правилам CSS сильнее `max-height`. Логотип гас,
   но держал первую строку flex: над поиском оставалось 50 px пустоты
   (поле 6 + логотип 44), шапка 105 px вместо 61. Замер на бою 17.09.

   На стенде дефект не проявлялся: в его страницах оставался скрипт
   `zt-msearch` из устаревшего пакета шапки R-029, он прятал логотип
   через `display: none`. На бою этого скрипта нет; со стенда снят.

   `min-height` едет вместе с `max-height`, а `max-height` в обычном
   состоянии равен высоте строки (44), — иначе сворачивание замирает
   на середине, а разворот прыгает на 44 px. Площадь нажатия
   развёрнутого логотипа — прежние 44 px. На 768–1023 шапка
   при прокрутке логотип не прячет — правило только до 767.
   ------------------------------------------------------------------ */
@media (max-width: 767px) {
    .zt-header .zt-mobile-trigger,
    .zt-header .zt-header__logo {
        max-height: 44px;
        transition: opacity .26s ease,
                    max-height .26s ease,
                    min-height .26s ease,
                    transform .26s ease,
                    margin .26s ease,
                    padding .26s ease !important;
    }

    .zt-header.zt-header--compact .zt-header__logo {
        min-height: 0 !important;
    }
}

@media (prefers-reduced-motion: reduce) {
    .zt-header,
    .zt-header .zt-header__top,
    .zt-header .zt-header__top-inner {
        transition: none !important;
    }
}

/* ------------------------------------------------------------------
   Крестик очистки в строке поиска — жёлтый. Правка из чата
   02.09.2026. Поле объявлено как input[type="search"], и крестик
   рисует сам браузер; своей кнопки очистки в разметке нет. Поэтому
   гасим нативный вид и перекрашиваем через маску.
   ------------------------------------------------------------------ */
.zt-header .zt-search input[type="search"]::-webkit-search-cancel-button,
.zt-header .zt-live-search input[type="search"]::-webkit-search-cancel-button {
    -webkit-appearance: none;
    appearance: none;
    width: 14px;
    height: 14px;
    margin-left: 8px;
    cursor: pointer;
    background-color: var(--zt-header-accent, #ffb800);
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M6 6 18 18M18 6 6 18' stroke='%23000' stroke-width='2.6' stroke-linecap='round' fill='none'/%3E%3C/svg%3E") center / contain no-repeat;
    mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M6 6 18 18M18 6 6 18' stroke='%23000' stroke-width='2.6' stroke-linecap='round' fill='none'/%3E%3C/svg%3E") center / contain no-repeat;
}

/* ------------------------------------------------------------------
   Кнопка MAX набирается той же гарнитурой, что соседние кнопки.
   Замер показал Manrope против Tektur у «Каталога», телефона
   и «Заказать запчасти»: семейство кнопки перебито с !important,
   поэтому и здесь !important и тот же токен --zt-font.
   ------------------------------------------------------------------ */
/* Подпись MAX — той же гарнитурой, что «Каталог», телефон
   и «Заказать запчасти»: замер показывает у них Tektur.

   Токены тут не помогают: --zt-font-btn в zt-fonts.css объявлен
   как Manrope, а --zt-font в шапке — Tektur, и соседи получают
   свой Tektur не из кнопочного токена. Поэтому список задан явно.

   Вес добран проектным приёмом `:not(#zt_)`: гарнитуру кнопкам
   раздаёт правило из zt-redesign.css, которое уже пользуется этим
   хаком и потому весит больше любого обычного селектора. Двух
   повторов хватает, чтобы перебить его. */
body .zt-header a.zt-max-button:not(#zt_):not(#zt_),
body .zt-header a.zt-max-button:not(#zt_):not(#zt_) .zt-max-button__label {
    font-family: "Tektur", "Inter", "PT Sans Caption", system-ui, Arial, sans-serif !important;
}

/* ------------------------------------------------------------------
   Шапка при прокрутке — белая плашка, а не белая полоса во всю
   ширину. Раньше белым был весь блок шапки, а поля по краям
   закрашивались отдельной вуалью поверх. Из-за этого при открытом
   подменю по нижнему краю шапки был виден цветовой шов: слева
   и справа от шапки вуаль ложилась на белое, а рядом с панелью
   тот же по цвету оверлей ложился на контент страницы — оттенки
   получались разные.

   Теперь белую заливку даёт сама плашка (псевдоэлемент), а шапка
   и её строки прозрачны. По краям видно то же, что и рядом
   с панелью: страницу под общим оверлеем. Шов исчезает, вуаль
   больше не нужна.
   ------------------------------------------------------------------ */
@media (min-width: 1400px) {
    /* Геометрия плашки. Раньше эти переменные объявлялись рядом
       с вуалью; вуаль убрана, объявление переехало сюда. */
    .zt-header {
        --zt-plate-width: min(calc(100% - 28px), 2076px);
        --zt-plate-side: calc((100% - var(--zt-plate-width)) / 2);
    }

    /* Белое даёт плашка, а не сама шапка: шапка и обе её строки
       прозрачны, поэтому заливка идёт ровно по ширине плашки —
       с отступом 14 px от краёв экрана. Геометрия одинаковая
       в обоих состояниях, прокрутка добавляет только скругление
       и тень, ничего не сдвигается. */
    .zt-header,
    .zt-header .zt-header__top,
    .zt-header .zt-nav {
        background: transparent !important;
    }

    /* Своя нижняя граница строки меню идёт от края до края экрана
       и рисовала линию за пределами плашки. Край карточки теперь
       задаёт плашка, поэтому граница снимается. */
    .zt-header .zt-nav {
        border-bottom: 0 !important;
    }

    /* Плашка кладётся в положительный слой, а строки поднимаются
       над ней. На отрицательном z-index белый слой рисовался позади
       фона шапки и в некоторых состояниях уходил под общий оверлей —
       шапка выглядела темнее подменю, хотя оба белые. */
    /* Слой 0: плашка лежит ПОД строками шапки (они на слое 1).
       На слое 2 она закрывала собой логотип, поиск и меню — шапка
       выглядела пропавшей. */
    .zt-header::after {
        position: absolute;
        z-index: 0;
        top: 0;
        bottom: 0;
        left: 50%;
        width: var(--zt-plate-width);
        content: "";
        transform: translateX(-50%);
        background: #fff;
        pointer-events: none;
    }

    /* Строки поднимаются над плашкой, но НЕ на один слой: у верхней
       он выше. Обе на `z-index: 1` строка меню, идущая в разметке
       ниже, накрывала верхнюю целиком — вместе с выпадающими
       подсказками живого поиска. У панели подсказок свой
       `z-index: 1220`, но он бесполезен: `.zt-header__top` с
       `z-index: 1` создаёт контекст наложения, и панель заперта
       внутри него. Правка из чата 03.09.2026.

       Мега-меню это не задевает: панели `.zt-mega` — прямые дети
       `.zt-header` (слой 1010 в её контексте), а не потомки строки
       меню, и лежат выше обеих строк. */
    .zt-header .zt-nav {
        position: relative;
        z-index: 1;
    }

    .zt-header .zt-header__top {
        position: relative;
        z-index: 2;
    }
}


/* ------------------------------------------------------------------
   Шапка и выпавшее подменю — одна карточка. Правка из чата
   03.09.2026: до неё панель была на 14 px уже плашки с каждой
   стороны, и подсветка не сходилась в одну фигуру.

   Панель получает ту же горизонтальную геометрию, что и плашка,
   а скругление переезжает на её нижние углы: сверху панель
   стыкуется с шапкой, снизу замыкает карточку. У самой шапки
   на это время низ распрямляется — граница и скругление снимаются,
   иначе посреди карточки осталась бы линия.
   ------------------------------------------------------------------ */
@media (min-width: 1400px) {
    /* Все панели по одной механике. `#zt-mega-company` в селекторе
       не для красоты: выше по файлу лежит правило с этим же id
       (вес 1-0-0), которое держало «О компании» на своей ширине
       28/1992 — из-за него подменю компании было уже сервисного. */
    /* Ширина панели повторяет то, что реально нарисовано у шапки.
       Прокрученная шапка — это плашка, уже экрана на 14 px с каждой
       стороны, и панель встаёт по ней. Непрокрученная идёт во всю
       ширину — тогда и панель во всю ширину, иначе она выглядит
       вставленной внутрь шапки, а из-за границы и тени кажется ещё
       и другого оттенка. */
    /* Панель — карточка с отступом 14 px от краёв экрана, как
       и было. Шапка при этом остаётся белой во всю ширину. */
    .zt-header .zt-mega,
    .zt-header .zt-mega--company,
    #zt-mega-company {
        left: var(--zt-plate-side) !important;
        right: var(--zt-plate-side) !important;
        width: auto !important;
        max-width: none !important;
        border-top-left-radius: 0 !important;
        border-top-right-radius: 0 !important;
        border-bottom-right-radius: 20px !important;
        border-bottom-left-radius: 20px !important;

        /* Верхняя граница — это шов между шапкой и панелью:
           две белые поверхности разделялись серой линией и читались
           как разные. Боковые и нижнюю оставляем, они замыкают
           карточку. */
        border-top-color: transparent !important;
    }

    /* Содержимое панели встаёт ровно по пунктам меню.

       Через проценты это не считается: в переменных `100%` берётся
       от ширины самой панели, а не шапки, и на 3406 промахивалось
       на 14 px. Поэтому геометрия задана числами и работает в обоих
       режимах — и когда плашка тянется по экрану, и когда упёрлась
       в потолок:

       строки шапки держит `.zt-shell` — не шире 2048 с полями 28,
       то есть содержимое живёт в 1992. Панели даём 1992 + 28 = 2020
       по центру и поля 14. Тогда содержимое начинается там же:
       на 1920 это 28…1877, на 3406 — 700…2692, ровно как в меню. */
    .zt-header .zt-mega .zt-mega__body,
    .zt-header .zt-mega .zt-company-menu {
        box-sizing: border-box !important;
        max-width: 2020px !important;
        margin-left: auto !important;
        margin-right: auto !important;
        padding-left: 14px !important;
        padding-right: 14px !important;
    }

    /* До 1480 px оболочка шапки идёт с полями 20 px, а не 28
       (и максимум 2032 вместо 2048). Панель стоит внутри плашки,
       которая уже шапки на 14 px с каждой стороны, поэтому её поле
       всегда равно полю оболочки минус 14: 6 px здесь, 14 выше. */
    @media (max-width: 1480px) {
        .zt-header .zt-mega .zt-mega__body,
        .zt-header .zt-mega .zt-company-menu {
            padding-left: 6px !important;
            padding-right: 6px !important;
        }
    }

    /* Одна раскладка для всех панелей: слева содержимое, справа
       блок преимуществ. У «О компании» тело было пятиколоночным —
       наследство прежнего широкого меню, — и преимуществам
       доставалась колонка 340 px вместо 564: подписи переносились
       по два раза и блок казался уехавшим вправо. */
    .zt-header .zt-mega .zt-mega__body {
        /* display задаём явно: у «О компании» тело было не сеткой,
           и grid-template-columns там просто не применялся —
           ширину преимуществ считала другая раскладка. */
        display: grid !important;
        grid-template-columns: minmax(0, 1fr) minmax(360px, 560px) !important;
        column-gap: 48px !important;
        align-items: start !important;
    }

    /* Блоки преимуществ прибиты к колонкам явно: у «Сервиса» —
       к третьей, у «О компании» — к пятой. При двухколоночной сетке
       они попадали в неявные колонки за её пределами и сжимались.
       Ставим оба во вторую. */
    .zt-header .zt-mega .zt-mega__body > .zt-mega__column {
        grid-column: 1 !important;
    }

    .zt-header .zt-mega .zt-mega__body > .zt-mega__benefits {
        grid-column: 2 !important;
    }

    /* Отступ списка под иконкой заголовка оставлен как был:
       подпункты стоят под текстом заголовка, а не под его иконкой.
       По сетке шапки выравнивается сама панель и её заголовок. */

    /* При открытом подменю плашка шапки остаётся собой: скругление,
       грань и тень никуда не деваются. Раньше я их снимал, чтобы
       шапка слилась с панелью, но по виду это читалось как
       «шапка стала просто белой полосой». */
}

/* ------------------------------------------------------------------
   Подменю «Сервис» переехало со списка ссылок на плитки с фото.
   Правка из чата 03.09.2026 по референсу заказчика. Прежние правила
   `.zt-mega__links--service` (три колонки из `max-content`) сняты
   вместе с самим списком — теперь там сетка `.zt-service-menu__grid`,
   она описана ниже по файлу.
   ------------------------------------------------------------------ */

/* ------------------------------------------------------------------
   Шапка и подменю — ровно одна поверхность.

   Замер показал, что цвета у них и так одинаковые: обе `#fff`,
   без фильтров, градиентов и полупрозрачных слоёв. Разницу давала
   окантовка панели:

   1. Своя граница 1px `#e2e5e9` по бокам — рядом с белой шапкой
      она читается как край другой плоскости.
   2. Тень `0 10px 32px` расходится во все стороны, в том числе
      вверх на 22 px, и ложилась на нижнюю часть шапки, подтемняя её.

   Границу снимаем совсем, тень уводим строго вниз отрицательным
   разбросом — на шапку она больше не попадает.
   ------------------------------------------------------------------ */
@media (min-width: 1400px) {
    /* Панель — карточка: тонкая рамка по бокам и снизу, сверху
       рамки нет, там стык с шапкой. Тень уведена строго вниз
       отрицательным разбросом, чтобы не подтемняла шапку. */
    .zt-header .zt-mega {
        border: 0 !important;
        box-shadow: none !important;
    }
}

/* ------------------------------------------------------------------
   Плашка прокрученной шапки. Шапка остаётся белой во всю ширину,
   а форму задаёт нижняя грань: линия со скруглением, отступив 14 px
   от краёв экрана. Боковых линий нет — только низ, как и было
   в рабочем варианте.

   Когда открыто подменю, низ уходит на панель: она замыкает
   карточку своим скруглением, а у шапки грань и тень снимаются,
   иначе посреди фигуры осталась бы линия.
   ------------------------------------------------------------------ */
@media (min-width: 1400px) {
    .zt-header.zt-header--stuck::after {
        border-bottom-right-radius: 20px;
        border-bottom-left-radius: 20px;
    }

    /* Подменю открыто — низ плашки распрямляется, карточку
       замыкает панель. Тень при этом у плашки остаётся: если её
       снять, по бокам получается стык размытого края шапки
       с чётким краем панели. Снизу она не мешает — панель
       непрозрачная и лежит выше. */
    body.zt-mega-open .zt-header::after {
        border-bottom-right-radius: 0;
        border-bottom-left-radius: 0;
    }

}

/* ------------------------------------------------------------------
   Одна тень на всю карточку. Правка из чата 03.09.2026.

   Раньше теней было две — своя у плашки шапки и своя у панели
   подменю. Они не сходились на стыке: у плашки бока размывались,
   у панели по верхнему краю размытия ещё не было, и граница
   читалась как разная.

   `filter: drop-shadow` у шапки обводит не прямоугольник, а силуэт
   того, что реально нарисовано, — плашки вместе с выпавшей
   панелью. Тень получается одна и непрерывная по всему контуру.
   Собственные `box-shadow` у плашки и панели поэтому сняты.
   ------------------------------------------------------------------ */
@media (min-width: 1400px) {
    /* Тень только снизу карточки, бока чистые.

       `drop-shadow` обводил силуэт целиком и размывал в том числе
       боковые границы шапки — заказчик просил их без размытия.
       Здесь у тени разброс равен размытию со знаком минус: коробка
       тени поджимается на те же 12 px с каждой стороны, поэтому
       сбоку от неё не остаётся ничего, а снизу выходит мягкая
       полоса. Несёт её тот блок, который в данный момент нижний:
       закрыто подменю — плашка, открыто — панель. Стыка поэтому
       не возникает: тень всегда одна. */
    .zt-header.zt-header--stuck::after {
        box-shadow: 0 12px 12px -12px rgba(16, 24, 40, .28);
    }

    body.zt-mega-open .zt-header::after {
        box-shadow: none;
    }

    body.zt-mega-open .zt-header .zt-mega {
        box-shadow: 0 12px 12px -12px rgba(16, 24, 40, .28) !important;
    }
}


/* ------------------------------------------------------------------
   Затемнение фона при открытом подменю — без правок. Итог разбора
   03.09.2026.

   Разбор оверлея по параметрам: `#zt-page-overlay` — `fixed`,
   `inset: 0`, `z-index: 990`, `background: rgba(14,20,29,.38)`
   и `backdrop-filter: blur(5px)`. Шапка (1200) и панель подменю
   (1010) лежат выше и сами не темнеют и не размываются; полосы
   по 14 px по краям шапки прозрачны, и в них виден оверлей —
   одинаково и вдоль шапки, и вдоль панели.

   Пробовали два изменения, оба заказчик отклонил:
   увести оверлей из-под карточки (`top` по нижней грани) — полосы
   показали белый фон страницы, и шапка стала читаться залитой
   во всю ширину; снять `backdrop-filter` — заказчик попросил
   размытие вернуть.

   Итог: оверлей остаётся ровно таким, как был, — заливка
   `rgba(14,20,29,.38)` и размытие `blur(5px)` во весь экран.
   Своих правил на него мы не добавляем; блок оставлен как отметка,
   что узел разобран и трогать его не нужно. Причиной видимого
   «среза» на стыке была не эта заливка, а линия
   `border-bottom: 1px #e6e9ee`, оставшаяся у плашки от прежней
   итерации, — она снята выше по файлу.
   ------------------------------------------------------------------ */

/* ------------------------------------------------------------------
   Живой поиск: затемнение не размывает саму шапку. Правка из чата
   03.09.2026 по требованию «чтобы не было размытия на границах шапки».

   `.zt-live-search-backdrop` — кнопка-подложка компонента поиска
   `zipteh/search.suggest`. Она лежит ВНУТРИ `.zt-header`, при этом
   `position: fixed` во весь экран, `z-index: 1200`,
   `background: rgba(20,27,34,.48)` и `backdrop-filter: blur(5px)`.
   Внутри шапки её слой 1200 выше и плашки (слой 0), и обеих строк
   (слой 1), поэтому при вводе в поиск размывались и затемнялись
   логотип, «Каталог», телефон, «Заказать запчасти», MAX и вся строка
   меню — чёткими оставались только поле ввода и панель подсказок.
   Замер: подложка 0…ширина экрана × 0…высота экрана, в точке логотипа
   верхний элемент — она.

   Правила подложки приходят из боевого файла компонента
   `/local/components/zipteh/search.suggest/templates/header/style.css`;
   он не в бэкапе (см. «Что нужно прислать»), поэтому слой правится
   отсюда. Отрицательный слой убирает подложку под плашку шапки:
   страница по-прежнему затемняется и размывается, а сама шапка
   остаётся чистой. Специфичность 0-2-0 против 0-1-0 у компонента —
   `!important` не нужен.
   ------------------------------------------------------------------ */
.zt-header .zt-live-search-backdrop {
    z-index: -1;
}

/* ------------------------------------------------------------------
   Живой поиск: части шапки затемняются, поле и результаты — нет.
   Правка из чата 03.09.2026: «когда тыкаешь на поиск должно всё
   затемняться и оставаться только поиск и результаты, части шапки
   тоже должны затемняться».

   Замер на бою показал, зачем это нужно отдельным правилом. Родная
   подложка компонента (`.zt-live-search-backdrop`, слой 1200 внутри
   шапки) не различает своё и чужое: она лежит НАД всей шапкой как
   единым слоем, и `.zt-header__top` со всем содержимым — вместе
   с самим полем ввода и панелью подсказок — тонет под ней целиком.
   Проверено принудительным восстановлением слоя: `elementsFromPoint`
   в точке поля, панели и логотипа одинаково называет верхним
   элементом подложку. Поэтому и было родное поведение «размывается
   вообще всё, включая само поле» — то, что чинили как «причину №3»
   в шапке. Полностью выключать подложку правкой `z-index: -1` тоже
   неверно: заказчик прямо хочет, чтобы шапка при активном поиске
   темнела.

   Решение — настоящая вуаль того же цвета и с тем же размытием,
   что у родной подложки, но положенная ПОД полем поиска. Ключ к этому
   нашёлся в замере: при `is-open` компонент поднимает `.zt-search`
   на `z-index: 1210`, а панель подсказок — на `1220`. Значит внутри
   контекста наложения `.zt-header__top` есть промежуток: слой 5 выше
   логотипа, кнопок и меню, но ниже поля с панелью. Туда и кладётся
   `::after` каждой строки шапки с `rgba(20,27,34,.48)`
   и `backdrop-filter: blur(5px)` — теми же значениями, что у самой
   подложки. Совпадение цвета получается точным по построению,
   без подбора: это буквально та же заливка над тем же содержимым.

   Вуаль одна и на весь экран — как родная подложка. Сначала их было
   две, по одной на строку шапки, и шириной с плашку: так полосы
   по 14 px по краям не темнели дважды поверх родной подложки.
   Заказчик показал, что из этого вышло: между двумя вуалями шёл
   горизонтальный шов (каждый `backdrop-filter` считается в своих
   границах), а правый край вуали резал счётчик корзины — он стоит
   на 1387…1410 при крае плашки 1411 и с тенью выходит за него.

   Поэтому вуаль теперь одна, `position: fixed; inset: 0`, а родная
   подложка на этих ширинах гасится до прозрачной и без размытия:
   всю картинку рисует наш слой, а подложка остаётся только как
   кликабельная область закрытия поиска. Двойного затемнения нет —
   красит ровно один слой; швов нет — он один; счётчики и тени
   ничем не режутся — вуаль шире всего, что под ней.

   Ниже 1400 px подложка остаётся нетронутой: там свой мобильный
   поиск, и затемнение делает она.

   До этого перепробованы два варианта с подбором цвета, оба
   заказчиком забракованы. Первый — `opacity: .35` на элементах:
   шапка осталась белой полосой с бледными кнопками, потому что
   непрозрачность растворяет элементы к цвету плашки, а плашка белая.
   Второй — плашка `#8f8f8f` плюс `brightness(.56) blur(5px)`
   на элементах: тон подошёл, но `brightness()` сохраняет оттенок,
   и фирменный жёлтый `#ffb800` у «Каталога», MAX и обводок кнопок
   превращался в `rgb(143, 103, 0)`, тёмное золото — «затемняется
   шапка, но она выделяется жёлтым при поиске». Добавленный
   `grayscale(1)` жёлтый убрал, но шапка всё равно читалась отдельным
   пятном: подобранный серый не совпадал с тем, во что затемняется
   страница под ней. Вуаль снимает вопрос целиком.

   Признак активности — класс `is-open`, который компонент сам ставит
   и снимает на `.zt-search`; проверено на бою: появляется при вводе
   текста и артикула, снимается при очистке поля и по `blur`.

   От 1400 px — там же, где включена полная навигация: `.zt-nav`
   ниже этой ширины скрыт хамбургером, а мобильный поиск открывается
   отдельной панелью со своим бэкдропом.
   ------------------------------------------------------------------ */
@media (min-width: 1400px) {
    /* Один слой на весь экран: и шапка, и страница красятся им же.
       Лежит внутри верхней строки, поэтому поле поиска (1210)
       и панель подсказок (1220) остаются над ним. */
    .zt-header .zt-header__top::after {
        position: fixed;
        z-index: 5;
        inset: 0;
        background: rgba(20, 27, 34, .48);
        content: "";
        opacity: 0;
        transition: opacity .18s ease;
        pointer-events: none;
    }

    .zt-header:has(.zt-search.is-open) .zt-header__top::after {
        opacity: 1;
        -webkit-backdrop-filter: blur(5px);
        backdrop-filter: blur(5px);
    }

    /* Родная подложка перестаёт красить — иначе слой лёг бы дважды.
       Сама она остаётся на месте и по-прежнему ловит клик мимо
       поиска, закрывая его. */
    .zt-header .zt-live-search-backdrop {
        background: transparent;
        -webkit-backdrop-filter: none;
        backdrop-filter: none;
    }

    /* Под вуалью ничего не нажимается — кроме поиска, он выше неё. */
    .zt-header:has(.zt-search.is-open) .zt-header__top-inner > :not(.zt-search),
    .zt-header:has(.zt-search.is-open) .zt-nav {
        pointer-events: none;
    }
}

@media (min-width: 1400px) and (prefers-reduced-motion: reduce) {
    .zt-header .zt-header__top::after {
        transition: none;
    }
}


/* ==================================================================
   Подменю «Сервис» — плитки с фотографиями. Правка из чата
   03.09.2026 по референсу заказчика.

   Было: простой список из двенадцати ссылок в три колонки.
   Стало: сетка плиток «фото + название + описание» и промо-блок
   справа на месте прежних преимуществ. Двенадцать услуг
   раскладываются 3 × 4; от 2100 px, где панель упирается в потолок
   2076 и плитки становятся слишком широкими, — 4 × 3.

   Фотографии подготовлены из присланных исходников: обрезаны
   по содержимому, вписаны в квадрат 240 × 240 с прозрачным фоном,
   webp. Двенадцать плиток весят 83 КБ суммарно, баннер — 26 КБ,
   грузятся лениво.

   Панель под баннер пока занята одним из готовых баннеров
   «Свой сервис техники» — по договорённости это временная заглушка.
   ================================================================== */
@media (min-width: 1400px) {
    /* Тело панели: слева плитки, справа промо фиксированной ширины.
       Перебиваем общее правило `.zt-mega__body` выше по файлу —
       у него та же специфичность, но оно объявлено раньше. */
    .zt-header .zt-mega .zt-mega__body--service {
        display: grid !important;
        grid-template-columns: minmax(0, 1fr) 372px !important;
        column-gap: 28px !important;
        align-items: stretch !important;
        padding-bottom: 22px !important;
    }

    .zt-header .zt-mega .zt-mega__body--service > .zt-service-menu {
        display: flex;
        grid-column: 1 !important;
        min-width: 0;
        flex-direction: column;
    }

    /* Панели задана высота (см. блок «Одинаковая высота выпадающих
       панелей» в конце файла), поэтому сетка плиток должна её
       добирать. Без этого строки оставались натуральной высоты
       и плитки заканчивались на 24 px выше баннера — заказчик:
       «сервис поплыл, пункты теперь выше, чем баннер».

       Лишнее место уходит в межстрочные зазоры (`space-between`),
       а не в высоту плиток. Через `grid-auto-rows: 1fr` было хуже:
       строки равнялись по самой высокой (плитка «Расточно-наплавочные
       работы» с заголовком в три строки), и на 1400 px панели
       требовалось уже 597 px вместо 547 — плитки становились выше,
       чем в принятом виде. */
    .zt-header .zt-mega .zt-service-menu__grid {
        flex: 1 1 auto;
        align-content: space-between;
    }

    .zt-header .zt-mega .zt-mega__body--service > .zt-service-promo {
        grid-column: 2 !important;
    }
}

/* Заголовок «Сервис» стоит над сеткой, а не в колонке, — снимаем
   у него нижний отступ прежней колонки. */
.zt-service-menu {
    min-width: 0;
}

.zt-service-menu__grid {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 10px;
    margin: 0;
    padding: 0;
    list-style: none;
}

/* От 1750 px в колонке плиток становится больше 1300 px, и в трёх
   столбцах плитка растягивается до 470+ px — подпись с описанием
   занимают левую половину, справа пусто. Переходим на четыре
   столбца: 12 услуг ложатся 4 × 3, панель становится ниже. */
@media (min-width: 1750px) {
    .zt-service-menu__grid {
        grid-template-columns: repeat(4, minmax(0, 1fr));
    }
}

.zt-service-card {
    display: flex;
    min-width: 0;
}

/* Плитка целиком — ссылка: кликается вся площадь, а не подпись. */
.zt-service-card__link {
    position: relative;
    display: grid;
    grid-template-columns: 104px minmax(0, 1fr);
    gap: 14px;
    align-items: center;
    width: 100%;
    min-height: 108px;
    padding: 12px 28px 12px 12px;
    border: 1px solid #e6e9ee;
    border-radius: 14px;
    background: #fff;
    color: inherit;
    text-decoration: none;
    transition: border-color .16s ease, box-shadow .16s ease;
}

.zt-service-card__link:hover,
.zt-service-card__link:focus-visible {
    border-color: rgba(255, 184, 0, .85);
    box-shadow: 0 10px 20px -14px rgba(16, 24, 40, .45);
}

/* Блок, а не grid: у центрированного grid-элемента `max-height: 100%`
   не разрешается — картинка вставала во всю натуральную высоту
   и вываливалась из плитки вниз, под панель.

   Подложки нет: фотографии на прозрачном фоне, и серый квадрат
   под ними читался как лишняя рамка. Правка из чата 03.09.2026. */
.zt-service-card__media {
    display: block;
    box-sizing: border-box;
    width: 104px;
    height: 86px;
}

/* Наведение — та же механика, что у категорий товаров на бою
   (`categories-module.css`: `translateY(-3px) scale(1.035)` с
   `cubic-bezier(.22, .61, .36, 1)`). Плитка меньше карточки
   категории, поэтому масштаб чуть крупнее — иначе движение
   не читается. */
.zt-service-card__media img:not(#zt_):not(#zt_) {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: contain;
    transition: transform .5s cubic-bezier(.22, .61, .36, 1);
}

.zt-service-card__link:hover .zt-service-card__media img,
.zt-service-card__link:focus-visible .zt-service-card__media img {
    transform: translateY(-3px) scale(1.09);
}

@media (prefers-reduced-motion: reduce) {
    .zt-service-card__media img:not(#zt_):not(#zt_) {
        transition: none;
    }

    .zt-service-card__link:hover .zt-service-card__media img,
    .zt-service-card__link:focus-visible .zt-service-card__media img {
        transform: none;
    }
}

.zt-service-card__text {
    display: block;
    min-width: 0;
}

.zt-service-card__title {
    display: block;
    font-size: 14px;
    font-weight: 700;
    line-height: 1.2;
    color: #111820;
}

.zt-service-card__desc {
    display: block;
    margin-top: 5px;
    font-size: 12px;
    font-weight: 400;
    line-height: 1.33;
    color: #6b7480;
}

/* Стрелка в правом нижнем углу, как на референсе. */
.zt-service-card__arrow {
    position: absolute;
    right: 12px;
    bottom: 11px;
    display: grid;
    place-items: center;
    width: 18px;
    height: 18px;
    color: #ffb800;
    transition: transform .16s ease;
}

.zt-service-card__arrow svg {
    width: 16px;
    height: 16px;
}

.zt-service-card__link:hover .zt-service-card__arrow {
    transform: translateX(3px);
}

/* Заголовок выделенной плитки — фирменный жёлтый. Правка из чата
   03.09.2026. Хак специфичности нужен из-за общего правила шапки
   `body :not(i)…`, оно задаёт цвет текста с весом 0-2-2. */
.zt-service-card__link:hover .zt-service-card__title:not(#zt_):not(#zt_),
.zt-service-card__link:focus-visible .zt-service-card__title:not(#zt_):not(#zt_) {
    color: var(--zt-yellow, #ffb800);
}

.zt-service-card__title {
    transition: color .16s ease;
}

/* ---- промо-блок справа ---- */
.zt-service-promo {
    display: flex;
    flex-direction: column;
    overflow: hidden;
    border-radius: 16px;
    /* 07.09.2026: «заливку на баннерах в шапке делаем чёрной».
       Было #111820. */
    background: #000;
    color: #fff;
}

/* Баннер широкий, 3:1. При фиксированной высоте `cover` вырезал
   из него вертикальную полосу и резал надпись — держим натуральные
   пропорции, тогда картинка видна целиком. Хак специфичности нужен
   из-за атрибутов `width`/`height` у самой картинки. */
.zt-service-promo__image:not(#zt_):not(#zt_) {
    display: block;
    width: 100%;
    height: auto;
    aspect-ratio: 3 / 1;
    object-fit: cover;
}

.zt-service-promo__body {
    display: flex;
    flex-direction: column;
    gap: 14px;
    padding: 22px 22px 24px;
}

.zt-service-promo__title {
    margin: 0;
    font-size: 22px;
    font-weight: 700;
    line-height: 1.16;
    letter-spacing: .01em;
    text-transform: uppercase;
    color: #fff;
}

.zt-service-promo__text {
    margin: 0;
    font-size: 14px;
    font-weight: 400;
    line-height: 1.45;
    color: #a7b0ba;
}

.zt-service-promo__cta {
    align-self: stretch;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    padding: 13px 18px;
    border-radius: 10px;
    background: #ffb800;
    color: #111820;
    font-size: 13px;
    font-weight: 700;
    letter-spacing: .01em;
    text-transform: uppercase;
    text-decoration: none;
    transition: background-color .16s ease;
}

.zt-service-promo__cta::after {
    content: "→";
    font-size: 15px;
    line-height: 1;
}

.zt-service-promo__cta:hover,
.zt-service-promo__cta:focus-visible {
    background: #ffc633;
}

/* Тезисы из промо убраны по просьбе заказчика 03.09.2026. Осталась
   картинка, заголовок, подпись и кнопка. Тело занимает остаток
   высоты, кнопка прижата к низу — промо тянется на всю высоту сетки
   плиток, и низ обеих колонок совпадает. */
.zt-service-promo__body {
    flex: 1 1 auto;
}

.zt-service-promo__cta {
    margin-top: auto;
}

.zt-service-promo__list li {
    display: grid;
    grid-template-columns: 30px minmax(0, 1fr);
    gap: 10px;
    align-items: center;
    font-size: 12.5px;
    font-weight: 400;
    line-height: 1.32;
    color: #c3cbd4;
}

.zt-service-promo__icon {
    display: grid;
    place-items: center;
    width: 30px;
    height: 30px;
    border-radius: 9px;
    background: rgba(255, 184, 0, .13);
    color: #ffb800;
}

.zt-service-promo__icon svg {
    width: 16px;
    height: 16px;
}


/* ------------------------------------------------------------------
   Шторка мобильного меню и нижняя панель. Правка из чата 03.09.2026
   по замечанию «телефоны и емейл закрывает нижнее меню» и «есть
   проблема прокрутки меню гамбургера».

   Замер на 390 × 640 с открытой шторкой: у прокручиваемой области
   scrollHeight 662 против clientHeight 640 — запаса всего 22 px,
   блок контактов встаёт на 557…616, а нижняя панель занимает
   583…640. Панель лежит на слое 9990, шторка — на 2500, поэтому
   панель рисуется поверх и срезает нижние 33 px контактов.
   Долистать до них нельзя: прокрутка упирается в те же 22 px.

   Пока шторка открыта, нижняя панель не нужна — в шторке своя
   навигация и свой крестик. Прячем её и даём прокручиваемой
   области запас снизу, чтобы последний блок не прилипал к краю
   экрана и не попадал под системную зону жеста.
   ------------------------------------------------------------------ */
body.zt-mobile-menu-open .zt-bottombar,
body.zt-mobile-menu-open #ztBottomBar {
    display: none !important;
}

.zt-mobile-drawer__scroll {
    padding-bottom: calc(28px + env(safe-area-inset-bottom));
}


/* ------------------------------------------------------------------
   Линия между шапкой и раскрытым подменю. Правка из чата 03.09.2026.

   Раньше на этом месте была граница плашки во всю ширину карточки —
   её заказчик забраковал: она читалась не разделителем, а «срезом».
   Теперь линия рисуется с отступами и заканчивается там же, где
   начинается содержимое панели: слева вровень с первой плиткой,
   справа вровень с правым краем промо-блока. От краёв карточки,
   и тем более от краёв экрана, она заметно отступает.

   Отступ считается так же, как поля `.zt-mega__body`: оболочка
   панели не шире 2020 px и центрируется, поля 14 px (6 px до
   1480 px). `max()` берёт большее из двух — на узких экранах
   работают поля, на широких добавляется половина разницы
   до потолка.

   Только при открытом подменю: закрытая шапка рисует свою форму
   скруглением и тенью, там линия не нужна.
   ------------------------------------------------------------------ */
@media (min-width: 1400px) {
    body.zt-mega-open .zt-header .zt-mega::before {
        position: absolute;
        z-index: 1;
        top: 0;
        right: max(14px, calc((100% - 2020px) / 2 + 14px));
        left: max(14px, calc((100% - 2020px) / 2 + 14px));
        height: 1px;
        background: var(--zt-line, #e6e9ee);
        content: "";
        pointer-events: none;
    }
}

@media (min-width: 1400px) and (max-width: 1480px) {
    body.zt-mega-open .zt-header .zt-mega::before {
        right: 6px;
        left: 6px;
    }
}


/* ==================================================================
   Подменю «О компании» — карточки с иллюстрациями. Правка из чата
   07.09.2026 по присланному пакету `zipteh-about-menu-content`.

   Было: заголовок с иконкой, четыре ссылки в колонку и блок
   преимуществ справа. Стало: крупная карточка «О нас», сетка 2 × 2
   из четырёх карточек и тёмный бренд-блок — по макету из пакета.

   Что взято из пакета и что изменено:

   1. Адреса. В пакете они placeholder'ы (`/about/`, `/about/news/`,
      `/about/careers/`, `/about/awards/`) — проверка на бою 07.09
      показала по ним 404. Подставлены реальные: `/o-nas/`, `/news/`,
      `/vakansii/`, `/sertifikaty-kachestva/`. README пакета прямо
      просит это сделать.
   2. Акцент. В пакете `#ffb600`, в проекте фирменный `#ffb800` —
      берём проектный, чтобы жёлтый совпадал с кнопками шапки.
   3. Иконки преимуществ. Свой спрайт пакета не подключаем: в шапке
      уже есть `#zt-icon-shield`, `#zt-icon-truck`, `#zt-icon-award`
      с той же геометрией.
   4. Стрелки у ссылок рисуются через `::after`, а не тегом в
      разметке.
   5. Картинки пережаты: исходные webp пакета весили 1,59 МБ на пять
      штук, после уменьшения до 440–560 px по ширине — 157 КБ.

   Сетка включается от 1400 px, как и вся десктопная навигация.
   ================================================================== */
@media (min-width: 1400px) {
    /* Перебиваем общее правило `.zt-mega__body` (две колонки,
       объявлено выше по файлу с `!important`). */
    .zt-header .zt-mega .zt-mega__body--about {
        display: grid !important;
        /* Правая колонка фиксированной ширины — 340 px. Иначе место под
           баннер меняет пропорцию с 0,80 на 1400 px до 1,42 на 2560,
           и одной картинкой его не закрыть: она либо режется, либо
           оставляет поля. С фиксированной шириной размер баннера один
           на все экраны — 340 × 425 (файл 680 × 850). */
        grid-template-columns: minmax(280px, 1fr) minmax(520px, 1.72fr) 340px !important;
        column-gap: 14px !important;
        align-items: stretch !important;
        padding-bottom: 22px !important;
    }
}

.zt-about-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    grid-auto-rows: 1fr;
    gap: 14px;
    min-width: 0;
}

/* ---- карточка ---- */
.zt-about-card {
    position: relative;
    display: flex;
    overflow: hidden;
    min-width: 0;
    flex-direction: column;
    padding: 24px;
    border: 1px solid #e6e9ee;
    border-radius: 16px;
    background: #fff;
    color: inherit;
    text-decoration: none;
    transition: border-color .18s ease, box-shadow .18s ease;
}

.zt-about-card:hover,
.zt-about-card:focus-visible {
    border-color: rgba(255, 184, 0, .85);
    box-shadow: 0 10px 22px -14px rgba(16, 24, 40, .45);
    outline: none;
}

/* Как в плитках подменю «Сервис»: заголовок при наведении
   перекрашивается в фирменный жёлтый. */
.zt-about-card:hover .zt-about-card__title:not(#zt_):not(#zt_),
.zt-about-card:focus-visible .zt-about-card__title:not(#zt_):not(#zt_) {
    color: var(--zt-yellow, #ffb800);
}

.zt-about-card__title,
.zt-about-card__lead,
.zt-about-card__copy,
.zt-about-card__cta {
    position: relative;
    z-index: 2;
}

.zt-about-card__title {
    display: block;
    font-size: 20px;
    font-weight: 700;
    line-height: 1.1;
    color: #111820;
}

.zt-about-card__lead {
    display: block;
    margin-top: 16px;
    font-size: 16px;
    font-weight: 700;
    line-height: 1.25;
    color: #111820;
}

.zt-about-card__copy {
    display: block;
    margin-top: 10px;
    font-size: 13px;
    font-weight: 400;
    line-height: 1.42;
    color: #6b7480;
}

.zt-about-card__cta {
    display: block;
    margin-top: auto;
    padding-top: 16px;
    font-size: 12px;
    font-weight: 700;
    letter-spacing: .01em;
    text-transform: uppercase;
    color: #111820;
}

.zt-about-card__cta::after {
    display: inline-block;
    margin-left: 8px;
    color: var(--zt-yellow, #ffb800);
    content: "→";
    font-size: 16px;
    line-height: 1;
    transition: transform .16s ease;
}

.zt-about-card:hover .zt-about-card__cta::after,
.zt-about-card:focus-visible .zt-about-card__cta::after {
    transform: translateX(3px);
}

/* ---- иллюстрация ----

   В пакете картинка лежала абсолютом с отрицательными сдвигами
   (`right: -6px; bottom: -10px`) поверх текста. Из-за этого её резала
   сама карточка (`overflow: hidden`), а описание уходило под неё.
   Замер 07.09 на 1920 px: экскаватор терял 38 px справа и 7 px снизу
   и перекрывал четыре строки описания и подзаголовок; четыре малые
   картинки теряли 5 px справа и 9 px снизу.

   Стало: иллюстрация — отдельная колонка сетки карточки. Пересечься
   с текстом ей больше нечем, выйти за карточку тоже: `contain`
   вписывает её в свою ячейку целиком. */
.zt-about-card__visual {
    position: relative;
    z-index: 1;
    min-width: 0;
    pointer-events: none;
}

/* Абсолютом внутри ячейки: иначе `height: 100%` в строке auto-высоты
   раскрывается в натуральную высоту файла и раздувает карточку —
   на 1920 px панель выросла с 414 до 636 px. */
.zt-about-card__visual img:not(#zt_):not(#zt_) {
    position: absolute;
    display: block;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: contain;
    object-position: right bottom;
    transition: transform .5s cubic-bezier(.22, .61, .36, 1);
}

.zt-about-card:hover .zt-about-card__visual img,
.zt-about-card:focus-visible .zt-about-card__visual img {
    transform: translateY(-3px) scale(1.05);
}

/* ---- малые карточки сетки ---- */
.zt-about-card--small {
    display: grid;
    /* clamp, а не голые проценты: на 1400 px иначе текстовой колонке
       остаётся 137 px и описание уходит в восемь строк, на 2560 —
       картинка раздувается. */
    grid-template-columns: minmax(0, 1fr) clamp(86px, 33%, 150px);
    grid-template-rows: auto auto 1fr auto;
    column-gap: 12px;
}

.zt-about-card--small .zt-about-card__title {
    grid-area: 1 / 1 / 2 / 2;
}

.zt-about-card--small .zt-about-card__copy {
    grid-area: 2 / 1 / 3 / 2;
}

/* кнопка во всю ширину карточки — иначе на 1400 px «Смотреть вакансии»
   и «Смотреть презентацию» ломаются на две строки */
.zt-about-card--small .zt-about-card__cta {
    grid-area: 4 / 1 / 5 / 3;
}

.zt-about-card--small .zt-about-card__visual {
    grid-area: 1 / 2 / 4 / 3;
}

/* ---- крупная карточка «О нас» ---- */
/* Крупная карточка — стопкой, а не в две колонки: у неё много
   свободной высоты (на 1400 px 491 px при содержимом около 250),
   и в колонке шириной 154 px описание уходило в восемь строк.
   Текст во всю ширину, экскаватор — полосой под ним. */
.zt-about-card--featured {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    grid-template-rows: auto auto auto minmax(110px, 1fr) auto;
    padding: 28px;
}

.zt-about-card--featured .zt-about-card__title {
    grid-area: 1 / 1 / 2 / 2;
    font-size: 24px;
}

.zt-about-card--featured .zt-about-card__lead {
    grid-area: 2 / 1 / 3 / 2;
}

.zt-about-card--featured .zt-about-card__copy {
    grid-area: 3 / 1 / 4 / 2;
    margin-top: 14px;
}

.zt-about-card--featured .zt-about-card__cta {
    grid-area: 5 / 1 / 6 / 2;
}

.zt-about-card--featured .zt-about-card__visual {
    grid-area: 4 / 1 / 5 / 2;
    margin-top: 12px;
}

/* ---- тёмный бренд-блок ---- */
.zt-about-promo {
    position: relative;
    display: flex;
    overflow: hidden;
    flex-direction: column;
    border-radius: 16px;
    /* тот же цвет, что фон баннера, — стык не виден */
    background: #000;
    color: #fff;
}

/* Баннер занимает блок целиком и вписывается в него `contain` —
   при любой высоте панели он не режется и не искажается. Абсолютом,
   чтобы не раздувать блок собственной высотой. */
.zt-about-promo__banner:not(#zt_):not(#zt_) {
    position: absolute;
    display: block;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: contain;
    object-position: center top;
}

.zt-about-promo__cta {
    position: relative;
    z-index: 2;
}

.zt-about-promo__brand {
    margin: 0;
    font-size: 38px;
    font-weight: 700;
    line-height: .95;
}

.zt-about-promo__brand span:not(#zt_):not(#zt_),
.zt-about-promo__brand strong:not(#zt_):not(#zt_) {
    display: block;
    font-size: 38px;
    font-weight: 700;
    line-height: .95;
    letter-spacing: -.01em;
}

.zt-about-promo__brand span:not(#zt_):not(#zt_) {
    color: var(--zt-yellow, #ffb800);
}

.zt-about-promo__brand strong:not(#zt_):not(#zt_) {
    color: #fff;
}

.zt-about-promo__tagline {
    margin: 10px 0 20px;
    font-size: 13px;
    font-weight: 400;
    color: #bcc3ca;
}

.zt-about-promo__list {
    display: grid;
    gap: 12px;
    margin: 0 0 18px;
    padding: 0;
    list-style: none;
}

.zt-about-promo__list li {
    display: grid;
    grid-template-columns: 36px minmax(0, 1fr);
    gap: 12px;
    align-items: center;
}

.zt-about-promo__icon {
    display: grid;
    place-items: center;
    width: 36px;
    height: 36px;
    border: 1px solid var(--zt-yellow, #ffb800);
    border-radius: 50%;
    color: #fff;
}

.zt-about-promo__icon svg {
    width: 18px;
    height: 18px;
}

.zt-about-promo__text {
    display: grid;
    gap: 2px;
    min-width: 0;
}

/* Общее правило шапки красит вложенные `strong`/`small` в тёмно-серый —
   на тёмном фоне они бы пропали. */
.zt-about-promo__text strong:not(#zt_):not(#zt_) {
    font-size: 13px;
    font-weight: 700;
    color: #fff;
}

.zt-about-promo__text small:not(#zt_):not(#zt_) {
    font-size: 11.5px;
    font-weight: 400;
    line-height: 1.3;
    color: #aeb6bf;
}

/* Кнопка ложится на нижнюю полосу баннера — в баннере под неё
   оставлено чистое тёмное поле. */
.zt-about-promo__cta {
    position: absolute;
    right: 14px;
    bottom: 14px;
    left: 14px;
    display: flex;
    padding: 13px 18px;
    align-items: center;
    justify-content: center;
    gap: 8px;
    border-radius: 10px;
    background: var(--zt-yellow, #ffb800);
    color: #111820;
    font-size: 12.5px;
    font-weight: 700;
    letter-spacing: .01em;
    text-transform: uppercase;
    text-decoration: none;
    transition: background-color .16s ease;
}

.zt-about-promo__cta::after {
    content: "→";
    font-size: 15px;
    line-height: 1;
}

.zt-about-promo__cta:hover,
.zt-about-promo__cta:focus-visible {
    background: #ffc633;
}

@media (prefers-reduced-motion: reduce) {
    .zt-about-card__visual img:not(#zt_):not(#zt_),
    .zt-about-card__cta::after {
        transition: none;
    }

    .zt-about-card:hover .zt-about-card__visual img,
    .zt-about-card:focus-visible .zt-about-card__visual img {
        transform: none;
    }
}


/* ==================================================================
   Одинаковая высота выпадающих панелей. Правка из чата 07.09.2026:
   «хочу, чтобы высота подменю была такой же, как в сервисе,
   и не была больше».

   Замер до правки показал, что «Сервис» и сам не держит одну высоту:
   на 1750 px плитки перестраиваются с трёх колонок на четыре
   и панель падает с 532 до 428 px. Разброс по ширинам был такой —
   «Сервис» 547 / 530 / 532 / 428 / 410, «О компании» 530 / 534.

   Стало: обе панели получают одну заданную высоту в каждом режиме.
   Значения — максимум того, что требует содержимое «Сервиса»
   в своём режиме, поэтому ничего не обрезается, а лишнее место
   разбирают строки-распорки внутри карточек.
   ================================================================== */
@media (min-width: 1400px) {
    .zt-header .zt-mega .zt-mega__body:not(#zt_):not(#zt_) {
        height: 548px;
    }
}

@media (min-width: 1750px) {
    .zt-header .zt-mega .zt-mega__body:not(#zt_):not(#zt_) {
        height: 434px;
    }
}


/* ==================================================================
   Кнопки подменю — в стиле кнопки «Каталог». Правка из чата
   07.09.2026: «нужно, чтоб по цветам кнопки в сервисе и о компании
   были так же, как кнопка каталог в шапке, и по стилю собственно
   такие же, и цвет текста белый».

   Замер «Каталога»: фон `#FFB800`, при наведении `#E8A600`, рамка
   1 px того же цвета, скругление 8 px, высота 48, поля 0/24,
   Tektur 15/700, капс, трекинг .01em, зазор 10 px. Всё это
   перенесено на обе кнопки; отличие одно — подпись белая,
   как попросил заказчик (у «Каталога» она тёмная, `#1a1a1a`).
   ================================================================== */
.zt-about-promo__cta:not(#zt_):not(#zt_),
.zt-service-promo__cta:not(#zt_):not(#zt_) {
    display: flex;
    min-height: 48px;
    padding: 0 24px;
    align-items: center;
    justify-content: center;
    gap: 10px;
    border: 1px solid var(--zt-yellow, #ffb800);
    border-radius: 8px;
    background: var(--zt-yellow, #ffb800);
    color: #fff;
    -webkit-text-fill-color: #fff;
    font-size: 15px;
    font-weight: 700;
    letter-spacing: .01em;
    text-transform: uppercase;
    text-decoration: none;
    transition: background-color .18s ease, border-color .18s ease;
}

.zt-about-promo__cta:hover:not(#zt_):not(#zt_),
.zt-about-promo__cta:focus-visible:not(#zt_):not(#zt_),
.zt-service-promo__cta:hover:not(#zt_):not(#zt_),
.zt-service-promo__cta:focus-visible:not(#zt_):not(#zt_) {
    border-color: var(--zt-yellow-hover, #e8a600);
    background: var(--zt-yellow-hover, #e8a600);
    color: #fff;
    -webkit-text-fill-color: #fff;
}

/* «Двойная кнопка» на тёмной панели — это кольцо фокуса.

   В проекте их два, и оба рисуются СНАРУЖИ кнопки, поэтому вокруг
   жёлтого прямоугольника появляется второй:

   * `header-new.css`: `.zt-header :focus-visible` — жёлтое
     `rgba(255,184,0,.38)`, отступ 3 px;
   * `zt-home-unify.css`: `.zt-header a:focus-visible` — синее
     `rgb(26,111,212)`, отступ 2 px, и с `!important`, поэтому
     побеждает жёлтое. Первая попытка починки (белое кольцо
     без `!important`) по этой же причине не сработала — заказчик
     ответил «проблема не ушла».

   Здесь кольцо уводится ВНУТРЬ кнопки: `outline-offset: -4px`.
   Снаружи силуэта не появляется ничего, чем бы ни красили кольцо,
   а фокус с клавиатуры остаётся видимым — белая рамка на жёлтом.
   Заодно снимаем любые тени: у кнопки «Каталог», на которую эти
   равняются, при наведении есть жёлтое свечение
   `0 8px 20px rgba(255,184,0,.25)` — на тёмной панели оно тоже
   читалось бы вторым контуром. */
.zt-header .zt-about-promo__cta:focus-visible,
.zt-header .zt-service-promo__cta:focus-visible,
.zt-header a.zt-about-promo__cta:focus-visible,
.zt-header a.zt-service-promo__cta:focus-visible {
    outline: 2px solid #fff !important;
    outline-offset: -4px !important;
}

.zt-header .zt-about-promo__cta,
.zt-header .zt-about-promo__cta:hover,
.zt-header .zt-about-promo__cta:focus,
.zt-header .zt-about-promo__cta:focus-visible,
.zt-header .zt-about-promo__cta:active,
.zt-header .zt-service-promo__cta,
.zt-header .zt-service-promo__cta:hover,
.zt-header .zt-service-promo__cta:focus,
.zt-header .zt-service-promo__cta:focus-visible,
.zt-header .zt-service-promo__cta:active {
    box-shadow: none !important;
    transform: none !important;
    /* Рамка была того же цвета, что фон, — на глаз её не видно,
       но при масштабе браузера меньше 100 % она сглаживается
       в светлую кайму по контуру. Снимаем: у кнопки «Каталог»
       рамка нужна как граница на белой шапке, здесь фон чёрный
       и граница не нужна. */
    border: 0 !important;
}

.zt-header .zt-about-promo__cta:hover,
.zt-header .zt-about-promo__cta:active,
.zt-header .zt-service-promo__cta:hover,
.zt-header .zt-service-promo__cta:active {
    outline: none !important;
}

/* Фон блока — кромка нового баннера, стык не виден. */
.zt-about-promo:not(#zt_):not(#zt_) {
    background: #000;
}


/* ==================================================================
   Разделитель под шапкой до скролла. Правка из чата 07.09.2026:
   «по шапке, до скрола на сайте чтоб была аккуратная линия
   разделитель на версиях для ПК».

   До скролла у шапки не было ничего: скругление низа и тень
   появляются только у закреплённой (`.zt-header--stuck`), и в самом
   верху страницы белая плашка сливалась с белым фоном контента.

   Линию несёт та же плашка `.zt-header::after`, и не рамкой,
   а внутренней тенью — рамка увеличила бы плашку на пиксель
   и сдвинула стык с подменю.

   Линия снимается в двух случаях, иначе она ляжет ровно на шов
   между шапкой и выпавшей панелью — тот самый дефект, который
   разбирали 03.09 (см. [[Шапка, подменю и затемнение]]):
   когда открыто мега-подменю и когда шапка закрепилась.
   ================================================================== */
@media (min-width: 1400px) {
    .zt-header:not(.zt-header--stuck)::after {
        box-shadow: inset 0 -1px 0 var(--zt-line, #e6e9ee);
    }

    body.zt-mega-open .zt-header:not(.zt-header--stuck)::after {
        box-shadow: none;
    }
}


/* ==================================================================
   ВРЕМЕННО: раздел «Акции» скрыт из шапки. Правка из чата
   07.09.2026: «из шапки на всех разрешениях временно скрываем
   раздел акции».

   Скрываем стилями, а не удаляем разметку: раздел вернётся одной
   правкой — достаточно снять этот блок. Оба места, где «Акции»
   есть в шапке:

   * `.zt-nav__item--offers` — пункт десктопного меню от 1400 px;
   * `.zt-mobile-nav__link--offers` — ссылка в мобильной шторке
     (класс-крючок добавлен 07.09; сама ссылка отличается от соседней
     «Производители» только иконкой и подписью, отдельного класса
     у неё не было).

   Обе вели на модалку-заглушку `zt-brand-placeholder-modal` —
   раздела на сайте ещё нет. Старая панель `#zt-mega-offers` в коде
   остаётся и так же не открывается: к ней ничего не привязано.
   ================================================================== */
.zt-nav__item--offers:not(#zt_):not(#zt_),
.zt-mobile-nav__link--offers:not(#zt_):not(#zt_) {
    display: none !important;
}


/* ==================================================================
   «Двойная кнопка» при наведении — панели перекрывались на переходе.

   Заказчик несколько раз присылал скриншот: на тёмной панели
   у кнопки виден второй жёлтый прямоугольник, «причём это происходит
   при наведении на баннер». Ни фокус, ни тень, ни макет баннера
   ни при чём — проверено поштучно (см. [[Картинки шапки]]).

   Причина: панели прячутся не `display: none`, а
   `opacity: 0; visibility: hidden` с переходом (`header-new.css`).
   `visibility` переключается ступенькой в конце перехода, поэтому
   пока новая панель проявляется, старая ещё РИСУЕТСЯ и просвечивает
   сквозь неё. У «Сервиса» и «О компании» кнопки стоят по-разному —
   замер на 1920: 312 × 48 на x 1551 против 328 × 48 на x 1527,
   расхождение 24 px по горизонтали и 10 по вертикали. Две жёлтые
   плашки со сдвигом и читаются двойной кнопкой.

   Лечение: пока открыта какая-то панель, все остальные гаснут
   мгновенно, без перехода. Плавность при этом сохраняется там,
   где она видна: открытие панели и полное закрытие меню
   (когда `zt-mega-open` с `body` снят) идут по-прежнему с переходом.
   ================================================================== */
@media (min-width: 1400px) {
    body.zt-mega-open .zt-header .zt-mega:not(.is-open) {
        opacity: 0 !important;
        visibility: hidden !important;
        transition: none !important;
    }
}
