

/* Start:/local/templates/a1/css/fonts.css?17852752632543*/
/* ==========================================================================
   Inter — локальные файлы, без CDN.
   Вариативный шрифт Inter v4.001 (ось wght 100–900), подмножества и
   unicode-range взяты один в один из Google Fonts css2:
   https://fonts.googleapis.com/css2?family=Inter:wght@400..600&display=swap
   Файлы лежат в ../fonts/, скачаны с fonts.gstatic.com и в репозитории.

   Один вариативный файл на подмножество закрывает оба нужных начертания —
   Regular 400 и Semi Bold 600 (§3 ТЗ), поэтому отдельных файлов на вес нет.
   Браузер тянет только те подмножества, которые реально встретились на
   странице: русская страница — cyrillic + latin, latin-ext подключается,
   когда появляется знак рубля ₽ (U+20BD) и прочая расширенная латиница.
   ========================================================================== */

/* Кириллица: русский текст, ё, №, ударение */
@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 100 900;
    font-display: swap;
    src: url(/local/templates/a1/css/../fonts/Inter-cyrillic.woff2) format('woff2');
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}

/* Базовая латиница, типографские кавычки, тире, пробелы */
@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 100 900;
    font-display: swap;
    src: url(/local/templates/a1/css/../fonts/Inter-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;
}

/* Расширенная латиница: сюда попадает знак рубля ₽ (U+20BD) для цен */
@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 100 900;
    font-display: swap;
    src: url(/local/templates/a1/css/../fonts/Inter-latin-ext.woff2) format('woff2');
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
        U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F,
        U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
        U+A720-A7FF;
}

/* End */


/* Start:/local/templates/a1/css/tokens.css?178903827531772*/
/* ==========================================================================
   tokens — все токены дизайна из §3 ТЗ одним слоем.
   Ниже по каскаду литералов цвета и кегля быть не должно: только var().

   ТИПОГРАФИЧЕСКИХ УРОВНЕЙ ТРИ, А НЕ ЧЕТЫРЕ.
   В Figma живут три набора текстовых стилей: «Главная 4/1600px/*»,
   «Главная 4/1200px/*» и «Главная 4/Mob/*». Отдельного набора под Tab 800
   нет — планшет переиспользует набор 1200px. Поэтому кегли переключаются
   на 800 (mob → набор 1200px) и на 1600 (набор 1200px → набор 1600px),
   а брейкпоинт 1200 меняет только сетку и высоту хедера.
   ========================================================================== */

:root {
    /* ----------------------------------------------------------------------
       Цвета (§3). Шесть именованных стилей заливки из макета плюс два
       безымянных значения, у которых в §3 есть роль, но нет имени стиля
       (--a1-canvas и --a1-black-light). Ничего сверх этих восьми в вёрстке
       появляться не должно.
       ---------------------------------------------------------------------- */

    /* Фон полотна страницы. Стиля с именем в макете у него нет — §3
       перечисляет его первым и без названия: «— #000000 (фон полотна
       страницы)». Отдельный токен, а НЕ var(--a1-black): Black #222222
       заливает тёмные кнопки, плашки и табы, и это другая роль.

       Правка от 29.07.2026. До неё --a1-bg ссылался на --a1-black, и это
       был видимый дефект прода: тёмные кнопки #222222 сливались с фоном
       #222222 и выглядели подписью без плашки («Подробнее» на 20 карточках,
       «Конфигуратор», «Скачать каталог», плашка CTA), а рамка неактивного
       таба (#222222 по легенде) не читалась вовсе. Измерено по макету:
       гистограмма 1490:8962 даёт #000000 47.3 % против #222222 3.2 %,
       левое поле страницы на девяти высотах — #000000; то же на 1641:58100
       (1200), 1641:95590 (футер) и в поле легенды 1641:106434 (bg-black).
       В CTA-блоке 1490:8984 — #000000 55 % фона плюс #222222 31 % плашки
       кнопки, то есть макет эти два цвета различает. */
    --a1-canvas: #000000;

    --a1-black: #222222;
    --a1-white: #f0f0f0;
    --a1-white-pure: #ffffff;
    --a1-grey: #7c7c7c;
    --a1-red: #d61c26;
    /* Red 2. В макете применён как заливка плашки статуса «Автомобиль
       в наличии» (узел I1631:20509;682:8355). Нажатых состояний в макете нет
       вообще — легенда §8 состоит только из «СТАТИКА» и «ХОВЕР», — но §3 ТЗ
       описывает этот цвет как «нажатое/тёмное состояние», поэтому он отдан
       ещё и :active светлой кнопки. Отдельной роли-алиаса намеренно нет:
       два назначения (плашка статуса и нажатие) под одно имя не сводятся. */
    --a1-red-2: #7c0f15;
    /* Осветлённый чёрный — фон тёмной кнопки на ховере. В §8 ТЗ он назван
       «~#3A3A3A», в макете это ровно #484848; по цвету источник истины —
       макет. В шестёрку токенов §3 не входит, отсюда отдельное имя. */
    --a1-black-light: #484848;

    /* Роли: разметка обращается к ним, а не к палитре напрямую —
       так смена палитры не требует правки компонентов. */
    --a1-bg: var(--a1-canvas);
    --a1-text: var(--a1-white);
    --a1-text-muted: var(--a1-grey);
    --a1-accent: var(--a1-red);

    /* Цвет кольца фокуса. Отдельная роль, а НЕ ещё одна ссылка на акцент.
       Правка от 30.07.2026, после жалобы с прода.

       ПОЧЕМУ ФОКУС ОТДЕЛЁН ОТ АКЦЕНТА. Red #D61C26 в шаблоне занят дважды:
       им набраны ховеры ссылок и кнопок (§8 ТЗ) и — уже вёрсткой, потому что
       состояний ошибки в макете нет вовсе, — рамка неверно заполненного поля
       вместе с подписью под ним и подсказкой tippy. Кольцо фокуса тем же
       цветом читается сообщением об ошибке там, где ошибки нет. Ровно так его
       и прочитал заказчик: «такая рамка при вводе, у всех полей» — курсор
       стоял в необязательном «Комментарии», а поле обводило красным.
       Своего цвета у ошибок в §3 нет и не вводится, поэтому расходятся не
       ошибка с акцентом, а фокус с ними обоими.

       ПОЧЕМУ ИМЕННО БЕЛЫЙ. Фокус поля в макете нарисован не кольцом, а сменой
       цвета той же рамки: полупрозрачная rgba(240,240,240,0.5) становится
       сплошной #F0F0F0 при неизменной толщине 1px (узлы 1641:52069 — 1600,
       1641:53307 — 1200, 1641:53383 — Tab, 1641:53244 — Mob). То есть
       индикатором фокуса макет назначает белый. Значение — --a1-white, тот
       самый #F0F0F0, а не --a1-white-pure.

       КОНТРАСТ. Кольцо ставится с положительным outline-offset, то есть
       ложится НАРУЖУ элемента — мерить его надо к фону за элементом, а не
       к заливке самого элемента. Полотно чёрное (--a1-canvas), белое кольцо
       на нём даёт 18.43:1 при пороге 3:1 из WCAG 1.4.11; на плашке #222222
       — 13.96:1. У светлой кнопки #F0F0F0 кольцо всё равно лежит на чёрном
       и отделено от плашки зазором в 2px (замер столбцом при dpr 2:
       чёрный 4 | белый 4 | чёрный 4 | плашка), так что совпадение цвета
       кольца и заливки индикатор не гасит.

       ЕСЛИ ПОЯВИТСЯ СВЕТЛЫЙ ФОН. Переопределять роль локально на самом блоке
       (`.светлый-блок { --a1-focus-ring-color: var(--a1-black); }`), а не
       менять значение здесь: :focus-visible в base.css читает переменную
       в момент отрисовки, поэтому наследования достаточно и трогать
       фундамент не придётся. */
    --a1-focus-ring-color: var(--a1-white);

    /* Разделительная линия: White с альфой 0.5. Тем же значением нарисована
       нижняя граница хедера, но у той своё имя по месту применения
       (--a1-header-border-color) — здесь нейтральная роль: горизонтальные
       линии между блоками подвала (в макете это `<line>` со stroke #F0F0F0
       и opacity 0.5) и всё, что появится дальше в той же роли. */
    --a1-divider-color: rgba(240, 240, 240, 0.5);

    /* White fff в §3 подписан как «текст на красном», но текст на красной
       кнопке в макете — White #F0F0F0. Figma перечисляет стиль White fff
       среди применённых в узлах 1631:20500 и 1641:52069, однако конкретный
       слой с ним найти не удалось — то есть применение не найдено, а не
       доказано его отсутствие. Токен объявлен, потому что он есть в §3;
       роли-алиаса под него нет: назначение «текст на акценте» макетом
       не подтверждается. */

    /* ----------------------------------------------------------------------
       Шрифт
       ---------------------------------------------------------------------- */
    --a1-font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI',
        Arial, sans-serif;
    --a1-fw-regular: 400;
    /* Light — пока только описание карточки товара (правка от 10.09.2026,
       partitions.section). В §3 ТЗ его нет: макет набирает всё Regular
       и Semi Bold, тоньше описание сделали по просьбе заказчика. */
    --a1-fw-light: 300;
    --a1-fw-semibold: 600;

    /* Трекинг −6 % у всех заголовочных стилей и ссылок хедера/подвала.
       В em, а не в px: доля от кегля, поэтому одно значение работает на всех
       брейкпоинтах (h4 26px → −1.56px, как и указано в §5 ТЗ). */
    --a1-heading-tracking: -0.06em;

    /* ----------------------------------------------------------------------
       Типографика — базовый уровень: Mob (< 800px)
       ---------------------------------------------------------------------- */
    --a1-h1-size: 30px;
    --a1-h1-lh: 1.2;

    --a1-h2-size: 22px;
    --a1-h2-lh: 1.1;

    --a1-h3-size: 18px;
    --a1-h3-lh: 1.1;

    /* Стиль Mob/h4 = 16px в макете заведён, но карточка товара на мобильном
       заголовком берёт Mob/h2 (22px). Токен здесь — определение стиля.
       Класс на карточке при этом остаётся .a1-h4: он даёт макетные 22/22/26
       на Tab/1200/1600, а под 800 кегль переопределяется в стилях раздела
       (partitions.section, .a1-partitions-card__title). .a1-h2 не подходит —
       он дал бы 38/38/46 вместо 22/22/26. Проверено рендером этапа 5:
       22/22/22/26 на Mob/Tab/1200/1600, ровно по макету. */
    --a1-h4-size: 16px;
    --a1-h4-lh: 1.1;

    --a1-shead-size: 12px;
    --a1-shead-lh: 1.1;
    --a1-shead-tracking: 0;

    /* txt и sTxt по брейкпоинтам НЕ меняются: в макете это по одному стилю
       (1600px/txt и 1600px/sTxt), применённому на всех четырёх ширинах. */
    --a1-txt-size: 14px;
    --a1-txt-lh: 1.2;
    --a1-txt-tracking: 0;

    --a1-stxt-size: 12px;
    --a1-stxt-lh: 1.3;
    --a1-stxt-tracking: 0;

    /* xsTxt — ступень ниже sTxt: 10/1.3. В §3 ТЗ такого стиля нет, §3
       обрывается на sTxt 12 — это пробел ТЗ, а не вольность вёрстки.
       В макете этим кеглем набраны текст о компании, текст о сертификации
       и сноска о запрещённых организациях в подвале (узлы 361:11224,
       361:11225, 1641:42287). По брейкпоинтам, как txt и sTxt, не меняется. */
    --a1-xstxt-size: 10px;
    --a1-xstxt-lh: 1.3;
    --a1-xstxt-tracking: 0;

    /* bTxt — крупный текст абзаца. В §3 ТЗ его нет, в макете есть и он
       используется (контентные блоки мега-меню, «Реализованные проекты»). */
    --a1-btxt-size: 18px;
    --a1-btxt-lh: 1.3;
    --a1-btxt-tracking: 0;

    /* Ссылки хедера и подвала — единственный стиль на все брейкпоинты.
       Стиль Mob/head foot-er links (16px) в макете заведён, но не применён
       ни разу, поэтому в токены не вынесен. */
    --a1-link-size: 14px;
    --a1-link-lh: 1;

    /* Мелкая кнопка-ссылка из легенды §8 («Мелкие кнопки»): 16/1.1 Regular
       с подчёркиванием. Это не head/footer link, кегль другой. */
    --a1-link-small-size: 16px;
    --a1-link-small-lh: 1.1;

    /* ----------------------------------------------------------------------
       Сетка и контейнеры (§2)

                     | Mob 360 | Tab 800 | Desk 1200 | Desk 1600
       padding       |    20   |    20   |     40    |     40
       контент       |   320   |   760   |    1120   |    1520
       колонок       |     1   |     2   |       2   |        2
       gap колонок   |     —   |    60   |      60   |       60
       gap строк     |    40   |    60   |      60   |       60

       Все шесть строк сверены с макетом по координатам узлов. Вертикальный
       gap на мобильном — 40, а не 60: шаг сетки карточек 476+40 и 500+40.
       ---------------------------------------------------------------------- */
    --a1-container-pad: 20px;
    /* Полная ширина контейнера вместе с паддингами: 1520 + 40 + 40 */
    --a1-container-max: 1600px;
    --a1-grid-gap: 60px;
    --a1-grid-row-gap: 40px;
    --a1-grid-columns: 1;

    /* ----------------------------------------------------------------------
       Хедер (§4.1). Высота 70 на mob/tab, 74 на десктопе.
       Фон и размытие — из компонента Header в макете.
       Значения раскрытого меню (затемнение 70 %, blur 20) в аннотации
       1641:103931 — их задаёт этап 2, здесь только состояние покоя.
       ---------------------------------------------------------------------- */
    --a1-header-height: 70px;
    --a1-header-bg: rgba(0, 0, 0, 0.3);
    --a1-header-blur: 5px;
    --a1-header-border-color: rgba(240, 240, 240, 0.5);

    /* ----------------------------------------------------------------------
       Шкала слоёв. Литералов z-index ниже по каскаду быть не должно: слои
       этапов 2 (панели меню, затемнение, бургер) и 6 (модалки, галерея)
       обязаны уживаться, а разложить их по числам задним числом дороже.

       Порядок снизу вверх:
         dim           затемнение фона под раскрытым меню (§4.1);
         menu-panel    панель мега-меню и выпадашки — ниже полосы хедера,
                       они из-под неё и выезжают;
         header        полоса хедера;
         modal-overlay затемнение с блюром под модалкой (§6) — ВЫШЕ хедера;
         modal         сама модалка;
         gallery       полноразмерное фото поверх всего.

       Хедер ниже модалки, и это не описка. В макете порядок детей поп-апа
       (Figma отдаёт back-to-front) на всех четырёх брейкпоинтах такой:
       контент страницы → Header → Rectangle 173 (затемнение во весь фрейм)
       → «Закрыть ✕» → заголовок → содержимое. Узлы 1496:22405 (Mob),
       1641:55746 (Tab), 1560:4574 (Desktop 1600), с направляющими 1641:99999.
       Затемняющий прямоугольник лежит поверх хедера: на десктопе меню и
       логотип размыты и затемнены наравне с контентом, резким остаётся один
       «Закрыть ✕», а на Mob хедера на экране нет вовсе.
       То есть «хедер остаётся видимым» из §6 означает, что он просвечивает
       ПОД затемнением, а не лежит над ним.

       Практическое следствие для этапа 6: подними хедер выше — и на Mob 360
       и Tab 800 он вырежет из полноэкранного поп-апа верхние 70 px вместе
       с кнопкой «Закрыть» (y=20) и заголовком продукта (y=64), а на десктопе
       меню под модалкой останется кликабельным.

       fancybox по умолчанию ставит себе 1050 — на этапе 6 его z-index
       придётся принудительно свести к --a1-z-gallery, иначе он выпадет
       из этой шкалы.
       ---------------------------------------------------------------------- */
    --a1-z-dim: 50;
    --a1-z-menu-panel: 80;
    --a1-z-header: 90;
    --a1-z-modal-overlay: 100;
    --a1-z-modal: 110;
    --a1-z-gallery: 300;

    /* ----------------------------------------------------------------------
       Движение (§8): единственная длительность и кривая на весь сайт.

       Правка от 10.09.2026: 0.2s → 0.4s. Легенда макета подписывает переходы
       «0.2s ease in out», но на живом сайте заказчик счёл ховеры резкими,
       и дизайнер согласовал 0.4s везде: кнопки, хедер, появление слоёв,
       увеличение фото. Меняется только это значение — все переходы шаблона
       и разделов читают его через --a1-transition.
       ---------------------------------------------------------------------- */
    --a1-duration: 0.4s;
    --a1-easing: ease-in-out;
    --a1-transition: var(--a1-duration) var(--a1-easing);

    /* ----------------------------------------------------------------------
       Базовые компоненты. Скругления в макете нет нигде — 0 вынесен в токен,
       чтобы не рассыпать литерал по правилам.
       ---------------------------------------------------------------------- */
    --a1-radius: 0;

    /* Кнопка: 44 высоты, 16 по горизонтали, размытие подложки 4.
       Подпись кнопки живёт по собственной шкале и НЕ совпадает с txt:
       12/1.3 на Mob 360 и Tab 800, 14/1.2 на Desktop 1200 и 1600.
       Переключение — на 1200, а не на 800, как у заголовков. */
    --a1-button-height: 44px;
    --a1-button-padding-x: 16px;
    --a1-button-gap: 16px;
    --a1-button-icon-size: 20px;
    --a1-button-blur: 4px;
    --a1-button-font-size: 12px;
    --a1-button-lh: 1.3;

    /* Таб */
    --a1-tab-padding-x: 20px;

    /* Иконка-ссылка (соцсети, коммуникационные каналы) */
    --a1-icon-link-size: 40px;

    /* Поле ввода: высота 44 (в §7 ТЗ указано «~48» — макет говорит 44),
       textarea 88 с отступом 16 со всех сторон.
       Рамка — белый с альфой 0.5, а не Grey: над чёрным фоном она выглядит
       как серая, но токен именно белый, и на фокусе альфа уходит в 1. */
    /* Текст и плейсхолдер поля тоже по своей шкале: 12/1.1 (Mob/sHead) на
       Mob 360, 14/1.2 начиная с Tab 800. Переключение — на 800. */
    --a1-field-font-size: 12px;
    --a1-field-lh: 1.1;
    --a1-field-height: 44px;
    --a1-field-padding-x: 16px;
    --a1-field-textarea-height: 88px;
    --a1-field-textarea-padding: 16px;
    --a1-field-gap: 20px;
    --a1-field-border-color: rgba(240, 240, 240, 0.5);
    --a1-field-border-color-focus: var(--a1-white);
    /* Поле внутри модалки лежит на своей подложке с размытием 10 */
    --a1-field-overlay-bg: rgba(0, 0, 0, 0.7);
    --a1-field-overlay-blur: 10px;

    /* Чекбокс: квадрат 20, отметка — залитый квадрат 14 с отступом 3 */
    --a1-checkbox-size: 20px;
    --a1-checkbox-mark-size: 14px;
    --a1-checkbox-gap: 20px;
}

/* --------------------------------------------------------------------------
   Tab 800 и выше — переключение на набор стилей «1200px».
   Сетка здесь становится двухколоночной, паддинг остаётся 20.
   -------------------------------------------------------------------------- */
@media (min-width: 800px) {
    :root {
        --a1-h1-size: 50px;
        --a1-h2-size: 38px;
        --a1-h3-size: 28px;
        --a1-h4-size: 22px;

        --a1-shead-size: 16px;

        /* Поле переключается здесь: на Tab уже 14/1.2 */
        --a1-field-font-size: 14px;
        --a1-field-lh: 1.2;

        --a1-grid-columns: 2;
        --a1-grid-row-gap: 60px;
    }
}

/* --------------------------------------------------------------------------
   Desktop 1200 и выше — кегли те же, что на Tab; меняются только паддинг
   контейнера и высота хедера.
   -------------------------------------------------------------------------- */
@media (min-width: 1200px) {
    :root {
        --a1-container-pad: 40px;
        --a1-header-height: 74px;

        /* Подпись кнопки переключается здесь, а не на 800:
           на Tab 800 она ещё 12/1.3 */
        --a1-button-font-size: 14px;
        --a1-button-lh: 1.2;
    }
}

/* --------------------------------------------------------------------------
   Desktop 1600 и выше — набор стилей «1600px».
   -------------------------------------------------------------------------- */
@media (min-width: 1600px) {
    :root {
        --a1-h1-size: 70px;
        --a1-h2-size: 46px;
        --a1-h3-size: 38px;
        --a1-h4-size: 26px;
    }
}

/* ==========================================================================
   МЕНЮ ХЕДЕРА (§4.1): типографика и цвета мега-меню, выпадашек и бургера.

   Почему здесь, а не в menu.css. Следующий раздел редизайна забирает
   tokens.css как определение дизайна целиком — шкала кеглей и палитра
   обязаны быть в одном файле. Объявления, оставшиеся в слое компонента,
   до него бы не доехали, и меню приехало бы без половины шкалы.

   Геометрия меню (шаг сетки, высота плитки, паддинг панелей, ширина
   панели режима работы) осталась в menu.css: это раскладка одного
   компонента, а не токен дизайна.

   Блоки @media ниже отдельные, а не дописанные в те, что выше. Файл уже
   отревьюен, добавление не должно править принятые строки; повторный
   @media с той же границей CSS разрешает и стоит ноль.
   ========================================================================== */
