/* ==========================================================================
   magazinus.css — стили темы magazinus

   Подключается в catalog/view/theme/magazinus/template/common/header.twig
   сразу ПОСЛЕ дефолтного stylesheet.css, поэтому всё, что здесь написано,
   перекрывает дефолт. Дефолтную тему не трогаем никогда.

   Один обычный файл, обычный <link>: без сборки, склейки и минификации
   (решение владельца 2026-08-20).

   ПРАВИЛО: ни одного литерала #rrggbb ниже блока :root. Любой цвет —
   только через var(--…). Смена гаммы должна быть правкой одного :root.
   ========================================================================== */

/* --------------------------------------------------------------------------
   Шрифт Open Sans — свои файлы, со своего домена.
   Гугловский <link> на fonts.googleapis.com из header.twig убран: он заставлял
   браузер каждого посетителя ходить на чужой сервер за шрифтом.

   Файлы: catalog/view/theme/magazinus/font/ (пути ниже — относительно ЭТОГО
   файла, а не корня сайта). Открытая лицензия SIL OFL 1.1, самохостинг разрешён.

   Это ВАРИАТИВНЫЙ шрифт: одно начертание покрывает всю толщину 300-800,
   поэтому файлов четыре, а не двенадцать. font-weight: 300 800 — это диапазон
   осей, а не опечатка.

   По файлу на подмножество: браузер скачивает только то, чьи символы реально
   встретились на странице (unicode-range). Кириллица - для текста, латиница -
   для брендов и цифр, курсивные - только если на странице есть курсив.
   -------------------------------------------------------------------------- */

@font-face {
    font-family: 'Open Sans';
    font-style: normal;
    font-weight: 300 800;
    font-stretch: 100%;
    font-display: swap;
    src: url('../font/open-sans-cyrillic.woff2') format('woff2');
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}

/* Пятый файл — cyrillic-ext. Нужен ровно ради одного символа: знака гривні ₴
   (U+20B4), он живёт именно в этом подмножестве. Скачан 2026-08-22 с
   fonts.gstatic.com, версия v44 — та же, что у остальных четырёх.

   ⚠ Пока в `oc_currency` символ валюты — « грн.», ни один символ из этого
   диапазона на страницах не встречается, и браузер файл НЕ качает: правило
   unicode-range для того и нужно. Он начнёт грузиться в тот день, когда
   в настройках валюты поставят ₴. */
@font-face {
    font-family: 'Open Sans';
    font-style: normal;
    font-weight: 300 800;
    font-stretch: 100%;
    font-display: swap;
    src: url('../font/open-sans-cyrillic-ext.woff2') format('woff2');
    unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}

@font-face {
    font-family: 'Open Sans';
    font-style: normal;
    font-weight: 300 800;
    font-stretch: 100%;
    font-display: swap;
    src: url('../font/open-sans-latin.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: 'Open Sans';
    font-style: italic;
    font-weight: 300 800;
    font-stretch: 100%;
    font-display: swap;
    src: url('../font/open-sans-italic-cyrillic.woff2') format('woff2');
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}

@font-face {
    font-family: 'Open Sans';
    font-style: italic;
    font-weight: 300 800;
    font-stretch: 100%;
    font-display: swap;
    src: url('../font/open-sans-italic-latin.woff2') format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

:root {
    /* --- Основа ---------------------------------------------------------
       Гамма STATNA, выведена из логотипа (2026-08-30), а не подобрана
       на глаз. Знак — рукописное «Statna» приглушённой розой с сердечком.

       ⚠ Фирменную розу #c97177 НЕЛЬЗЯ ставить ссылкам и кнопкам как есть:
       на белом это 3.44:1, а текст требует 4.5:1. Поэтому вся ступень
       акцента — тот же тон и та же насыщенность (H356 S45%), опущенные
       по светлоте до читаемого уровня. Логотип и интерфейс от этого
       остаются одного цвета, просто интерфейс темнее на два шага.

       ⚠ Нейтрали здесь ТЁПЛЫЕ (H0-16), а не серо-голубые, как было
       в заглушке. Холодный графит рядом с тёплой розой читается как
       чужеродный — ровно это и видно на снимке шапки до правки. */

    --c-bg:              #ffffff;   /* фон страницы */
    --c-bg-soft:         #faf7f7;   /* подложка секций, шапки, плиток */
    --c-bg-sunken:       #f0eaea;   /* то, что должно быть «глубже» фона */

    --c-text:            #2a2326;   /* основной текст, 15.4:1 */
    --c-text-muted:      #75696b;   /* подписи, второстепенное, 5.3:1 */
    --c-text-inverse:    #ffffff;   /* текст на тёмном/акцентном фоне */

    --c-border:          #e6dedd;   /* обычные рамки и разделители */
    --c-border-strong:   #cfc2c2;   /* рамка в фокусе, активная плитка */

    /* --- Акценты --------------------------------------------------------
       accent   — основное действие: кнопка «Купити», ссылки, активное меню.
       accent-2 — второй акцент: цена, акции, выделение в шапке.

       ⚠ accent-2 — тёплый тауп, а не второй розовый и не прежний сливовый.
       Роза в этой гамме одна и должна оставаться единственным цветным
       пятном: два розовых рядом начинают спорить, какое из них главное. */

    --c-accent:          #b1434b;   /* роза логотипа, ступень L48%, 5.6:1 */
    --c-accent-hover:    #94383e;   /* ступень L40%, 7.3:1 */
    --c-accent-soft:     #faeff0;   /* ИЗ ИКОНКИ: подложка монограммы */

    --c-accent-2:        #7d6a63;   /* тёплый тауп, 5.1:1 */
    --c-accent-2-hover:  #5f504a;

    /* --- Состояния ------------------------------------------------------ */

    --c-success:         #2e7d4f;   /* «В наявності», успешное действие */
    --c-error:           #b3261e;   /* ошибки формы, «Немає в наявності» */
    --c-warning:         #a76a00;   /* предупреждения, останні розміри */

    /* --- Тени ------------------------------------------------------------
       Тень — это тоже цвет, поэтому живёт здесь, а не в блоке метрик:
       при смене гаммы её тон меняется вместе с остальным. */

    --shadow-header:     0 1px 3px rgba(42, 35, 38, .10);
    --shadow-menu:       0 6px 18px rgba(42, 35, 38, .12);
}

/* --------------------------------------------------------------------------
   ТИПОГРАФИКА И РИТМ — шаг 3.

   Отдельный :root, не тот, что выше: там гамма (её меняем при выборе цветов),
   здесь размеры и отступы (их менять при выборе цветов не придётся).

   Дефолтная тема ocStore набрана 12px/20px — это размер 2013 года, когда
   макеты рисовали под 1024. Ставим 15px/1.6: столько же строк на экране,
   но текст читается без прищура. Все размеры — в переменных, чтобы масштаб
   правился в одном месте, а не по всему файлу.
   -------------------------------------------------------------------------- */

:root {
    /* --- Шрифт ----------------------------------------------------------
       Open Sans лежит у нас локально (@font-face выше). Дальше по списку —
       системные шрифты на случай, если наш файл не доехал. */

    --font-sans:        'Open Sans', -apple-system, 'Segoe UI', Arial, sans-serif;

    /* --- Размеры текста -------------------------------------------------- */

    --fs-base:          15px;   /* основной текст */
    --fs-sm:            13px;   /* подписи, хлебные крошки, мелочь */
    --fs-xs:            12px;   /* совсем служебное */
    --fs-lead:          17px;   /* вводный абзац, цена в листинге */
    --fs-form:          14px;   /* поля ввода, см. блок «Формы» ниже */

    --fs-h1:            28px;
    --fs-h2:            23px;
    --fs-h3:            19px;
    --fs-h4:            17px;
    --fs-h5:            15px;
    --fs-h6:            13px;

    --lh-base:          1.6;    /* текст абзацами */
    --lh-tight:         1.25;   /* заголовки, плитки, кнопки */

    /* --- Вертикальный ритм ----------------------------------------------
       Шаг 4px: любые отступы берём отсюда, «на глаз» не подбираем. */

    --space-1:          4px;
    --space-2:          8px;
    --space-3:          12px;
    --space-4:          16px;
    --space-5:          24px;
    --space-6:          32px;
    --space-7:          48px;
    --space-8:          64px;

    /* --- Контейнер -------------------------------------------------------
       1170px — ширина bootstrap 3 по умолчанию и ровно та, под которую
       нарисован редизайн натамоды. Меняется одной строкой.

       ⚠ --layout-gutter трогать нельзя: 15px зашиты в сетку bootstrap
       (.row компенсирует их отрицательным margin). Другое число разъедет
       колонки на всех страницах разом. */

    /* Высота «крупного» элемента управления: кнопка «Купити» на карточке
       и поле количества рядом с ней. Одно число на оба — иначе они разъезжаются
       по высоте, как это и вышло сначала: поле брало общие для форм 36px,
       кнопка — свои 48. */
    --control-lg:       44px;

    --layout-max:       1170px;
    --layout-gutter:    15px;

    /* Листинг категории живёт во всю ширину окна (см. блок «Листинг
       категории: сетка»), но не бесконечно. Арифметика редизайна сходится
       ровно на 1920: четыре превью по 470 плюс пять промежутков по 8
       (два поля контейнера и три щели между плитками) = 1880 + 40 = 1920.
       Дальше картинка растягивалась бы выше своего размера и мылила. */
    --layout-max-listing: 1920px;

    /* Оформление заказа: ширина всего блока и ширина поля ввода.
       Переменные, а не литералы, потому что это решения о виде страницы,
       а у второго магазина они могут быть другими. Разовые отступы внутри
       блоков остаются числами: правило про переменные касается цветов
       и тех метрик, которые меняют осознанно. */
    --checkout-max:     760px;
    --field-max:        360px;
}

/* --------------------------------------------------------------------------
   Контейнер: было три ступеньки (750 / 970 / 1170), стало плавно до 1170.

   Bootstrap задаёт ширину медиазапросами, поэтому на окне 1000px страница
   упиралась в 970 и по бокам висели пустые поля. width: 100% + max-width
   даёт тот же максимум, но без ступенек. Специфичность у нас та же, что
   у bootstrap (.container), а файл подключён позже — поэтому перекрывает.
   -------------------------------------------------------------------------- */

.container {
    width: 100%;
    max-width: var(--layout-max);
    padding-left: var(--layout-gutter);
    padding-right: var(--layout-gutter);
}

/* --------------------------------------------------------------------------
   Базовый текст
   -------------------------------------------------------------------------- */

/* Фон страницы — светло-серый, а не белый. Так в редизайне (`body { background:
   #f9f9f9 }`), и на этом держится вся раскладка листинга: плитки товаров белые,
   и отделяются они от страницы фоном, а не рамкой. */
body {
    font-family: var(--font-sans);
    font-size: var(--fs-base);
    line-height: var(--lh-base);
    color: var(--c-text);
    background-color: var(--c-bg-soft);
}

h1, h2, h3, h4, h5, h6 {
    font-family: inherit;
    color: var(--c-text);
    line-height: var(--lh-tight);
    font-weight: 600;
    margin-top: 0;
}

h1 { font-size: var(--fs-h1); margin-bottom: var(--space-5); }
h2 { font-size: var(--fs-h2); margin-bottom: var(--space-4); }
h3 { font-size: var(--fs-h3); margin-bottom: var(--space-3); }
h4 { font-size: var(--fs-h4); margin-bottom: var(--space-3); }
h5 { font-size: var(--fs-h5); margin-bottom: var(--space-2); }
h6 { font-size: var(--fs-h6); margin-bottom: var(--space-2); }

/* Заголовку внутри текста нужен воздух сверху — но не первому в блоке. */
h2, h3 { margin-top: var(--space-6); }
h2:first-child, h3:first-child { margin-top: 0; }

p {
    margin: 0 0 var(--space-4);
}

ul, ol {
    margin: 0 0 var(--space-4);
    padding-left: var(--space-5);
}

/* Последний абзац блока не должен отталкивать рамку — описания товаров
   заканчиваются то <p>, то <ul>, и без этого низ блока прыгает. */
p:last-child,
ul:last-child,
ol:last-child {
    margin-bottom: 0;
}

small, .small {
    font-size: var(--fs-sm);
}

/* Дефолт уменьшает текст описаний и категорий до 13px — отменяем.
   Селектор повторён точь-в-точь: у него два id, меньшей специфичностью
   его не перебить. */
#product-category #content,
#product-product #tab-description,
#information-information #content {
    font-size: inherit;
}

a {
    color: var(--c-accent);
}

a:hover,
a:focus {
    color: var(--c-accent-hover);
}

/* Картинка не вылезает из своей колонки, даже без класса img-responsive. */
img {
    max-width: 100%;
    height: auto;
}

/* --------------------------------------------------------------------------
   Отступы секций
   -------------------------------------------------------------------------- */

#content {
    padding-bottom: var(--space-7);
}

footer {
    margin-top: var(--space-7);
    padding-top: var(--space-6);
    padding-bottom: var(--space-6);
}

/* Хлебные крошки — см. отдельный блок ниже (шаг 14): стрелки дефолта из
   повёрнутых квадратов пришлось убрать целиком, они не переносились на вторую
   строку и на телефоне выталкивали страницу за экран. */

/* --------------------------------------------------------------------------
   Формы

   Поля ввода набираем на размер мельче текста — так принято в плотных
   интерфейсах, и так уже сделано в bootstrap (14px).

   ⚠ Дефолтная тема сажает их на 12px длинным списком селекторов вида
   input[type="text"].form-control — перебить его коротким .form-control
   нельзя, специфичность ниже. Поэтому список повторён.

   ⚠ height: auto обязателен: bootstrap жёстко ставит .form-control высоту
   34px под свой 14px/1.43, и на мобильных 16px (см. ниже) текст обрезало бы.
   -------------------------------------------------------------------------- */

.form-control,
select.form-control,
textarea.form-control,
input[type="text"].form-control,
input[type="password"].form-control,
input[type="email"].form-control,
input[type="tel"].form-control,
input[type="number"].form-control,
input[type="search"].form-control,
input[type="url"].form-control,
input[type="date"].form-control {
    font-size: var(--fs-form);
    height: auto;
    min-height: 36px;
}

/* Приставка к полю (иконка, «грн») — дефолт держит её на 30px, поле стало
   36px, и они разъезжались по высоте. */
.input-group .input-group-addon {
    font-size: var(--fs-form);
    height: auto;
}

label {
    font-size: var(--fs-form);
    font-weight: 600;
    margin-bottom: var(--space-1);
}

/* --------------------------------------------------------------------------
   Мобильные

   Заголовки на 360px должны быть заметно меньше десктопных, иначе h1
   в три строки съедает первый экран.

   ⚠ Поля ввода наоборот вырастают до 16px — не ради красоты: Safari на iOS
   зумит страницу при фокусе в поле мельче 16px, и вернуть масштаб потом
   может только сам покупатель.
   -------------------------------------------------------------------------- */

@media (max-width: 767px) {
    :root {
        --fs-h1:   23px;
        --fs-h2:   20px;
        --fs-h3:   17px;
        --fs-form: 16px;
    }

    #content {
        padding-bottom: var(--space-6);
    }
}