:root {
    /* ----------------------------------------------------------------------
       Плотность слоёв меню (аннотация 1641:103931).

       ПОКОЙ И ПАНЕЛИ: rgba(0,0,0,0.3) + размытие 5px. Этим залиты полоса
       хедера, выпадашки «Опции» и «Компания» (узлы 1641:7901 и 1632:7898)
       и панель режима работы (1632:8806). Замер по рендеру макета
       1632:8466: фон 218 → 149 под панелью, α ≈ 0.31.

       РАСКРЫТОЕ МЕГА-МЕНЮ: 0.7 + размытие 10px. Аннотация формулирует это
       как «30 % → 70 %, background-blur 10 → 20», и удвоенные числа блюра
       в ней — свойство самой аннотации, а не единиц Figma: codegen отдаёт
       ровно backdrop-blur-[5px] в покое и backdrop-blur-[10px] в раскрытии,
       никакого коэффициента между Figma и CSS нет.

       Затемнение применяется ТОЛЬКО к мега-меню «Продукты»: и аннотация
       («При наведении кнопка "Продукты"…»), и карта зон
       Header-продукты_поля_активности адресованы одному пункту. Замер
       рендеров подтверждает: при раскрытых «Опциях» полоса хедера 154.2
       против 155.4 в покое, фон под ней 240.6 против 240.5 — не меняется.

       Свой токен, а не var(--a1-header-bg): тот переопределяется на
       .a1-header.is-menu-open, и панели, лежащие внутри хедера,
       унаследовали бы значение раскрытия.
       ---------------------------------------------------------------------- */
    --a1-menu-panel-bg: rgba(0, 0, 0, 0.3);
    --a1-menu-panel-blur: 5px;
    --a1-menu-open-bg: rgba(0, 0, 0, 0.7);
    --a1-menu-open-blur: 10px;

    /* Затемнение фото на плитке. На десктопе это сплошной слой
       rgba(0,0,0,0.4), на tab/mob — два градиента, тёмных сверху и снизу
       и прозрачных в середине: подписи бренда и модели стоят по краям,
       а середину макет оставляет открытой. Ховерное значение в макете
       не задано — см. комментарий у правила в menu.css. */
    --a1-menu-tile-shade: rgba(0, 0, 0, 0.4);
    --a1-menu-tile-shade-hover: rgba(0, 0, 0, 0.15);
    --a1-menu-tile-shade-image:
        linear-gradient(0deg, rgba(0, 0, 0, 0) 73.419%, rgba(0, 0, 0, 0.6) 100%),
        linear-gradient(180deg, rgba(0, 0, 0, 0) 73.419%, rgba(0, 0, 0, 0.6) 100%);

    /* Подложка текстового блока плашки CTA в мега-меню (узлы 1632:8181
       на 1600 и 1641:103433 на 1200 — на обоих брейкпоинтах она есть) */
    --a1-menu-cta-panel-bg: rgba(0, 0, 0, 0.3);

    /* ----------------------------------------------------------------------
       Типографика меню. §3 ТЗ этих стилей не описывает — они взяты из
       макета по факту применения.
       ---------------------------------------------------------------------- */

    /* Пункт бургера. Это стиль «Главная 4/Mob/head foot-er links» = 16/1.0
       с трекингом −6 %. Выше он не вынесен с пометкой «в макете заведён,
       но не применён ни разу» — в меню tab/mob он применён: узлы
       1641:100597 (Mob) и 1641:104937 (Tab), оба 16 px. */
    --a1-menu-item-size: 16px;
    --a1-menu-item-lh: 1;

    /* Заголовок «Свяжитесь с нами» в бургере: 18/1.1 Semi Bold, −6 %,
       UPPERCASE. Кегль совпадает с bTxt (18), но у bTxt Regular и lh 1.3 —
       это другой стиль, свести их нельзя. */
    --a1-menu-contacts-size: 18px;
    --a1-menu-contacts-lh: 1.1;

    /* Плитка модели: название. На десктопе это h4 (26 на 1600, 22 на 1200) —
       берём токен. На tab/mob макет ставит те же 16/1.0, что у пунктов. */
    --a1-menu-tile-title-size: var(--a1-menu-item-size);
    --a1-menu-tile-title-lh: var(--a1-menu-item-lh);

    /* Заголовок плашки CTA. Кегль в макете свой на каждом брейкпоинте и
       ни один из них не следует шкале h1–h4 этого брейкпоинта:
       Mob 22, Tab 38, Desktop 1200 и 1600 — 26. Поэтому переменная, а не
       var(--a1-h3-size) / var(--a1-h4-size): те дали бы 18/28/22/26. */
    --a1-menu-cta-title-size: 22px;
    --a1-menu-cta-title-lh: 1.1;

    /* Подпись кнопки CTA: 14 на Mob и на десктопе, 16 на Tab */
    --a1-menu-cta-button-size: 14px;
}

@media (min-width: 800px) {
    :root {
        /* Заголовок плашки CTA на Tab крупнее всех остальных брейкпоинтов */
        --a1-menu-cta-title-size: 38px;
        --a1-menu-cta-button-size: 16px;
    }
}

@media (min-width: 1200px) {
    :root {
        /* Название модели на плитке — h4 своего брейкпоинта: 22 на 1200,
           26 на 1600 (макет: стили «Главная 4/1200px/h4» и «.../1600px/h4») */
        --a1-menu-tile-title-size: var(--a1-h4-size);
        --a1-menu-tile-title-lh: var(--a1-h4-lh);

        /* Заголовок плашки CTA на десктопе — 26 на обеих ширинах */
        --a1-menu-cta-title-size: 26px;
        --a1-menu-cta-button-size: 14px;
    }
}

/* End */


/* Start:/local/templates/a1/css/base.css?178903827513245*/
/* ==========================================================================
   base — сброс, дефолты элементов, типографические классы.
   Значения не задаются числами: всё через переменные из tokens.css.
   ========================================================================== */

*,
*::before,
*::after {
    box-sizing: border-box;
}

html {
    /* Плавный якорный скролл, но с уважением к системной настройке */
    scroll-behavior: smooth;
    /* Фиксированный хедер не должен перекрывать цель якоря */
    scroll-padding-top: var(--a1-header-height);
    -webkit-text-size-adjust: 100%;
    text-size-adjust: 100%;
}

/*
 * Замок прокрутки для бургера (этап 2) и модалок (этап 6).
 * Ставится и снимается только через window.A1.lockScroll / unlockScroll —
 * они считают вложенность, чтобы слои не снимали замок друг другу.
 * padding-right компенсирует исчезнувшую полосу прокрутки, иначе страница
 * дёргается по горизонтали в момент открытия.
 */
html.a1-scroll-locked {
    overflow: hidden;
    padding-right: var(--a1-scrollbar-width, 0px);
}

/*
 * Отступ на <html> не действует на position: fixed — у фиксированных слоёв
 * содержащий блок это вьюпорт, а он при снятии полосы прокрутки становится
 * шире. Без отдельной компенсации хедер остаётся на месте, а контент под ним
 * уезжает влево на ширину полосы, и контейнеры расходятся примерно на 15 px.
 *
 * Правило: КАЖДЫЙ фиксированный слой шириной во весь экран (хедер, оверлей
 * модалки, бургер) получает класс .a1-fixed-layer. Хедеру он не нужен —
 * он перечислен здесь явно, — но всему, что появится на этапах 2 и 6, нужен.
 */
html.a1-scroll-locked .a1-header,
html.a1-scroll-locked .a1-fixed-layer {
    padding-right: var(--a1-scrollbar-width, 0px);
}

body {
    margin: 0;
    background-color: var(--a1-bg);
    color: var(--a1-text);
    font-family: var(--a1-font-family);
    font-size: var(--a1-txt-size);
    font-weight: var(--a1-fw-regular);
    line-height: var(--a1-txt-lh);
    letter-spacing: var(--a1-txt-tracking);
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    /* Ни один блок не имеет права вылезти за ширину экрана (общее правило приёмки) */
    overflow-x: hidden;
}

h1, h2, h3, h4, h5, h6, p, figure, blockquote, dl, dd {
    margin: 0;
}

ul, ol {
    margin: 0;
    padding: 0;
    list-style: none;
}

img, picture, video, canvas, svg {
    display: block;
    max-width: 100%;
}

svg {
    fill: currentColor;
}

a {
    color: inherit;
    text-decoration: none;
    transition: color var(--a1-transition);
}

button, input, textarea, select {
    font: inherit;
    letter-spacing: inherit;
    color: inherit;
}

button {
    border: 0;
    padding: 0;
    background: none;
    cursor: pointer;
}

textarea {
    resize: vertical;
}

/* Видимый фокус обязателен: клавиатурная навигация по меню — критерий приёмки
   этапа 2. Мышиный клик рамку не показывает, :focus-visible это разводит. */
:focus-visible {
    outline: 2px solid var(--a1-focus-ring-color);
    outline-offset: 2px;
}

/* Доступное скрытие: элемент не виден, но читается скринридером */
.a1-visually-hidden {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0 0 0 0);
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
}

/* --------------------------------------------------------------------------
   Типографика (§3 ТЗ)

   Классы, а не голые теги: уровень заголовка в разметке диктуется структурой
   документа, а размер — макетом, и совпадать они обязаны не всегда.
   Теги h1–h4 получают соответствующий стиль по умолчанию, класс его
   перебивает.

   Верхний регистр стоит на всех четырёх уровнях: в макете textCase=UPPER
   зашит в стили h1, h2, h3 и h4, а не только в h4, как сказано в §3 ТЗ.
   По регистру источник истины — макет.
   -------------------------------------------------------------------------- */

.a1-h1, h1 {
    font-size: var(--a1-h1-size);
    line-height: var(--a1-h1-lh);
    letter-spacing: var(--a1-heading-tracking);
    font-weight: var(--a1-fw-semibold);
    text-transform: uppercase;
}

.a1-h2, h2 {
    font-size: var(--a1-h2-size);
    line-height: var(--a1-h2-lh);
    letter-spacing: var(--a1-heading-tracking);
    font-weight: var(--a1-fw-semibold);
    text-transform: uppercase;
}

.a1-h3, h3 {
    font-size: var(--a1-h3-size);
    line-height: var(--a1-h3-lh);
    letter-spacing: var(--a1-heading-tracking);
    font-weight: var(--a1-fw-semibold);
    text-transform: uppercase;
}

/* h4 — заголовок карточки товара (§5) */
.a1-h4, h4 {
    font-size: var(--a1-h4-size);
    line-height: var(--a1-h4-lh);
    letter-spacing: var(--a1-heading-tracking);
    font-weight: var(--a1-fw-semibold);
    text-transform: uppercase;
}

/* sHead — крупный вспомогательный текст: надзаголовки, подписи под H2 */
.a1-shead {
    font-size: var(--a1-shead-size);
    line-height: var(--a1-shead-lh);
    letter-spacing: var(--a1-shead-tracking);
    font-weight: var(--a1-fw-regular);
}

/* txt — основной текст, он же дефолт body */
.a1-txt {
    font-size: var(--a1-txt-size);
    line-height: var(--a1-txt-lh);
    letter-spacing: var(--a1-txt-tracking);
    font-weight: var(--a1-fw-regular);
}

/* bTxt — крупный абзац. В §3 ТЗ стиля нет, в макете есть и он применён
   (контентные блоки мега-меню). */
.a1-btxt {
    font-size: var(--a1-btxt-size);
    line-height: var(--a1-btxt-lh);
    letter-spacing: var(--a1-btxt-tracking);
    font-weight: var(--a1-fw-regular);
}

/* sTxt — мелкий текст: подписи чекбоксов, сноски */
.a1-stxt {
    font-size: var(--a1-stxt-size);
    line-height: var(--a1-stxt-lh);
    letter-spacing: var(--a1-stxt-tracking);
    font-weight: var(--a1-fw-regular);
}

/*
 * МЕЖСТРОЧНЫЙ АБЗАЦНЫХ СТИЛЕЙ ОКРУГЛЁН ДО ЦЕЛОГО ПИКСЕЛЯ. Правка от
 * 10.09.2026, замечание заказчика «текст описания с некорректными
 * расстояниями между строк» в hero.
 *
 * Токены дают дробный шаг: 14 × 1.2 = 16.8 px. Браузер ставит строки на
 * целые пиксели экрана, и дробный шаг распадается на неравные интервалы —
 * замер на живом сайте: 17 17 16 17 при dpr 1, 34 34 32 34 при dpr 2.
 * С шагом 17 px интервалы ровные на обоих. Figma не округляет, поэтому
 * в макете дефекта нет.
 *
 * Токены остаются множителями — их читают calc() в стилях разделов.
 * @supports обязателен: объявление с var() проходит разбор в любом
 * движке, и браузер без round() сбросил бы line-height в унаследованный
 * от body, а не вернулся к множителю выше.
 *
 * Наследуется уже пиксельное значение, поэтому потомок с другим кеглем
 * обязан задавать свой line-height — у всех типографических классов
 * шаблона он свой.
 */
@supports (line-height: round(nearest, 1px, 1px)) {
    .a1-txt {
        line-height: round(nearest, calc(var(--a1-txt-size) * var(--a1-txt-lh)), 1px);
    }

    .a1-btxt {
        line-height: round(nearest, calc(var(--a1-btxt-size) * var(--a1-btxt-lh)), 1px);
    }

    .a1-stxt {
        line-height: round(nearest, calc(var(--a1-stxt-size) * var(--a1-stxt-lh)), 1px);
    }
}

/*
 * Сноска: самый мелкий кегль (xsTxt 10/1.3) плюс приглушённый цвет одной
 * ролью. Юридические примечания, тексты о компании и о сертификации,
 * оговорки со звёздочкой — везде эта пара идёт вместе, поэтому класс один,
 * а не .a1-xstxt + .a1-muted на каждом абзаце.
 */
.a1-note {
    font-size: var(--a1-xstxt-size);
    line-height: var(--a1-xstxt-lh);
    letter-spacing: var(--a1-xstxt-tracking);
    font-weight: var(--a1-fw-regular);
    color: var(--a1-text-muted);
}

/*
 * Типографика стиля «head/footer links» (§3) без цвета и без интерактивных
 * состояний: 14/1.0, Semi Bold, UPPERCASE, трекинг −6 %.
 *
 * Нужна там, где кегль тот же, а элемент не кликабельный: заголовки колонок
 * подвала, подписи-разделители в меню. Вешать на них .a1-link нельзя —
 * тот красит текст и краснеет по ховеру, то есть притворяется ссылкой.
 *
 * .a1-link ниже повторяет эти четыре объявления своими строками, а не
 * ссылается сюда: правило отревьюено этапом 1 и правке не подлежит.
 * Свести их в одно — отдельной задачей, когда фундамент откроют.
 */
.a1-link-label {
    font-size: var(--a1-link-size);
    line-height: var(--a1-link-lh);
    letter-spacing: var(--a1-heading-tracking);
    font-weight: var(--a1-fw-semibold);
    text-transform: uppercase;
}

/* Ссылки хедера и подвала (§3, §8) */
.a1-link {
    font-size: var(--a1-link-size);
    line-height: var(--a1-link-lh);
    letter-spacing: var(--a1-heading-tracking);
    font-weight: var(--a1-fw-semibold);
    text-transform: uppercase;
    color: var(--a1-text);
}

.a1-link.is-active {
    color: var(--a1-accent);
}

@media (hover: hover) {
    .a1-link:hover {
        color: var(--a1-accent);
    }
}

/* Мелкая кнопка-ссылка: 16/1.1 Regular, в статике подчёркнута, на ховере
   краснеет и теряет подчёркивание (§8, легенда «Мелкие кнопки») */
.a1-link-underline {
    font-size: var(--a1-link-small-size);
    line-height: var(--a1-link-small-lh);
    font-weight: var(--a1-fw-regular);
    color: var(--a1-text);
    text-decoration: underline;
    text-underline-offset: 0.2em;
    transition: color var(--a1-transition), text-decoration-color var(--a1-transition);
}

@media (hover: hover) {
    .a1-link-underline:hover {
        color: var(--a1-accent);
        text-decoration-color: transparent;
    }
}

/*
 * Размыкатель верхнего регистра. Заголовки едут из инфоблока (названия
 * продуктов §9, заголовки поп-апов), а text-transform: uppercase на уровне
 * CSS необратим: контент-менеджер уже никак не получит строчные, даже если
 * так введёт. Класс вешается на конкретный заголовок и возвращает регистр
 * ровно тот, что лежит в базе.
 */
.a1-no-caps {
    text-transform: none;
}

.a1-muted {
    color: var(--a1-text-muted);
}

.a1-accent {
    color: var(--a1-accent);
}

/* Уважение к системному «уменьшить движение» */
@media (prefers-reduced-motion: reduce) {
    html {
        scroll-behavior: auto;
    }

    *,
    *::before,
    *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        scroll-behavior: auto !important;
    }
}

/* End */


/* Start:/local/templates/a1/css/layout.css?17852752634679*/
/* ==========================================================================
   layout — контейнер, сетка, каркас страницы (§2 ТЗ).
   ========================================================================== */

/* Оболочка документа: прижимает подвал к низу на коротких страницах */
.a1-page {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
    min-height: 100dvh;
}

.a1-main {
    flex: 1 0 auto;
}

/* --------------------------------------------------------------------------
   Контейнер

   Одна формула закрывает все четыре брейкпоинта:
     360  → 360 − 2×20 = 320
     800  → 800 − 2×20 = 760
     1200 → 1200 − 2×40 = 1120
     1600 → 1600 − 2×40 = 1520
   Шире 1600 контент упирается в 1520 и центрируется.

   Паддинг переключается ступенькой на 1200, а не растёт плавно. Побочный
   эффект: на 1199 контент 1159, на 1200 — 1120, то есть при расширении окна
   он разово сужается на 39 px. Так задано в макете (20 на планшете, 40 на
   десктопе), и ступенька — единственный способ попасть в заявленную ширину
   на всех четырёх контрольных точках точно. Плавная интерполяция через
   clamp() промахивается на ширину полосы прокрутки, потому что 100vw её
   учитывает, а доступная ширина — нет.
   -------------------------------------------------------------------------- */
.a1-container {
    width: 100%;
    max-width: var(--a1-container-max);
    margin-inline: auto;
    padding-inline: var(--a1-container-pad);
}

/* --------------------------------------------------------------------------
   Сетка карточек: 1 колонка на мобильном, 2 начиная с 800.
   -------------------------------------------------------------------------- */
.a1-grid {
    display: grid;
    grid-template-columns: repeat(var(--a1-grid-columns), minmax(0, 1fr));
    column-gap: var(--a1-grid-gap);
    row-gap: var(--a1-grid-row-gap);
}

/* --------------------------------------------------------------------------
   Хедер: лежит поверх контента, полупрозрачный, с размытием подложки (§4.1).
   Наполнение — этап 2; здесь только габариты и подложка, чтобы этап 2
   достраивал внутрь, а не переписывал обвязку.
   -------------------------------------------------------------------------- */
.a1-header {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    z-index: var(--a1-z-header);
    height: var(--a1-header-height);
    background-color: var(--a1-header-bg);
    backdrop-filter: blur(var(--a1-header-blur));
    -webkit-backdrop-filter: blur(var(--a1-header-blur));
    border-bottom: 1px solid var(--a1-header-border-color);
    transition: background-color var(--a1-transition),
        backdrop-filter var(--a1-transition);
}

.a1-header__inner {
    display: flex;
    align-items: center;
    height: 100%;
}

/* --------------------------------------------------------------------------
   Подвал. Наполнение — этап 3.
   -------------------------------------------------------------------------- */
.a1-footer {
    flex: 0 0 auto;
}

/* --------------------------------------------------------------------------
   Утилиты раскладки, нужные более чем одному разделу.
   -------------------------------------------------------------------------- */

/* Ряд элементов с шагом сетки полей формы */
.a1-row {
    display: flex;
    gap: var(--a1-field-gap);
}

.a1-row > * {
    flex: 1 1 0;
    min-width: 0;
}

/* На мобильном парные поля и кнопки становятся в столбец (§5, §7).
   Сброс flex обязателен: в колонке `flex: 1 1 0` начинает делить не ширину,
   а высоту, и поля с кнопками сплющиваются до трети от 44 px. */
@media (max-width: 799.98px) {
    .a1-row {
        flex-direction: column;
    }

    .a1-row > * {
        flex: 0 0 auto;
        width: 100%;
    }
}

/* End */


/* Start:/local/templates/a1/css/components.css?178903827519810*/
/* ==========================================================================
   components — базовые интерфейсные элементы: кнопка, поле ввода, textarea,
   чекбокс, таб. Состояния по легенде §8 ТЗ, переход — --a1-transition.

   Правило про ховеры: любой :hover обёрнут в @media (hover: hover).
   На тач-устройствах ховер «залипает» после тапа, а по §5 ТЗ на tab и mob
   ховер-эффектов быть не должно.
   ========================================================================== */

/* --------------------------------------------------------------------------
   Кнопка

   Общее у всех вариантов: высота 44, паддинг по горизонтали 16, скругления
   нет, рамки нет, размытие подложки 4, подпись Inter Regular 14/1.2 без
   трекинга и без верхнего регистра.

   ВЫТЕСНЕНИЕ СНИЗУ ВВЕРХ (правка от 29.07.2026). Средняя колонка легенды
   1641:106434 — не промежуточный кадр плавной заливки, а механика перехода:
   у светлой кнопки (Frame 9501, узел 1232:1611) и у светлой кнопки с иконкой
   (Frame 9502, узел 1232:1602) нарисован Rectangle 16 — красный
   прямоугольник 120×21 при высоте кнопки 44, то есть заливка, поднявшаяся
   снизу ровно наполовину. Реализовано псевдоэлементом ::before со
   scaleY(0→1) от нижнего края; лишнего узла в разметку не добавлено.

   position и isolation нужны именно вытеснению: ::before лежит под подписью
   на z-index: -1, а отрицательный слой обязан оставаться внутри собственного
   контекста наложения кнопки, иначе он провалится под фон страницы.
   -------------------------------------------------------------------------- */
.a1-button {
    position: relative;
    isolation: isolate;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--a1-button-gap);
    height: var(--a1-button-height);
    padding-inline: var(--a1-button-padding-x);
    border: 0;
    border-radius: var(--a1-radius);
    font-size: var(--a1-button-font-size);
    line-height: var(--a1-button-lh);
    font-weight: var(--a1-fw-regular);
    letter-spacing: var(--a1-txt-tracking);
    text-align: center;
    text-decoration: none;
    white-space: nowrap;
    cursor: pointer;
    backdrop-filter: blur(var(--a1-button-blur));
    -webkit-backdrop-filter: blur(var(--a1-button-blur));
    transition: background-color var(--a1-transition), color var(--a1-transition);
}

.a1-button__icon {
    flex: 0 0 auto;
    width: var(--a1-button-icon-size);
    height: var(--a1-button-icon-size);
}

/* Растянуть кнопку на всю доступную ширину (кнопка формы, кнопки карточки) */
.a1-button--block {
    display: flex;
    width: 100%;
}

/* Светлая кнопка: основной призыв («Получить предложение», «Отправить») */
.a1-button--light {
    background-color: var(--a1-white);
    color: var(--a1-black);
}

/*
 * Красная заливка ховера. Не background-color кнопки, а отдельный слой:
 * по легенде она приходит снизу и вытесняет светлый фон, а не проявляется
 * равномерно по всей плашке.
 *
 * inset: 0 плюс transform-origin: bottom — прямоугольник в полную ширину и
 * нулевой высоты, прижатый к нижнему краю; scaleY(1) поднимает его до
 * верхнего. Анимируется transform, а не height: он не вызывает
 * переразметку и не дёргает подпись.
 *
 * z-index: -1 кладёт слой между собственным фоном кнопки и её содержимым,
 * поэтому подпись и глиф остаются видимыми и не требуют своего узла.
 */