/* --------------------------------------------------------------------------
   ИКОНКИ — шаг 4.

   Иконка вставляется пустым <span class="mz-icon mz-icon--phone">, а рисуется
   CSS-маской: файл задаёт форму, цвет берётся из currentColor. Поэтому иконка
   меняет цвет вместе с текстом (наведение, тёмная плашка) и не завязана
   на гамму — в самих .svg цвет не имеет значения вовсе.

   Почему не общий twig-шаблон с иконками: в ocStore шаблон рендерится
   через ArrayLoader, в котором лежит ровно один файл
   (`system/library/template/twig.php:31`). {% include %} и {% import %}
   не работают в принципе — общей разметки между шаблонами не бывает,
   общими могут быть только CSS-классы.

   Почему не Font Awesome, хотя он уже подключён: там сплошные глифы
   образца 2013 года, а редизайн натамоды нарисован тонкой линией.
   -------------------------------------------------------------------------- */

.mz-icon {
    display: inline-block;
    width: 20px;
    height: 20px;
    flex: none;
    background-color: currentColor;
    -webkit-mask: no-repeat center / contain;
            mask: no-repeat center / contain;
}

.mz-icon--search { -webkit-mask-image: url('../image/icon/search.svg'); mask-image: url('../image/icon/search.svg'); }
.mz-icon--phone  { -webkit-mask-image: url('../image/icon/phone.svg');  mask-image: url('../image/icon/phone.svg'); }
.mz-icon--user   { -webkit-mask-image: url('../image/icon/user.svg');   mask-image: url('../image/icon/user.svg'); }
.mz-icon--mail   { -webkit-mask-image: url('../image/icon/mail.svg');   mask-image: url('../image/icon/mail.svg'); }
.mz-icon--cart   { -webkit-mask-image: url('../image/icon/cart.svg');   mask-image: url('../image/icon/cart.svg'); }

/* --------------------------------------------------------------------------
   ШАПКА — шаг 4 (разметка и раскладка).

   Один этаж вместо двух: логотип — поиск — телефон — вход — корзина.
   Тонкая полоса #top дефолтной темы убрана из шаблона целиком, см. комментарий
   в header.twig.

   Раскладка на flex, а не на сетке bootstrap: колонки col-sm-* дают фиксированные
   доли, а нам нужно, чтобы поиск забирал всё свободное место при любой длине
   названия магазина и номера телефона.
   -------------------------------------------------------------------------- */

.mz-header {
    background-color: var(--c-bg);
    border-bottom: 1px solid var(--c-border);
    padding: var(--space-4) 0;
    margin-bottom: var(--space-5);
}

.mz-header__inner {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: var(--space-4) var(--space-5);
}

/* ⚠ Bootstrap вешает на `.container` клирфикс `::before`/`::after`
   (`content: " "; display: table`). В обычном блоке они невидимы, но
   `.mz-header__inner` — это ещё и flex-контейнер, а там псевдоэлементы
   становятся полноценными flex-элементами нулевой ширины и съедают
   по одному column-gap с каждой стороны.

   Наружу это вылезало так: логотип стоял на 16px правее поля поиска,
   а корзина — на 16px левее кнопки поиска. Найдено 2026-08-23 замером
   `getBoundingClientRect` (на глаз причину не видно вообще: разметка
   и отступы правильные, лишние элементы в вёрстке отсутствуют). */
.mz-header__inner::before,
.mz-header__inner::after {
    display: none;
}

/* Витрина одноязычная, `common/language.twig` ничего не рисует — но сам блок
   остаётся flex-элементом и добавляет свой gap справа от корзины (ещё 4px
   к тем 16). Прячем именно пустой: появится `/ru/` — вернётся сам. */
.mz-header__lang:empty {
    display: none;
}

/* ⚠ `flex: 1 1 0`, а НЕ `flex: none` и не `0 1 auto`. База именно НОЛЬ,
   и это главное.

   Раньше стояло `none`: логотип не сжимался ни при какой тесноте и на узком
   экране выталкивал панель значков на вторую строку — шапка вставала
   в три этажа.

   ⚠ Промежуточная попытка `0 1 auto; min-width: 0` НЕ помогла, и это стоит
   помнить: при `flex-wrap: wrap` браузер сначала решает, что переносить,
   и только потом сжимает то, что осталось на строке. Пока база элемента
   равна его содержимому, он участвует в решении о переносе своей полной
   шириной — и выталкивает соседа, вместо того чтобы ужаться.

   База 0 убирает логотип из этого расчёта совсем: перенос считается
   по одной панели значков, а логотип потом занимает остаток строки.
   Картинка внутри упирается в потолок высоты, а на тесных экранах
   уменьшается вместе с остатком. */
.mz-header__logo {
    flex: 1 1 0;
    min-width: 0;
}

/* ⚠ Ссылка обязана быть блочной: `max-width: 100%` у картинки считается
   от ширины РОДИТЕЛЯ, а строчный `<a>` шириной не управляет — картинка
   мерила бы себя от чего угодно и не ужималась. */
.mz-header__logo a {
    display: block;
    max-width: 100%;
}

.mz-header__logo img {
    max-height: 44px;
    max-width: 100%;
    width: auto;
}

/* Текстовый логотип — пока не выбрано название магазина. */
.mz-logo {
    display: inline-block;
    font-size: 22px;
    font-weight: 700;
    line-height: var(--lh-tight);
    color: var(--c-text);
    white-space: nowrap;
}

.mz-logo:hover,
.mz-logo:focus {
    color: var(--c-accent);
}

/* Поиск забирает остаток строки, но не сжимается уже 220px. */
.mz-header__search {
    flex: 1 1 220px;
    min-width: 220px;
}

.mz-header__actions {
    display: flex;
    align-items: center;
    gap: var(--space-4);
    margin-left: auto;
}

/* ⚠️ Обёртка меню аккаунта — блочная (`.dropdown` от bootstrap), и ссылка
   внутри неё сидит на базовой линии строки: высота блока выходила 26px против
   20px у самой ссылки, а лишние 6px висели снизу. В ряду шапки блоки
   центрируются по своей высоте, поэтому «Авторизація» оказывалась на 3px выше
   почты — при одинаковых шрифтах и одинаковом `align-items: center`.
   Выпадающее меню внутри позиционировано абсолютно, из потока выпадает,
   поэтому flex ему не мешает. */
.mz-header__account {
    display: flex;
    align-items: center;
}

.mz-header__phone,
.mz-header__action {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    color: var(--c-text);
    white-space: nowrap;
}

.mz-header__phone:hover,
.mz-header__phone:focus,
.mz-header__action:hover,
.mz-header__action:focus {
    color: var(--c-accent);
    text-decoration: none;
}

.mz-header__action-label {
    font-size: var(--fs-sm);
}

.mz-header__cart {
    min-width: 170px;
}

/* Дефолтная тема вешает на эти блоки нижний отступ 10px — в строке на flex
   он сдвигал бы всё вверх относительно центра. */
#logo,
#search,
#cart {
    margin-bottom: 0;
}

/* Кнопка корзины: дефолт рисует её как btn-inverse — тёмный градиент bootstrap.
   Полная отделка шапки идёт шагом 5, здесь достаточно убрать градиент,
   чтобы кнопка не спорила с остальной строкой. */
/* ⚠ Корзина осталась ЗАЛИТОЙ, скруглена только форма. Это единственное
   цветное пятно в шапке, и так и задумано: поиск ушёл в тон, а дорога
   к оформлению заказа должна оставаться заметной.

   ⚠ Тем и отличаемся от svitbra, где залитого нет вовсе и непустая корзина
   ничем не выделяется. Здесь эта беда не возникает. */
/* ⚠ Геометрия корзины (скругление, высота, отступы) живёт НЕ здесь,
   а в блоке «Шапка: отделка» ниже по файлу: там правило более специфичное
   (`#cart > .btn.btn-lg`) и стоит позже. Здесь только цвет и типографика.
   Первая попытка поставить капсулу в этом блоке ничего не дала —
   скругление молча перебивалось. */
#cart > .btn {
    background-color: var(--c-accent);
    background-image: none;
    border: 0;
    box-shadow: none;
    color: var(--c-text-inverse);
    font-size: var(--fs-form);
    line-height: var(--lh-tight);
    padding: 10px 14px;
    text-shadow: none;
}

#cart > .btn:hover,
#cart > .btn:focus,
#cart.open > .btn {
    background-color: var(--c-accent-hover);
    background-image: none;
    color: var(--c-text-inverse);
    border: 0;
    box-shadow: none;
}

/* --- Шапка на узком экране ------------------------------------------------
   Полноценная мобильная шапка (бургер, поиск отдельной строкой) — шаг 6.
   Здесь только то, что не даёт ей рассыпаться прямо сейчас: строка
   переносится, поиск занимает всю ширину, номер телефона прячется
   за иконку. */

@media (max-width: 767px) {
    .mz-header__inner {
        gap: var(--space-3);
    }

    .mz-header__search {
        order: 3;
        flex: 1 1 100%;
        min-width: 0;
    }

    .mz-header__phone-number,
    .mz-header__action-label {
        display: none;
    }

    .mz-header__cart {
        min-width: 0;
    }
}

/* --------------------------------------------------------------------------
   ШАПКА: отделка — шаг 5.

   Источник — секция «top» из `stylesheet_natamoda.css` (строки 126–202),
   но переложена, а не скопирована: там стили писались под другую разметку
   (.white, .headfix, плавающая корзина, обратный звонок, режим работы,
   мессенджеры). Взято то, что относится к внешнему виду, а не к чужим блокам:

   • белая шапка с тонкой тенью вместо жирной рамки;
   • поиск — светло-серое поле, кнопка сплошным вторым акцентом;
   • подписи действий мелкими капсами, номер телефона крупнее и жирнее;
   • счётчик корзины — плашка акцентного цвета.
   -------------------------------------------------------------------------- */

.mz-header {
    box-shadow: var(--shadow-header);
}

/* --- Поиск ---------------------------------------------------------------
   Дефолт рисует поле и кнопку как обычную bootstrap-группу с рамками и
   градиентом. У натамоды поле «утоплено» в серый, а кнопка — сплошной
   цветной квадрат без рамки. */

/* ⚠ Поиск здесь — КАПСУЛА в тон, а не прямоугольник с залитой кнопкой
   (решение владельца 2026-08-30).

   Причина в знаке: «Статна» написана от руки, сплошными скруглёнными
   росчерками. Прямой угол рядом с такой строкой спорит с ней, а два
   тёмно-розовых прямоугольника подряд — поиск и корзина — читались
   как два одинаковых по важности пятна, хотя действие тут одно.

   ⚠ Заливка `--c-accent-soft` — это `#faeff0`, взятый побайтово
   из подложки фирменной иконки. То есть поле окрашено ровно тем же,
   чем плашка знака, а не «похожим розовым».

   ⚠ Залитым осталось ОДНО пятно — корзина. Она единственная ведёт
   к оформлению заказа, и пусть будет единственной заметной.

   ⚠ У svitbra поиск устроен иначе — линией-подчёркиванием. Не копируем
   одно в другое намеренно: там монохромная антиква, здесь рукописная роза,
   и магазины должны отличаться не только цветом. */
#search .form-control,
#search .input-lg {
    height: 42px;
    padding: 0 0 0 18px;
    font-size: var(--fs-form);
    line-height: 42px;
    background-color: var(--c-accent-soft);
    border: 0;
    border-radius: 999px 0 0 999px;
    box-shadow: none;
}

/* ⚠ Фокус показываем кольцом на ВСЕЙ группе, а не рамкой на поле:
   поле и кнопка — два соседних элемента одной капсулы, и рамка на одном
   из них разрезала бы её пополам. `:focus-within` срабатывает и когда
   курсор в поле, и когда фокус ушёл на кнопку. */
#search .form-control:focus {
    background-color: var(--c-bg);
    box-shadow: none;
}

#search:focus-within {
    border-radius: 999px;
    box-shadow: 0 0 0 1px var(--c-accent);
}

#search:focus-within .form-control,
#search:focus-within .btn {
    background-color: var(--c-bg);
}

/* ⚠ Кнопка поиска красится основным акцентом, тем же, что «Купити».
   Сначала здесь стоял второй акцент — так у натамоды: у них кнопка поиска
   сливовая (#814275), а кнопки покупки синие (#597AB2), то есть два цвета
   по разным ролям. В нашей нейтральной заглушке-палитре это читалось просто
   как несогласованность. Второй акцент остался там, где он несёт смысл:
   цена по акции и обводка фокуса. */
/* Кнопка — правый край той же капсулы: та же заливка, значок акцентом.
   Своей тёмной заливки у неё больше нет, поэтому и ширина меньше 52:
   добирать площадь под палец здесь нечем, а лишняя ширина отодвигала бы
   значок от текста. */
#search .btn,
#search .btn-lg {
    width: 46px;
    height: 42px;
    padding: 0;
    border: 0;
    border-radius: 0 999px 999px 0;
    background-color: var(--c-accent-soft);
    background-image: none;
    color: var(--c-accent);
    box-shadow: none;
    text-shadow: none;
}

#search .btn:hover,
#search .btn:focus,
#search .btn-lg:hover,
#search .btn-lg:focus {
    background-color: var(--c-accent-soft);
    color: var(--c-accent-hover);
    color: var(--c-text-inverse);
}

/* Иконка внутри кнопки — своя, вместо Font Awesome. Сам <i class="fa">
   остаётся в разметке: шаблон поиска мы не копировали (к нему привязан
   штатный JS), поэтому глиф просто прячем. */
#search .btn .fa {
    display: none;
}

#search .btn::before {
    content: '';
    display: inline-block;
    width: 22px;
    height: 22px;
    vertical-align: middle;
    background-color: currentColor;
    -webkit-mask: url('../image/icon/search.svg') no-repeat center / contain;
            mask: url('../image/icon/search.svg') no-repeat center / contain;
}

/* --- Телефон и вход ------------------------------------------------------ */

/* Метрики те же, что у ссылки авторизации рядом (`.mz-header__action-label`).
   Было 17px полужирным против её 12px обычных — почта выглядела крупнее
   и сидела на другой высоте: при `align-items: center` центры строк совпадают,
   а базовые линии у разных кеглей расходятся, и глаз видит ступеньку.
   Решение владельца 2026-08-26: «пусть всё будет как авторизация».
   ⚠️ Кроме капса и разрядки: адрес почты набирают как есть, uppercase
   исказил бы его, а `letter-spacing` мешает читать строчные. */
.mz-header__phone-number {
    font-size: var(--fs-xs);
    line-height: var(--lh-tight);
}

.mz-header__action-label {
    font-size: var(--fs-xs);
    text-transform: uppercase;
    letter-spacing: .04em;
    line-height: var(--lh-tight);
}

/* --- Корзина -------------------------------------------------------------
   Кнопка той же высоты, что поиск, со своей иконкой и счётчиком-плашкой. */

.mz-header__cart {
    min-width: 0;
}

/* ⚠ Здесь и решается форма корзины — это правило специфичнее и позже
   того, что задаёт ей цвет. Скругление 999px делает капсулу под стать
   рукописному знаку и капсуле поиска рядом; на узком экране, где ширина
   становится 52px, та же строчка даёт круг. */
#cart > .btn,
#cart > .btn.btn-lg {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    width: auto;
    height: 42px;
    padding: 0 var(--space-5);
    border-radius: 999px;
    font-size: var(--fs-sm);
}