.a1-button--light::before {
    content: '';
    position: absolute;
    inset: 0;
    z-index: -1;
    background-color: var(--a1-accent);
    transform: scaleY(0);
    transform-origin: bottom;
    transition: transform var(--a1-transition),
        background-color var(--a1-transition);
}

@media (hover: hover) {
    .a1-button--light:hover {
        color: var(--a1-white);
    }

    .a1-button--light:hover::before {
        transform: scaleY(1);
    }
}

/* Нажатое состояние в макете не нарисовано; цвет взят из §3 ТЗ, где Red 2
   прямо назван цветом нажатого состояния. Обращаемся к палитре напрямую:
   роли-алиаса у Red 2 нет, см. комментарий в tokens.css.

   Нажатие красит тот же слой, а не фон кнопки, иначе Red 2 остался бы
   под уже поднятым красным и его никто бы не увидел. На десктопе клику
   предшествует ховер, слой к этому моменту поднят — меняется только цвет.
   На тач-устройстве ховера нет, и слой поднимается по самому нажатию. */
.a1-button--light:active {
    color: var(--a1-white);
}

.a1-button--light:active::before {
    background-color: var(--a1-red-2);
    transform: scaleY(1);
}

/*
 * Тёмная кнопка: второстепенное действие («Подробнее», «Конфигуратор»).
 *
 * ВЫТЕСНЕНИЯ ЗДЕСЬ НЕТ, И ЭТО ПРОВЕРЕНО ПО МАКЕТУ. В легенде 1641:106434
 * средняя колонка есть только у тех рядов, где переход рисуется: Frame 9501
 * (светлая), Frame 9502 (светлая с иконкой), Frame 9515 (иконки). Ряды
 * тёмной кнопки — Frame 9505 (узлы 0:30 и 0:33) и Frame 9506 (0:66 и 0:74) —
 * состоят ровно из двух состояний, между ними ничего не нарисовано.
 * Значит у тёмной кнопки простая смена цвета фона #222222 → #484848.
 * Подпись и глиф при этом остаются #F0F0F0 — цвет не меняется вовсе.
 */
.a1-button--dark {
    background-color: var(--a1-black);
    color: var(--a1-white);
}

@media (hover: hover) {
    .a1-button--dark:hover {
        background-color: var(--a1-black-light);
    }
}

.a1-button--dark:active {
    background-color: var(--a1-black-light);
}

.a1-button:disabled,
.a1-button[aria-disabled='true'] {
    opacity: 0.5;
    pointer-events: none;
}

/* --------------------------------------------------------------------------
   Таб (§8: три состояния — активный, неактивный, ховер).
   Ховер выглядит ровно как активный, вытеснения у таба в легенде нет —
   ряд Frame 9507 состоит из трёх готовых состояний без промежуточного кадра.

   Рамка неактивного таба — Black #222222 (легенда, узел 1012:1791). Читается
   она только на чистом чёрном полотне; пока --a1-bg был #222222, рамка
   совпадала с фоном и таб выглядел одной подписью без коробки. Это лечится
   не здесь, а токеном --a1-canvas — см. tokens.css.
   -------------------------------------------------------------------------- */
.a1-tab {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    height: var(--a1-button-height);
    padding: 0 var(--a1-tab-padding-x);
    border: 1px solid var(--a1-black);
    border-radius: var(--a1-radius);
    background-color: transparent;
    color: var(--a1-text-muted);
    font-size: var(--a1-link-size);
    line-height: var(--a1-link-lh);
    font-weight: var(--a1-fw-semibold);
    letter-spacing: var(--a1-heading-tracking);
    text-transform: uppercase;
    cursor: pointer;
    transition: background-color var(--a1-transition), color var(--a1-transition),
        border-color var(--a1-transition);
}

.a1-tab.is-active,
.a1-tab[aria-selected='true'] {
    background-color: var(--a1-black);
    border-color: var(--a1-black);
    color: var(--a1-text);
}

@media (hover: hover) {
    .a1-tab:hover {
        background-color: var(--a1-black);
        border-color: var(--a1-black);
        color: var(--a1-text);
    }
}

/* --------------------------------------------------------------------------
   Поле ввода

   Рамка задаётся переменной --a1-field-border-current, чтобы фокус менял
   ровно одно значение, а не переопределял правило целиком.
   Базовый вариант — прозрачный, как в форме на странице. Модификатор
   --overlay добавляет подложку с размытием, как в модалке (§7).
   -------------------------------------------------------------------------- */
.a1-field {
    --a1-field-border-current: var(--a1-field-border-color);

    display: block;
    width: 100%;
    height: var(--a1-field-height);
    padding: 0 var(--a1-field-padding-x);
    border: 1px solid var(--a1-field-border-current);
    border-radius: var(--a1-radius);
    background-color: transparent;
    color: var(--a1-text);
    font-family: var(--a1-font-family);
    font-size: var(--a1-field-font-size);
    line-height: var(--a1-field-lh);
    font-weight: var(--a1-fw-regular);
    transition: border-color var(--a1-transition);
}

.a1-field::placeholder {
    color: var(--a1-text-muted);
    opacity: 1; /* Firefox глушит плейсхолдер своей альфой */
}

/* Индикатор фокуса поля — САМА РАМКА, и второго контура рядом не ставится.
   В макете сфокусированное поле отличается от обычного ровно цветом рамки:
   rgba(240,240,240,0.5) → сплошной #F0F0F0 при той же толщине 1px (узлы
   1641:52069 / 1641:53307 / 1641:53383 / 1641:53244). Поэтому outline: none
   гасит здесь не только штатное кольцо браузера, но и кольцо :focus-visible
   из base.css: белое кольцо в 2px от белой рамки дало бы две линии там, где
   в макете одна. Правило висит на :focus, а не на :focus-visible, значит
   рамка светлеет и от клика мышью, и от Tab — клавиатурный обход без
   индикатора не остаётся. Контраст смены состояния 3.87:1 при пороге 3:1
   (WCAG 1.4.11) и на весь периметр поля.
   Исключение — поле с ошибкой: там рамка красная в любом состоянии,
   светлеть ей некуда, и кольцо ему возвращает form.css правилом
   .a1-field.is-invalid:focus-visible — два класса и псевдокласс, (0,3,0)
   против (0,2,0) здесь, так что оно сильнее независимо от порядка слоёв. */
.a1-field:focus {
    --a1-field-border-current: var(--a1-field-border-color-focus);
    outline: none;
}

/* Поле внутри модалки лежит на собственной затемнённой подложке */
.a1-field--overlay {
    background-color: var(--a1-field-overlay-bg);
    backdrop-filter: blur(var(--a1-field-overlay-blur));
    -webkit-backdrop-filter: blur(var(--a1-field-overlay-blur));
}

.a1-field--textarea {
    height: var(--a1-field-textarea-height);
    padding: var(--a1-field-textarea-padding);
    resize: vertical;
}

/* --------------------------------------------------------------------------
   Чекбокс

   Нативный input скрыт, но остаётся фокусируемым и доступным скринридеру;
   квадрат рисуется псевдоэлементом. Отметка — залитый квадрат 14×14
   (в макете именно квадрат, не галочка).
   -------------------------------------------------------------------------- */
.a1-checkbox {
    display: grid;
    grid-template-columns: var(--a1-checkbox-size) 1fr;
    column-gap: var(--a1-checkbox-gap);
    /* В макете строка чекбокса — flex items-center (I1631:20503;1641:70117):
       квадрат центрируется по подписи целиком. Подпись политики двухстрочная,
       при align-items:start квадрат и текст разъезжаются. */
    align-items: center;
    font-size: var(--a1-stxt-size);
    line-height: var(--a1-stxt-lh);
    color: var(--a1-text-muted);
    cursor: pointer;
}

.a1-checkbox__input {
    /* Не display:none — иначе поле выпадает из порядка табуляции
       и перестаёт участвовать в нативной валидации формы */
    appearance: none;
    -webkit-appearance: none;
    width: var(--a1-checkbox-size);
    height: var(--a1-checkbox-size);
    margin: 0;
    border: 1px solid var(--a1-text-muted);
    border-radius: var(--a1-radius);
    background-color: transparent;
    cursor: pointer;
    transition: border-color var(--a1-transition);
}

.a1-checkbox__input:checked {
    border-color: var(--a1-white);
    /* Квадрат 14×14 по центру квадрата 20×20 — отступ 3 со всех сторон */
    background-image: linear-gradient(var(--a1-white), var(--a1-white));
    background-repeat: no-repeat;
    background-position: center;
    background-size: var(--a1-checkbox-mark-size) var(--a1-checkbox-mark-size);
}

/* Квадрат чекбокса по фокусу не меняется — своей рамки-индикатора у него
   нет, кольцо ему нужно. Цвет берётся из роли, а не из акцента: красное
   кольцо на чекбоксе согласия читается ошибкой ровно там, где её нет
   (врезка у --a1-focus-ring-color в tokens.css). Правило дублирует
   геометрию base.css намеренно: чекбокс появится и вне формы — в фильтрах
   каталога, — и держать его индикатор описанным в компоненте надёжнее,
   чем полагаться на то, что до него доедет общий фундамент. */
.a1-checkbox__input:focus-visible {
    outline: 2px solid var(--a1-focus-ring-color);
    outline-offset: 2px;
}

/* Ссылка на политику внутри подписи: белая, подчёркнутая */
.a1-checkbox__link {
    color: var(--a1-text);
    text-decoration: underline;
    text-underline-offset: 0.15em;
}

@media (hover: hover) {
    .a1-checkbox__link:hover {
        color: var(--a1-accent);
    }
}

/* Вертикальный шаг между чекбоксами — 20, как между полями */
.a1-checkbox-group {
    display: flex;
    flex-direction: column;
    gap: var(--a1-field-gap);
}

/* --------------------------------------------------------------------------
   Иконка-ссылка: соцсети и коммуникационные каналы (§8).
   Размер 40×40, цвет наследуется иконкой через currentColor.

   ХОВЕР КРАСИТ ПОДЛОЖКУ, А НЕ ГЛИФ (правка от 29.07.2026). Ряд Frame 9515
   легенды 1641:106434 разобран по экспорту трёх кадров:

     покой  (0:91) — только черта снизу: <path> шириной 40 и высотой 1,
                     fill #F0F0F0. Подложки нет, глиф #F0F0F0;
     кадр   (0:93) — та же черта плюс Rectangle 15: rect y=18 h=22 w=40,
                     fill #D61C26. То есть красный поднялся снизу и занял
                     чуть больше половины квадрата — механика вытеснения;
     ховер  (0:96) — Rectangle 15 во весь квадрат (y=0 h=40 w=40) #D61C26,
                     черта #F0F0F0 поверх.

   Ни в одном из трёх кадров глиф и черта не краснеют. Подтверждено вторым
   узлом — 1632:8466, ховер иконки телефона: красный квадрат, белый глиф,
   белая черта. До правки код делал ровно наоборот: красил глиф и черту
   и не трогал подложку.

   Частным случаем это правило уже жило у телефона (menu.css, «красная
   плашка» §4.1). Легенда говорит, что оно общее для всех иконок этого типа:
   Telegram и MAX в полосе хедера, те же ссылки в бургере, пять иконок
   соцсетей в подвале. Поэтому вытеснение объявлено на базовом классе.
   -------------------------------------------------------------------------- */
.a1-icon-link {
    position: relative;
    isolation: isolate;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: var(--a1-icon-link-size);
    height: var(--a1-icon-link-size);
    color: var(--a1-text);
}

/*
 * Подложка ховера. Механика та же, что у светлой кнопки: scaleY от нижнего
 * края, z-index: -1 под глифом.
 *
 * inset: 0 отсчитывается от padding-box, а нижняя черта иконки — это
 * border-bottom. Красное поле поэтому кончается на 39-м пикселе, а сороковой
 * занимает белая черта: в макете она нарисована поверх красного квадрата,
 * и здесь выходит тот же результат без единого лишнего правила.
 */
.a1-icon-link::before {
    content: '';
    position: absolute;
    inset: 0;
    z-index: -1;
    background-color: var(--a1-accent);
    transform: scaleY(0);
    transform-origin: bottom;
    transition: transform var(--a1-transition);
}

@media (hover: hover) {
    .a1-icon-link:hover::before {
        transform: scaleY(1);
    }
}

/* End */


/* Start:/local/templates/a1/css/menu.css?178903827569805*/
/* ==========================================================================
   menu — хедер целиком: навигация, мега-меню «Продукты», выпадашки «Опции»
   и «Компания», ховер-панель телефона, бургер tab/mob. §4.1 ТЗ, этап 2.

   Узлы макета: мега-меню 1632:7907 (панель 1632:8136), «Опции» 1641:7901,
   «Компания» 1632:7898, панель режима работы 1632:8806, поля активности
   1641:103935, аннотация поведения 1641:103931; Desktop 1200 — 1641:103433
   (мега-меню), 1641:103052 («Опции»), 1641:102675 («Компания»), 1641:102276
   (телефон); бургер Mob 1641:100402 / 100624 / 101322 / 101724, бургер Tab
   1641:104404 / 105179 / 105655 / 106054.

   Габариты полосы хедера (высота, фон, размытие, нижняя граница) задаёт
   layout.css — здесь только наполнение и состояния.

   ГДЕ ПРОХОДИТ ГРАНИЦА ДЕСКТОП / БУРГЕР. На 1200: там же переключается
   высота хедера (74 / 70) и паддинг контейнера (40 / 20) в tokens.css.
   То есть Tab 800 живёт по бургерной ветке — так и в макете.
   ========================================================================== */

:root {
    /* Паддинг всех выпадающих панелей. Он же задаёт их сдвиг влево: панель
       смещается на свой паддинг, и текст пунктов встаёт ровно под подписью
       пункта хедера (макет: пункт «опции» x152, панель x136) */
    --a1-menu-panel-pad: 16px;

    /* Шаг сетки мега-меню и высота плитки — одинаковые на всех брейкпоинтах,
       меняется только ширина плитки и число колонок */
    --a1-menu-gap: 20px;
    --a1-menu-tile-h: 220px;

    /* Нижнее поле активности мега-меню. На 1200 оно равно верхнему (макет
       1641:103803: панель 780 = 40 + 700 + 40), на 1600 вдвое больше —
       переключается в медиа 1600. Разбор — у .a1-mega ниже. */
    --a1-menu-panel-foot: 40px;

    /* Панель режима работы: 174 = 16 + 142 + 16 (макет 1632:8806 — width 174,
       текст x16 шириной 142). Ширина макетная, а вот место — не совсем:
       по горизонтали панель равняется по краю контейнера и стоит на 2 px
       правее макета, разбор у .a1-header__contacts ниже */
    --a1-menu-schedule-w: 174px;

    /* Плашка CTA конфигуратора: кнопка 80 высотой, графика шестерён 140×140
       прижата к правому верхнему углу и обрезается по высоте кнопки */
    --a1-menu-cta-button-h: 80px;
    --a1-menu-cta-gears: 140px;

    /* Ширина полосы прокрутки мега-меню на движках без scrollbar-width.
       Тоньше системной: панель без собственной заливки, широкий жёлоб
       читался бы как вторая полоса поверх затемнения */
    --a1-menu-scroll-w: 8px;
}

/* --------------------------------------------------------------------------
   Полоса хедера

   ПОЧЕМУ ПОДЛОЖКУ ПОЛОСЫ РИСУЕТ ::before, А НЕ САМ ЭЛЕМЕНТ.

   backdrop-filter делает элемент backdrop root: у ЕГО ПОТОМКОВ собственный
   backdrop-filter перестаёт видеть страницу и размывать становится нечего.
   А выпадающие панели меню лежат внутри <header> (иначе разваливаются поля
   активности из §4.1), и по макету у каждой своя заливка 0.3 + размытие 5.

   Замер (Chromium 1228, полосатая подложка чёрное/белое 4 px, разброс
   яркости внутри области):
     подложка без слоёв                 std 127.5   резкая
     полоса хедера, backdrop-filter     std   6.8   размыта
     панель ВНУТРИ такого хедера        std  89.0   НЕ размыта, только темнее
     та же панель ВНЕ хедера            std   6.8   размыта
     полоса через ::before + панель     std   6.3 / 6.8  обе размыты

   То есть вложенный backdrop-filter действительно не работает — прежний
   исполнитель был прав, — но лечится это не отказом от макета, а переносом
   фильтра на псевдоэлемент: ::before потомков не имеет, backdrop root
   больше никого не запирает, и панели размываются штатно.

   z-index: -1 обязателен. Без него позиционированный псевдоэлемент рисуется
   ПОЗЖЕ строчного и блочного содержимого полосы и закрывает собой пункты
   меню и логотип. Отрицательный слой уводит его под содержимое, оставаясь
   внутри контекста наложения самого хедера (у того z-index из tokens.css).

   Правило переопределяет layout.css намеренно и локально: панели —
   принадлежность меню, поэтому и обход живёт в слое меню. Раздел, забравший
   один layout.css без menu.css, получит рабочую полосу без изменений.

   РАЗДЕЛИТЕЛЬНАЯ ЛИНИЯ ПЕРЕЕХАЛА С border-bottom НА ::before — правка
   от 29.07.2026, претензия «прозрачный зазор в 1 px между полосой и панелью».

   Щель была не между полосой и панелью: панель и раньше начиналась ровно
   на 74, вплотную к border-box хедера (замер: header 0…74, .a1-mega 74…660).
   Светилась САМА ГРАНИЦА ХЕДЕРА. Абсолютный ::before с inset: 0 считается
   от padding-box, то есть красит 0…73 и до строки границы не достаёт,
   а .a1-menu-dim начинается с 74 — граница оставалась единственным слоем
   на строке 73…74. Цвет у неё rgba(240,240,240,0.5): под раскрытым меню,
   где сверху и снизу всё затемнено на 70 %, полупрозрачная белая строка
   поверх светлого фото страницы и читается как щель. Замер на белой
   подложке: полоса и панель #4A4A4A, строка между ними #F7F7F7.

   Лечится не сдвигом панели, а тем, что заливка полосы обязана доходить
   до низа border-box, а линия — лежать ПОВЕРХ заливки. Ровно так нарисовано
   и в макете: прямоугольник хедера залит rgba(0,0,0,0.3) на все 74, stroke
   идёт по его краю. Поэтому граница снимается, а линию рисует inset-тень
   на ::before — тот же 1 px, тем же токеном, но уже по тёмному.

   Побочно это чинит и арифметику панелей: без границы padding-box хедера
   становится равен border-box, и top: 100 % у панелей попадает на 74 без
   поправки на 1 px (разбор — у общего правила панелей ниже).
   -------------------------------------------------------------------------- */
.a1-header {
    background-color: transparent;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    border-bottom-width: 0;
}

.a1-header::before {
    content: '';
    position: absolute;
    inset: 0;
    z-index: -1;
    background-color: var(--a1-header-bg);
    /* Разделительная линия хедера: 1 px по низу поверх заливки */
    box-shadow: inset 0 -1px 0 var(--a1-header-border-color);
    backdrop-filter: blur(var(--a1-header-blur));
    -webkit-backdrop-filter: blur(var(--a1-header-blur));
    transition: background-color var(--a1-transition),
        backdrop-filter var(--a1-transition);
}

/* Раскрытое мега-меню: затемнение 70 %, размытие вдвое сильнее.
   Переопределяем ТОКЕНЫ, а не свойства: ::before выше уже читает их
   в background-color и backdrop-filter и уже вешает на них --a1-transition.

   Класс ставится ТОЛЬКО под мега-меню «Продукты» и под открытый бургер.
   Под «Опциями» и «Компанией» хедер остаётся в покое — см. замер
   в tokens.css у --a1-menu-open-bg. */
.a1-header.is-menu-open {
    --a1-header-bg: var(--a1-menu-open-bg);
    --a1-header-blur: var(--a1-menu-open-blur);
}

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

   Правка от 30.07.2026 по жалобе заказчика «кнопки в шапке должны быть
   посередине»: на присланном скриншоте у пунктов меню срезан верх, логотип
   и коммуникационные иконки видны наполовину, а свободный остаток полосы
   лежит НИЖЕ содержимого — будто содержимое выезжает за полосу вверх.

   САМО ВЫРАВНИВАНИЕ ЗДЕСЬ НЕ ВИНОВАТО, ОНО ТОЧНОЕ. Замер по рендеру против
   макета 1641:7906 (ink-строки глифов, 1600): пункты 31…44 против 31…44
   в макете, логотип 20…53 против 20…53, иконки 26…56 против 27…56 —
   расхождение только в антиалиасе. Полоса 0…74, центр 37, центр содержимого
   37. Так же на 1200, 800 и 360 и во всех трёх движках.

   ЗАКРЫВАЕТ ПОЛОСУ ЧУЖОЙ ЭЛЕМЕНТ. Заказчик смотрит сайт из-под своей
   админской сессии, и $APPLICATION->ShowPanel() печатает панель Битрикса
   ПЕРВЫМ элементом <body>, до .a1-page (header.php). У неё z-index 995
   (bitrix/js/main/core/css/core_panel.css:22) против 90 у нашей полосы,
   а высота — 39 у свёрнутой (там же :737), 50 у развёрнутой (:32). Полоса
   зафиксирована на top: 0, поэтому панель ложится поверх её верхних 39–50 px.

   Замер воспроизведения (свёрнутая панель, 1600): пункт скрыт на 39 px
   из 74, логотип на 19 из 34, иконка телефона на 22 из 40 — от иконки
   остаётся нижняя часть с чертой. Ровно то, что на скриншоте.

   ЛЕЧИТСЯ СДВИГОМ ПАНЕЛИ, А НЕ ПОЛОСЫ, и так уже сделано на всём остальном
   сайте: у легаси-шаблонов лежит `#bx-panel { margin-top: 90px !important }`
   под их 90-пиксельную шапку (bitrix/templates/landings/css/style.css:3546,
   local/templates/widgets/css/style.css:3435). Шапку вниз увести нельзя:
   высота панели меняется в рантайме — свёрнута, развёрнута, режим правки, —
   и в CSS её не узнать. Сдвиг панели работает в обоих её режимах: в потоке
   (position: relative по умолчанию) margin уводит панель под полосу вместе
   с остальной страницей, у закреплённой (.bx-panel-fixed — position: fixed,
   top: 0 !important, там же :27) margin-top действует так же.

   `!important` неизбежен: ядро задаёт `margin: 0 !important` селектором
   `#bx-panel, #bx-panel a, #bx-panel span, #bx-panel div` (core_panel.css:14),
   без важности правило не применится вовсе.

   `.a1-body` в селекторе — не украшение, а два дела сразу. Специфичность
   становится (1,1,0) против (1,0,0) у правила ядра, и исход перестаёт
   зависеть от того, раньше или позже шаблонного напечатан kernel-бандл
   (проверено обоими порядками листов). И правило не протекает в легаси:
   там своя компенсация под свою высоту шапки.

   Значение — токеном, а не литералом: 74 на 1600/1200 и 70 на tab/mob
   переключает tokens.css, панель встаёт под полосу на всех брейкпоинтах сама.
   -------------------------------------------------------------------------- */