#cart > .btn .fa {
    display: none;
}

#cart > .btn::before {
    content: '';
    display: inline-block;
    width: 20px;
    height: 20px;
    flex: none;
    background-color: currentColor;
    -webkit-mask: url('../image/icon/cart.svg') no-repeat center / contain;
            mask: url('../image/icon/cart.svg') no-repeat center / contain;
}

#cart-total {
    white-space: nowrap;
}

/* Выпадающая корзина: дефолт растягивает её по ширине кнопки, а кнопка теперь
   узкая — списку товаров нужно своё пространство. */
#cart .dropdown-menu {
    min-width: 300px;
    border-radius: 0;
    border-color: var(--c-border);
}

/* Ссылки в выпадающей корзине разнесены по краям: «Переглянути кошик»
   слева, «Оформити замовлення» справа (решение владельца 2026-08-27).
   В дефолтном шаблоне у абзаца стоит bootstrap-класс `text-right`,
   и обе ссылки слипались в один ком у правого края.

   ⚠ Правим стилем, а не копией шаблона: ради одной строки
   в `common/cart.twig` пришлось бы завести в теме весь файл, а каждая
   лишняя копия не обновится при апдейте движка (наследование пофайловое).

   ⚠ Между ссылками в разметке стоят три `&nbsp;`. Во flex-контейнере они
   становятся отдельным анонимным элементом, поэтому `space-between`
   разводит именно ссылки по краям, а пробелы остаются посередине
   и не видны. Убирать их из шаблона не нужно. */
#cart .dropdown-menu p.text-right {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: var(--space-3);

    /* ⚠ Нижний отступ обязателен: без него ссылки прилипают к рамке
       выпадашки. Первая редакция гасила его `margin-bottom: 0` — заметил
       владелец. */
    margin: var(--space-2) 0 var(--space-3);
}

/* --- Выпадающие меню -----------------------------------------------------
   Дефолт красит пункт при наведении синим градиентом bootstrap — это цвет
   заводской темы, к нашей гамме отношения не имеющий. */

.dropdown-menu {
    border-radius: 0;
    border-color: var(--c-border);
    box-shadow: var(--shadow-menu);
}

.dropdown-menu li > a {
    padding: var(--space-2) var(--space-4);
    color: var(--c-text);
}

.dropdown-menu li > a:hover,
.dropdown-menu li > a:focus {
    background-color: var(--c-accent-soft);
    background-image: none;
    color: var(--c-accent-hover);
}

@media (max-width: 767px) {
    #cart .dropdown-menu {
        min-width: 0;
        width: 100%;
    }
}

/* --------------------------------------------------------------------------
   ШАПКА НА УЗКОМ ЭКРАНЕ — шаг 6.

   Шапка сжимается тремя ступенями, а не одной: между 1170 и 360 текста в ней
   ровно столько, что он перестаёт помещаться задолго до телефонной ширины.
   Порядок отказа от лишнего выбран по ценности: первой уходит подпись «Вхід»
   (иконка человечка понятна и без неё), потом номер телефона и состав корзины,
   и только на телефоне поиск переезжает на отдельную строку.

       ≥ 1200   логотип · поиск · телефон с номером · вход с подписью · корзина с суммой
       992-1199 то же, но у входа только иконка
       768-991  телефон и корзина тоже сворачиваются в иконки
       < 768    иконки в одну строку с логотипом, поиск — строкой ниже

   ⚠ Бургера в шапке нет намеренно. Категорий всего две («Бюстгальтери»,
   «Трусики»), и на 360px они помещаются в строку меню целиком — прятать их
   за кнопку значит добавить лишнее нажатие на ровном месте. Появится третий
   уровень или десяток категорий — вернуться к вопросу в шаге 7, где живёт меню.
   -------------------------------------------------------------------------- */

@media (max-width: 1199px) {
    .mz-header__action-label {
        display: none;
    }
}

@media (max-width: 991px) {
    .mz-header__inner {
        gap: var(--space-3) var(--space-4);
    }

    .mz-header__phone-number {
        display: none;
    }

    /* Корзина превращается в квадратную кнопку с одной иконкой.
       ⚠ Состав («Товарів: 0 (0.00 грн.)») при этом теряется целиком, а не
       сокращается до числа: контроллер отдаёт это одной готовой строкой
       (`common/cart.php`, sprintf по text_items), отдельного счётчика в данных
       шаблона нет. Разделить их можно только правкой контроллера — не в этом
       шаге и не ради мобильной шапки. */
    #cart-total {
        display: none;
    }

    /* ⚠ Связка с кнопкой поиска РАЗОРВАНА 2026-08-30. Раньше здесь стояло
       «ширина ровно как у `#search .btn`, 52px»: обе кнопки были залиты одним
       цветом, вставали друг под другом у правого края, и разная ширина
       читалась бы как недосмотр. Теперь кнопка поиска — часть светлой
       капсулы, залита только корзина, пары больше нет.

       52px остаётся собственным размером корзины: со скруглением 999px
       она превращается в аккуратный круг 52x42. Менять `#search .btn`
       можно свободно, сюда это больше не тянется. */
    #cart > .btn,
    #cart > .btn.btn-lg {
        width: 52px;
        padding: 0;
        justify-content: center;
    }
}

@media (max-width: 767px) {
    .mz-header {
        padding: var(--space-3) 0;
        margin-bottom: var(--space-4);
    }

    .mz-logo {
        font-size: 18px;
    }

    /* ⚠ Дыра между знаком и значками закрывается ЗНАКОМ, а не разгоном
       значков (решение владельца 2026-08-30, после снимков).

       На узком экране первая строка — это логотип и три значка, а поиск
       уходит на вторую. Логотип в 44px занимал меньше трети ширины,
       значки жались к правому краю, и между ними зияло около 130px пустоты.

       Разгонять значки по остатку (`justify-content: space-between`)
       пробовали и отклонили: три значка — это одна панель действий,
       и разнесённые по ширине они читаются как не связанные между собой,
       а корзина теряет соседство с остальными. Дыра при этом никуда
       не девается, просто дробится на три.

       Логотип на 52px съедает пустоту сам и заодно перестаёт теряться:
       на телефоне знак и так был непропорционально мелким.

       ⚠ Промежуток между значками — 12px, а не 4: четырёх пикселей мало
       пальцу, соседние цели слипаются. То же число стоит в мобильной
       шапке svitbra. */
    /* ⚠ 52px здесь — ПОТОЛОК, а не фиксированный размер. Пока места хватает,
       знак закрывает пустоту собой; когда экран уже, он сжимается вместе
       с местом и остаётся в строке со значками.

       ⚠ Первая редакция ставила 52px при `flex: none` у контейнера,
       и на ширине чуть меньше 430 значки уезжали на вторую строку —
       шапка вставала в три этажа. Проверено было ровно на одной ширине;
       правило теперь проверяется по диапазону 320-767. */
    .mz-header__logo img {
        max-height: 52px;
    }

    .mz-header__actions {
        gap: var(--space-3);
    }

    /* Пальцу нужна цель не меньше 40px, а иконка сама по себе 20px —
       добираем отступами вокруг. */
    .mz-header__phone,
    .mz-header__action {
        padding: var(--space-2);
    }

    /* ⚠ Здесь были правила, уменьшавшие поиск на мобильном до 40px высоты
       и 44px ширины кнопки. Они не работали никогда: `.mz-header__search .btn`
       это (0,2,0), а выше по файлу стоит `#search .btn` — (1,1,0), и id
       перебивает класс независимо от порядка и медиазапроса. Замер на 402
       показывал 52×42, то есть десктопные числа.

       Убраны, а не починены: одинаковый размер поиска на всех ширинах и есть
       то, что нужно, а кнопка корзины теперь подогнана под него. Правило,
       которое врёт о результате, хуже отсутствующего. */
}

/* --------------------------------------------------------------------------
   МЕНЮ КАТЕГОРИЙ — шаг 7, переделано 2026-08-31 (шаг 3 EXPANSION.md).

   Дефолт рисует его синей плашкой с градиентом — заводским цветом ocStore.
   У натамоды меню, наоборот, белое: тонкая линия сверху и мелкие капсы
   (`#menu`, строки 286–303 их CSS). Берём этот вид — он не спорит с товаром,
   а на странице каталога главное всё-таки товар.

   Своя разметка (`common/menu.twig`) вместо `.navbar`: bootstrap-навбар тянет
   за собой свою отделку, а нам от него нужны были только выпадающие списки
   и сворачивание на телефоне — и то и другое здесь сделано двумя десятками
   строк CSS.

   ⚠ Две несущие вещи, которые легко сломать по отдельности:

   • ДЕСКТОП — панель выпадает ПО НАВЕДЕНИЮ (`:hover`), плюс `:focus-within`
     ради клавиатуры. Ни одной строки JS здесь не участвует. Так же сделано
     и в редизайне натамоды (`mouseover` + `slideDown`);
   • ТЕЛЕФОН — строка ссылок сворачивается в кнопку, панель ВЫЕЗЖАЕТ СЛЕВА.
     Решение владельца 2026-08-31, «как в нтест». У натамоды это делал
     сторонний jquery.mmenu (35 КБ JS + 44 КБ CSS, написан под jQuery 2);
     здесь панель целиком на CSS, а скрипт в шаблоне только ставит `is-open`.

   ⚠ Порог ровно один — 767px. В этом файле есть и вторая мобильная ступень,
   991px, и лежит она НИЖЕ по файлу: ставя что-то для меню в блоке 767,
   проверяй, не перекрывает ли его блок 991. Меню в 991 не упоминается вовсе,
   и пусть так и остаётся.
   -------------------------------------------------------------------------- */

.mz-menu {
    background-color: var(--c-bg);
    border-bottom: 1px solid var(--c-border);
    margin-bottom: var(--space-5);
}

.mz-menu__list {
    display: flex;
    flex-wrap: wrap;
    margin: 0;
    padding: 0;
    list-style: none;
}

.mz-menu__link {
    display: block;
    padding: var(--space-3) 0;
    margin-right: var(--space-6);
    font-size: var(--fs-sm);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--c-text-muted);
    border-bottom: 2px solid transparent;
}

.mz-menu__link:hover,
.mz-menu__link:focus {
    color: var(--c-text);
    border-bottom-color: var(--c-accent);
    text-decoration: none;
}

/* ⚠ Подсветки текущей категории нет: контроллер меню не передаёт в шаблон,
   какая страница открыта, а сравнивать href с адресом страницы в twig не с чем
   (`common/menu.php` отдаёт только список категорий). Понадобится — это
   правка контроллера, а не шаблона. */

.mz-menu__sub {
    margin: 0;
    padding: 0;
    list-style: none;
}

.mz-menu__sublink {
    display: block;
    font-size: var(--fs-sm);
    color: var(--c-text-muted);
}

.mz-menu__sublink:hover,
.mz-menu__sublink:focus {
    color: var(--c-text);
    background-color: var(--c-bg-soft);
    text-decoration: none;
}

/* --------------------------- десктоп: наведение --------------------------- */

@media (min-width: 768px) {

    /* Всё, что нужно только телефону, здесь не существует. */
    .mz-menu__burger,
    .mz-menu__panel-head,
    .mz-menu__expander,
    .mz-menu__shade {
        display: none;
    }

    .mz-menu__item {
        position: relative;
    }

    /* ⚠ `top: 100%` — это низ пункта, а он совпадает с низом полосы меню.
       Зазора между ссылкой и панелью не возникает, и наведение не срывается
       при переходе мышью вниз. Появится вертикальный отступ у пункта —
       зазор появится вместе с ним, и меню начнёт моргать. */
    .mz-menu__sub {
        position: absolute;
        z-index: 30;
        top: 100%;
        left: 0;
        min-width: 232px;
        padding: var(--space-2) 0;
        background-color: var(--c-bg);
        border: 1px solid var(--c-border);
        border-top: 0;
        box-shadow: var(--shadow-menu);
        opacity: 0;
        visibility: hidden;
        transition: opacity .12s ease;
    }

    .mz-menu__item--parent:hover .mz-menu__sub,
    .mz-menu__item--parent:focus-within .mz-menu__sub {
        opacity: 1;
        visibility: visible;
    }

    .mz-menu__sublink {
        padding: var(--space-2) var(--space-4);
    }
}

/* ------------------------- телефон: выезжающее меню ----------------------- */

@media (max-width: 767px) {

    .mz-menu {
        margin-bottom: var(--space-4);
    }

    /* Замок прокрутки страницы под открытой панелью. У натамоды был свой,
       такой же по смыслу (`html.open, html.open body { overflow: hidden }`). */
    html.mz-menu-open,
    html.mz-menu-open body {
        overflow: hidden;
    }

    .mz-menu__burger {
        display: inline-flex;
        align-items: center;
        gap: var(--space-3);
        padding: var(--space-3) 0;
        background: none;
        border: 0;
        font-family: inherit;
        font-size: var(--fs-sm);
        font-weight: 600;
        text-transform: uppercase;
        letter-spacing: .04em;
        color: var(--c-text-muted);
    }

    .mz-menu__burger:hover,
    .mz-menu__burger:focus {
        color: var(--c-text);
    }

    .mz-menu__bars,
    .mz-menu__bars::before,
    .mz-menu__bars::after {
        display: block;
        width: 18px;
        height: 2px;
        background-color: currentColor;
    }

    .mz-menu__bars {
        position: relative;
    }

    .mz-menu__bars::before,
    .mz-menu__bars::after {
        content: '';
        position: absolute;
        left: 0;
    }

    .mz-menu__bars::before { top: -6px; }
    .mz-menu__bars::after  { top: 6px; }

    /* ⚠ Панель и затемнение прячутся через `visibility`, а не `display`:
       у `display` нет промежуточных состояний, и выезд не анимировался бы
       вовсе. Задержка `visibility 0s linear .22s` при закрытии держит панель
       видимой ровно столько, сколько едет `transform`. */
    .mz-menu__panel {
        position: fixed;
        z-index: 1050;
        top: 0;
        left: 0;
        bottom: 0;
        width: 82%;
        max-width: 320px;
        background-color: var(--c-bg);
        box-shadow: var(--shadow-menu);
        overflow-y: auto;
        visibility: hidden;
        transform: translateX(-100%);
        transition: transform .22s ease, visibility 0s linear .22s;
    }

    .mz-menu.is-open .mz-menu__panel {
        visibility: visible;
        transform: none;
        transition: transform .22s ease, visibility 0s;
    }

    .mz-menu__shade {
        position: fixed;
        z-index: 1040;
        top: 0;
        right: 0;
        bottom: 0;
        left: 0;
        background-color: rgba(42, 35, 38, .45);
        opacity: 0;
        visibility: hidden;
        transition: opacity .22s ease, visibility 0s linear .22s;
    }

    .mz-menu.is-open .mz-menu__shade {
        opacity: 1;
        visibility: visible;
        transition: opacity .22s ease, visibility 0s;
    }

    .mz-menu__panel-head {
        display: flex;
        align-items: center;
        justify-content: space-between;
        padding: var(--space-3) var(--space-4);
        border-bottom: 1px solid var(--c-border);
    }

    .mz-menu__panel-title {
        font-size: var(--fs-sm);
        font-weight: 600;
        text-transform: uppercase;
        letter-spacing: .04em;
        color: var(--c-text);
    }

    .mz-menu__close {
        position: relative;
        width: 32px;
        height: 32px;
        padding: 0;
        background: none;
        border: 0;
        color: var(--c-text-muted);
    }

    .mz-menu__close::before,
    .mz-menu__close::after {
        content: '';
        position: absolute;
        top: 15px;
        left: 7px;
        width: 18px;
        height: 2px;
        background-color: currentColor;
    }

    .mz-menu__close::before { transform: rotate(45deg); }
    .mz-menu__close::after  { transform: rotate(-45deg); }

    .mz-menu__list {
        display: block;
    }

    /* ⚠ Строка пункта собрана флексом, а кнопка раскрытия НЕ позиционируется
       абсолютно. Абсолютной ей пришлось бы задать высоту числом, а число
       разъехалось бы с высотой строки при первой же правке шрифта; так она
       тянется по строке сама. Подкатегории берут всю ширину и падают вниз. */
    .mz-menu__item {
        display: flex;
        flex-wrap: wrap;
        border-bottom: 1px solid var(--c-border);
    }

    .mz-menu__link {
        flex: 1 1 auto;
        margin-right: 0;
        padding: var(--space-4);
        border-bottom: 0;
        color: var(--c-text);
    }

    .mz-menu__link:hover,
    .mz-menu__link:focus {
        border-bottom-color: transparent;
        background-color: var(--c-bg-soft);
    }

    .mz-menu__expander {
        position: relative;
        flex: 0 0 56px;
        padding: 0;
        background: none;
        border: 0;
        border-left: 1px solid var(--c-border);
        color: var(--c-text-muted);
    }

    .mz-menu__expander::before {
        content: '';
        position: absolute;
        top: 50%;
        left: 50%;
        width: 8px;
        height: 8px;
        border-right: 2px solid currentColor;
        border-bottom: 2px solid currentColor;
        transform: translate(-50%, -70%) rotate(45deg);
        transition: transform .18s ease;
    }

    .mz-menu__item.is-expanded .mz-menu__expander::before {
        transform: translate(-50%, -30%) rotate(225deg);
    }

    .mz-menu__sub {
        flex: 0 0 100%;
        display: none;
        background-color: var(--c-bg-soft);
        border-top: 1px solid var(--c-border);
    }

    .mz-menu__item.is-expanded .mz-menu__sub {
        display: block;
    }

    .mz-menu__sublink {
        padding: var(--space-3) var(--space-4) var(--space-3) var(--space-6);
    }
}

/* --------------------------------------------------------------------------
   ПОДВАЛ — шаг 8.

   Дефолт красит подвал в тёмно-серый #303030 — тяжёлая плита под лёгкой
   светлой страницей. У натамоды подвал белый с тонкой линией сверху
   (`footer`, строка 314 их CSS), и это честнее: подвал — служебная зона,
   а не второй по важности блок страницы.
   -------------------------------------------------------------------------- */

.mz-footer {
    background-color: var(--c-bg);
    border-top: 1px solid var(--c-border);
    color: var(--c-text);
    margin-top: var(--space-8);
    padding: var(--space-7) 0 var(--space-6);
}

.mz-footer__title {
    font-size: var(--fs-sm);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--c-text);
    margin-bottom: var(--space-3);
}

.mz-footer__list {
    margin: 0;
    font-size: var(--fs-sm);
}

.mz-footer__list li + li {
    margin-top: var(--space-2);
}

.mz-footer__list a {
    color: var(--c-text-muted);
}

.mz-footer__list a:hover,
.mz-footer__list a:focus {
    color: var(--c-accent);
    text-decoration: underline;
}

.mz-footer__copy {
    margin: var(--space-6) 0 0;
    padding-top: var(--space-4);
    border-top: 1px solid var(--c-border);
    font-size: var(--fs-sm);
    color: var(--c-text-muted);
}

@media (max-width: 767px) {
    .mz-footer {
        margin-top: var(--space-6);
        padding: var(--space-6) 0 var(--space-5);
    }

    /* На телефоне колонки идут одна под другой — им нужен воздух между собой. */
    .mz-footer__cols > [class^="col-"] + [class^="col-"] {
        margin-top: var(--space-5);
    }
}

/* --------------------------------------------------------------------------
   ЛИСТИНГ КАТЕГОРИИ: сетка — шаг 10.

   Число колонок задаётся здесь, а не классами на плитке: у дефолта на каждом
   товаре висело `col-lg-3 col-md-4 col-sm-6`, и любое изменение сетки означало
   правку шаблона. CSS grid держит это в одном месте.

       ≥ 1200   4 в ряд
       992-1199 3
       768-991  2
       < 768    2 (плитка 165px на 360-м экране — читается)
   -------------------------------------------------------------------------- */

/* ⚠ Числа литеральные, из редизайна, и оба были прочитаны неверно до 2026-08-23.
   Ошибка одна и та же: бралось общее правило bootstrap, а не то, которым
   редизайн его перекрывает на странице категории.

       было 30px по горизонтали — это гуттер bootstrap (два поля по 15px);
       на самом деле `#product-category .product-layout { padding: 0 4px !important }`
       плюс `#product-category .products { padding: 0 4px }`, то есть
       4 + 4 = **8px между изображениями**;

       было 10px по вертикали — это общее `.product-layout { margin-bottom: 10px }`
       (строка 453 исходника); на странице категории оно перекрыто
       `#product-category .product-layout { margin-bottom: 20px }` (строка 1729).

   В bootstrap промежуток набирается полями соседних ячеек, у CSS grid — это
   сам `gap`, поэтому 4 + 4 записываются одним числом 8. Поля контейнера
   при этом тоже 8 (4 от `.products` + 4 от ячейки) — см.
   `#product-category.container-fluid` ниже. */
.mz-products {
    display: grid;
    /* ⚠ minmax(0, 1fr), а не 1fr: у грид-ячейки минимальная ширина по умолчанию
       равна min-content, и на 360px плитка распирала ряд шире окна
       (замер: документ 391 при окне 360). Ноль снимает этот минимум. */
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 20px 8px;
    margin-bottom: var(--space-6);
}

/* Четыре в ряд держатся до 992 — это `col-md-3` натамоды. Ниже 992 у них
   `col-sm-6`, то есть две; на телефоне у них одна, но мы оставляем две
   (решение владельца по плану: «1-2 на телефоне»). */
@media (max-width: 991px) {
    .mz-products { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* Страница категории — единственная во всю ширину окна. Ограничение
   сверху — чтобы превью 470px не растягивалось.

   ⚠ Поля здесь 8px, а не общие --layout-gutter (15px): в редизайне
   `#product-category .products` гасит родительские 15px отрицательными
   margin'ами и ставит свои `padding: 0 4px`, к которым добавляются 4px
   ячейки. От края окна до картинки — 8px, ровно как между картинками. */
#product-category.container-fluid {
    max-width: var(--layout-max-listing);
    margin: 0 auto;
    padding-left: 8px;
    padding-right: 8px;
}

/* --- Панель сортировки --------------------------------------------------- */

.mz-toolbar {
    display: flex;
    flex-wrap: wrap;
    justify-content: flex-end;
    gap: var(--space-3) var(--space-5);
    margin-bottom: var(--space-5);
    padding-bottom: var(--space-4);
    border-bottom: 1px solid var(--c-border);
}

.mz-toolbar__field {
    display: flex;
    align-items: center;
    gap: var(--space-2);
}

.mz-toolbar__label {
    margin: 0;
    font-size: var(--fs-sm);
    font-weight: 400;
    color: var(--c-text-muted);
    white-space: nowrap;
}

.mz-toolbar__field .form-control {
    width: auto;
    border-radius: 0;
}

/* --- Описание категории и подкатегории ----------------------------------- */

/* Описание категории лежит под товарами и в обычном контейнере — см. шаблон. */
.mz-category__text,
.mz-brand__text {
    margin-top: var(--space-7);
    color: var(--c-text-muted);
}

.mz-category__text h2,
.mz-category__text h3,
.mz-brand__text h2,
.mz-brand__text h3 {
    color: var(--c-text);
}

/* --- страница бренда -------------------------------------------------------
   Разметка листинга у неё общая с категорией (.mz-products / .mz-product),
   поэтому здесь только шапка с логотипом и текст под товарами.

   ⚠ Текст бренда переиспользует правила текста категории: это один и тот же
   блок «читаемая простыня под листингом», и разводить их значило бы держать
   две одинаковые копии, которые разойдутся при первой же правке. */
.mz-brand__head {
    display: flex;
    align-items: center;
    gap: var(--space-4);
    margin-bottom: var(--space-5);
}

.mz-brand__head h1 {
    margin: 0;
}

/* Логотипы у брендов разной пропорции — от вытянутых до почти квадратных,
   поэтому ограничена ВЫСОТА, а ширина считается сама. */
.mz-brand__logo {
    height: 48px;
    width: auto;
    flex: none;
}

@media (max-width: 767px) {
    .mz-brand__head {
        gap: var(--space-3);
    }

    .mz-brand__logo {
        height: 36px;
    }
}

.mz-subcats {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-3);
    margin: 0 0 var(--space-5);
    padding: 0;
    list-style: none;
}

/* ⚠ Значок и подпись живут в ОДНОЙ ссылке, а не рядом: подкатегория —
   одна цель, и промахнуться мимо неё, попав между картинкой и словом,
   покупатель не должен. Отсюда и flex здесь, а не на `li`. */
.mz-subcats a {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    /* ⚠ Ширина ОДНА НА ВСЕХ, а не по длине подписи. Замер до правки дал
       176, 224, 225 и 267 — разброс в 91 пиксель, и строка плашек читалась
       как случайная. 300 взято по самой длинной подписи (181px в одну
       строку) с запасом на счётчик товаров: «(0)» станет «(16)».

       ⚠ Подпись длиннее — перенесётся на вторую строку, и это ничего
       не стоит: высоту плашки задаёт картинка (112), две строки по 13px
       в неё помещаются. Поэтому `nowrap` здесь не нужен. */
    width: 300px;
    padding-right: var(--space-4);
    background-color: var(--c-bg-soft);
    border: 1px solid var(--c-border);
    color: var(--c-text);
    font-size: var(--fs-sm);
}

.mz-subcats a:hover,
.mz-subcats a:focus {
    border-color: var(--c-border-strong);
    text-decoration: none;
}

/* ⚠ Размер задан числами, а не `auto`: файл приходит ровно 80x112
   (`theme_<тема>_image_category_*`), и жёсткие числа держат высоту плашки
   постоянной ещё до загрузки картинки — иначе строка плашек дёргается
   по мере подгрузки.

   ⚠ Пропорция 1.4 — та же, что у товарных превью (470x657, 555x777,
   293x410). Заводские 80x80 квадратные: квадратный значок рядом
   с портретными плитками товара читается как чужой. Меняешь одно —
   меняй и второе, число в настройке и число здесь обязаны совпадать. */
.mz-subcats__image {
    display: block;
    flex: 0 0 auto;
    width: 80px;
    height: 112px;
}

.mz-subcats__label {
    font-weight: 600;
}

/* ⚠ НА ТЕЛЕФОНЕ ЗНАЧКОВ НЕТ — решение владельца 2026-08-31.

   Вместе со значком уходит и фиксированная ширина: без картинки плашка
   снова становится пилюлей по длине подписи, и четыре пилюли занимают
   одну-две строки вместо четырёх плашек по 114px. Ровнять их по ширине
   на телефоне незачем — там они и так идут в столбик или по две.

   ⚠ Заодно снимается вопрос узкого экрана: 300px фиксированной ширины
   на 320px вылезали бы за край и давали горизонтальную прокрутку всей
   странице. Теперь ширины нет вовсе, и страховка не нужна.

   ⚠ Картинка прячется через `display: none`, но из разметки НЕ убирается:
   убрать её в шаблоне значило бы решать за десктоп из мобильного правила.
   Байты картинки браузер при этом всё равно скачает — если это когда-нибудь
   станет важно, лечится `<picture>` с пустым источником, а не правкой здесь. */
@media (max-width: 767px) {
    .mz-subcats__image {
        display: none;
    }

    .mz-subcats a {
        width: auto;
        padding: var(--space-2) var(--space-4);
    }
}

@media (max-width: 767px) {
    /* На узком экране поля переносятся на две строки, и подписи разной длины
       («Сортування:» против «Показати:») разводили селекты по разным местам.
       Сетка из двух колонок ставит подписи в первую, поля во вторую —
       левые края полей совпадают.

       `display: contents` растворяет обёртку поля, чтобы её label и select
       стали прямыми ячейками сетки. Колонки `max-content`, а не `1fr`:
       селекты сохраняют свою natural-ширину («16» не растягивается на всю
       строку следом за «За замовчуванням»). */
    .mz-toolbar {
        display: grid;
        grid-template-columns: max-content max-content;
        justify-content: start;
        justify-items: start;
        align-items: center;
        gap: var(--space-3) var(--space-2);
    }

    .mz-toolbar__field {
        display: contents;
    }
}

/* --------------------------------------------------------------------------
   ПЛИТКА ТОВАРА — шаг 11.

   Четыре вещи: картинка, название, цена, кнопка. Описание из плитки убрано
   (в дефолте там 100 символов текста) — в сетке из четырёх колонок оно
   превращается в серый шум и ломает выравнивание.

   ⚠ `aspect-ratio` на картинке обязателен. Превью 470×657 приходят по сети
   и без зарезервированной высоты вёрстка прыгает на каждой загрузке: сначала
   плитки схлопнуты, потом раздвигаются. Пропорция та же, что у превью.

   ⚠ Названия у нас длинные (бренд + модель + цвет, до трёх строк). Обрезка
   тремя строками нужна не ради красоты: без неё соседние плитки в ряду
   разъезжаются по высоте, и кнопки «Купити» стоят на разных уровнях.
   -------------------------------------------------------------------------- */

/* Плитка отделяется от страницы фоном, а не рамкой — как в редизайне
   (`.product-thumb { border: 0; background-color: #FFF }` поверх более
   раннего правила с рамкой). Белое на сером. */
.mz-product {
    display: flex;
    flex-direction: column;
    background-color: var(--c-bg);
}

.mz-product__image {
    display: block;
    aspect-ratio: 470 / 657;
    overflow: hidden;
    background-color: var(--c-bg-soft);
}

.mz-product__image img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

/* Подпись плотнее, чем стандартные 16px по кругу: у редизайна внутри плитки
   воздуха мало (`.caption { padding: 0 20px }`, заголовок 10px, цена в одну
   строку с кнопкой). Мы не уходим в их 10px шрифта, но и лишний воздух
   внутри плитки не держим. */
.mz-product__body {
    display: flex;
    flex: 1;
    flex-direction: column;
    gap: var(--space-2);
    padding: var(--space-3) var(--space-4) var(--space-4);
}

.mz-product__name {
    margin: 0;
    font-size: var(--fs-base);
    font-weight: 600;
    line-height: 1.35;
    overflow: hidden;
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
}

.mz-product__name a {
    color: var(--c-text);
}

.mz-product__name a:hover,
.mz-product__name a:focus {
    color: var(--c-accent);
    text-decoration: none;
}

/* margin-top: auto прижимает цену и кнопку к низу плитки — тогда они стоят
   на одной линии во всём ряду, сколько бы строк ни занял заголовок. */