.a1-body #bx-panel {
    margin-top: var(--a1-header-height) !important;
}

/*
 * position: relative здесь НЕТ намеренно. Мега-меню лежит внутри пункта
 * «Продукты» (порядок обхода Tab, см. ниже) и растягивается на всю ширину
 * через left/right: 0 — значит его содержащим блоком обязан быть сам
 * .a1-header, а не контейнер с максимальной шириной 1600 и паддингами.
 * Логотип от этого не страдает: он абсолютный с left: 50 %, а .a1-header
 * шириной во вьюпорт — центр тот же, что был у центрированного контейнера.
 */
.a1-header__inner {
    justify-content: space-between;
    gap: var(--a1-menu-gap);
}

/* Логотип. На десктопе центрируется по вьюпорту, а не распоркой флекса:
   левая группа в макете 409 px, правая 380 — при space-between логотип
   встал бы между ними, а не по центру страницы (макет: x761 при ширине 78,
   то есть центр ровно 800 из 1600). */
.a1-header__logo {
    display: flex;
    align-items: center;
    flex: 0 0 auto;
}

.a1-header__logo img {
    width: 68px;
    height: 30px;
}

/* --------------------------------------------------------------------------
   Навигация
   -------------------------------------------------------------------------- */
.a1-header__nav {
    height: 100%;
}

.a1-header__list {
    display: flex;
    align-items: stretch;
    height: 100%;
    gap: var(--a1-menu-gap);
}

/*
 * Пункт растянут на всю высоту полосы, хотя подпись занимает 14 px.
 * Это не косметика: панель позиционируется top:100% ОТ ПУНКТА, и только
 * при полной высоте «100 %» совпадает с низом полосы хедера.
 *
 * Высоту строки при этом не трогаем. В макете пункты нарисованы с
 * интерлиньяжем 130 %, но стиль head/footer links задаёт 100 %, и токен
 * --a1-link-lh сделан по стилю. Подгонка line-height развалила бы
 * типографику, общую с подвалом; высоту здесь держит флекс.
 */
.a1-header__item {
    position: relative;
    display: flex;
    align-items: center;
}

/*
 * Пункт, у которого раскрывается мега-меню. position: static возвращает
 * панели в качестве содержащего блока сам .a1-header: панель обязана быть
 * во всю ширину экрана, а не в ширину пункта. Обычные выпадашки,
 * наоборот, привязаны к своему пункту и оставлены relative.
 */
.a1-header__item--mega {
    position: static;
}

.a1-header__link,
.a1-header__trigger {
    display: flex;
    align-items: center;
    gap: 2px;
    height: 100%;
    white-space: nowrap;
    /* §8: переход цвета. У .a1-link он приходит из base.css правилом
       для <a>, а триггер — <button>, и это правило его не задевает */
    transition: color var(--a1-transition);
}

.a1-header__chevron {
    flex: 0 0 auto;
    width: 14px;
    height: 14px;
    /* Иконка экспортирована смотрящей влево — как компонент Icon/arrow
       в макете. Поворотами из неё получаются все четыре направления. */
    transform: rotate(-90deg);
    transition: transform var(--a1-transition);
}

/* Раскрытый пункт: красный, шеврон перевёрнут (§4.1) */
.a1-header__trigger[aria-expanded='true'] {
    color: var(--a1-accent);
}

.a1-header__trigger[aria-expanded='true'] .a1-header__chevron {
    transform: rotate(90deg);
}

/* --------------------------------------------------------------------------
   Правая часть: меню + коммуникационные иконки.
   Между группами 40 (макет: правая навигация кончается на 1360,
   иконки начинаются на 1400), внутри рядов — 20.
   -------------------------------------------------------------------------- */
.a1-header__aside {
    display: flex;
    align-items: stretch;
    height: 100%;
    gap: 40px;
}

/*
 * Ряд коммуникационных иконок. position: relative стоит на РЯДУ, а не на
 * отдельном слоте: панель режима работы прижимается правым краем к правому
 * краю ряда, а он всегда совпадает с краем контейнера.
 *
 * ЭТО НЕ ПИКСЕЛЬ В ПИКСЕЛЬ С МАКЕТОМ, И ЭТО НАМЕРЕННО. В макете 1632:8466
 * панель занимает 1384…1558, то есть отступает от края контейнера (1560
 * на ширине 1600 при паддинге 40) на 2 px внутрь. Здесь она равняется по
 * самому краю и занимает 1386…1560 — на 2 px правее макета. Искать ошибку
 * в этих двух пикселях не нужно, её тут нет: край контейнера — единственная
 * опора, которая не съезжает, когда в ряду остаётся две иконки вместо трёх.
 *
 * Привязка к слоту телефона (left от иконки) выглядела бы ближе к макету, но
 * ломается на длинной строке режима работы: значение приходит из настроек,
 * и панель уехала бы за правый край окна. Ещё она ломается, когда одна из
 * ссылок-мессенджеров не заполнена — иконок в ряду становится две, слот
 * телефона сдвигается вправо, и запаса до края уже нет.
 */
.a1-header__contacts {
    position: relative;
    display: flex;
    align-items: stretch;
    gap: var(--a1-menu-gap);
}

.a1-header__contact-slot {
    display: flex;
    align-items: center;
}

/*
 * Коммуникационная иконка (§4.7): 40×40 с белой чертой по нижней границе.
 * Черта есть в легенде ховеров 1641:106434, в полосе хедера на 1600 и 1200,
 * под красной плашкой телефона и в блоке «Свяжитесь с нами» бургера —
 * то есть везде, где эта иконка встречается. Подвал делает так же
 * (.a1-footer__social), отличается только имя блока.
 *
 * Правка от 29.07.2026. Здесь стояло «currentColor, а не токен: §8 требует,
 * чтобы на ховере черта краснела вместе с глифом». Легенда требует обратного:
 * в ряду Frame 9515 черта во всех трёх кадрах — сплошной #F0F0F0, краснеет
 * подложка под глифом (разбор кадров — у .a1-icon-link в components.css).
 * Красная плашка телефона оказалась не исключением из §8, а общим правилом
 * для всех иконок этого типа, и переехала на базовый класс.
 *
 * currentColor у черты сохранён и после правки: цвет глифа больше не
 * меняется ни в одном состоянии, поэтому черта белая всегда — и сама по
 * себе, и поверх красного квадрата.
 */
.a1-menu-contact {
    border-bottom: 1px solid currentColor;
}

/* Размер глифа задаётся явно, а не в процентах: рамка снизу съедает
   у контентной коробки 1 px высоты, и от 100 % глиф сплющило бы */
.a1-menu-contact__icon {
    flex: 0 0 auto;
    width: var(--a1-icon-link-size);
    height: var(--a1-icon-link-size);
}

/* --------------------------------------------------------------------------
   Панели: общее

   Все три вида (мега-меню, выпадашка, панель телефона) выезжают из-под
   полосы хедера и лежат ВНУТРИ <header>.

   Раньше отсюда следовало «зона активности = поддерево DOM, координаты
   считать не нужно». Не следует: по карте 1641:103935 поля закрытия лежат
   внутри той же панели (её боковые и нижний паддинги) и внутри той же
   полосы хедера. Зону удержания считает menu.js по прямоугольникам —
   разбор там, при measureHold().
   -------------------------------------------------------------------------- */
.a1-mega,
.a1-menu-drop,
.a1-menu-schedule {
    position: absolute;
    /* Панель примыкает к полосе вплотную. Поправки на 1 px здесь больше нет:
       граница хедера уехала в inset-тень ::before (разбор выше), padding-box
       сравнялся с border-box, и 100 % отсчитывается ровно от низа полосы —
       74 на десктопе. Подпоркой этот пиксель был и по другой причине: пока
       закрытие висело на mouseleave по поддереву DOM, разрыв между пунктом
       и панелью терял курсор. Закрытие считается по координатам (menu.js,
       inHold), зона удержания непрерывна по построению, подпорка не нужна. */
    top: 100%;
    z-index: var(--a1-z-menu-panel);
}

.a1-mega[hidden],
.a1-menu-drop[hidden] {
    display: none;
}

/* --------------------------------------------------------------------------
   Выпадашки «Опции» и «Компания»

   Сдвиг влево на паддинг выравнивает текст пунктов по подписи пункта
   хедера. Ширина по содержимому: в макете 206 у «Опций» и 140 у «Компании»,
   то есть по самому длинному пункту плюс 16+16.

   ЗАЛИВКА У ПАНЕЛИ СВОЯ: rgba(0,0,0,0.3) + размытие 5 плюс нижняя линия
   (узлы 1641:7901 и 1632:7898). Общестраничного затемнения под этими двумя
   выпадашками нет вовсе — оно принадлежит одному мега-меню «Продукты»
   (замер в tokens.css у --a1-menu-open-bg: с раскрытыми «Опциями» и полоса
   хедера, и фон под ней в рендере макета не меняются ни на единицу).
   Работает размытие только благодаря ::before у полосы — см. врезку выше.
   -------------------------------------------------------------------------- */
.a1-menu-drop {
    left: calc(-1 * var(--a1-menu-panel-pad));
    padding: var(--a1-menu-panel-pad);
    background-color: var(--a1-menu-panel-bg);
    backdrop-filter: blur(var(--a1-menu-panel-blur));
    -webkit-backdrop-filter: blur(var(--a1-menu-panel-blur));
    border-bottom: 1px solid var(--a1-divider-color);
}

.a1-menu-drop__list {
    display: flex;
    flex-direction: column;
    gap: var(--a1-menu-panel-pad);
    width: max-content;
}

.a1-menu-drop__list a {
    display: block;
    white-space: nowrap;
}

/*
 * «Компания» в §4.1 названа «прижатой вправо», но это про её место в полосе,
 * а не про способ выравнивания: в макете она выровнена по левому краю пункта
 * так же, как «Опции» (пункт x1266 — панель x1250 на 1600, пункт x866 —
 * панель x850 на 1200). Правый край панели при этом отстоит от края
 * контейнера на 154 px, запаса хватает на всех ширинах от 1200 и выше.
 * Если в это меню когда-нибудь добавят пункт заметно длиннее «Кредитования»,
 * панель придётся прижать правым краем — проверено, что сейчас это не нужно.
 */

/* --------------------------------------------------------------------------
   Панель режима работы под иконкой телефона (§4.1, макет 1632:8806)

   Появляется на ховере и на клавиатурном фокусе — иначе панель была бы
   недоступна с клавиатуры.

   Заливка макетная: 0.3 + размытие 5. Замер по рендеру макета 1632:8466 —
   фон 218 → 149 у левого края панели и 71 → 54 у нижнего, α ≈ 0.31 и 0.24.
   Сплошные 0.7, стоявшие здесь раньше, дали бы 218 → 65: вдвое темнее.

   Ширина фиксированная 174 (макет), а не по содержимому. Строки приходят
   из настроек: max-content растянул бы панель за край окна на длинной
   строке, фиксированная ширина переносит её — как и нарисовано в макете
   (текст 142 шириной, две строки в каждом блоке).

   Правый край панели садится на край контейнера, а не на макетные 1558:
   получается 1386…1560 против 1384…1558, на 2 px правее. Расхождение
   осознанное, разбор — во врезке .a1-header__contacts выше.
   -------------------------------------------------------------------------- */
.a1-menu-schedule {
    right: 0;
    display: flex;
    flex-direction: column;
    gap: var(--a1-menu-panel-pad);
    width: var(--a1-menu-schedule-w);
    padding: var(--a1-menu-panel-pad);
    background-color: var(--a1-menu-panel-bg);
    backdrop-filter: blur(var(--a1-menu-panel-blur));
    -webkit-backdrop-filter: blur(var(--a1-menu-panel-blur));
    border-bottom: 1px solid var(--a1-divider-color);
    opacity: 0;
    visibility: hidden;
    transition: opacity var(--a1-transition), visibility var(--a1-transition);
}

.a1-menu-schedule__divider {
    display: block;
    height: 1px;
    background-color: var(--a1-divider-color);
}

.a1-header__contact-slot--phone:focus-within .a1-menu-schedule {
    opacity: 1;
    visibility: visible;
}

/*
 * Красная плашка телефона (§4.1). Сама заливка сюда больше не пишется:
 * с правкой от 29.07.2026 она стала общим поведением всех иконок этого типа
 * и живёт на .a1-icon-link::before (components.css) — оттуда же приходит
 * и вытеснение снизу вверх.
 *
 * Здесь остаётся ровно то, чего в общем правиле нет: у телефона плашка
 * загорается не от самой иконки, а от СЛОТА. Слот включает панель режима
 * работы, поэтому при переводе курсора с иконки на панель плашка не гаснет,
 * а панель не схлопывается под курсором. То же и с :focus-within — панель
 * доступна с клавиатуры.
 */
.a1-header__contact-slot--phone:focus-within .a1-menu-contact--phone::before {
    transform: scaleY(1);
}

@media (hover: hover) {
    .a1-header__contact-slot--phone:hover .a1-menu-schedule {
        opacity: 1;
        visibility: visible;
    }

    .a1-header__contact-slot--phone:hover .a1-menu-contact--phone::before {
        transform: scaleY(1);
    }
}

/* --------------------------------------------------------------------------
   Мега-меню «Продукты»

   Панель во всю ширину: left/right: 0 при содержащем блоке .a1-header,
   который сам растянут во вьюпорт. Красные полосы x0…40 и x1560…1600 на
   карте 1641:103935 лежат внутри прямоугольника панели, а не рядом с ним —
   это её боковые паддинги, и по карте они ЗАКРЫВАЮТ меню, а не держат его.
   Ту же роль играет нижний паддинг (Rectangle 178). Зону удержания по этим
   паддингам считает menu.js, здесь они только задают геометрию.

   НИЖНИЙ ПАДДИНГ РАЗНЫЙ НА ДВУХ ДЕСКТОПАХ: 40 на 1200 и 86 на 1600.

   Правка от 29.07.2026. Здесь стояло padding-block: 40px с обоснованием
   «на 1600 макет рисует 826, но там панель просто растянута до низа
   артборда». Артборд ни при чём: у обоих десктопов артборд равен ровно
   хедер + панель — 1200×854 при панели 780 (узел 1641:103803) и 1600×900
   при панели 826 (узлы 1632:8136 и 1641:104139). Первична панель, а не
   высота артборда, и на 1600 у неё под содержимым действительно 86.

   Карта зон 1641:103935 это подтверждает отдельным прямоугольником
   Rectangle 178 — 1520×86 на y740, ровно от низа содержимого до низа
   панели. Будь нижнее поле 40, оно было бы нарисовано на 40.

   Чем это поле является — правка от 29.07.2026, второй заход. Прямоугольник
   красный, а красным на карте показано ЗАКРЫТИЕ: аннотация 1641:103931
   говорит «закрывается при попадании курсора вне полей активности (показал
   на макете справа)». Прошлый заход прочитал карту наоборот и расширил поле
   с 40 до 86 как зону удержания. Размер верен, смысл был обратный: 86 —
   это высота полосы, на которой меню закрывается.

   Правка видна только курсору: собственной заливки у панели нет (фон
   держит .a1-menu-dim во весь экран), поэтому 46 px разницы ничего не
   сдвигают и ничего не рисуют. Прежний довод про «366 px пустоты под сеткой
   из восьми плиток» относился к пустоте видимой, а её тут нет.

   Проверка на макетных данных (три ряда плиток, 700):
     1200  40 + 700 + 40 = 780,  панель y74…854
     1600  40 + 700 + 86 = 826,  панель y74…900 — совпадает с картой зон
   -------------------------------------------------------------------------- */

/* --------------------------------------------------------------------------
   ПРОКРУТКА ВНУТРИ ПАНЕЛИ — правка от 29.07.2026, претензия «панель не
   помещается по высоте, до низа не добраться».

   Высоту панели никто не задаёт, её набирает содержимое, и от числа плиток
   она скачет рядами по 220 + 20. Замер собственной высоты (без ограничения):
     1600 и шире  восемь плиток  586  панель 74…660
                  десять плиток  826  панель 74…900 — ровно макетные
     1200…1599    восемь плиток  780  панель 74…854 — тоже макетные:
                  десять плиток  780  плашка CTA занимает две ячейки сетки,
                                      и 8, и 10 плиток дают три ряда
   На макетном вьюпорте это помещается, на невысоком — нет: окно 600 обрезает
   мега-меню 1600 на 300 px, окно 650 обрезает мега-меню 1200 на 204 px, и
   вместе с последним рядом плиток за кадром остаётся плашка конфигуратора.
   Прокрутки не было ни своей, ни страничной: панель абсолютная внутри
   fixed-хедера, страница под ней не прокручивается вместе с ней.

   Ограничиваем высоту свободным местом под полосой и отдаём остаток
   прокрутке самой панели. 100vh, а не высота документа: панель живёт
   в системе координат окна, как и хедер.

   ЗАЛИВКУ ЭТО НЕ ЛОМАЕТ. Своего фона у панели нет, тёмный фон под ней
   держит .a1-menu-dim во весь экран — поэтому жёлоб полосы прокрутки
   обязан быть прозрачным, иначе поверх затемнения ляжет светлая системная
   дорожка. Ползунок красим токеном разделительной линии.

   Двумя наборами правил, а не одним: scrollbar-width/scrollbar-color —
   стандарт (Chrome 121+, Firefox), ::-webkit-scrollbar — то же самое для
   более ранних Chrome и Safari. Где работает стандарт, вебкитные
   псевдоэлементы движок игнорирует, так что конфликта не возникает.

   overscroll-behavior: contain — докрутка до края панели не должна
   утаскивать за собой страницу под затемнением. Тот же приём, что
   у .a1-burger__body.

   ЗОНА УДЕРЖАНИЯ ПРИ ПРОКРУТКЕ считается в menu.js от фактической коробки
   панели и пересчитывается на каждом scroll — разбор при measureHold().
   -------------------------------------------------------------------------- */
.a1-mega {
    left: 0;
    right: 0;
    padding-top: 40px;
    padding-bottom: var(--a1-menu-panel-foot);
    max-height: calc(100vh - var(--a1-header-height));
    overflow-y: auto;
    overscroll-behavior: contain;
    scrollbar-width: thin;
    scrollbar-color: var(--a1-divider-color) transparent;
}

.a1-mega::-webkit-scrollbar {
    width: var(--a1-menu-scroll-w);
}

.a1-mega::-webkit-scrollbar-track {
    background-color: transparent;
}

.a1-mega::-webkit-scrollbar-thumb {
    background-color: var(--a1-divider-color);
}

.a1-mega__grid {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    grid-auto-rows: var(--a1-menu-tile-h);
    gap: var(--a1-menu-gap);
}

/* --------------------------------------------------------------------------
   Плитка модели: одна и та же в мега-меню и во втором уровне бургера
   -------------------------------------------------------------------------- */
.a1-menu-tile {
    position: relative;
    /* Свой контекст наложения. Внутри плитки лежат три слоя (фото, затемнение,
       подписи) и подписи подняты z-index: 1. Без isolation эта единица
       считалась бы в контексте страницы и конкурировала с чужими слоями —
       со шкалой из tokens.css в том числе. */
    isolation: isolate;
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    height: var(--a1-menu-tile-h);
    padding: var(--a1-menu-panel-pad);
    overflow: hidden;
    color: var(--a1-text);
}

.a1-menu-tile__photo {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    /* Ховер увеличивает фото (аннотация 1641:103922). Переход объявлен на
       базовом правиле, а не в ветке :hover, чтобы работал и возврат */
    transition: transform var(--a1-transition);
}

/* Затемнение поверх фото. Отдельным слоем, а не фильтром на картинке:
   подписи должны остаться незатемнёнными */
.a1-menu-tile::after {
    content: '';
    position: absolute;
    inset: 0;
    background-image: var(--a1-menu-tile-shade-image);
    transition: background-color var(--a1-transition);
}

.a1-menu-tile__brand,
.a1-menu-tile__name {
    position: relative;
    z-index: 1;
}

.a1-menu-tile__brand {
    display: flex;
    align-items: center;
    gap: 8px;
}

.a1-menu-tile__logo {
    flex: 0 0 auto;
    max-height: 24px;
    width: auto;
}

.a1-menu-tile__name {
    font-size: var(--a1-menu-tile-title-size);
    line-height: var(--a1-menu-tile-title-lh);
    letter-spacing: var(--a1-heading-tracking);
    font-weight: var(--a1-fw-semibold);
    text-transform: uppercase;
}

/*
 * Ховер плитки — по аннотации 1641:103922 (frame «Описание работы»).
 *
 * ЧТО ЭТО ЗА УЗЕЛ И ПОЧЕМУ ОН ПРО ПЛИТКИ ТОЖЕ. §14 ТЗ подписывает его
 * «пояснение к ховеру карточек», и прошлый круг на этом основании оставил
 * плиткам самодельное осветление. Подпись у́же, чем узел: на канвасе фрейм
 * стоит первым элементом раздела «Ховеры» (заголовок 1641:103913, x-2648
 * y3676) — выше примеров кнопок 1641:104389 и легенды состояний
 * 1641:106434, — а не внутри группы «Компонент карточки» (1632:7643,
 * y2605…2939). Это общая строка легенды §8 для любой плитки с фотографией
 * и подписью, и мега-меню под неё подпадает наравне с карточкой товара.
 *
 * Текст узла целиком:
 *   «scale фото x1.05, подчеркивание пункта, убирается затемнение фото
 *    0.2s ease in out
 *    *Работает только на Desktop 1200/1600, на tab и mob карточки
 *    с другими характеристиками»
 *
 * Отсюда три эффекта, а не один, и «убирается» — это до нуля, а не до
 * 0.15: прежнее значение было подобрано на глаз, потому что ховерного
 * состояния плитки в макете нет ни одним узлом. Токен
 * --a1-menu-tile-shade-hover после этой правки не нужен: затемнение не
 * заменяется другим, а снимается; transparent здесь не цвет из палитры,
 * а отсутствие слоя, поэтому литералом он не считается.
 *
 * ГЕЙТ. К (hover: hover) добавлен min-width: 1200 — сноска аннотации
 * ограничивает эффект десктопом. Ниже 1200 те же .a1-menu-tile живут во
 * втором уровне бургера, и на планшете с мышью ховер к ним больше не
 * применяется. Общее правило приёмки шаблона требует того же.
 *
 * Карточка товара читает ту же аннотацию и с тем же гейтом — см.
 * .a1-partitions-card:hover в partitions.section (§5). Держать эти два
 * блока в согласии: узел один, расходиться им не с чего.
 */