.mz-product__price {
    margin-top: auto;
    font-size: var(--fs-lead);
    font-weight: 700;
    color: var(--c-text);
}

.mz-product__price-new {
    color: var(--c-accent-2);
}

.mz-product__price-old {
    margin-left: var(--space-2);
    font-size: var(--fs-sm);
    font-weight: 400;
    color: var(--c-text-muted);
    text-decoration: line-through;
}

/* Кнопки «Купити» в плитке нет — решение владельца 2026-08-28.
   Она не могла добавить товар в корзину и никогда этого не делала:
   размер и цвет у нас `required`, а ядро при незаполненной обязательной
   опции отдаёт `json['redirect']` на страницу товара
   (`catalog/controller/checkout/cart.php:379`), и common.js делает
   `location = …` (`common.js:155`). То есть кнопка тратила AJAX-запрос
   ради перехода, который и так даёт клик по картинке или названию.
   Класс `.mz-product__buy` удалён вместе с ней. */

@media (max-width: 767px) {
    .mz-product__body {
        gap: var(--space-2);
        padding: var(--space-3);
    }

    .mz-product__name {
        font-size: var(--fs-sm);
    }

    .mz-product__price {
        font-size: var(--fs-base);
    }
}

/* --------------------------------------------------------------------------
   КНОПКИ — заодно на шаге 11.

   Bootstrap 3 красит `.btn-primary` в свой синий, а дефолтная тема добавляет
   поверх градиенты. Кнопки встречаются на всех служебных страницах (контакты,
   вход, корзина), и синяя кнопка рядом с нашей плиткой выглядит чужой.
   Отделка самих форм — шаги 24-25, здесь только цвет и форма.
   -------------------------------------------------------------------------- */

.btn {
    border-radius: 0;
    font-size: var(--fs-form);
    text-shadow: none;
}

.btn-primary {
    background-color: var(--c-accent);
    background-image: none;
    border-color: var(--c-accent);
    color: var(--c-text-inverse);
}

.btn-primary:hover,
.btn-primary:focus,
.btn-primary:active {
    background-color: var(--c-accent-hover);
    background-image: none;
    border-color: var(--c-accent-hover);
    color: var(--c-text-inverse);
}

.btn-default {
    background-color: var(--c-bg);
    background-image: none;
    border-color: var(--c-border);
    color: var(--c-text);
}

.btn-default:hover,
.btn-default:focus {
    background-color: var(--c-bg-soft);
    background-image: none;
    border-color: var(--c-border-strong);
    color: var(--c-text);
}

/* --------------------------------------------------------------------------
   ПАГИНАЦИЯ И СЧЁТЧИК — шаг 12.

   Разметку страниц рисует ядро (`system/library/pagination.php`) — это
   `<ul class="pagination">` bootstrap, шаблоном не управляется. Значит
   и приводить её к теме можно только стилями.

   Стрелки в ней — не иконки, а символы `|<`, `<`, `>`, `>|` прямо в тексте
   ссылки. Менять их на свои значит править ядро; оставляем как есть.
   -------------------------------------------------------------------------- */

.mz-pagination {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3);
    margin-top: var(--space-6);
    padding-top: var(--space-5);
    border-top: 1px solid var(--c-border);
}

.mz-pagination__results {
    font-size: var(--fs-sm);
    color: var(--c-text-muted);
}

.pagination {
    margin: 0;
    border-radius: 0;
}

.pagination > li > a,
.pagination > li > span {
    padding: var(--space-2) var(--space-4);
    border-color: var(--c-border);
    color: var(--c-text);
    border-radius: 0 !important;
}

.pagination > li > a:hover,
.pagination > li > a:focus {
    background-color: var(--c-bg-soft);
    border-color: var(--c-border-strong);
    color: var(--c-text);
}

.pagination > .active > a,
.pagination > .active > span,
.pagination > .active > a:hover,
.pagination > .active > span:hover,
.pagination > .active > a:focus,
.pagination > .active > span:focus {
    background-color: var(--c-accent);
    border-color: var(--c-accent);
    color: var(--c-text-inverse);
}

@media (max-width: 767px) {
    .mz-pagination {
        justify-content: center;
        text-align: center;
    }
}

/* --------------------------------------------------------------------------
   КАРТОЧКА ТОВАРА — шаги 14-19.

   Две колонки: галерея и данные о товаре. Редизайн натамоды карточку
   не трогал вовсе, поэтому она нарисована по мотивам листинга — те же
   рамки, те же капсы, та же кнопка.
   -------------------------------------------------------------------------- */

.mz-card {
    display: grid;
    grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
    gap: var(--space-7);
    margin-bottom: var(--space-7);
}

/* --- Галерея (шаг 15) ----------------------------------------------------
   Главное фото и миниатюры лежат в одном списке: увеличение по клику
   собирается magnific-ом из всех ссылок подряд, то есть листается вся
   галерея в том же порядке, что видно на странице. */

.mz-gallery {
    display: grid;
    grid-template-columns: repeat(6, 1fr);
    gap: var(--space-2);
    margin: 0;
    padding: 0;
    list-style: none;
}

.mz-gallery__main {
    grid-column: 1 / -1;
}

/* Постоянных рамок нет: фото товара сняты на белом, и обводка вокруг них
   только рябит. Отделяет их от серой страницы сам белый фон. */
.mz-gallery a {
    display: block;
    background-color: var(--c-bg);
}

.mz-gallery a:hover {
    opacity: .9;
}

/* ⚠ Обводка при наведении — только на миниатюрах, не на главном фото.

   Миниатюры и плитки других цветов одного размера (93×130) и стоят на одной
   странице: разный отклик у одинаковых на вид элементов читается как
   небрежность. Главному фото обводка не нужна — на полном кадре рамка бросается
   в глаза сильнее самого снимка, там хватает затемнения.

   Через outline, а не border: миниатюры лежат в grid, и border сдвигал бы
   соседние при каждом движении мыши. */
.mz-gallery__thumb a:hover {
    outline: 1px solid var(--c-border-strong);
}

/* Для клавиатуры — тот же приём, что у плиток цвета и у выбора размера. */
.mz-gallery__thumb a:focus-visible {
    opacity: 1;
    outline: 2px solid var(--c-accent-2);
    outline-offset: 1px;
}

.mz-gallery img {
    display: block;
    width: 100%;
}

/* ⚠ Пропорция берётся от РАЗМЕРА ПРЕВЬЮ, а не от исходника «вообще»: она
   должна совпадать с тем, что нарезает движок, иначе object-fit срежет край.
   С 2026-09-03 главное фото карточки — 833x1165 (было 555x777).

   Разница между 0.7143 и 0.7150 глазом не видна, но держать здесь число,
   не равное настройке темы, — это заготовка для тихого расхождения:
   поменяют превью ещё раз, а тут останется старое. */
.mz-gallery__main img {
    aspect-ratio: 833 / 1165;
    object-fit: cover;
}

.mz-gallery__thumb img {
    aspect-ratio: 93 / 130;
    object-fit: cover;
}

/* --- Правая колонка (шаги 14 и 18) --------------------------------------- */

.mz-card__title {
    margin-bottom: var(--space-3);
}

.mz-card__meta {
    margin: 0 0 var(--space-4);
    padding: 0;
    list-style: none;
    font-size: var(--fs-sm);
    color: var(--c-text-muted);
}

.mz-card__meta li + li {
    margin-top: var(--space-1);
}

.mz-card__stock {
    color: var(--c-success);
}

.mz-card__price {
    margin-bottom: var(--space-5);
    font-size: 28px;
    font-weight: 700;
    line-height: var(--lh-tight);
}

.mz-card__price-new {
    color: var(--c-accent-2);
}

.mz-card__price-old {
    margin-left: var(--space-2);
    font-size: var(--fs-base);
    font-weight: 400;
    color: var(--c-text-muted);
    text-decoration: line-through;
}

/* --- Опции (шаги 16 и 17) ------------------------------------------------
   Размеры и цвета — плитками, а не столбиком радиокнопок. Сам <input>
   остаётся в разметке и в потоке формы, скрыт только визуально: обработчик
   кнопки собирает поля селектором `#product input[type=radio]:checked`,
   и элемент, спрятанный стилями, в этот сбор всё равно попадает. */

.mz-option {
    margin-bottom: var(--space-5);
}

/* Цвет с единственным значением: блока нет, а input внутри — есть и отмечен. */
.mz-option--hidden {
    display: none;
}

.mz-option__name {
    display: block;
    margin-bottom: var(--space-2);
    font-size: var(--fs-sm);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .04em;
}

.mz-option.required .mz-option__name::after {
    content: ' *';
    color: var(--c-error);
}

/* Размеры — сеткой равных ячеек, а не потоком по содержимому: у бюстгальтеров
   значения от «70G» до «2XL(52)», и при ширине по тексту ряд получался рваным.
   84px — с запасом на самое длинное значение, которое реально встречается
   на карточках (семь символов); что не влезет, перенесётся внутри ячейки,
   а сетка не поедет. */
.mz-option__values {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(84px, 1fr));
    gap: var(--space-2);
}

.mz-opt {
    margin: 0;
    font-weight: 400;
    cursor: pointer;
}

/* Радиокнопку не убираем из потока `display: none`, а прячем прозрачностью:
   так она остаётся фокусируемой с клавиатуры. */
.mz-opt__input {
    position: absolute;
    width: 1px;
    height: 1px;
    opacity: 0;
}

.mz-opt__box {
    display: block;
    min-width: 0;
    padding: var(--space-2) var(--space-3);
    border: 1px solid var(--c-border);
    background-color: var(--c-bg);
    font-size: var(--fs-sm);
    text-align: center;
}

.mz-opt:hover .mz-opt__box {
    border-color: var(--c-border-strong);
}

.mz-opt__input:checked + .mz-opt__box {
    border-color: var(--c-accent);
    background-color: var(--c-accent);
    color: var(--c-text-inverse);
}

.mz-opt__input:focus + .mz-opt__box {
    outline: 2px solid var(--c-accent-2);
    outline-offset: 1px;
}

.mz-option.has-error .mz-opt__box {
    border-color: var(--c-error);
}

.text-danger {
    color: var(--c-error);
    font-size: var(--fs-sm);
    margin-top: var(--space-2);
}

/* --- Количество и кнопка (шаг 18) ---------------------------------------- */

.mz-card__buy {
    display: flex;
    align-items: flex-end;
    /* ⚠ Промежуток только вертикальный. Горизонтальный `gap` прибавлялся бы
       к левому отступу кнопки поверх её авто-полей, и она вставала бы
       не по центру: замер показывал 143px слева против 130 справа.
       Расстояние между полем и кнопкой держат сами авто-поля. */
    gap: var(--space-3) 0;
    margin-top: var(--space-5);
}

.mz-card__qty {
    margin: 0;
    font-weight: 400;
}

.mz-card__qty-label {
    display: block;
    margin-bottom: var(--space-2);
    font-size: var(--fs-sm);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .04em;
}

/* ⚠ Селектор с тегом и типом не для красоты: общее правило форм записано как
   `input[type="text"].form-control`, у него специфичность выше, чем у
   `.mz-card__qty .form-control`, — короткий вариант оно перебивало, и поле
   так и оставалось 36px против 48 у кнопки. */
.mz-card__qty input[type="text"].form-control {
    width: 76px;
    height: var(--control-lg);
    text-align: center;
}

/* Контур вместо заливки, `min-width: 160px` — из редизайна
   (`.btn { min-width: 160px }`), не растягивается на всю строку.
   ⚠ Это единственная кнопка покупки в магазине: в плитке листинга её
   больше нет (см. комментарий у `.mz-product`), так что образец вида
   теперь здесь. Высота — общая с полем количества, иначе разъедутся. */
.mz-card__button {
    flex: 0 0 auto;
    /* Кнопка встаёт по центру того, что осталось справа от поля количества,
       а не липнет к нему. `margin: auto` во флексе забирает всё свободное
       место и делит его поровну между левым и правым краем — поэтому центрирование
       получается без обёрток в разметке. */
    margin-left: auto;
    margin-right: auto;
    min-width: 160px;
    height: var(--control-lg);
    padding: 0 var(--space-5);
    border: 1px solid var(--c-border-strong);
    background-color: transparent;
    color: var(--c-text);
    font-size: var(--fs-xs);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .04em;
}

.mz-card__button:hover,
.mz-card__button:focus {
    border-color: var(--c-accent);
    background-color: var(--c-accent);
    color: var(--c-text-inverse);
}

/* --- Вкладки (шаг 19) ----------------------------------------------------- */

.mz-tabs {
    margin-bottom: var(--space-7);
}

.nav-tabs {
    margin-bottom: 0;
    border-bottom: 1px solid var(--c-border);
}

.nav-tabs > li > a {
    margin: 0;
    padding: var(--space-3) var(--space-4);
    border: 0;
    border-radius: 0;
    color: var(--c-text-muted);
    font-size: var(--fs-sm);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .04em;
}

.nav-tabs > li > a:hover,
.nav-tabs > li > a:focus {
    background-color: transparent;
    border: 0;
    color: var(--c-text);
}

.nav-tabs > li.active > a,
.nav-tabs > li.active > a:hover,
.nav-tabs > li.active > a:focus {
    border: 0;
    border-bottom: 2px solid var(--c-accent);
    background-color: transparent;
    color: var(--c-text);
}

.tab-content {
    padding-top: var(--space-5);
}

.mz-attrs {
    max-width: 640px;
    margin: 0;
}

.mz-attrs > tbody > tr > td {
    padding: var(--space-3) var(--space-4) var(--space-3) 0;
    border-top: 1px solid var(--c-border);
}

.mz-attrs__name {
    width: 45%;
    color: var(--c-text-muted);
}

.mz-related__title {
    margin-top: 0;
}

@media (max-width: 991px) {
    .mz-card {
        grid-template-columns: 1fr;
        gap: var(--space-5);
    }
}

@media (max-width: 767px) {
    .mz-gallery {
        grid-template-columns: repeat(4, 1fr);
    }

    .mz-card__price {
        font-size: 24px;
    }

    .mz-card__buy {
        flex-wrap: wrap;
    }

    .mz-card__button {
        flex: 1 1 100%;
    }
}

/* --------------------------------------------------------------------------
   ХЛЕБНЫЕ КРОШКИ — переделаны на шаге 14.

   Дефолт рисует их серой плашкой с рамкой, а разделители — повёрнутыми
   на 45° квадратами 26×26 с `position: absolute`. Конструкция держится
   на `white-space: nowrap` у каждого пункта, и на карточке товара, где
   в крошках стоит полное название, страница на 360px уезжала за экран.

   Здесь: обычный текст, разделитель — косая черта, перенос разрешён.
   -------------------------------------------------------------------------- */

.breadcrumb {
    margin: 0 0 var(--space-5);
    padding: 0;
    background-color: transparent;
    border: 0;
    font-size: var(--fs-sm);
}

.breadcrumb > li {
    padding: 0;
    white-space: normal;
    text-shadow: none;
}

/* Стрелка-квадрат дефолта. */
.breadcrumb > li::after {
    content: none;
    display: none;
}

.breadcrumb > li + li::before {
    content: '/';
    padding: 0 var(--space-2);
    color: var(--c-border-strong);
}

.breadcrumb > li > a {
    color: var(--c-text-muted);
}