@media (hover: hover) and (min-width: 1200px) {
    .a1-menu-tile:hover .a1-menu-tile__photo {
        transform: scale(1.05);
    }

    /* Подчёркивание «пункта» — подпись модели, тот же элемент, что
       заголовок у карточки товара. Логотип бренда не трогаем */
    .a1-menu-tile:hover .a1-menu-tile__name {
        text-decoration: underline;
    }

    .a1-menu-tile:hover::after {
        background-color: transparent;
    }
}

/* --------------------------------------------------------------------------
   Плашка CTA конфигуратора (§4.1)

   Текстовый блок и кнопка. На 1600 плашка это левая колонка мега-меню во
   всю его высоту, на 1200 — ячейка сетки шириной в две плитки, на tab/mob —
   блок под списком плиток. Разметка везде одна, различия ниже по медиа.
   -------------------------------------------------------------------------- */
.a1-menu-cta {
    display: flex;
    flex-direction: column;
    color: var(--a1-text);
}

.a1-menu-cta__text {
    display: flex;
    flex-direction: column;
    gap: var(--a1-menu-gap);
    padding: var(--a1-menu-panel-pad);
}

.a1-menu-cta__title {
    font-size: var(--a1-menu-cta-title-size);
    line-height: var(--a1-menu-cta-title-lh);
    letter-spacing: var(--a1-heading-tracking);
    font-weight: var(--a1-fw-semibold);
    text-transform: uppercase;
}

/* Ширина абзаца ограничена: в макете он набран в 256 px на 1600 и 249 на
   1200 — то есть заведомо уже колонки, а не по её ширине */
.a1-menu-cta__note {
    max-width: 256px;
}

.a1-menu-cta__button {
    position: relative;
    /* Свой контекст наложения: подпись поднята z-index: 1 над шестерёнками,
       и эта единица не должна попадать в шкалу слоёв страницы */
    isolation: isolate;
    display: flex;
    align-items: center;
    flex: 0 0 auto;
    height: var(--a1-menu-cta-button-h);
    padding-inline: var(--a1-menu-panel-pad);
    overflow: hidden;
    background-color: var(--a1-black);
    /* Размытие подложки 4, как у обычной кнопки (--a1-button-blur) */
    backdrop-filter: blur(var(--a1-button-blur));
    -webkit-backdrop-filter: blur(var(--a1-button-blur));
    transition: background-color var(--a1-transition);
}

.a1-menu-cta__button-label {
    position: relative;
    z-index: 1;
    width: 116px;
    font-size: var(--a1-menu-cta-button-size);
    line-height: var(--a1-menu-item-lh);
    letter-spacing: var(--a1-heading-tracking);
    font-weight: var(--a1-fw-semibold);
    text-transform: uppercase;
}

/* Шестерёнки прижаты к правому верхнему углу и обрезаются нижней границей
   кнопки — так они нарисованы в макете (140×140 в кнопке высотой 80).

   Отдельным файлом в images/, а не инлайном: 10,6 КБ пути, а плашка CTA
   выводится дважды на странице (мега-меню и второй уровень бургера) —
   инлайн клал бы ~21 КБ некэшируемой разметки в КАЖДЫЙ документ сайта.

   ЦВЕТ ГРАФИКИ НЕ СТАТИЧЕСКИЙ — правка от 29.07.2026. На ховере шестерёнки
   светлеют с Grey до Light (узлы 1641:104389 → 1641:104394), поэтому цвет
   ушёл из файла в правило, а файл стал маской. В самом файле остаётся
   заливка #7C7C7C, но маску интересует только альфа-канал: цвет берётся
   отсюда, из токенов.

   Запасной вариант для движка без масок — пусто: подложки без маски дали бы
   серый прямоугольник 140×140 поверх кнопки, а шестерёнки декоративны, их
   отсутствие ничего не ломает. Отсюда @supports, а не голое правило. */
.a1-menu-cta__gears {
    position: absolute;
    top: 0;
    right: 0;
    width: var(--a1-menu-cta-gears);
    height: var(--a1-menu-cta-gears);
    max-width: none;
    pointer-events: none;
}

@supports ((mask-image: url("/local/templates/a1/css/../images/menu-gears.svg"))
        or (-webkit-mask-image: url("/local/templates/a1/css/../images/menu-gears.svg"))) {
    .a1-menu-cta__gears {
        background-color: var(--a1-grey);
        -webkit-mask-image: url("/local/templates/a1/css/../images/menu-gears.svg");
        mask-image: url("/local/templates/a1/css/../images/menu-gears.svg");
        -webkit-mask-repeat: no-repeat;
        mask-repeat: no-repeat;
        /* Растянуть по коробке, как это делал <img width=140 height=140> */
        -webkit-mask-size: 100% 100%;
        mask-size: 100% 100%;
        transition: background-color var(--a1-transition);
    }

    /*
     * Ховер шестерёнок живёт ЗДЕСЬ, внутри @supports, а не рядом с ховером
     * самой плашки ниже. Причина: без поддержки масок .a1-menu-cta__gears —
     * пустой <span> без фона, и заливка на ховере нарисовала бы сплошной
     * светлый прямоугольник 140×140 в правом верхнем углу плашки — и в
     * мега-меню, и на втором уровне бургера. Внутри @supports правило
     * применяется только там, где есть маска и красить действительно нечего,
     * кроме силуэта шестерёнок.
     *
     * Цвета — из легенды плашки конфигуратора (ряд 1641:104389 → 1641:104394,
     * подпись перехода 1641:104398): фон #222222 → #7C7C7C, шестерёнки
     * #7C7C7C → #F0F0F0, промежуточного кадра нет, то есть простая смена
     * цвета за общий --a1-transition.
     */
    @media (hover: hover) {
        .a1-menu-cta:hover .a1-menu-cta__gears {
            background-color: var(--a1-text);
        }
    }
}

/*
 * Ховер плашки конфигуратора — своя пара кадров в макете, а не строка
 * «тёмная кнопка» из §8: 1641:104389 (покой) → 1641:104394 (ховер), подпись
 * перехода 1641:104398 «0.2s ease in out»; длительность — общий
 * --a1-transition (с 10.09.2026 это 0.4s, см. tokens.css).
 *
 * Замер по рендеру обоих кадров: фон #222222 → #7C7C7C, шестерёнки
 * #7C7C7C → #F0F0F0, подпись #F0F0F0 в обоих. То есть фон занимает цвет
 * шестерёнок, а шестерёнки — цвет подписи. Стоявший здесь --a1-black-light
 * (#484848) взят из общей строки §8 и этой паре кадров не соответствует —
 * именно на это указал заказчик.
 *
 * Промежуточного кадра у пары нет, значит форма перехода — простая смена
 * цвета, без вытеснения снизу вверх.
 */
@media (hover: hover) {
    .a1-menu-cta:hover .a1-menu-cta__button {
        background-color: var(--a1-grey);
    }

    /* Ховер шестерёнок — выше, внутри @supports: см. разбор там */
}

/* --------------------------------------------------------------------------
   Затемнение фона под раскрытым меню

   Показывается ТОЛЬКО под мега-меню «Продукты» — см. замер у
   --a1-menu-open-bg в tokens.css.

   Лежит вне .a1-header намеренно. Слой обязан быть шириной во вьюпорт, а
   хедер — единственный предок, который может оказаться содержащим блоком
   для fixed-потомка: у него самого фильтра больше нет (уехал на ::before),
   но любое будущее transform/filter/will-change на полосе снова запрёт
   слой в прямоугольник 100 %×74 px. Снаружи это невозможно по построению.

   Начинается ПОД полосой хедера: у полосы затемнение и размытие тех же
   значений, и наложение дало бы двойную плотность в верхних 74 px.

   .a1-fixed-layer в разметке — по правилу base.css: каждый фиксированный
   слой во весь экран компенсирует исчезнувшую полосу прокрутки сам.

   pointer-events: none — слой ничего не должен перехватывать: клик по
   странице при раскрытом меню обязан доходить до страницы, а закрытие
   висит на уходе курсора из хедера и на клике мимо.
   -------------------------------------------------------------------------- */
.a1-menu-dim {
    position: fixed;
    top: var(--a1-header-height);
    left: 0;
    right: 0;
    bottom: 0;
    z-index: var(--a1-z-dim);
    background-color: var(--a1-menu-open-bg);
    backdrop-filter: blur(var(--a1-menu-open-blur));
    -webkit-backdrop-filter: blur(var(--a1-menu-open-blur));
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transition: opacity var(--a1-transition), visibility var(--a1-transition);
}

.a1-menu-dim.is-visible {
    opacity: 1;
    visibility: visible;
}

/* --------------------------------------------------------------------------
   Бургер (tab/mob)

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

   Фон и размытие — те же значения раскрытого меню (макет 1641:104404:
   rgba(0,0,0,0.7) + blur 10).
   -------------------------------------------------------------------------- */
.a1-burger {
    position: fixed;
    top: var(--a1-header-height);
    left: 0;
    right: 0;
    bottom: 0;
    z-index: var(--a1-z-menu-panel);
    display: flex;
    flex-direction: column;
    background-color: var(--a1-menu-open-bg);
    backdrop-filter: blur(var(--a1-menu-open-blur));
    -webkit-backdrop-filter: blur(var(--a1-menu-open-blur));
}

.a1-burger[hidden] {
    display: none;
}

/*
 * Прокручивается только тело меню; блок «Свяжитесь с нами» закреплён внизу.
 * overscroll-behavior: contain не даёт докрутке уехать на страницу под
 * меню, когда список долистан до края.
 */
.a1-burger__body {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    overscroll-behavior: contain;
    -webkit-overflow-scrolling: touch;
}

.a1-burger__level[hidden] {
    display: none;
}

/* Первый уровень: список начинается через 40 после полосы хедера
   (макет: полоса 70, список y110) */
.a1-burger__level[data-a1-burger-level='root'] {
    padding-top: 40px;
}

/* --------------------------------------------------------------------------
   Список пунктов бургера

   Ритм макета: строка, 16 до линии, 16 до следующей строки. Высоту строки
   задаёт содержимое — 18 у пунктов с шевроном, 16 у остальных; это ровно
   то, что нарисовано (y пунктов 0/50/100/148/196/244, линии 34/84/132/180/
   228/278). Фиксировать min-height нельзя: сместились бы все следующие.
   -------------------------------------------------------------------------- */
.a1-burger__item {
    border-bottom: 1px solid var(--a1-divider-color);
}

.a1-burger__row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--a1-menu-gap);
    width: 100%;
    padding-bottom: var(--a1-menu-panel-pad);
    color: var(--a1-text);
    text-align: left;
    transition: color var(--a1-transition);
}

.a1-burger__item + .a1-burger__item .a1-burger__row {
    padding-top: var(--a1-menu-panel-pad);
}

.a1-burger__label {
    font-size: var(--a1-menu-item-size);
    line-height: var(--a1-menu-item-lh);
    letter-spacing: var(--a1-heading-tracking);
    font-weight: var(--a1-fw-semibold);
    text-transform: uppercase;
}

/* Шеврон пункта смотрит вправо: подменю открывается «вглубь» */
.a1-burger__chevron {
    flex: 0 0 auto;
    width: 18px;
    height: 18px;
    transform: rotate(180deg);
}

/* --------------------------------------------------------------------------
   Второй уровень: возврат «‹ МЕНЮ»

   Отступы макета: полоса 70 → 16 → строка 18 → 16 → линия (y120) → 40 →
   контент (y160). Линия под строкой возврата идёт во всю ширину, в отличие
   от разделителей списка, которые живут в контейнере.
   -------------------------------------------------------------------------- */
.a1-burger__level:not([data-a1-burger-level='root']) {
    padding-top: var(--a1-menu-panel-pad);
}

.a1-burger__back {
    display: flex;
    align-items: center;
    gap: 2px;
    /* Строка возврата серая (макет 1641:100831 — Grey), а не белая:
       это подпись действия, а не пункт меню */
    color: var(--a1-text-muted);
    font-size: var(--a1-stxt-size);
    line-height: var(--a1-stxt-lh);
    letter-spacing: var(--a1-heading-tracking);
    font-weight: var(--a1-fw-semibold);
    text-transform: uppercase;
    transition: color var(--a1-transition);
}

.a1-burger__back-icon {
    flex: 0 0 auto;
    width: 18px;
    height: 18px;
}

.a1-burger__back-line {
    height: 1px;
    margin-top: var(--a1-menu-panel-pad);
    background-color: var(--a1-divider-color);
}

.a1-burger__content {
    padding-top: 40px;
    padding-bottom: 20px;
}

/* --------------------------------------------------------------------------
   Второй уровень: плитки моделей
   -------------------------------------------------------------------------- */
.a1-burger__tiles {
    display: grid;
    gap: var(--a1-menu-panel-pad);
}

/* Плашка CTA под списком плиток: линия сверху, отступ 16, дальше блок */
.a1-burger__cta {
    margin-top: var(--a1-menu-panel-pad);
    padding-top: var(--a1-menu-panel-pad);
    border-top: 1px solid var(--a1-divider-color);
}

.a1-burger__cta .a1-menu-cta__text {
    gap: 10px;
    padding: 0;
    padding-bottom: var(--a1-menu-gap);
}

/* --------------------------------------------------------------------------
   Блок «Свяжитесь с нами» (§4.7)

   Закреплён у нижнего края бургера. В подменю «Продукты» его в макете нет
   (узлы 1641:100816 и 1641:105562) — там список уходит в скролл и
   упирается в плашку конфигуратора.
   -------------------------------------------------------------------------- */
.a1-burger__contacts {
    flex: 0 0 auto;
    padding-block: 20px;
    border-top: 1px solid var(--a1-divider-color);
}

.a1-burger__contacts[hidden] {
    display: none;
}

.a1-burger__contacts-inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--a1-menu-gap);
}

.a1-burger__contacts-title {
    font-size: var(--a1-menu-contacts-size);
    line-height: var(--a1-menu-contacts-lh);
    letter-spacing: var(--a1-heading-tracking);
    font-weight: var(--a1-fw-semibold);
    text-transform: uppercase;
}

.a1-burger__contacts-links {
    display: flex;
    gap: var(--a1-menu-gap);
}

/* --------------------------------------------------------------------------
   Кнопка бургера
   -------------------------------------------------------------------------- */
.a1-header__burger {
    display: flex;
    align-items: center;
    justify-content: center;
    /* align-self обязателен: у .a1-header__aside выравнивание stretch,
       и кнопка с заданной высотой прижалась бы к верху полосы */
    align-self: center;
    flex: 0 0 auto;
    width: 30px;
    height: 30px;
    color: var(--a1-text);
    transition: color var(--a1-transition);
}

.a1-header__burger-icon {
    width: 30px;
    height: 30px;
}

.a1-header__burger-icon--close,
.a1-header__burger[aria-expanded='true'] .a1-header__burger-icon--open {
    display: none;
}

.a1-header__burger[aria-expanded='true'] .a1-header__burger-icon--close {
    display: block;
}

@media (hover: hover) {
    .a1-header__burger:hover,
    .a1-burger__row:hover,
    .a1-burger__back:hover {
        color: var(--a1-accent);
    }
}

/* ==========================================================================
   Уже 1200 — работает бургер, десктопной навигации нет.

   Разметка навигации остаётся в документе (её же читает бургер), поэтому
   прячем именно её, а не выводим условно в PHP: два разных дерева пришлось
   бы держать в согласии руками.
   ========================================================================== */
@media (max-width: 1199.98px) {
    .a1-header__nav,
    .a1-header__contacts,
    .a1-mega,
    .a1-menu-drop,
    .a1-menu-dim {
        display: none;
    }
}

/* Плитки бургера на Mob — один столбец во всю ширину контейнера (320×220) */

/* ==========================================================================
   Tab 800: та же бургерная ветка, но шире
   ========================================================================== */
@media (min-width: 800px) {
    /* Кегли переключает tokens.css — здесь только раскладка */

    /* Плитки в два столбца (макет: 370×220, шаг 390 при контенте 760) */
    .a1-burger__tiles {
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: var(--a1-menu-gap);
    }

    .a1-burger__cta {
        margin-top: var(--a1-menu-gap);
    }

    .a1-menu-cta__button-label {
        width: 129px;
    }
}

/* ==========================================================================
   Desktop 1200 и выше: полноценный хедер, бургера нет
   ========================================================================== */
@media (min-width: 1200px) {
    /* Кегли переключает tokens.css — здесь только раскладка */

    .a1-header__logo {
        position: absolute;
        left: 50%;
        transform: translateX(-50%);
    }

    .a1-header__logo img {
        width: 78px;
        height: 34px;
    }

    .a1-header__burger,
    .a1-burger {
        display: none;
    }

    /* На десктопе затемнение плитки сплошное, без градиентов */
    .a1-menu-tile::after {
        background-image: none;
        background-color: var(--a1-menu-tile-shade);
    }

    .a1-menu-cta__button-label {
        width: 116px;
    }

    /*
     * Раскладка мега-меню на 1200: одна сетка 4 в ряд, плашка CTA занимает
     * две ячейки и встаёт следом за последней плиткой. При десяти плитках
     * это правый нижний угол третьего ряда — ровно как в макете; при восьми
     * (двух плиткам не выдали адреса) она встаёт в начало третьего ряда,
     * дыр в раскладке не остаётся.
     *
     * order у плашки больше нуля: grid-раскладка расставляет элементы
     * в порядке, изменённом order, поэтому CTA уходит в конец потока,
     * хотя в разметке идёт первой. В разметке она первая потому, что
     * на 1600 это левая колонка.
     */
    .a1-mega__inner {
        display: grid;
        grid-template-columns: repeat(4, minmax(0, 1fr));
        grid-auto-rows: var(--a1-menu-tile-h);
        gap: var(--a1-menu-gap);
    }

    .a1-mega__grid {
        display: contents;
    }

    .a1-mega__cta {
        order: 1;
        grid-column: span 2;
    }

    /*
     * Текстовый блок плашки: подложка 0.3 и линия сверху. В макете они есть
     * на ОБОИХ десктопных брейкпоинтах, а не только на 1600 (узлы 1632:8181
     * и 1641:103433). Замер по рендеру 1200: светлая линия на y=594, под ней
     * полоса яркостью 12 против 25 у соседнего фона мега-меню.
     *
     * Расстояние между заголовком и подписью — общее 20 из базового правила,
     * своего значения у мега-меню нет. Стоявшие здесь 10 промахивались:
     * в рендере макета первая строка подписи лежит на y=663..671, при
     * десятке — на 655..661, то есть на 9 px выше нужного. Линия и глифы
     * заголовка при этом совпадают с макетом попиксельно (594 и 616..632).
     */
    .a1-mega__cta .a1-menu-cta__text {
        flex: 1 1 auto;
        background-color: var(--a1-menu-cta-panel-bg);
        border-top: 1px solid var(--a1-divider-color);
    }
}

/* ==========================================================================
   Desktop 1600 и выше: плашка CTA становится левой колонкой мега-меню
   ========================================================================== */
@media (min-width: 1600px) {
    /*
     * Колонка 288 слева, сетка справа. Проверка ширин: контент 1520 =
     * 288 + 20 + 1212, сетка 1212 = 4×288 + 3×20 — совпадает с макетом
     * до пикселя.
     *
     * Высота колонки тянется за сеткой (align-items: stretch по умолчанию):
     * при трёх рядах это макетные 700, при двух — 460. Фиксировать 620+80
     * нельзя: плиток может быть меньше десяти.
     */
    .a1-mega__inner {
        display: flex;
        align-items: stretch;
        gap: var(--a1-menu-gap);
    }

    .a1-mega__grid {
        display: grid;
        flex: 1 1 auto;
        min-width: 0;
    }

    .a1-mega__cta {
        order: 0;
        flex: 0 0 288px;
        width: 288px;
    }

    /* Нижнее поле на 1600 вдвое шире верхнего: панель 826 при содержимом 700
       (узлы 1632:8136, 1641:104139), а карта зон 1641:103935 красит эту
       полосу отдельным Rectangle 178 1520×86 — то есть закрывает на ней
       меню. Разбор — у .a1-mega */
    .a1-mega {
        --a1-menu-panel-foot: 86px;
    }

    /* Подложка, линия сверху и шаг текста приходят из блока 1200 — он
       действует и здесь. Своего у 1600 не осталось: колонка отличается
       только шириной и высотой, а внутренний ритм тот же (узел 1632:8181). */
}

/* End */


/* Start:/local/templates/a1/css/footer.css?178534004518532*/
/* ==========================================================================
   footer — подвал сайта: блок контактов (§4.6), четыре колонки меню (§4.8),
   юридический блок. Слой общий для всех разделов редизайна, поэтому лежит
   в css/ шаблона, а не в компоненте раздела.

   Узлы макета: Footer 1600 `1641:95590`, 1200 `1641:95710`, Tab `1641:58169`,
   Mob `1641:96066`. Форма «Получите индивидуальное предложение» в макете —
   часть того же компонента Footer, но по ТЗ это §4.5/§7 и она живёт на
   странице (этап 5). Здесь её нет намеренно: подвал начинается с блока
   контактов, отсюда же и отступ 40 сверху — в макете он разделяет форму
   и первую линию подвала.

   Литералов цвета и кегля ниже нет — всё через переменные tokens.css,
   локальные переменные подвала держат только геометрию.
   ========================================================================== */