.breadcrumb > li:last-child > a {
    color: var(--c-text);
}

/* --------------------------------------------------------------------------
   ГЛАВНАЯ — шаги 20-23.

   Блоки главной — это модули на макете «Головна», а не разметка в шаблоне:
   `common/home.twig` выводит только `content_top` и `content_bottom`.
   Поэтому здесь только стили, а состав блоков меняется в админке.
   -------------------------------------------------------------------------- */

.mz-block__title,
.mz-catgrid + div h2 {
    margin: 0 0 var(--space-5);
}

/* Между модулями главной нужен воздух; сами модули о соседях не знают. */
#common-home #content > div + div,
#common-home #content > div + h2 {
    margin-top: var(--space-7);
}

/* --- Входы в категории (шаг 20) ------------------------------------------ */

/* ⚠ Три колонки с 2026-09-03, а не две: на главную добавился третий вход —
   «Домашній одяг». Число зашито намеренно, `auto-fit` тут не подходит:
   плашек ровно столько, сколько корневых категорий, и четвёртая появится
   не раньше, чем заведут новую ветку каталога. Пусть перенос будет
   заметным событием, а не тихой перестройкой сетки.

   ⚠ Правка НЕ общая для двух тем. У svitbra входов два и плашки там
   квадратные, свои файлы; портретная пропорция обрезала бы им бока.
   Это ещё одно место, где темы разошлись сознательно — см. SVITBRA.md. */
.mz-catgrid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--space-5);
    margin-bottom: var(--space-7);
}

.mz-catgrid__item {
    position: relative;
    display: block;
    overflow: hidden;
    background-color: var(--c-bg-soft);
}

.mz-catgrid__item img {
    display: block;
    width: 100%;
    /* ⚠ Портрет с 2026-09-03 (решение владельца), было `1 / 1`.

       Прежний квадрат назывался тут компромиссом — «исходники портретные
       833×1165, и в широкую полосу от них остаётся случайная нарезка».
       Довод верный, но вывод из него сделан был обратный: раз исходники
       портретные, портретной надо делать ПЛАШКУ, а не резать фото под неё.

       558 / 780 — это те же 0.715, что у товарных превью, поэтому
       `object-fit: cover` теперь не срезает вообще ничего, а `object-position`
       не нужен: кадрировать нечего. Оставлен на случай замены картинки
       на кадр другой пропорции. */
    aspect-ratio: 558 / 780;
    object-fit: cover;
    object-position: center 18%;
}

.mz-catgrid__label {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    padding: var(--space-4) var(--space-5);
    background-color: var(--c-bg);
    color: var(--c-text);
    font-size: var(--fs-lead);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
}

.mz-catgrid__item:hover .mz-catgrid__label {
    background-color: var(--c-accent);
    color: var(--c-text-inverse);
}

/* --- Текстовый блок (шаг 23) --------------------------------------------- */

.mz-hometext {
    max-width: 820px;
    margin: 0 auto;
    color: var(--c-text-muted);
}

.mz-hometext h2 {
    color: var(--c-text);
}

@media (max-width: 767px) {
    /* ⚠ На телефоне НЕ в один столбик, а в два: портретных плашек стало три,
       и в столбик это три экрана прокрутки до первого текста. Третья
       остаётся одна в нижнем ряду — так и надо, она же и самая новая. */
    .mz-catgrid {
        grid-template-columns: repeat(2, 1fr);
        gap: var(--space-4);
    }

    .mz-catgrid__label {
        padding: var(--space-3) var(--space-4);
        font-size: var(--fs-base);
    }
}

/* --------------------------------------------------------------------------
   КОРЗИНА — шаг 24.
   -------------------------------------------------------------------------- */

.mz-cart {
    margin-bottom: var(--space-6);
}

.mz-cart > thead > tr > td {
    padding: 0 var(--space-3) var(--space-3);
    border-bottom: 1px solid var(--c-border);
    font-size: var(--fs-sm);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--c-text-muted);
}

.mz-cart > tbody > tr > td {
    padding: var(--space-4) var(--space-3);
    border-top: 1px solid var(--c-border);
    vertical-align: top;
}

.mz-cart__col-image {
    width: 1%;
}

.mz-cart__col-image img {
    display: block;
    width: 70px;
    border: 1px solid var(--c-border);
}

.mz-cart__name {
    font-weight: 600;
    color: var(--c-text);
}

.mz-cart__options {
    margin: var(--space-2) 0 0;
    padding: 0;
    list-style: none;
    font-size: var(--fs-sm);
    color: var(--c-text-muted);
}

.mz-cart__qty {
    display: flex;
    gap: var(--space-1);
}

.mz-cart__qty .form-control {
    width: 56px;
    text-align: center;
}

.mz-cart__totals {
    display: flex;
    justify-content: flex-end;
    margin-bottom: var(--space-5);
}

.mz-cart__totals table {
    width: auto;
    min-width: 280px;
    margin: 0;
}

.mz-cart__totals td {
    padding: var(--space-2) 0 var(--space-2) var(--space-5);
    border: 0;
}

/* Последняя строка итогов — это «Разом», её и выделяем. */
.mz-cart__totals tr:last-child .mz-cart__total-value {
    font-size: var(--fs-lead);
    font-weight: 700;
}

.mz-cart__buttons {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    gap: var(--space-3);
}

@media (max-width: 767px) {
    /* На телефоне таблица перестаёт быть таблицей: пять колонок в 360px
       не помещаются, а `.table-responsive` прячет за горизонтальной прокруткой
       именно то, что нужнее всего, — количество и кнопку «прибрати».

       Строка превращается в карточку: слева картинка на всю высоту,
       справа название, количество и сумма друг под другом. */
    .mz-cart,
    .mz-cart > tbody,
    .mz-cart > tbody > tr > td {
        display: block;
    }

    .mz-cart > thead {
        display: none;
    }

    .mz-cart > tbody > tr {
        display: grid;
        grid-template-columns: 64px minmax(0, 1fr);
        column-gap: var(--space-4);
        row-gap: var(--space-2);
        align-items: start;
        padding: var(--space-4) 0;
        border-top: 1px solid var(--c-border);
    }

    .mz-cart > tbody > tr > td {
        padding: 0;
        border: 0;
    }

    /* ⚠ Bootstrap внутри `.table-responsive` вешает на все ячейки
       `white-space: nowrap` (ровно с этой ширины). Из-за него название товара
       не переносилось, уезжало за край и утаскивало таблицу в горизонтальную
       прокрутку. Селектор повторяет их глубину — короче не перебить. */
    .table-responsive > .mz-cart > tbody > tr > td,
    .table-responsive > .mz-cart > thead > tr > td {
        white-space: normal;
    }

    /* Рамка `.table-responsive` тоже от bootstrap: она обводила «прокручиваемую
       область», которой у нас больше нет. */
    .table-responsive {
        border: 0;
    }

    /* Цена за штуку уходит: на телефоне важнее сумма строки.

       ⚠ Селектор длинный не для красоты: правило `display: block` выше стоит
       на `.mz-cart > tbody > tr > td`, и короткий `.mz-cart__col-price`
       его не перебивает — специфичность ниже. */
    .mz-cart > tbody > tr > td.mz-cart__col-price {
        display: none;
    }

    .mz-cart__col-image {
        grid-column: 1;
        grid-row: 1 / span 3;
        width: auto;
    }

    .mz-cart__col-image img {
        width: 64px;
    }

    .mz-cart .text-right {
        text-align: left;
        font-weight: 600;
    }

    .mz-cart__buttons .btn {
        flex: 1 1 100%;
        text-align: center;
    }
}

/* --------------------------------------------------------------------------
   ПОИСК И МЕЛКИЕ СТРАНИЦЫ — шаг 25.
   -------------------------------------------------------------------------- */

.mz-searchform {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-3);
    margin-bottom: var(--space-6);
}

.mz-searchform .form-control {
    width: auto;
    min-width: 220px;
}

.mz-searchform__check {
    display: flex;
    align-items: center;
    gap: var(--space-2);
    margin: 0;
    font-weight: 400;
    font-size: var(--fs-sm);
    color: var(--c-text-muted);
}

/* Формы служебных страниц: вход, регистрация, контакты, возврат. */
.form-horizontal .control-label {
    font-weight: 600;
}

.well {
    background-color: var(--c-bg-soft);
    border: 1px solid var(--c-border);
    border-radius: 0;
    box-shadow: none;
}

.panel {
    border-radius: 0;
    border-color: var(--c-border);
    box-shadow: none;
}

.panel-heading {
    border-radius: 0;
}

.panel-default > .panel-heading {
    background-color: var(--c-bg-soft);
    border-color: var(--c-border);
    color: var(--c-text);
}

.alert {
    border-radius: 0;
}

@media (max-width: 767px) {
    .mz-searchform {
        flex-direction: column;
        align-items: stretch;
    }

    .mz-searchform .form-control,
    .mz-searchform .btn {
        width: 100%;
        min-width: 0;
    }
}

/* --------------------------------------------------------------------------
   ИНФО-СТРАНИЦЫ — шаг 5 плана CONTENT.md.

   Своего шаблона у этих страниц нет: обе темы отдают их дефолтному
   `information/information.twig`, и правится тут только ширина колонки.

   ⚠ Ограничение не косметическое. Текст лежал в контейнере 1140 — это
   около 150 знаков в строке при рекомендованных 60-90. На «Про магазин»
   с его тысячей знаков это ещё терпимо, а в оферте их двадцать восемь
   тысяч: на такой длине глаз теряет начало следующей строки, и человек
   перечитывает одну и ту же дважды.

   ⚠ Число то же, что у текстового блока главной (`.mz-hometext`, 820px),
   и это намеренно: две страницы с текстом не должны набираться по-разному.

   ⚠ Таблиц в инфо-страницах нет (проверено по всем пяти: p, ul, li, h2,
   strong, a и одна картинка) — значит сужение колонки ничего не ломает.
   Появится таблица — ей понадобится своя обёртка с прокруткой.
   -------------------------------------------------------------------------- */

/* ⚠ Центрирование обязано стоять рядом с `max-width`, иначе узкая колонка
   прижимается к левому краю контейнера 1140 и справа зияет пустая полоса
   в 320 пикселей - страница выглядит сломанной, а не набранной уже.
   Первая версия этого блока (шаг 5) центрирование пропустила.

   ⚠ Крошки сужаются вместе с текстом и той же величиной: они лежат ВНЕ
   `#content`, и без этого правила начинались бы на 160 пикселей левее
   первой строки текста. */
#information-information #content,
#information-information .breadcrumb {
    max-width: 820px;
    margin-left: auto;
    margin-right: auto;
}

/* ⚠ `#content` - это bootstrap-колонка `.col-sm-12`, а у неё `float: left`.
   На плавающем элементе `margin: auto` не центрирует ВООБЩЕ: первая версия
   правки сдвинула крошки на середину, а текст оставила у левого края -
   и рассогласовала их между собой. Поэтому float снимается. */
#information-information #content {
    float: none;
}

/* ⚠ Крошки лежат вне колонки, а у колонки свои 15px внутреннего отступа
   от bootstrap - без этой строки крошки начинались бы ровно на эти 15px
   левее первой буквы заголовка. Отступ добавлен крошкам, а не снят
   у колонки: ширина набора текста остаётся прежней (790), проверенной
   на длину строки. */
#information-information .breadcrumb {
    padding-left: 15px;
}

/* --------------------------------------------------------------------------
   ЗВОРОТНІЙ ЗВ'ЯЗОК — шаг 3 плана CONTENT.md.

   Страница из двух вещей: адрес почты и форма письма. Телефона нет
   (решение владельца 2026-09-03), адреса нет — оба поля в настройках
   заняты заглушками установщика и стереть их нельзя, форма настроек
   требует непустые. Подробности — в шапке `information/contact.twig`.

   ⚠ Ширина ограничена, как у чекаута: форма из трёх полей, распахнутая
   на 1140, читается как незаполненная таблица. То же число, что там,
   и по той же причине.
   -------------------------------------------------------------------------- */

.mz-contact {
    max-width: var(--checkout-max);
}

/* Единственный настоящий контакт — значит он и есть главное на странице,
   а не строчка петитом. Кегль ведущего абзаца, цвет акцента, значок
   тот же, что в шапке. */
.mz-contact__mail {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    margin-bottom: var(--space-6);
    font-size: var(--fs-lead);
    line-height: var(--lh-tight);
    color: var(--c-accent);
}

.mz-contact__mail:hover,
.mz-contact__mail:focus {
    color: var(--c-accent-hover);
}

/* ⚠ Адрес почты не переносится по словам, но на узком экране длинный
   адрес обязан переноситься хоть как-то — иначе он вытолкнет страницу
   вбок. `anywhere` рвёт строку в любом месте, но только когда иначе
   не влезает. */
.mz-contact__mail-address {
    overflow-wrap: anywhere;
}

.mz-contact__title {
    margin: 0 0 var(--space-3);
    padding-bottom: var(--space-2);
    border-bottom: 1px solid var(--c-border);
    font-size: var(--fs-lead);
    line-height: var(--lh-tight);
}

/* ⚠ Исключение из общего ограничения ширины полей: в `.mz-form` поля
   сужены до 360px, потому что там пишут одно слово. Здесь пишут письмо,
   и загонять его в узкую колонку — то же самое, что комментарий к заказу
   (`#mz-comment` выше по файлу, ровно тот же случай).

   ⚠ В СЕЛЕКТОРЕ ЕСТЬ ТЕГ, И ЭТО НЕ УКРАШЕНИЕ. Ограничение записано как
   `.mz-form .form-control` — вес 0,2,0. Первая попытка была одиночным
   `.mz-contact__text` (0,1,0) и проиграла: замер показал textarea 360
   там, где по коду ждали полную ширину. Вторая, `.mz-form .mz-contact__text`,
   весит РОВНО СТОЛЬКО ЖЕ — и проиграла тоже, потому что при равном весе
   побеждает тот, кто ниже в файле, а блок чекаута идёт следующим.
   Тег добавляет 0,2,1 и снимает зависимость от порядка блоков совсем.
   Тот же приём и по той же причине уже стоит у количества на карточке.

   ⚠ У `#mz-comment` этой беды нет только потому, что id весит 1,0,0. */
.mz-form textarea.mz-contact__text {
    max-width: none;
}

/* Кнопка не по ширине слова: «Надіслати» короче, чем действие, которое
   она означает. Тот же потолок, что у «Купити» на карточке. */
.mz-contact__submit {
    min-width: 160px;
}

@media (max-width: 767px) {
    .mz-contact__submit {
        width: 100%;
    }
}

/* --------------------------------------------------------------------------
   ОФОРМЛЕННЯ ЗАМОВЛЕННЯ — шаг 2 плана CHECKOUT.md.

   Четыре блока одной колонкой: контакты, доставка, оплата, подтверждение.
   Аккордеона нет — всё раскрыто сразу, поэтому и панелей bootstrap здесь нет,
   только заголовок и тело.

   Двухколоночная раскладка (форма слева, итог справа) — шаг 9, вместе
   с адаптивом. Сейчас важнее, чтобы блоки читались в один столбец.
   -------------------------------------------------------------------------- */

/* Одна колонка, состав заказа сверху.

   ⚠ Две колонки (форма слева, состав справа) были сделаны по шагу 9 плана
   и отменены владельцем 2026-08-25 — состав должен быть сверху. Прежняя
   проблема «блок уже шапки и прижат влево» решена не колонками, а
   центрированием: раньше стоял `max-width` без `margin: 0 auto`. */
.mz-checkout {
    max-width: var(--checkout-max);
    margin: 0 auto;
}

/* ⚠ Поля не растягиваются на всю ширину блока: строка ввода длиной
   в семьсот пикселей под слово «Ім'я» выглядит нелепо и читается хуже —
   глазу негде зацепиться за начало и конец. Ограничиваем, а подпись
   и рамка остаются на месте.

   `.mz-form` — форма контактов, `.mz-np` — поля Нової Пошти, `.mz-login` —
   вход для постійних покупців. Все наши, чужие формы не задеваем. Ограничивать надо обе разом: иначе имя с
   телефоном узкие, а «Область» и «Відділення» через два блока — во всю
   ширину, и колонка выглядит рваной. */
.mz-form .form-control,
.mz-np .form-control,
.mz-login .form-control {
    max-width: var(--field-max);
}

/* Комментарий к заказу — исключение: там пишут фразу, а не одно слово. */
#mz-comment {
    max-width: none;
}

/* В боковой колонке блок читается карточкой, иначе висит в воздухе.
   ⚠ Без скругления: тема плоская, `border-radius: 0` стоит в тринадцати
   местах и ни одного скругления нет. Карточка с радиусом выбивалась бы. */
.mz-checkout__block--card {
    padding: 16px;
    background: var(--c-bg-soft);
    border: 1px solid var(--c-border);
    border-radius: 0;
}

.mz-checkout__block--card .mz-checkout__title {
    margin-top: 0;
}

@media (max-width: 767px) {
    /* На телефоне поле во всю ширину: там её и так мало, а ограничение
       оставило бы справа пустую полосу. */
    .mz-form .form-control,
    .mz-np .form-control {
        max-width: none;
    }
}

.mz-checkout__block + .mz-checkout__block {
    margin-top: 30px;
}

.mz-checkout__title {
    margin: 0 0 12px;
    padding-bottom: 8px;
    border-bottom: 1px solid var(--c-border);
    font-size: var(--fs-lead);
    line-height: var(--lh-tight);
}

.mz-checkout__body {
    color: var(--c-text);
}

/* Пустой блок подтверждения не должен оставлять зазор до подвала:
   он наполняется только после сохранения оплаты. */
.mz-checkout__body:empty {
    display: none;
}

/* Штатные подшаблоны кладут кнопку в .buttons с pull-right. На одной странице
   таких кнопок три, и прижатые к правому краю они читаются как «дальше» —
   что здесь неверно, шагов нет. Ставим по левому краю, к своему блоку. */
.mz-checkout__body .buttons {
    margin-top: 15px;
}

.mz-checkout__body .buttons .pull-right {
    float: none !important;
}

/* Состав заказа: что покупают и почём. Виден сразу, первым блоком —
   вопрос владельца «почему при оформлении не видны товары» был про это. */

.mz-summary {
    margin: 0 0 15px;
    padding: 0;
    list-style: none;
}

.mz-summary__item {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    padding: 10px 0;
    border-bottom: 1px solid var(--c-border);
}

.mz-summary__pic {
    flex: 0 0 auto;
}

.mz-summary__pic img {
    display: block;
    width: 47px;
    height: auto;
}

.mz-summary__text {
    flex: 1 1 auto;
    min-width: 0;
}

.mz-summary__name {
    color: var(--c-text);
    line-height: var(--lh-tight);
}

.mz-summary__options {
    margin-top: 3px;
    color: var(--c-text-muted);
    font-size: var(--fs-sm);
}

.mz-summary__options span + span::before {
    content: ' · ';
}

.mz-summary__count {
    flex: 0 0 auto;
    color: var(--c-text-muted);
    font-size: var(--fs-sm);
    white-space: nowrap;
}

.mz-summary__sum {
    flex: 0 0 auto;
    min-width: 90px;
    text-align: right;
    white-space: nowrap;
}

.mz-summary__totals {
    width: 100%;
}

.mz-summary__totals td {
    padding: 4px 0;
}

/* Последняя строка итогов — «Разом»: она и есть то число, которое платят. */
.mz-summary__totals tr:last-child td {
    padding-top: 8px;
    border-top: 1px solid var(--c-border);
    font-size: var(--fs-lead);
}

/* Одна кнопка на всю страницу вместо трёх «Продовжити». */
.mz-checkout__submit {
    margin-top: 30px;
}

.mz-checkout__submit .btn {
    min-width: 220px;
}

/* Согласие без галочки: строка со ссылками под кнопкой. */
.mz-checkout__agree {
    margin: 10px 0 0;
    max-width: 480px;
    font-size: var(--fs-sm);
    line-height: var(--lh-base);
}

@media (max-width: 767px) {
    /* Узкая колонка: картинка и название остаются в строке, а количество
       с ценой переносятся под них.

       ⚠ Отступ 59px — это ширина превью (47) плюс зазор (12): числа должны
       начинаться под названием, а не под картинкой. Раньше тот же отступ
       стоял и у суммы, и она повисала посреди строки; теперь сумма
       прижата вправо, как и в широкой раскладке. */
    .mz-summary__item {
        flex-wrap: wrap;
    }

    .mz-summary__count {
        margin-left: 59px;
    }

    .mz-summary__sum {
        margin-left: auto;
    }

    .mz-checkout__submit .btn {
        width: 100%;
    }
}

/* Пояснение звёздочки над формой контактов. Саму звёздочку рисует
   bootstrap у `.form-group.required`, но человеку, который видит форму
   впервые, она ничего не говорит. */
.mz-checkout__required {
    margin: 0 0 12px;
    font-size: var(--fs-sm);
}

/* Вход для постоянных покупателей на чекауте.

   ⚠ Первая редакция была нарочито неброской — мелкий приглушённый текст
   со ссылкой. Владелец 2026-08-27: сделать заметнее, «Увійти» кнопкой.
   Резон понятен: постоянный покупатель должен увидеть вход сразу, иначе
   заполнит форму заново и заведёт второй заказ мимо своей истории. */
/* Приглашение и форма — один блок с общей рамкой. Порознь они читались
   как две несвязанные полосы, и было неясно, что форма относится
   к строке над ней (замечание владельца 2026-08-27). */
.mz-auth {
    margin: 0 0 var(--space-4);
    border: 1px solid var(--c-border);
}

.mz-login__prompt {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    margin: 0;
    padding: var(--space-3) var(--space-4);
    background: var(--c-accent-soft);
}

/* Текст приглашения — обычного размера, не подпись. */
.mz-login__prompt > span {
    color: var(--c-text);
}

/* ⚠ Кнопка не должна тянуться на всю ширину: во flex-контейнере
   она бы растянулась вслед за строкой. */
.mz-login__prompt .btn {
    flex: 0 0 auto;
    margin-left: auto;
}

/* ⚠ Своей подложки у формы больше нет: внутри общей рамки две разные
   заливки выглядели бы как два блока, вложенных друг в друга.
   Отделяет её от приглашения тонкая линия. */
.mz-login {
    margin: 0;
    padding: var(--space-4);
    border-top: 1px solid var(--c-border);
}

.mz-login .form-group:last-of-type {
    margin-bottom: var(--space-3);
}

.mz-login__actions {
    display: flex;
    align-items: center;
    gap: var(--space-4);
}

/* ⚠ `hidden` в разметке против bootstrap: у него `.form-control` и прочие
   классы задают `display`, и атрибут перебивается. Гасим явно. */
#mz-login[hidden] {
    display: none;
}
/* Вошедший покупатель: вместо гостевой формы — его данные из аккаунта.
   Это не форма, а сводка, поэтому и выглядит как сводка: без рамок полей,
   именем в один вес крупнее остального. */
.mz-checkout__logged {
    line-height: 1.5;
}

.mz-logged__note {
    margin: 0 0 8px;
    font-size: var(--fs-sm);
    color: var(--c-text-muted);
}

.mz-logged__name {
    margin: 0 0 2px;
    font-weight: 600;
}

.mz-logged__line {
    margin: 0 0 2px;
}

.mz-logged__edit {
    display: inline-block;
    margin-top: 8px;
    font-size: var(--fs-sm);
}
/* Перевозчик: логотип и название одной строкой. Логотип обычной картинкой,
   не маской, — маска залила бы фирменный красный цветом текста. */
.mz-carrier {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-bottom: 10px;
}

.mz-carrier__logo {
    flex: 0 0 auto;
    width: 24px;
    height: 24px;
}

/* --------------------------------------------------------------------------
   Другие цвета той же модели (этап 3 плана CATALOG.md).

   Блок стоит в колонке покупки, сразу под кнопкой «Купити», — так же,
   как в теме натамоды. Плитка мельче, чем у похожих товаров: это не
   «другой товар», а тот же в другом цвете, покупателю нужен сам оттенок,
   а не название и цена.
   -------------------------------------------------------------------------- */

.mz-card__variants {
    margin-top: 22px;
    padding-top: 18px;
    border-top: 1px solid var(--c-border);
}

/* Подпись мельче заголовков страницы: это часть карточки покупки,
   а не самостоятельный раздел, каким был блок внизу. */
.mz-card__variants-title {
    margin: 0 0 10px;
    font-size: var(--fs-h5);
    line-height: var(--lh-tight);
}

.mz-variants {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin: 0 0 30px;
    padding: 0;
    list-style: none;
}

/* ⚠ Рамки нет намеренно. Сначала я обвёл плитки рамкой в 1px, чтобы
   обозначить границу кликабельной области, — но в исходнике её нет:
   у натамоды `.variant` это только отступ снизу, а плитка внутри —
   голая ссылка с картинкой. Рамка превращала фото в «коробочки»
   и добавляла шума там, где его не было.

   Отклик при наведении оставлен: без подписи под плиткой ничто больше
   не подсказывает, что она кликабельна. */
.mz-variant a {
    display: block;
    line-height: 0;
    transition: opacity .15s;
}

.mz-variant a:hover {
    opacity: .85;
    /* ⚠ Обводка через outline, а не border: border добавил бы плитке 2px
       и сдвинул соседей при каждом наведении. Outline рисуется поверх
       и на раскладку не влияет. */
    outline: 1px solid var(--c-border-strong);
}

/* Для клавиатуры отклик должен быть заметнее, чем для мыши. Берём тот же
   приём, что у выбора размера выше (`.mz-opt__input:focus`), — чтобы
   фокус по всей карточке выглядел одинаково. */
.mz-variant a:focus-visible {
    opacity: 1;
    outline: 2px solid var(--c-accent-2);
    outline-offset: 1px;
}

.mz-variant img {
    display: block;
    width: 93px;
    height: auto;
}

@media (max-width: 767px) {
    .mz-variants {
        gap: 8px;
    }

    .mz-variant img {
        width: 74px;
    }
}

/* --------------------------------------------------------------------------
   ТАБЛИЦА РАЗМЕРОВ — этап 4, шаг 13.

   Модалка на нативном <dialog>: Esc, ловушка фокуса и подложка достаются
   от браузера, поэтому здесь только размеры, отступы и поведение таблиц
   на узком экране.
   -------------------------------------------------------------------------- */

/* Кнопка вызова — как в редизайне натамоды (`.size-table`): рамка,
   мелкий текст капсом, иконка календаря. Числа оттуда литералами
   (padding 4px 11px, 10px, 148px), цвета — наши переменные. */
.mz-size-link {
    display: flex;
    align-items: center;
    gap: 6px;
    width: 148px;
    padding: 4px 11px;
    border: 1px solid var(--c-border);
    background: none;
    font-family: inherit;
    font-size: 10px;
    line-height: 1.6;
    text-transform: uppercase;
    color: var(--c-text);
    cursor: pointer;
}

.mz-size-link .fa {
    color: var(--c-text-muted);
}

/* У них рамка на hover красилась в акцент темы — здесь то же самое. */
.mz-size-link:hover {
    border-color: var(--c-accent);
}

/* ⚠ Ссылка — сосед подписи, а не её содержимое. Звёздочка обязательности
   рисуется через `.mz-option__name::after`, то есть после всего, что внутри:
   положи ссылку внутрь — и звезда встанет после неё, за словами
   «Таблиця розмірів». */
.mz-option__head {
    display: flex;
    align-items: center;
    gap: var(--space-2);
    margin-bottom: var(--space-2);
}

.mz-option__head .mz-option__name {
    margin-bottom: 0;
}

.mz-size {
    width: min(860px, calc(100vw - 2 * var(--space-4)));
    max-height: calc(100vh - 2 * var(--space-5));
    padding: 0;
    border: 1px solid var(--c-border);
    border-radius: 3px;
    background-color: var(--c-bg);
    color: var(--c-text);
    box-shadow: var(--shadow-menu);
    overflow: hidden;
}

.mz-size::backdrop {
    background-color: rgba(31, 33, 36, .45);
}

/* Шапка закреплена, прокручивается только содержимое: таблица бюстгальтеров
   длинная, и кнопка закрытия не должна уезжать наверх. */
.mz-size__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3);
    padding: var(--space-3) var(--space-4);
    border-bottom: 1px solid var(--c-border);
}

/* Заголовки попапа идут ступенями сверху вниз: шапка окна 19px, заголовок
   таблицы 17px, «Крок 1/2» 15px. До 2026-08-26 порядок стоял на голове —
   h3 был 19px, шапка 17px, а h2 15px да ещё серым и нежирным (замечено
   владельцем: «Як визначити розмір бюстгальтера меньше, чем Крок 1»).
   Приглушённым h2 делали затем, чтобы он не спорил с шапкой окна, но
   ценой того, что заголовок таблицы читался мельче своих же подзаголовков. */
.mz-size__title {
    margin: 0;
    font-size: var(--fs-h3);
}

.mz-size__close {
    padding: 0;
    width: 32px;
    height: 32px;
    border: 0;
    background: none;
    font-size: 26px;
    line-height: 1;
    color: var(--c-text-muted);
    cursor: pointer;
}

.mz-size__close:hover {
    color: var(--c-text);
}

.mz-size__close:focus:not(:focus-visible) {
    outline: none;
}

/* Фокусной рамки у тела нет намеренно: оно не интерактивно, фокус здесь —
   только чтобы он не достался крестику и чтобы работали стрелки. */
.mz-size__body:focus {
    outline: none;
}

.mz-size__body {
    padding: var(--space-4);
    max-height: calc(100vh - 2 * var(--space-5) - 57px);
    overflow-y: auto;
}

.mz-size__body h2 {
    margin-top: 0;
    font-size: var(--fs-h4);
}

.mz-size__body h3 {
    font-size: var(--fs-h5);
}

.mz-size__body img {
    max-width: 100%;
    max-height: 280px;
    width: auto;
    height: auto;
}

/* ⚠ Прокрутка нужна не всем таблицам, а тем, что перенесены из ntest:
   у трусов одиннадцать колонок в одну линию, и на 768 они вылезают на 85px,
   на 360 — на 337. Свои две таблицы бюстгальтера с 2026-08-26 разложены
   по восемь значений в ряд и на 1280 и 768 влезают целиком (лишнего 0),
   на 360 остаётся 157 и 81. Прокручиваем таблицу саму, а не страницу —
   горизонтальная прокрутка всего документа ломает вёрстку карточки. */