.a1-footer {
    /* ------------------------------------------------------------------
       Локальные переменные подвала. Здесь только геометрия: цвета и
       типографика приходят из tokens.css.
       ------------------------------------------------------------------ */

    /* Вертикальный ритм подвала: 40 между линией и контентом, 40 между
       блоками, 40 снизу — одно значение на весь подвал во всех макетах */
    --a1-footer-gap: 40px;
    /* Шаг колонок меню и юридического блока (20 во всех четырёх макетах) */
    --a1-footer-col-gap: 20px;
    /* Шаг между пунктами внутри колонки */
    --a1-footer-link-gap: 16px;
    /* Колонка иконок соцсетей: 177 фиксированно на 1600/1200/800 */
    --a1-footer-socials-width: 177px;
    /* Шаг между иконками соцсетей: 20 начиная с Tab, 30 на Mob
       (5×40 + 4×30 = 320 — ровно ширина контента мобильного) */
    --a1-footer-socials-gap: 30px;
    /* Иконка телефона и адреса: 30 на Mob, 40 начиная с Tab */
    --a1-footer-contact-icon: 30px;
    /* Зазор между иконкой и текстом строки контакта */
    --a1-footer-contact-icon-gap: 12px;
    /* Телефон и адрес: на Mob макет берёт стиль h2 (22), на остальных
       брейкпоинтах — h3 (28 → 38). Кегль и интерлиньяж переключаются
       ПАРОЙ, хотя сейчас оба lh равны 1.1: если у h2 или h3 интерлиньяж
       когда-нибудь разойдётся, правило продолжит брать оба значения из
       одного стиля, а не смешивать кегль одного с интерлиньяжем другого. */
    --a1-footer-contact-size: var(--a1-h2-size);
    --a1-footer-contact-lh: var(--a1-h2-lh);
    /* Логотип: 68×30 на Mob, 78×34 начиная с Tab */
    --a1-footer-logo-width: 68px;
    /* Подпись под логотипом переносится по макету на трёх строках */
    --a1-footer-tagline-width: 178px;

    flex: 0 0 auto;
    padding-top: var(--a1-footer-gap);
    padding-bottom: var(--a1-footer-gap);
}

@media (min-width: 800px) {
    .a1-footer {
        --a1-footer-socials-gap: 20px;
        --a1-footer-contact-icon: 40px;
        --a1-footer-contact-size: var(--a1-h3-size);
        --a1-footer-contact-lh: var(--a1-h3-lh);
        --a1-footer-logo-width: 78px;
        --a1-footer-tagline-width: 167px;
    }
}

@media (min-width: 1600px) {
    .a1-footer {
        --a1-footer-tagline-width: 175px;
    }
}

/* --------------------------------------------------------------------------
   Блок подвала: горизонтальная линия сверху во всю ширину экрана, под ней 40.
   Цвет линии — токен --a1-divider-color (White с альфой 0.5), поэтому альфа
   живёт в токене, а не в правиле, и содержимое блока её не наследует.
   -------------------------------------------------------------------------- */
.a1-footer__block {
    position: relative;
    padding-top: var(--a1-footer-gap);
}

.a1-footer__block + .a1-footer__block {
    margin-top: var(--a1-footer-gap);
}

.a1-footer__block::before {
    content: '';
    position: absolute;
    top: 0;
    right: 0;
    left: 0;
    height: 1px;
    background-color: var(--a1-divider-color);
}

/* ==========================================================================
   Блок контактов (§4.6)
   ========================================================================== */

/*
 * Раскладка блока по брейкпоинтам (координаты сверены с макетом):
 *   1600/1200 — три колонки в ряд: бренд, контакты, соцсети;
 *   800       — бренд на всю ширину, под ним контакты и соцсети в два столбца;
 *   360       — три строки друг под другом.
 *
 * Ширина первой колонки задана процентом, а не пикселями: в макете контакты
 * начинаются на 385 из 1520 и на 285 из 1120, то есть это доля ширины
 * контента, а не фиксированный отступ. 25.33 % даёт 385.0 на 1600 (точно)
 * и 283.7 на 1200 (макет 285, расхождение 1.3 px — меньше, чем разброс
 * метрик текста между Figma и браузером).
 */
.a1-footer__contacts {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    grid-template-areas:
        'brand'
        'contacts'
        'socials';
    row-gap: var(--a1-footer-gap);
}

@media (min-width: 800px) {
    .a1-footer__contacts {
        grid-template-columns: minmax(0, 1fr) var(--a1-footer-socials-width);
        grid-template-areas:
            'brand brand'
            'contacts socials';
        /*
         * Зазора между колонками нет: колонка соцсетей фиксирована (177) и
         * прижата вправо, поэтому её положение задаётся её же шириной, а
         * колонке контактов достаётся весь остаток. В макете колонка
         * контактов 573 при зазоре 10 — то же самое положение соцсетей
         * (20 + 573 + 10 = 603), но на 10 px уже. Берём остаток целиком:
         * строка адреса в браузере набирается на ~4 px шире, чем меряет
         * Figma (525 против 521 в Tab), и на 573 переносится на вторую
         * строку, чего в макете нет. Соцсети при этом стоят там же.
         */
        column-gap: 0;
    }
}

@media (min-width: 1200px) {
    .a1-footer__contacts {
        grid-template-columns: 25.33% minmax(0, 1fr) var(--a1-footer-socials-width);
        grid-template-areas: 'brand contacts socials';
    }
}

/*
 * Ни одной ссылки соцсетей в настройках — колонку под них не резервируем.
 * Модификатор ставит шаблон: колонка фиксированной ширины, и без неё
 * справа осталась бы дыра 177 px. Через :has() тут было бы короче, но
 * поддержка в браузерах аудитории сайта не гарантирована, а промах
 * означал бы ту же дыру.
 */
@media (min-width: 800px) {
    .a1-footer__contacts--no-socials {
        grid-template-columns: minmax(0, 1fr);
        grid-template-areas:
            'brand'
            'contacts';
    }
}

@media (min-width: 1200px) {
    .a1-footer__contacts--no-socials {
        grid-template-columns: 25.33% minmax(0, 1fr);
        grid-template-areas: 'brand contacts';
    }
}

/* --------------------------------------------------------------------------
   Логотип и подпись
   -------------------------------------------------------------------------- */
.a1-footer__brand {
    grid-area: brand;
    display: flex;
    align-items: flex-start;
    gap: var(--a1-footer-col-gap);
}

/*
 * На Desktop 1200 макет ставит подпись ПОД логотип, а на 1600, 800 и 360 —
 * справа от него. Выглядит как случайность, но координаты у всех четырёх
 * макетов разные и однозначные, поэтому воспроизводим как есть.
 */
@media (min-width: 1200px) and (max-width: 1599.98px) {
    .a1-footer__brand {
        flex-direction: column;
    }
}

.a1-footer__logo {
    flex: 0 0 auto;
    width: var(--a1-footer-logo-width);
    height: auto;
}

.a1-footer__tagline {
    max-width: var(--a1-footer-tagline-width);
    color: var(--a1-text-muted);
}

/* --------------------------------------------------------------------------
   Телефон и адрес
   -------------------------------------------------------------------------- */
.a1-footer__contacts-list {
    grid-area: contacts;
    display: flex;
    flex-direction: column;
    gap: var(--a1-footer-col-gap);
    /* Строка не должна вылезать за колонку на промежуточных ширинах */
    min-width: 0;
}

.a1-footer__contact {
    display: flex;
    align-items: center;
    gap: var(--a1-footer-contact-icon-gap);
    color: var(--a1-text);
    /* Кегль h3 (h2 на Mob), верхний регистр и трекинг —
       адрес в настройках хранится обычным регистром */
    font-size: var(--a1-footer-contact-size);
    line-height: var(--a1-footer-contact-lh);
    letter-spacing: var(--a1-heading-tracking);
    font-weight: var(--a1-fw-semibold);
    text-transform: uppercase;
    transition: color var(--a1-transition);
}

.a1-footer__contact-icon {
    flex: 0 0 auto;
    width: var(--a1-footer-contact-icon);
    height: var(--a1-footer-contact-icon);
}

@media (hover: hover) {
    a.a1-footer__contact:hover {
        color: var(--a1-accent);
    }
}

/* --------------------------------------------------------------------------
   Иконки соцсетей + сноска о запрещённых организациях
   -------------------------------------------------------------------------- */
.a1-footer__socials {
    grid-area: socials;
    display: flex;
    flex-wrap: wrap;
    /* По горизонтали шаг иконок (30 на Mob, 20 дальше), по вертикали — шаг
       блока 20. Вертикальный отвечает и за перенос иконок на вторую строку
       (макет 1600/1200: ряды на y=0 и y=60), и за отступ до сноски (y=120).
       Один gap на оба направления дал бы на Mob 30 до сноски вместо 20. */
    column-gap: var(--a1-footer-socials-gap);
    row-gap: var(--a1-footer-col-gap);
}

/* Начиная с Tab колонка соцсетей фиксирована по ширине и прижата вправо:
   иконки переносятся на вторую строку, обе строки выровнены по правому краю */
@media (min-width: 800px) {
    .a1-footer__socials {
        justify-content: flex-end;
        width: var(--a1-footer-socials-width);
        margin-left: auto;
    }
}

/*
 * Иконка соцсети: 40×40 с подчёркиванием на всю ширину.
 *
 * Правка от 29.07.2026. Здесь стояло «подчёркивание currentColor — по §8
 * на ховере краснеет вместе с иконкой (см. легенду 1641:106434, там у иконки
 * красная и глифа, и черта)». Легенда этого не говорит: в её ряду Frame 9515
 * черта во всех трёх кадрах — сплошной #F0F0F0 шириной 40, а краснеет
 * ПОДЛОЖКА под глифом. Разбор кадров — в комментарии к .a1-icon-link
 * (components.css), там же живут и размер, и вытеснение подложки.
 *
 * currentColor у черты после правки означает просто «цвет глифа»: он теперь
 * не меняется ни на ховере, ни под красным квадратом, и черта остаётся белой
 * во всех состояниях — ровно как в макете.
 */
.a1-footer__social {
    border-bottom: 1px solid currentColor;
}

/* Размер задаётся явно, а не в процентах: рамка снизу съедает у контентной
   коробки 1 px высоты, и от 100% глиф сплющило бы по вертикали */
.a1-footer__social svg {
    flex: 0 0 auto;
    width: var(--a1-icon-link-size);
    height: var(--a1-icon-link-size);
}

/* Сноска про Instagram: отдельная строка под иконками, во всю ширину блока.
   Кегль и цвет — общий класс .a1-note (base.css), здесь только раскладка */
.a1-footer__socials-note {
    width: 100%;
}

@media (min-width: 800px) {
    .a1-footer__socials-note {
        text-align: right;
    }
}

/* ==========================================================================
   Меню подвала (§4.8): четыре колонки
   ========================================================================== */
.a1-footer__menu {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    column-gap: var(--a1-footer-col-gap);
    row-gap: var(--a1-footer-gap);
}

@media (min-width: 800px) {
    .a1-footer__menu {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}

@media (min-width: 1200px) {
    .a1-footer__menu {
        grid-template-columns: repeat(4, minmax(0, 1fr));
        row-gap: var(--a1-footer-col-gap);
    }
}

/* Кегль — общий класс .a1-link-label (base.css), тот же, что у ссылок
   хедера и подвала; здесь только цвет и отбивка до списка */
.a1-footer__col-title {
    margin-bottom: var(--a1-footer-col-gap);
    color: var(--a1-text);
}

.a1-footer__col-list {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: var(--a1-footer-link-gap);
}

/*
 * Пункты колонок в макете набраны стилем txt и цветом Grey — это не
 * «head/footer links» из легенды §8 (те белые, Semi Bold, UPPERCASE).
 * Ховер для них в легенде не нарисован; берём общий акцент §8: Grey → Red.
 * Вынесено в отчёт.
 */
.a1-footer__link {
    color: var(--a1-text-muted);
    font-size: var(--a1-txt-size);
    line-height: var(--a1-txt-lh);
    transition: color var(--a1-transition);
}

@media (hover: hover) {
    a.a1-footer__link:hover {
        color: var(--a1-accent);
    }
}

/* ==========================================================================
   Юридический блок: копирайт, политика, текст о компании, о сертификации
   ========================================================================== */

/*
 * Начиная с Tab — две колонки: слева копирайт и текст о компании, справа
 * ссылка на политику и текст о сертификации.
 * На Mob макет меняет и порядок, и шаг: политика, текст о компании,
 * текст о сертификации, копирайт.
 */
.a1-footer__legal {
    display: flex;
    flex-direction: column;
    gap: var(--a1-footer-col-gap);
}

.a1-footer__legal-texts {
    display: flex;
    flex-direction: column;
    /* Между двумя абзацами на Mob шаг 10, а не 20 */
    gap: calc(var(--a1-footer-col-gap) / 2);
}

@media (min-width: 800px) {
    .a1-footer__legal {
        display: grid;
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: var(--a1-footer-col-gap);
    }

    /* Обёртка абзацев нужна только мобильной раскладке. На широких
       брейкпоинтах она исчезает из дерева боксов, и абзацы становятся
       ячейками той же сетки: копирайт | политика / о компании | о сертификации */
    .a1-footer__legal-texts {
        display: contents;
    }
}

/* Копирайт и ссылка на политику: White, обычное начертание, без капса */
.a1-footer__legal-line {
    color: var(--a1-text);
    font-size: var(--a1-txt-size);
    line-height: var(--a1-txt-lh);
    transition: color var(--a1-transition);
}

@media (hover: hover) {
    a.a1-footer__legal-line:hover {
        color: var(--a1-accent);
    }
}

/* Порядок мобильной раскладки: копирайт уходит вниз, остальное — как в DOM */
@media (max-width: 799.98px) {
    .a1-footer__copyright {
        order: 1;
    }
}

/* End */


/* Start:/local/templates/a1/css/modal.css?178536068423030*/
/* ==========================================================================
   modal — общий слой модальных окон: затемнение с размытием, строка
   «Закрыть ✕», коробка модалки на десктопе и полноэкранный лист на tab/mob.
   §6 и §7 ТЗ, этап 6.

   ПОЧЕМУ ЭТО СЛОЙ ШАБЛОНА, А НЕ КОМПОНЕНТА РАЗДЕЛА.
   Модалок на странице две — «Подробнее» (данные раздела) и форма
   «Получить предложение» (нужна каждому будущему разделу). Общая у них
   ровно оболочка: слой, затемнение, кнопка закрытия, охранные поля,
   поведение прокрутки. Держать её в компоненте значило бы копировать
   в каждый следующий раздел, поэтому оболочка лежит здесь, а содержимое —
   в шаблонах компонентов (конвенция §13 и include/assets.php).

   Узлы макета: «Подробнее» 1600 `1560:4574`, 1200 `1641:55672`,
   Tab `1641:55746`, Mob `1496:22405`; те же с направляющими отступов —
   `1641:99160`, `1641:99285`, `1641:99655`, `1641:99999`.
   Форма модалкой: 1600 `1631:20556`, 1200 `1631:20625`, Tab `1631:20694`,
   Mob `1631:20500`.

   ОХРАННОЕ ПОЛЕ — 20 px, ОДНО НА ВСЕ ЧЕТЫРЕ БРЕЙКПОИНТА. Фреймы
   «минимальное охранное поле» ставят по прямоугольнику 20 px над строкой
   «Закрыть», между ней и содержимым и под содержимым. Замер:
     1600 — закрыть 20..60, модалка 80..938, низ фрейма 958;
     1200 — закрыть 20..60, модалка 80..977, низ фрейма 997;
     Tab  — закрыть 20..44, контент 64.., кнопка ..955, низ 975;
     Mob  — закрыть 20..44, контент 64.., кнопка ..817, низ 837.
   Отсюда верхний отступ содержимого = 20 + высота кнопки закрытия + 20,
   то есть 64 на tab/mob (иконка 24) и 80 на десктопе (иконка 40).
   ========================================================================== */

/*
 * ЕДИНСТВЕННАЯ ПЕРЕМЕННАЯ ЭТОГО СЛОЯ, ОБЪЯВЛЕННАЯ НА :root, А НЕ НА .a1-modal.
 *
 * Фон коробки — ЧИСТО ЧЁРНЫЙ, а не Black #222 из §3. Codegen Figma для узла
 * 1641:55640 отдаёт bg-black (#000000) и тут же в том же ответе пишет
 * bg-[#222] у тёмной кнопки — то есть эти два цвета он различает. Выборка
 * пикселя из рендера 1641:99160 подтверждает: поле коробки (0,0,0).
 * §6 ТЗ называл фон «#222» и с правкой от 28.07.2026 исправлен на #000000.
 * Значение берётся из --a1-canvas: с правкой от 29.07.2026 фон полотна
 * страницы — тот же чистый чёрный, и держать под него второй литерал незачем.
 *
 * Почему :root. Тем же чёрным красится подложка галереи, а её контейнер
 * fancybox создаёт в конце <body> — ВНЕ .a1-modal. Объявленная на .a1-modal
 * переменная туда не наследуется, var() остаётся нерезолвленным, и правило
 * становится недействительным на этапе вычисления: background-color
 * сваливается в transparent, то есть подложка исчезает вовсе. Замер до
 * правки: rgba(0, 0, 0, 0). --a1-canvas объявлен там же, на :root, поэтому
 * до fancybox-контейнера он доходит.
 */
:root {
    --a1-modal-bg: var(--a1-canvas);
}

.a1-modal {
    /* ----------------------------------------------------------------------
       Локальные переменные слоя: только геометрия и плотность затемнения.
       Цвета и типографика приходят из tokens.css.
       ---------------------------------------------------------------------- */

    /* Затемнение с размытием. Значения из макета: у прямоугольника
       Rectangle 173 во весь фрейм заливка rgba(0,0,0,0.7) и backdrop-blur 10
       на всех четырёх брейкпоинтах. Совпадает с плотностью раскрытого
       мега-меню (--a1-menu-open-*), но своё имя обязательно: у меню оно
       переопределяется на .a1-header.is-menu-open. */
    --a1-modal-overlay-bg: rgba(0, 0, 0, 0.7);
    --a1-modal-overlay-blur: 10px;

    /* Охранное поле макета (см. врезку выше) */
    --a1-modal-guard: 20px;

    /* Кнопка закрытия: иконка 24 на tab/mob, 40 на десктопе; подпись
       «Закрыть» отбита на 10 (узлы 1641:99187 и 1641:99699) */
    --a1-modal-close-size: 24px;
    --a1-modal-close-gap: 10px;

    /*
     * Коробка модалки «Подробнее». НА 1200 И НА 1600 ЭТО РАЗНЫЕ РАСКЛАДКИ,
     * а не одна масштабированная (§6, правка ТЗ от 28.07.2026):
     *   1600 — 750 (узел 1641:55640): контент 702, колонки 341+20+341,
     *          кадр слайдера 702×400, описание в шапке во всю ширину;
     *   1200 — во всю ширину контейнера, 1120 (узлы 1641:99285 и 1641:55672):
     *          контент 1072, кадр 1072×500, колонки 526+20+526, описание
     *          в шапке полуширинное.
     *
     * ПОЧЕМУ НЕ «РАСТЯНУТАЯ КОПИЯ 750», КАК СЧИТАЛА ПРЕДЫДУЩАЯ РЕДАКЦИЯ.
     * Масштаб 750→1118 дал бы колонки 508 и описание 1046 — таких чисел
     * в макете нет. А 1120 − 48 = 1072 = 526 + 20 + 526 сходится точно,
     * и текстовые узлы фиксированной ширины остались 526 при колонках 525.
     * Нарисованные 1118 и 1070 — те же 1120 и 1072 после сжатия автолэйаутом
     * на 2 px, а не самостоятельные размеры.
     *
     * 100% здесь — ширина .a1-modal__inner, то есть вьюпорта; до ширины
     * контейнера её обрезает max-width у .a1-modal--boxed .a1-modal__body.
     * Отдельного значения под 1200 поэтому не нужно.
     */
    --a1-modal-width: 100%;
    --a1-modal-pad: 24px;
    /* Вертикальный шаг внутри модалки: 20 между всеми блоками */
    --a1-modal-gap: 20px;
    /* --a1-modal-bg объявлен выше, на :root — врезка перед ним */
    /* Рамка коробки: белый с альфой 0.5 (макет 1641:55640) */
    --a1-modal-border-color: rgba(255, 255, 255, 0.5);

    position: fixed;
    inset: 0;
    z-index: var(--a1-z-modal-overlay);
    /* Прокручивается весь слой целиком: так строка «Закрыть» остаётся на
       месте (она position: fixed), а длинный поп-ап доезжает до конца.
       overscroll-behavior не даёт прокрутке «протечь» на страницу под ним. */
    overflow-x: hidden;
    overflow-y: auto;
    overscroll-behavior: contain;
    -webkit-overflow-scrolling: touch;
}

/*
 * Обязательное правило: display выше перебивает браузерный [hidden],
 * и без него закрытая модалка осталась бы видимой. Скрытие ставит и снимает
 * js/modal.js через свойство .hidden — так же, как menu.js панелям меню.
 */
.a1-modal[hidden] {
    display: none;
}

/*
 * КОРОБКА ДИАЛОГА, ПОЛУЧИВШАЯ ФОКУС, КОЛЬЦА НЕ РИСУЕТ.
 *
 * Модалка, открытая указателем, приземляет фокус на себя — на узел
 * с role="dialog" (js/modal.js, врезка у openModal). Атрибут tabindex="-1"
 * ставит туда же скрипт, то есть в обход Tab слой не входит НИКОГДА
 * и попасть на него с клавиатуры нельзя. Сообщать кольцом такому узлу
 * нечего: оно не отмечало бы «вы здесь и можете нажать», а обвело бы
 * весь экран — слой растянут inset: 0.
 *
 * Общее правило :focus-visible из base.css не трогается и трогать его
 * нельзя — это фундамент шаблона: у кнопок, ссылок и полей внутри модалки
 * кольцо остаётся, и при открытии с клавиатуры оно видно сразу, на кнопке
 * «Закрыть ✕». Здесь ровно одно исключение, и оно перебивает общее правило
 * по весу селектора: класс плюс псевдокласс (0,2,0) против одного
 * псевдокласса (0,1,0).
 */
.a1-modal:focus {
    outline: none;
}

/*
 * ЗАТЕМНЕНИЕ — НА ПСЕВДОЭЛЕМЕНТЕ, А НЕ НА САМОМ СЛОЕ. Элемент с
 * backdrop-filter становится backdrop root и запирает потомков: их
 * собственный backdrop-filter перестаёт размывать (замер этапа 2, врезка
 * у .a1-header::before в menu.css). Внутри модалки такие потомки есть —
 * поля формы с --a1-field-overlay-blur и кнопки с --a1-button-blur.
 * Перенос фильтра на ::before снимает запрет: у псевдоэлемента потомков нет.
 *
 * position: fixed, а не absolute: слой сам является контейнером прокрутки,
 * и абсолютное затемнение уехало бы вверх вместе с содержимым.
 * z-index: -1 уводит его под содержимое, оставаясь внутри контекста
 * наложения самой модалки.
 */
.a1-modal::before {
    content: '';
    position: fixed;
    inset: 0;
    z-index: -1;
    background-color: var(--a1-modal-overlay-bg);
    backdrop-filter: blur(var(--a1-modal-overlay-blur));
    -webkit-backdrop-filter: blur(var(--a1-modal-overlay-blur));
}

/*
 * Модалка, оказавшаяся ПОД другой модалкой (форма, открытая из поп-апа
 * «Подробнее»). Стек слоёв window.A1.layers держит обе открытыми — Escape
 * закрывает верхнюю и возвращает пользователя в нижнюю, — но рисовать обе
 * оболочки нельзя: затемнения сложились бы в 0.91 вместо 0.7, а два креста
 * «Закрыть» встали бы друг на друга в одной точке. Поэтому у нижней
 * гасятся ровно её оболочка и её кнопка; содержимое остаётся видимым
 * и затемняется уже слоем верхней модалки.
 */
.a1-modal.is-under::before,
.a1-modal.is-under .a1-modal__close {
    display: none;
}

/*
 * Верхняя модалка поднимается на слой --a1-z-modal (110), нижняя остаётся
 * на --a1-z-modal-overlay (100). Именно так шкала в tokens.css и задумана:
 * затемнение ниже, сама модалка выше.
 *
 * Без этого правила обе модалки лежали бы на одном слое, и порядок
 * решала бы разметка: поп-ап «Подробнее» подключается на странице ПОСЛЕ
 * формы и рисовался бы поверх неё — форма, открытая из поп-апа, оказалась
 * бы под его чёрной коробкой. Замер до правки подтверждает: коробка
 * поп-апа перекрывала левую колонку и половину полей формы.
 */
.a1-modal:not(.is-under) {
    z-index: var(--a1-z-modal);
}

/* --------------------------------------------------------------------------
   Кнопка «Закрыть ✕»

   position: fixed, а не absolute: слой прокручивается, и абсолютная кнопка
   уехала бы вверх вместе с содержимым уже на первом экране мобильного
   поп-апа. Фиксированный потомок позиционируется от вьюпорта — предков
   с transform и filter над ним нет (фильтр вынесен на ::before).
   Ширина полосы прокрутки прибавляется вручную: правило
   .a1-scroll-locked .a1-fixed-layer из base.css добавляет padding самому
   слою, а на fixed-потомка паддинг родителя не действует.
   -------------------------------------------------------------------------- */
.a1-modal__close {
    position: fixed;
    top: var(--a1-modal-guard);
    right: calc(var(--a1-container-pad) + var(--a1-scrollbar-width, 0px));
    /*
     * 2, а не 1: содержимое модалки поднимает свои слои до 1 (телефонный
     * ввод с раскрытым списком стран, врезка в css/form.css). Кнопка обязана
     * остаться выше всего, что прокручивается под ней, — иначе на низком
     * экране список стран проехал бы поверх «Закрыть ✕».
     */
    z-index: 2;
    display: flex;
    align-items: center;
    gap: var(--a1-modal-close-gap);
    color: var(--a1-text);
    transition: color var(--a1-transition);
}

.a1-modal__close-label {
    color: var(--a1-text-muted);
    transition: color var(--a1-transition);
}

.a1-modal__close-icon {
    display: flex;
    flex: 0 0 auto;
    align-items: center;
    justify-content: center;
    width: var(--a1-modal-close-size);
    height: var(--a1-modal-close-size);
}

.a1-modal__close-icon svg {
    width: 100%;
    height: 100%;
}

@media (hover: hover) {
    .a1-modal__close:hover,
    .a1-modal__close:hover .a1-modal__close-label {
        color: var(--a1-accent);
    }
}

/* --------------------------------------------------------------------------
   Каркас: вертикальные охранные поля и центрирование
   -------------------------------------------------------------------------- */
.a1-modal__inner {
    display: flex;
    flex-direction: column;
    /* min-height, а не height: содержимое выше экрана растит слой,
       и он прокручивается вместо того, чтобы обрезаться */
    min-height: 100%;
    /* 20 + высота кнопки закрытия + 20 (врезка про охранное поле) */
    padding-top: calc(var(--a1-modal-guard) * 2 + var(--a1-modal-close-size));
    padding-bottom: var(--a1-modal-guard);
}

/*
 * margin: auto, а не align-items: center. При содержимом выше экрана
 * центрирование через align-items обрезает ВЕРХ блока и до него нельзя
 * доскроллить; автоматические поля в этом случае схлопываются в ноль,
 * и блок просто начинается сразу после верхнего охранного поля.
 */
.a1-modal__body {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
}

@media (min-width: 1200px) {
    .a1-modal {
        --a1-modal-close-size: 40px;
    }

    .a1-modal__body {
        flex: 0 1 auto;
        margin: auto;
        width: 100%;
    }
}

/* --------------------------------------------------------------------------
   Коробка модалки (модификатор --boxed): поп-ап «Подробнее» на десктопе.

   На tab и mob коробки нет вовсе — по макету это полноэкранный лист:
   ни фона, ни рамки, ни внутренних паддингов, а фото слайдера уходит
   в край экрана (узлы 1641:99655 и 1641:99999). Поэтому оформление
   коробки живёт только внутри @media 1200.
   -------------------------------------------------------------------------- */
@media (min-width: 1200px) {
    .a1-modal--boxed .a1-modal__body {
        width: var(--a1-modal-width);
        max-width: calc(100% - var(--a1-container-pad) * 2);
        /*
         * Паддинг на пиксель меньше макетного, потому что рамку Figma
         * рисует ВНУТРЬ фрейма, поверх его паддинга: у неё содержимое
         * начинается на 24 от края и имеет ширину 702 при рамке 1
         * (узлы 1641:99190 и 1641:99191). В CSS при box-sizing: border-box
         * рамка и паддинг складываются, поэтому 1 + 23 = те же 24 от края
         * и та же ширина 702. С паддингом 24 получилось бы 700.
         */
        padding: calc(var(--a1-modal-pad) - 1px);
        border: 1px solid var(--a1-modal-border-color);
        background-color: var(--a1-modal-bg);
    }
}

/*
 * На 1600 коробка сжимается до 750 — вторая из двух раскладок §6.
 * Граница та же, что у набора стилей «1600px» в tokens.css: на промежуточных
 * ширинах 1200…1599 работает широкая раскладка и коробка едет по контейнеру,
 * то есть скачка ширины между брейкпоинтами ровно один и он там же, где
 * переключается вся типографика страницы.
 */
@media (min-width: 1600px) {
    .a1-modal {
        --a1-modal-width: 750px;
    }
}

/* --------------------------------------------------------------------------
   Галерея полноразмерных фото (fancybox 3.5.7, §6 и §12 решение 9).

   ВЕРСИЯ 3.5.7, А НЕ 5.x — решение заказчика от 28.07.2026. Пятая ветка
   (@fancyapps/ui) распространяется по проприетарной лицензии, GPL-опции
   в ней нет. 3.5.7 — та самая копия, что работает на лендингах сайта,
   с шапкой «Licensed GPLv3 for open source use or fancyBox Commercial
   License for commercial use». Файлы скопированы в css/vendor и js/vendor
   шаблона a1 вместе с лицензионными заголовками; из landings ничего
   не подключается (правило проекта: легаси не источник).

   ПОЧЕМУ ПЕРЕОПРЕДЕЛЯЮТСЯ ПРАВИЛА, А НЕ ПЕРЕМЕННЫЕ. Переменных у v3 нет
   вовсе, вся настройка — в её собственных селекторах. Поэтому при смене
   версии этот блок придётся сверять заново; он для того и собран в одном
   месте, а файл вендора не правится, чтобы обновление сводилось к замене.

   ПОЧЕМУ СЕЛЕКТОР НАЧИНАЕТСЯ С html. Стили библиотеки грузятся по первому
   клику и попадают в конец <head> — то есть ПОСЛЕ слоёв шаблона. При равной
   специфичности выигрывал бы вендор, и подложка осталась бы библиотечной
   (ровно этот дефект нашло ревью у v5). Лишний html поднимает специфичность
   до (0,1,1) и снимает зависимость от порядка подключения. Проверено
   замером computedStyle, а не чтением файла.
   -------------------------------------------------------------------------- */

/* Слой галереи: у библиотеки 99992, шкала --a1-z-* этого не знает.
   Галерея обязана лежать НАД модалкой (110), а не над всем вообще. */
html .fancybox-container {
    z-index: var(--a1-z-gallery);
}

/* Полоса прокрутки. .fancybox-container — фиксированный слой во весь экран,
   то есть ровно тот случай, ради которого в base.css заведён .a1-fixed-layer.
   Класс на чужую разметку не навесить, поэтому правило повторено здесь. */
html.a1-scroll-locked .fancybox-container {
    padding-right: var(--a1-scrollbar-width, 0px);
}

/* Подложка галереи — тот же чёрный, что у коробки модалки; у библиотеки
   #1e1e1e, а чужого цвета в палитре §3 нет. Прозрачность (0.9 в открытом
   состоянии) оставлена библиотечной: это её анимация появления. */
html .fancybox-bg {
    background-color: var(--a1-modal-bg);
}

/* End */


/* Start:/local/templates/a1/css/form.css?178913728843808*/
/* ==========================================================================
   form — форма «Получите индивидуальное предложение» (§4.5 и §7 ТЗ).

   Одна и та же вёрстка обслуживает два показа (§7): секцию в футерной зоне
   страницы и модалку, вызываемую из hero, из карточек и из поп-апа
   «Подробнее». Отличий ровно два, и оба — модификаторы:
     .a1-offer--modal  — подпись под заголовком белая, а не серая;
     .a1-field--overlay — поля лежат на затемнённой подложке с размытием.
   Всё остальное (сетка, шаг 20, состав полей, чекбоксы) совпадает.

   ПОЧЕМУ СЛОЙ ШАБЛОНА. Форма нужна каждому будущему разделу редизайна —
   §7 прямо называет её общей точкой захвата, — а базовые кирпичи (.a1-field,
   .a1-checkbox, .a1-button) уже лежат в components.css на этом же уровне.
   Класть форму в компонент раздела значило бы копировать её в следующий.

   Узлы макета. Секция — первый блок компонента Footer:
     1600 `1631:20558`, 1200 `1641:95710`, Tab `1641:58169`, Mob `1641:96066`.
   Модалка — 1600 `1631:20556`, 1200 `1631:20625`, Tab `1631:20694`,
   Mob `1631:20500`; раскрытый список стран — `1641:52576`.

   Литералов цвета и кегля здесь нет: всё через переменные tokens.css,
   локальные переменные держат только геометрию.
   ========================================================================== */

/* --------------------------------------------------------------------------
   Секция в футерной зоне страницы.

   ОТСТУПОВ СВЕРХУ И СНИЗУ У СЕКЦИИ НЕТ, и это контракт, а не упущение:
     сверху — расстояние до блока раздела держит padding-bottom у
       .a1-partitions (200 на десктопе и планшете, 160 на мобильном);
     снизу — подвал держит собственные 40 над своей первой линией
       (.a1-footer { padding-top } в css/footer.css).
   Свой отступ здесь сложился бы с чужим в двойной.

   Линия сверху — часть блока формы: в макете она идёт во всю ширину экрана
   (узел «Line 7» шириной 1600/1200/800/360), а не по ширине контента, и
   отбивает форму от блока раздела ровно так же, как линии отбивают блоки
   подвала. Отсюда и padding-top 40 — тот же ритм, что у .a1-footer__block.
   -------------------------------------------------------------------------- */
.a1-form-section {
    /* Шаг «линия → содержимое», он же шаг подвала. Одно значение на все
       четыре брейкпоинта (замер: контент формы начинается на y=40 от линии
       в каждом из четырёх узлов Footer). */
    --a1-form-section-gap: 40px;

    position: relative;
    padding-top: var(--a1-form-section-gap);
}

.a1-form-section::before {
    content: '';
    position: absolute;
    top: 0;
    right: 0;
    left: 0;
    height: 1px;
    background-color: var(--a1-divider-color);
}

/* --------------------------------------------------------------------------
   Раскладка «заголовок + форма»

   1600: колонки 750 + 20 + 750 = 1520;
   1200: колонки 550 + 20 + 550 = 1120;
   Tab и Mob: одна колонка, шаг 40 между заголовком и формой
              (замер: Tab — заголовок 40..197, форма с 237; Mob — 40..192,
               форма с 232).
   Граница переключения — 1200, та же, что у паддинга контейнера и высоты
   хедера в tokens.css.
   -------------------------------------------------------------------------- */
.a1-offer {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 40px;
}

@media (min-width: 1200px) {
    .a1-offer {
        grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
        gap: var(--a1-field-gap);
        align-items: start;
    }
}

/*
 * Заголовок и подпись. Шаг между ними 20, на Mob — 10 (замер: 1600 —
 * 252 → 272, 1200 — 180 → 200, Tab — 120 → 140, Mob — 108 → 118).
 */
.a1-offer__head {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

@media (min-width: 800px) {
    .a1-offer__head {
        gap: var(--a1-field-gap);
    }
}

/*
 * Подпись под заголовком. В секции она серая (Grey), в модалке — белая:
 * узел 1631:20604 модалки набран White, узел I1631:20558;361:11236 секции —
 * Grey. Разница осмысленная: в секции подпись лежит на фоне страницы,
 * в модалке — на затемнении, где серый по контрасту проваливается.
 */
.a1-offer__note {
    color: var(--a1-text-muted);
}

.a1-offer--modal .a1-offer__note {
    color: var(--a1-text);
}

/* --------------------------------------------------------------------------
   Собственно форма: поля, кнопка, чекбоксы. Единый вертикальный шаг 20
   (замер: поля 0 / 64 / 128, кнопка 236 при textarea 88, чекбоксы 300).
   -------------------------------------------------------------------------- */
.a1-form {
    display: flex;
    flex-direction: column;
    gap: var(--a1-field-gap);
}

/* Обёртка поля: нужна, чтобы сообщение об ошибке жило рядом с полем,
   а не ломало шаг флекса */
.a1-form__field {
    display: flex;
    flex-direction: column;
    gap: 4px;
    min-width: 0;
}

/*
 * ФОКУС В ФОРМЕ ЛОКАЛЬНЫХ ПРАВИЛ БОЛЬШЕ НЕ ТРЕБУЕТ — правка от 30.07.2026.
 *
 * Здесь стояли два переопределения, снятые вместе с починкой фундамента:
 *
 *   1. .a1-field:focus-visible { outline: none } — гасило красное кольцо
 *      у полей. Теперь кольцо гасит .a1-field:focus в components.css
 *      (класс и псевдокласс против голого :focus-visible в base.css —
 *      специфичность выше), и делает это для обоих способов фокусировки
 *      сразу. Дублировать нечего.
 *   2. перечисление .a1-checkbox__input / .a1-checkbox__link /
 *      .a1-phone__toggle / .a1-phone__option / .a1-form .a1-button
 *      с outline-color: var(--a1-white) — перекрашивало кольцо остальных
 *      элементов формы. Теперь белое кольцо приходит из base.css само:
 *      :focus-visible берёт цвет из --a1-focus-ring-color (tokens.css),
 *      а тот и есть --a1-white.
 *
 * Дефект, ради которого они появлялись (кольцо фокуса красное и потому
 * читается ошибкой), лечится в корне: красный оставлен акценту, ховеру
 * и ошибке, фокус переведён на свою роль. Разбор — во врезке
 * у --a1-focus-ring-color в tokens.css.
 *
 * Что осталось в этом файле по фокусу и почему:
 *   — .a1-field.is-invalid:focus-visible и .a1-checkbox.is-invalid
 *     .a1-checkbox__input:focus-visible ниже: у поля с ОШИБКОЙ контур
 *     обязан остаться красным, и одной линией, а не двумя;
 *   — .a1-phone.is-invalid:focus-within:not(.is-open): то же для телефона,
 *     где рамку несёт обёртка;
 *   — .a1-phone__input:focus { outline: none }: у самого <input> рамки нет,
 *     её рисует обёртка, и кольцо внутри неё было бы вторым индикатором.
 */

/*
 * Ошибки валидации в макете НЕ НАРИСОВАНЫ — ни одного состояния «поле
 * заполнено неверно» в группе «Форма обратной связи маска» нет. Красная
 * рамка и подпись добавлены вёрсткой: §7 требует обязательности первого
 * чекбокса, а блокировать отправку без объяснения нельзя. Цвет — Red из §3,
 * то есть тот же акцент, что у ховеров; своих цветов не вводится.
 */
.a1-field.is-invalid {
    --a1-field-border-current: var(--a1-accent);
}

/*
 * ОДИН КОНТУР У ПОЛЯ С ОШИБКОЙ, А НЕ ДВА.
 *
 * Замер (1600 / 1200 / 800 / 360, обе формы, настоящий клик по «Отправить»
 * на пустой форме): у поля «Имя» две красные линии — рамка 1px по краю поля
 * и кольцо 2px в 2px от неё, с зазором. Складываются два независимых
 * индикатора, и оба красные:
 *
 *   1. рамка ошибки — правило выше, цвет --a1-accent;
 *   2. кольцо :focus-visible из base.css (outline 2px, outline-offset 2px),
 *      тоже --a1-accent: акцент шаблона и цвет ошибки это один и тот же
 *      Red из §3, своего цвета у ошибок не вводилось.
 *
 * ЧТО ИЗМЕНИЛОСЬ 30.07.2026 И ПОЧЕМУ ПРАВИЛО ВСЁ РАВНО НУЖНО. Кольцо
 * из base.css больше не красное — оно берёт --a1-focus-ring-color, то есть
 * белое. Двух красных линий из замера выше сегодня не получилось бы и без
 * этого правила, но без него у поля с ошибкой не осталось бы ВООБЩЕ
 * никакого признака фокуса: кольцо гасит .a1-field:focus в components.css
 * (специфичность выше, чем у голого :focus-visible), а красная рамка стоит
 * и в покое, и в фокусе одинаково. То есть правило переехало из починки
 * «двух линий» в единственный индикатор фокуса ошибочного поля, а его
 * геометрия — 1px вплотную к рамке — осталась той же и по той же причине:
 * второй контур макету противоречит.
 *
 * Кольцо берётся оттуда, что при отказе валидации js/form.js ставит фокус
 * на первое непрошедшее поле (focusField), а ТЕКСТОВОМУ полю движки выдают
 * :focus-visible при любом способе фокусировки — с клавиатуры, мышью и
 * программно одинаково. Замерено в трёх движках, Chromium / Firefox /
 * WebKit: везде две линии, дефект не браузерная особенность.
 *
 * У телефона и чекбокса рамка была одна ровно потому, что фокус до них не
 * доходил: он достаётся ПЕРВОМУ непрошедшему полю, а «Имя» стоит первым.
 * Скрытым дефект от этого не стал — обход Tab по форме, где непройденными
 * оказались все три обязательных поля, давал те же две линии на чекбоксе
 * согласия (замер, все четыре ширины, обе формы).
 *
 * ЧИНИМ НЕ УБОРКОЙ КОЛЬЦА, А СВЕДЕНИЕМ ДВУХ ЛИНИЙ В ОДНУ. Голый
 * outline: none не годится: после отказа валидации непройденными
 * оказываются ВСЕ обязательные поля сразу, и обход формы с клавиатуры
 * шёл бы вообще без видимого фокуса. У ПОЛЯ БЕЗ ОШИБКИ кольцо как раз
 * снимается (правило .a1-field:focus в components.css) — и это не
 * противоречие: там индикатором работает сама рамка, она светлеет
 * с rgba(240,240,240,0.5) до #F0F0F0. У поля с ошибкой рамка красная
 * и в фокусе, и без него, светлеть ей некуда, поэтому кольцо не
 * снимается, а садится вплотную к рамке (offset 0) и ужимается до 1px:
 * рамка 1px и
 * кольцо 1px без зазора рисуются одной непрерывной линией 2px. Поле
 * с ошибкой получает один контур цвета ошибки, а фокус на нём читается
 * по толщине этой линии (2px против 1px), а не по второму кольцу.
 *
 * КОЛЬЦО ОБЪЯВЛЯЕТСЯ ЦЕЛИКОМ, А НЕ ДВУМЯ LONGHAND'АМИ. Раньше здесь стояли
 * только outline-width и outline-offset, а стиль и цвет кольца доставались
 * по каскаду из .a1-field:focus-visible в components.css. Так правило
 * держалось на трёх правилах в двух файлах сразу и на их порядке
 * в объединённом бандле. С 30.07.2026 донора и вовсе нет: то правило
 * удалено как мёртвое, кольцо полю не приходит ниоткуда, и longhand'ы
 * оставили бы поле с ошибкой без контура вообще. Shorthand задаёт ширину,
 * стиль и цвет одним объявлением и ни от чего снаружи не зависит; ровно
 * так же записано кольцо телефона ниже. Правило :focus-visible в base.css
 * — общий фундамент сайта, и правится там только цвет через токен.
 *
 * Замер на боевом сайте (30.07.2026, бандл template_37490b2c…_v1.css):
 * настоящий клик по «Отправить» на пустой форме, снимок при
 * deviceScaleFactor 2, столбец через центр верхней кромки поля «Имя» —
 * одна сплошная полоса 4 аппаратных пикселя (2 CSS-пикселя) цвета
 * rgb(214,28,38), зазора нет. Контроль: с вырезанным из бандла правилом
 * тот же столбец даёт 4px + зазор 4px + 2px, то есть ровно те две линии
 * из врезки выше.
 */
.a1-field.is-invalid:focus-visible,
.a1-checkbox.is-invalid .a1-checkbox__input:focus-visible {
    outline: 1px solid var(--a1-accent);
    outline-offset: 0;
}

.a1-form__error {
    color: var(--a1-accent);
}

.a1-form__error[hidden] {
    display: none;
}

/*
 * ПОДПИСЬ ПОД ПОЛЕМ ОСТАЁТСЯ В ДОКУМЕНТЕ, НО УХОДИТ ИЗ КАДРА.
 *
 * Решение заказчика — показывать ошибки подсказкой tippy, как на
 * a1tuning.ru. Убрать подпись насовсем нельзя по двум причинам:
 *   1. Она держит связь поля с текстом ошибки для скринридера. Поле
 *      получает aria-describedby на эту строку и не теряет её, когда
 *      подсказка гаснет по таймеру (js/form.js, describe()). Собственный
 *      aria-describedby библиотеки для этого не годится: он живёт ровно
 *      столько, сколько висит подсказка.
 *   2. Она же — запасной показ. Библиотека грузится лениво, по первой
 *      ошибке; если файл не доехал, js/form.js снимает этот класс со всех
 *      строк, и форма возвращается к прежнему виду с текстом под полем.
 *
 * Значения — те же, что у .a1-visually-hidden в base.css. Свой класс,
 * а не тот: .a1-form__error уже занимает display, и общий класс пришлось
 * бы перебивать; к тому же снимать нужно именно этот признак.
 */
.a1-form__error--quiet {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0 0 0 0);
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
}

/*
 * Общее сообщение формы: результат отправки заявки. Базовый цвет
 * приглушённый — нейтральное сообщение не должно спорить с подписями
 * у полей. Своего отступа нет: шаг 20 держит флекс .a1-form, а скрытая
 * строка из потока выпадает вместе с ним.
 *
 * ДВА МОДИФИКАТОРА ДОБАВЛЕНЫ ЭТАПОМ 7. До него удача и отказ выглядели
 * одинаково: «Заявка отправлена» и «Вы не прошли проверку на роботов»
 * печатались одним и тем же приглушённым цветом, и отличить их можно было
 * только прочитав. Оба цвета — токены §3, своих не вводится:
 *   --error → Red, тот же акцент, что у ошибок полей и ховеров;
 *   --ok    → основной цвет текста, заметно светлее приглушённого.
 * Красным окрашен только отказ: успех не ошибка и внимания требует меньше.
 */
.a1-form__status {
    color: var(--a1-text-muted);
}

.a1-form__status--error {
    color: var(--a1-accent);
}

.a1-form__status--ok {
    color: var(--a1-text);
}

.a1-form__status[hidden] {
    display: none;
}

/* Ошибка группы чекбоксов — под всей группой, а не под одним чекбоксом */
.a1-form__consents {
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.a1-checkbox.is-invalid .a1-checkbox__input {
    border-color: var(--a1-accent);
}

/* --------------------------------------------------------------------------
   Телефонный ввод (§7, узел раскрытого списка `1641:52576`).

   СОБСТВЕННЫЙ СЕЛЕКТОР, А НЕ intl-tel-input — обоснование в js/form.js.

   Контейнер получает класс .a1-field и выглядит полем шаблона: рамка,
   высота, паддинг и токен --a1-field-border-current достаются из
   components.css, а не переписываются здесь. Переопределяется только
   display: у .a1-field он block, а внутри нужен ряд.

   Замер строки (узел 1641:52630, поле 365×44):
     16 — паддинг, флаг 22×17, 4, шеврон 12×12, 10, «+7», 4, номер.
   -------------------------------------------------------------------------- */
.a1-phone {
    --a1-phone-flag-width: 22px;
    --a1-phone-flag-height: 17px;
    --a1-phone-chevron: 12px;
    /* Отбивка «флаг+шеврон → номер» и «код → номер» */
    --a1-phone-gap: 10px;
    --a1-phone-inner-gap: 4px;
    /* Высота строки списка стран (узлы 1641:53120 / 53129 / 53149) */
    --a1-phone-option-height: 36px;
    /* Толщина рамки поля — та же, что у .a1-field в components.css.
       Списку она нужна, чтобы встать ровно по внешнему краю поля */
    --a1-phone-border: 1px;

    /* Рамку, высоту и горизонтальный паддинг даёт класс .a1-field
       из components.css — здесь переопределяется только display */
    position: relative;
    /*
     * z-index НУЖЕН САМОМУ БЛОКУ, а не только списку внутри него. Разбор:
     *
     * в модалке телефонный ввод несёт .a1-field--overlay, а у того
     * backdrop-filter (components.css). Любой backdrop-filter создаёт
     * КОНТЕКСТ НАЛОЖЕНИЯ, значит .a1-phone запирает своих потомков: z-index
     * у .a1-phone__list считается уже внутри этого контекста и наружу
     * не действует. Сам же .a1-phone с z-index: auto красится в общей куче
     * с соседями по форме — а E-mail и Комментарий тоже .a1-field--overlay,
     * тоже создают контексты и стоят В РАЗМЕТКЕ ПОЗЖЕ, то есть выигрывают
     * по порядку обхода дерева.
     *
     * Итог до правки (замер 1600, открытая модалка): elementFromPoint
     * по центру пункта «Беларусь» отдавал INPUT E-mail, по центру
     * «Казахстан» — TEXTAREA, реальный клик падал с «intercepts pointer
     * events». В секции подвала тот же список работал: там поля без
     * .a1-field--overlay, контекстов не создают, и списку хватало своего
     * z-index. То есть дефект был только в модалке.
     *
     * Положительный z-index переводит весь блок в слой над соседями
     * с z-index auto/0 — и запертый внутри список едет наверх вместе с ним.
     * Значение 1, а не больше: выше стоит кнопка «Закрыть ✕» модалки (2),
     * под которую содержимое обязано прокручиваться, а не наоборот.
     * Правило безусловное — в секции подвала оно ничего не меняет, там
     * перекрывать нечего.
     */
    z-index: 1;
    display: flex;
    align-items: center;
    gap: var(--a1-phone-gap);
}

/*
 * Фокус внутри ряда подсвечивает рамку так же, как :focus у обычного поля.
 *
 * ВТОРОЙ СЕЛЕКТОР — РАСКРЫТЫЙ СПИСОК, и он не дублирует первый. В макете
 * (узел 1641:52630 — то же поле в состоянии «список раскрыт») рамка набрана
 * сплошным #f0f0f0, тогда как у соседних полей она rgba(240,240,240,0.5).
 * Опираться тут на :focus-within нельзя: фокус на кнопке появляется от
 * мышиного нажатия не во всех браузерах (Safari и Firefox на macOS кнопку
 * по клику не фокусируют), а список раскрывается везде. Класс ставит
 * js/form.js в openList()/closeList() рядом с aria-expanded.
 */
.a1-phone:focus-within,
.a1-phone.is-open {
    --a1-field-border-current: var(--a1-field-border-color-focus);
}

/*
 * РАМКА ОШИБКИ СИЛЬНЕЕ ФОКУСА, А НЕ НАОБОРОТ.
 *
 * Правило выше и .a1-field.is-invalid равны по весу (два класса против
 * класса и псевдокласса), а лежит оно ниже — значит при фокусе внутри
 * телефонного ввода оно побеждало и красная рамка ошибки становилась
 * белой. Замер сценария «имя заполнено, телефон пуст» (все четыре ширины,
 * обе формы): border у .a1-phone.is-invalid отдавал rgb(240,240,240) —
 * то есть поле с ошибкой выглядело просто сфокусированным, а подсказка
 * рядом при этом сообщала об ошибке. Третий класс возвращает приоритет
 * ошибке. .is-open тут не для симметрии: список раскрывают кнопкой, фокус
 * уходит на пункт, и без этого селектора рамка снова уплывала бы в белый.
 */
.a1-phone.is-invalid:focus-within,
.a1-phone.is-invalid.is-open {
    --a1-field-border-current: var(--a1-accent);
}

/*
 * Фокус внутри поля с ошибкой утолщает ту же линию до 2px — ровно как
 * у остальных полей (врезка «ОДИН КОНТУР У ПОЛЯ С ОШИБКОЙ»). Кольцо
 * приходится рисовать обёртке, а не полю: рамку несёт она, а у самого
 * <input> рамки нет и :focus-visible ему погашен ниже.
 *
 * :focus-within, а не :focus-visible у потомка: последнее требует :has(),
 * от которого в шаблоне отказались из-за поддержки в браузерах аудитории
 * (врезка в footer.css). Разницы почти нет — соседние поля и без того
 * подсвечивают рамку на любом фокусе, включая мышиный (.a1-field:focus
 * в components.css), а детачированного кольца от мыши здесь не появляется:
 * линия прирастает к рамке.
 *
 * :not(.is-open) — потому что раскрытый список начинается ВПЛОТНУЮ под
 * внешним краем поля (top: 100% + 1px, врезка у .a1-phone__list), и кольцо
 * с offset 0 ложится красной чертой на его первую строку, перерезая белую
 * рамку списка. Проверено снимком с отключённой страховкой, догадка это
 * не была.
 */
.a1-phone.is-invalid:focus-within:not(.is-open) {
    outline: 1px solid var(--a1-accent);
    outline-offset: 0;
}

.a1-phone__toggle {
    display: flex;
    flex: 0 0 auto;
    align-items: center;
    gap: var(--a1-phone-inner-gap);
    color: var(--a1-text);
}

.a1-phone__flag {
    display: block;
    flex: 0 0 auto;
    width: var(--a1-phone-flag-width);
    height: var(--a1-phone-flag-height);
    /* Флаги из flag-icons нарисованы 4:3, слот в макете 22×17 —
       обрезаем по слоту, а не тянем пропорции */
    object-fit: cover;
}

.a1-phone__chevron {
    display: flex;
    flex: 0 0 auto;
    align-items: center;
    justify-content: center;
    width: var(--a1-phone-chevron);
    height: var(--a1-phone-chevron);
    /* Шеврон шаблона смотрит влево — здесь он должен смотреть вниз */
    transform: rotate(-90deg);
    transition: transform var(--a1-transition);
}

.a1-phone__chevron svg {
    width: 100%;
    height: 100%;
}

.a1-phone__toggle[aria-expanded='true'] .a1-phone__chevron {
    transform: rotate(90deg);
}

@media (hover: hover) {
    .a1-phone__toggle:hover {
        color: var(--a1-accent);
    }
}

/* Код страны и сам ввод — один блок с отбивкой 4 */
.a1-phone__number {
    display: flex;
    flex: 1 1 auto;
    align-items: center;
    gap: var(--a1-phone-inner-gap);
    min-width: 0;
}

.a1-phone__dial {
    flex: 0 0 auto;
    color: var(--a1-text);
}

/*
 * Само поле ввода прозрачное и без рамки: рамку рисует контейнер.
 * Кегль и интерлиньяж — те же токены поля, что у .a1-field.
 */
.a1-phone__input {
    flex: 1 1 auto;
    width: 100%;
    min-width: 0;
    padding: 0;
    border: 0;
    background-color: transparent;
    color: var(--a1-text);
    font-family: var(--a1-font-family);
    font-size: var(--a1-field-font-size);
    line-height: var(--a1-field-lh);
    font-weight: var(--a1-fw-regular);
}

.a1-phone__input::placeholder {
    color: var(--a1-text-muted);
    opacity: 1;
}

.a1-phone__input:focus {
    outline: none;
}

/*
 * Список стран. В макете он раскрывается вплотную под полем во всю его
 * ширину (поле 1195..1560 y 284..328, список 1195..1560 y 328..436) и
 * лежит на подложке rgba(0,0,0,0.7) с размытием 10 — тех же значениях,
 * что у поля внутри модалки (--a1-field-overlay-*).
 *
 * РАМКА СПЛОШНАЯ, А НЕ ПОЛУПРОЗРАЧНАЯ. У всех трёх строк списка
 * (1641:53120 / 53129 / 53149) обводка набрана `#f0f0f0` — тем же цветом,
 * что рамка поля в раскрытом состоянии, а не приглушённым
 * rgba(240,240,240,0.5), которым обведены незаполненные поля формы.
 * Отсюда --a1-field-border-color-focus вместо --a1-field-border-color.
 *
 * РАМКУ ДЕЛЯТ КОНТЕЙНЕР И СТРОКИ. В макете обводка висит на КАЖДОЙ строке
 * и только с трёх сторон — снизу, слева и справа (`border-b border-l
 * border-r`), сверху её нет ни у одной. То есть по вертикали список
 * обведён целиком, между строками идут разделители, а сверху список
 * прирастает к нижней рамке поля без двойной линии. Здесь это разложено
 * ровно так: боковые линии — на контейнере (одна на весь список, а не
 * три встык), горизонтальные — border-bottom у строк. Нижняя граница
 * списка при этом достаётся от последней строки, поэтому у контейнера
 * её нет: иначе высота стала бы 109 вместо 108 из макета.
 *
 * z-index здесь поднимает список над содержимым САМОГО телефонного ввода
 * (флаг, код, поле). Над соседними полями формы его поднимает не он,
 * а z-index у .a1-phone — см. разбор во врезке выше: в модалке блок
 * запирает потомков собственным контекстом наложения, и наружу это
 * значение не выходит.
 */
.a1-phone__list {
    position: absolute;
    /*
     * ОТСЧЁТ ИДЁТ ОТ ВНЕШНЕГО КРАЯ ПОЛЯ, А НЕ ОТ ВНУТРЕННЕГО. Абсолютный
     * потомок считает проценты и смещения от КОРОБКИ ПАДДИНГА родителя,
     * то есть от границы, проведённой ВНУТРИ рамки. Голый top: 100% ставил
     * бы список на пиксель выше, поверх нижней рамки поля: полупрозрачная
     * подложка списка (альфа 0.7) съедала бы её на 70 %, белая линия между
     * полем и «Россией» становилась серой, а пара «поле + список» теряла
     * пиксель высоты — 151 вместо 152 в макете (поле 284..328, список
     * 328..436). Те же −1 по бокам возвращают список на внешние края поля.
     */
    top: calc(100% + var(--a1-phone-border));
    right: calc(-1 * var(--a1-phone-border));
    left: calc(-1 * var(--a1-phone-border));
    z-index: 2;
    margin: 0;
    padding: 0;
    border: 0 solid var(--a1-field-border-color-focus);
    border-right-width: var(--a1-phone-border);
    border-left-width: var(--a1-phone-border);
    background-color: var(--a1-field-overlay-bg);
    backdrop-filter: blur(var(--a1-field-overlay-blur));
    -webkit-backdrop-filter: blur(var(--a1-field-overlay-blur));
    list-style: none;
}

.a1-phone__list[hidden] {
    display: none;
}

.a1-phone__option {
    /* Код страны в строке списка набран приглушённым (узлы 1641:53128 /
       53148 / 53189 — Grey), а название страны — основным цветом.
       Значение локальной переменной подменяет ховер, поэтому цвет кода
       задан не константой */
    --a1-phone-option-dial: var(--a1-text-muted);

    display: flex;
    align-items: center;
    gap: var(--a1-phone-gap);
    width: 100%;
    /* Разделитель ВХОДИТ в 36: строки в макете стоят ровно через 36
       (y 328 / 364 / 400 при высоте списка 108). Считается это благодаря
       border-box из base.css — своего box-sizing здесь нет намеренно */
    height: var(--a1-phone-option-height);
    padding-inline: var(--a1-field-padding-x);
    border-bottom: var(--a1-phone-border) solid var(--a1-field-border-color-focus);
    color: var(--a1-text);
    font-size: var(--a1-field-font-size);
    line-height: var(--a1-field-lh);
    text-align: left;
    transition: color var(--a1-transition), background-color var(--a1-transition);
}

/* Название и код страны отбиты друг от друга на 4
   (узел 1641:53126: «Россия» 0..50, «+7» с 54) */
.a1-phone__option-text {
    display: flex;
    gap: var(--a1-phone-inner-gap);
    min-width: 0;
}

/*
 * Второй элемент подписи — код страны. Класса у него нет и не будет:
 * разметку печатает шаблон компонента a1:offer.form, а он живёт на уровне
 * сайта и переживает шаблон. Позиционный селектор здесь безопасен —
 * элементов ровно два, название и код, состав задан циклом по трём странам.
 */
.a1-phone__option-text > :last-child {
    color: var(--a1-phone-option-dial);
}

@media (hover: hover) {
    .a1-phone__option:hover {
        /* currentColor в значении переменной вычисляется НА САМОМ КОДЕ
           страны и там равен унаследованному цвету строки, то есть акценту.
           Без этого приглушённый код остался бы серым на красной строке */
        --a1-phone-option-dial: currentColor;

        color: var(--a1-accent);
    }
}

/* --------------------------------------------------------------------------
   Подсказка с ошибкой поля — оформление темы для tippy.js 6.3.7.

   ЧТО ЗДЕСЬ ЛЕЖИТ И ЧЕГО НЕТ. Базовые правила библиотеки (позиционирование
   стрелки, переходы, каркас коробки) — в css/vendor/tippy.css, копия
   дистрибутива, не правится. Здесь только тема: цвета, кегль и отбивки
   из токенов §3. Разделение обязательно — vendor обновляется заменой файла.

   ПОЧЕМУ СЕЛЕКТОР С [data-theme], А НЕ ГОЛЫЙ .tippy-box. Стили библиотеки
   подключаются ЛЕНИВО, по первой ошибке (js/form.js), то есть <link>
   встаёт в <head> ПОЗЖЕ этого файла. Правило `.tippy-box` из vendor и такое
   же правило отсюда имели бы одинаковую специфичность, и побеждало бы
   подключённое позже — то есть чужое. Атрибут темы добавляет ещё один
   разряд специфичности, и порядок подключения перестаёт что-либо значить.
   Имя темы («a1») задаёт опция theme в js/form.js.

   ЦВЕТА — КАК НА a1tuning.ru: светлая плашка, красный текст (там это
   .mainform .tippy-content). Обратный вариант — тёмная плашка на тёмной
   странице — потребовал бы рамки, а рамка у tippy тянет за собой вторую
   стрелку из dist/border.css, то есть ещё один файл ради контура.
   Оба цвета здесь токены: White фоном, Red текстом (§3). Контраст
   #f0f0f0 / #d61c26 — 4.56:1, выше порога AA для основного текста.
   -------------------------------------------------------------------------- */
.tippy-box[data-theme~='a1'] {
    border-radius: var(--a1-radius);
    background-color: var(--a1-white);
    color: var(--a1-accent);
    font-family: var(--a1-font-family);
    font-size: var(--a1-stxt-size);
    line-height: var(--a1-stxt-lh);
    font-weight: var(--a1-fw-regular);
}

/* Стрелка красится через color: правила vendor рисуют её треугольником
   на border-*-color: initial, то есть на currentColor */
.tippy-box[data-theme~='a1'] > .tippy-arrow {
    color: var(--a1-white);
}

/*
 * Отбивки и потолок ширины. Ширину подсказка берёт по тексту, поэтому
 * потолок нужен с двух сторон:
 *   340 — чтобы на широком экране длинная подпись согласия не растянулась
 *         в одну строку через всю форму;
 *   ширина контейнера — чтобы на 360 подсказка не оказалась шире колонки
 *         контента (правило vendor [data-tippy-root] режет её только
 *         по экрану, calc(100vw - 10px), то есть с полем в 5 px).
 * Потолок стоит на .tippy-content, а не на .tippy-box: опция maxWidth
 * ставит коробке инлайновый max-width, а инлайн бьёт любое правило файла.
 */
.tippy-box[data-theme~='a1'] > .tippy-content {
    max-width: min(340px, calc(100vw - 2 * var(--a1-container-pad)));
    padding: 8px var(--a1-field-padding-x);
    text-align: left;
}

/* --------------------------------------------------------------------------
   Попапы результата отправки: «Ваши данные успешно отправлены» и «Произошла
   ошибка». Разметка — шаблон компонента a1:offer.form, открывает js/form.js.

   Узлы: успех 1600 `1784:16160`, 1200 `1784:16243`, Tab `1784:16343`,
   Mob `1784:16090`; провал — `1784:16127`, `1784:16193`, `1784:16293`,
   `1784:16053`.

   КОРОБКИ НЕТ: заголовок, текст и кнопка стоят прямо на затемнении по центру
   экрана. Затемнение, «Закрыть ✕», стек слоёв и фокус — общая оболочка
   .a1-modal из css/modal.css.

   Ширина заголовка задана макетом и держит перенос «Ваши данные / успешно
   отправлены» на две строки: 540 на 1600, 460 на 1200 и Tab, 260 на Mob.
   Тот же предел у текста успеха — на Mob он и переносит его на две строки.
   Текст провала уже: 320 на всех брейкпоинтах. Кегли — .a1-h2 и .a1-txt
   своего брейкпоинта (46 / 38 / 38 / 22 и 14).
   -------------------------------------------------------------------------- */
.a1-modal--notice {
    --a1-notice-width: 260px;
}

@media (min-width: 800px) {
    .a1-modal--notice {
        --a1-notice-width: 460px;
    }
}

@media (min-width: 1600px) {
    .a1-modal--notice {
        --a1-notice-width: 540px;
    }
}

/*
 * Центр по вьюпорту, а не по остатку под строкой «Закрыть»: низ получает то
 * же поле, что и верх. Макет центрирует блок по кадру целиком — на Tab
 * и 1200 центр блока стоит ровно на 450 из 900.
 */
.a1-modal--notice .a1-modal__inner {
    padding-bottom: calc(var(--a1-modal-guard) * 2 + var(--a1-modal-close-size));
}

.a1-modal--notice .a1-modal__body {
    justify-content: center;
}

.a1-notice {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 20px;
    text-align: center;
}

.a1-notice__head {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 10px;
}

.a1-notice__title {
    width: var(--a1-notice-width);
    max-width: 100%;
}

.a1-notice__text {
    max-width: var(--a1-notice-width);
}

.a1-notice--failed .a1-notice__text {
    max-width: 320px;
}

.a1-notice__button {
    width: 200px;
    max-width: 100%;
}

/* End */


/* Start:/local/templates/a1/template_styles.css?17852752671773*/
/* ==========================================================================
   template_styles.css — Битрикс подключает этот файл сам, автоматически.

   Основные стили шаблона живут слоями в css/ (fonts, tokens, base, layout,
   components) и подключаются явным списком в header.php: так виден и
   контролируется порядок каскада.

   Что класть сюда: только то, что чинит разметку и поведение самого Битрикса
   — компенсацию административной панели, правку служебных обёрток
   публичного редактора, стили вывода компонентов, которые нельзя
   переопределить в шаблоне компонента. Вёрстке разделов здесь места нет,
   иначе слои в css/ перестают быть полной картиной.

   Сейчас файл пуст намеренно. Компенсация высоты админ-панели под
   фиксированный хедер (.a1-header) потребуется, но её нельзя написать
   вслепую: нужно один раз посмотреть на живом Битриксе, какой класс и какой
   отступ панель реально навешивает на body в текущей версии. Пока шаблон не
   назначен сайту, любое правило здесь было бы догадкой.
   ========================================================================== */

/* End */
/* /local/templates/a1/css/fonts.css?17852752632543 */
/* /local/templates/a1/css/tokens.css?178903827531772 */
/* /local/templates/a1/css/base.css?178903827513245 */
/* /local/templates/a1/css/layout.css?17852752634679 */
/* /local/templates/a1/css/components.css?178903827519810 */
/* /local/templates/a1/css/menu.css?178903827569805 */
/* /local/templates/a1/css/footer.css?178534004518532 */
/* /local/templates/a1/css/modal.css?178536068423030 */
/* /local/templates/a1/css/form.css?178913728843808 */
/* /local/templates/a1/template_styles.css?17852752671773 */