.mz-size__body table {
    display: block;
    width: 100%;
    overflow-x: auto;
    border-collapse: collapse;
    margin-bottom: var(--space-4);
    font-size: var(--fs-sm);
}

/* ⚠️ `class="strong"` приехал с разметкой натамоды, и в теме он ничего
   не значил — ни в нашей, ни в дефолтной такого правила нет. Размеры,
   ради которых таблицу и открывают, выглядели обычным текстом (замечено
   владельцем 2026-08-26). Класс несёт смысл «это сам размер», поэтому
   правило пишем, а не вычищаем класс из разметки. */
.mz-size__body td.strong {
    font-weight: 600;
}

/* Схема у перенесённых таблиц: там она одна, и ей нужен только отступ снизу
   с центрированием. У бюстгальтеров схем две, и они лежат во flex-ряду
   (`.mz-size__schemes`) — общий класс им не подходит. Без этого правила
   картинка прилипала прямо к таблице. */
.mz-size__scheme {
    margin-bottom: var(--space-4);
    text-align: center;
}

/* ⚠ Ширина задана ПОТОЛКОМ, а не числом, и это не придирка: `width: 250px`
   тут молча плющил картинку. Механика такая — у всех картинок попапа стоит
   `max-height` (280 на десктопе, 200 на телефоне), а при ЗАДАННОЙ ширине
   браузер обрезает высоту по потолку и ширину пересчитывать не обязан.
   Пропорция теряется без единой ошибки.

   Три года это не всплывало, потому что все схемы влезали в потолок:
   `panty-scheme.png` квадратный 250x250, ленты бюстгальтера альбомные.
   Первая же портретная — `home-scheme.png` 380x560 — выехала на экран
   как 250x280 вместо 250x368, то есть сжатой по вертикали на четверть.

   `width: auto` отдаёт решение обоим потолкам сразу, и тогда работает
   штатный алгоритм подгонки замещаемых элементов: 380x560 становится
   190x280, пропорция цела. Квадратной схеме трусов это ничего не меняет —
   250x250 в оба потолка проходит и остаётся собой. */
.mz-size__body .mz-size__scheme img {
    width: auto;
    max-width: 250px;
    height: auto;
}

.mz-size__body th,
.mz-size__body td {
    padding: var(--space-2) var(--space-3);
    border: 1px solid var(--c-border);
    text-align: center;
    white-space: nowrap;
}

.mz-size__body th {
    background-color: var(--c-bg-soft);
    font-weight: 600;
}

/* Две схемы замера рядом: лента под грудью и лента по груди — это разные
   движения, и на одной картинке видно только одно из них. Узкому экрану
   flex-wrap разложит их в столбик. */
.mz-size__schemes {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: var(--space-7);
    margin-bottom: var(--space-4);
}

.mz-size__schemes figure {
    margin: 0;
    text-align: center;
}

.mz-size__body .mz-size__schemes img {
    display: block;
    width: 240px;
    max-width: 100%;
    height: auto;
    max-height: none;
}

.mz-size__schemes figcaption {
    padding-top: var(--space-1);
    font-size: var(--fs-sm);
    color: var(--c-text-muted);
}

/* Наши таблицы прокручивает обёртка, а не они сами: `display: block`
   на самой таблице (так сделано для перенесённых из ntest) заставляет её
   сжиматься по содержимому, и ряд из пяти значений выходит вдвое уже ряда
   из восьми — рядом стоящие «Крок 1» и «Крок 2» разъезжаются по ширине. */
.mz-size__scroll {
    overflow-x: auto;
    margin-bottom: var(--space-4);
}

.mz-size__body .mz-size__grid {
    display: table;
    width: 100%;
    margin-bottom: 0;
}

/* ⚠️ Блок ниже, а не выше правила над ним, и это важно: селекторы равной
   специфичности (оба 0-2-1), поэтому решает порядок. Стоял выше — `display:
   table` побеждал, и обе версии таблицы висели на странице одновременно. */
/* Одна и та же шкала лежит в разметке дважды: рядами и вертикально.
   На широком экране ряды читаются быстрее — глаз идёт по строке замеров
   и сразу под ней видит размеры. На телефоне ряды не помещаются физически:
   пять диапазонов вида «103–107» дают 378px при 301 доступных, и сузить их
   нечем. Вертикально ширину задаёт одна колонка значений, поэтому влезает
   на любом экране — включая 320px.
   Порог 600px, а не 767: на планшете в портрете ряды ещё помещаются. */
.mz-size__body .mz-size__grid--vertical {
    display: none;
}

@media (max-width: 600px) {
    .mz-size__body .mz-size__grid--rows {
        display: none;
    }

    .mz-size__body .mz-size__grid--vertical {
        display: table;
    }

    /* В вертикальной версии подписи шкал стоят в первой строке, и они
       длинные («(2) Обхват стегон (ОС), см»). Без переноса такая строка
       задаёт ширину всей таблице: у таблицы Ангела с тремя шкалами это
       давало 325px при 301 доступных. Значениям nowrap остаётся — переносить
       «118–122» посреди диапазона нельзя. */
    .mz-size__body .mz-size__grid--vertical tr:first-child td {
        white-space: normal;
    }

    /* ⚠️ Ширина строго 100%, а не по содержимому. Была `width: auto`,
       и таблицы разъезжались между собой: у обхватов подписи короткие
       («Ваш замір, см» / «Розмір») и таблица сжималась до 230px, а у чашек
       подпись «Обхват грудей мінус обхват під грудьми, см» распирала её
       на всю ширину. Две соседние таблицы разной ширины читаются как ошибка
       вёрстки — замечено владельцем 2026-08-26. Колонки делим поровну:
       иначе широкая подпись съедает место у самих размеров. */
    .mz-size__body .mz-size__grid--vertical {
        width: 100%;
        table-layout: fixed;
    }
}


/* Шкала разложена по восемь значений в ряд — иначе таблица не влезает
   в попап ни на одном экране (`exports/add_bra_size_table.php`).
   Ряды разделены зазором: вплотную они читались как одна сбившаяся таблица,
   а толстая линия вместо отступа положения не спасала (решение владельца
   2026-08-26). Отступ здесь делает пустая строка-распорка из генератора —
   при `border-collapse: collapse` margin у строк не работает. */
.mz-size__grid .mz-size__gap td {
    height: var(--space-3);
    padding: 0;
    border: 0;
}

/* Подпись строки переносится по словам, значения — нет: «Обхват грудей мінус
   обхват під грудьми, см» в одну строку съедала треть ширины. Правило только
   для наших таблиц — у перенесённых из ntest разметка чужая. */
.mz-size__grid td:first-child {
    white-space: normal;
    text-align: left;
}

/* Запас на случай, когда шкала не делится на ровные ряды: тогда последний
   добивается пустыми ячейками ради общей ширины колонок, и рисовать их
   не нужно. Сейчас такого нет — chunk_size() подбирает длину ряда так,
   чтобы все вышли одинаковыми (15 обхватов = 5+5+5, 16 чашек = 8+8). */
.mz-size__grid td:empty {
    border-color: transparent;
}

.mz-size__body caption {
    padding-bottom: var(--space-2);
    font-size: var(--fs-sm);
    color: var(--c-text-muted);
    text-align: left;
}

/* Запасной путь для браузеров без <dialog>: там элемент остаётся обычным
   блоком, поэтому прячем его сами и сами же рисуем подложку. */
.mz-size:not([open]) {
    display: none;
}

.mz-size.mz-size--open {
    display: block;
    position: fixed;
    top: 50%;
    left: 50%;
    z-index: 1050;
    transform: translate(-50%, -50%);
}

@media (max-width: 767px) {
    .mz-size__body {
        padding: var(--space-3);
    }

    /* На телефоне схема съедала весь экран, и до таблицы надо было листать. */
    .mz-size__body img {
        max-height: 200px;
    }

    /* ⚠ Фигуре во весь рост потолок в 200 мал: при пропорции 0.68 она
       выходит 136 пикселей шириной, и кружки с цифрами становятся по 10.
       Ради них схему и показывают, поэтому ей потолок отдельный — 176x260.
       Квадратной схемы трусов правило не касается намеренно: у неё ширина
       равна высоте, на 260 она заняла бы 260 и вернула бы ровно ту беду,
       про которую написано абзацем выше. */
    .mz-size__body .mz-size__scheme--figure img {
        max-height: 260px;
    }

    /* Две схемы в столбик — та же беда в двойном размере: до первой таблицы
       пришлось бы листать два экрана. Оставляем их в ряд, ужимая по ширине:
       лента на 185px ещё читается, а обе вместе занимают меньше, чем одна
       полноразмерная. */
    .mz-size__schemes {
        gap: var(--space-3);
    }

    .mz-size__schemes figure {
        flex: 1 1 45%;
        min-width: 0;
    }

    .mz-size__body .mz-size__schemes img {
        width: 100%;
    }

    .mz-size__body th,
    .mz-size__body td {
        padding: var(--space-1) var(--space-2);
        font-size: var(--fs-xs);
    }
}

/* --------------------------------------------------------------------------
   СПИСКИ ЮРИДИЧЕСКИХ СТРАНИЦ (решения владельца 2026-09-04).

   Три разных случая на одних и тех же `<ul>`, поэтому правило смотрит
   на ПУНКТ, а не на список целиком:

   1. Пункт несёт свой номер — `<strong>1.1</strong>`, `<strong>7.3.2</strong>`
      (а в 12.6 исходника — `<b>`, отсюда второй селектор). Маркер здесь был
      бы второй нумерацией подряд: «• 1.1 Договірні відносини…».
   2. Пункт начинается жирным термином — раздел «Терміни та визначення».
      Там словарь, а не перечисление.
   3. Пункт целиком состоит из абзаца `<p>` — списки политики, где каждый
      «пункт» на 270 знаков.

   ⚠ Всё остальное маркер СОХРАНЯЕТ, и это тоже решение владельца: подпункты
   10.2, 4.1, 5.1 и список карт в 7.3.3 — настоящие ненумерованные перечни,
   без точек они висели голым текстом. По той же причине не тронуты
   «Доставка» и «Оплата»: там 9-10 пунктов по 45 знаков.

   ⚠ Отсюда `:has()` вместо простого `#information-information #content li`:
   различить эти случаи можно только по содержимому пункта. В браузере
   без `:has()` (Chrome до 105, Firefox до 121) правило не применится
   и точки останутся — деградация мягкая, вёрстка не ломается.
   -------------------------------------------------------------------------- */

#information-information #content li:has(> strong:first-child),
#information-information #content li:has(> b:first-child),
#information-information #content li:has(> p) {
    list-style: none;
}

/* Список нумерованных пунктов прижат к краю: номер работает заголовком
   пункта, и отступ под несуществующий маркер ему не нужен. */
#information-information #content ul:has(> li > strong:first-child),
#information-information #content ul:has(> li > b:first-child),
#information-information #content ul:has(> li > p) {
    padding-left: 0;
}

/* ⚠ Вложенным отступ возвращается, и селектор намеренно длиннее: правило
   выше применяется и к вложенному списку 7.3.1-7.3.4 тоже (его пункты
   пронумерованы), а специфичности `ul ul` не хватило бы его перебить —
   подпункты вышли бы на один край с пунктами. */
#information-information #content ul ul,
#information-information #content ul ul:has(> li > strong:first-child),
#information-information #content ul ul:has(> li > p) {
    padding-left: 1.5em;
}

/* ⚠ Воздух между пунктами добавлен вместе со снятием маркера, а не «до кучи»:
   точка была единственным, что их разделяло. Убрать её и не дать промежутка
   значит слепить 1.1 и 1.2 в сплошную стену — в договоре на 23 тысячи знаков
   это хуже двойной нумерации. Пункты с маркерами («Доставка») не трогаем. */
#information-information #content li:has(> strong:first-child) + li,
#information-information #content li:has(> b:first-child) + li,
#information-information #content li:has(> p) + li {
    margin-top: 0.7em;
}

/* ⚠ Отдельное правило, потому что разметка невалидна: вложенный `<ul>` в этом
   тексте стоит СИБЛИНГОМ `<li>`, а не внутри него (так пришло из натамоды).
   Пара «последний подпункт → следующий пункт» выглядит для CSS как `ul + li`,
   под `li + li` не подпадает — и пункт 4.2 прижимался вплотную
   к подпунктам 4.1. */
#information-information #content ul + li {
    margin-top: 0.7em;
}

/* Подпунктам хватает половины: они короткие и уже отделены отступом слева. */
#information-information #content ul ul > li + li {
    margin-top: 0.35em;
}

/* --------------------------------------------------------------------------
   ФИЛЬТР OCFilter: раскрытые группы в выезжающей панели (решение владельца
   2026-09-04).

   OCFilter в режиме мобильной версии (mobile_max_width = 10000, поэтому всегда)
   даёт выезжающую слева панель поверх затемнённых товаров — ровно тот overlay,
   что и нужен. Но штатно группы там «проваливающиеся»: тап по группе —
   её значения выезжают вторым уровнем. Владельцу это не нравится.

   Здесь мы КЛАДЁМ значения обратно в поток: показываем их сразу под каждым
   заголовком, убираем стрелки проваливания и всплывающий абсолютный хедер.
   Групп на странице немного (7–11), список скроллится — читается как колонка.

   ⚠ Значения уже есть в DOM (мобильные стили модуля просто увозят их за край
   через transform), поэтому раскрытие — чисто CSS, без правки JS и ядра.
   ⚠ Перебиваем !important модуля большей специфичностью (`.ocf-container …`).
   ⚠ Это стили ТОЛЬКО темы magazinus. У svitbra фильтр будет горизонтальной
   лентой — там этого блока нет.
   -------------------------------------------------------------------------- */

/* значения — в общий поток, видны сразу */
.ocf-container .ocf-filter-body > .ocf-value-list,
.ocf-container .ocf-open .ocf-filter-body > .ocf-value-list {
    position: static !important;
    transform: none !important;
    width: auto !important;
    height: auto !important;
    min-width: 0 !important;
    padding: 4px 0 14px !important;
    margin: 0 !important;
    overflow: visible !important;
    background: transparent !important;
    box-shadow: none !important;
    z-index: auto !important;
}

/* заголовок группы всегда в потоке (без всплывающего абсолютного хедера) */
.ocf-container .ocf-filter-header,
.ocf-container .ocf-open .ocf-filter-header {
    position: static !important;
    bottom: auto !important;
    left: auto !important;
    width: auto !important;
    height: auto !important;
    padding: 12px 0 6px !important;
    background: transparent !important;
    flex-wrap: wrap !important;
    font-weight: 700 !important;
}

/* разделитель между группами */
.ocf-container .ocf-filter {
    border-top: 1px solid var(--c-border);
}
.ocf-container .ocf-filter:first-child { border-top: 0; }

/* убрать стрелки проваливания и «назад» */
.ocf-container .ocf-filter-header .ocf-angle-right,
.ocf-container .ocf-filter-header .ocf-arrow-left,
.ocf-container .ocf-open .ocf-filter-header .ocf-arrow-left {
    display: none !important;
}

/* подпись выбранного значения — снова показать (модуль её прячет в .ocf-open) */
.ocf-container .ocf-open .ocf-active-label { display: block !important; }
