/* ==========================================================================
   АТП-3 РосАвто — ДИЗАЙН-СИСТЕМА

   ╔══════════════════════════════════════════════════════════════════════╗
   ║  ПЕРЕКРАСКА САЙТА — В ОДНОМ МЕСТЕ.                                      ║
   ║  Весь цвет выведен из двух шкал-акцентов и нейтральной оси в блоке     ║
   ║  :root ниже. Чтобы сменить фирменный тон — правьте ТОЛЬКО их:          ║
   ║    · --o-*  горячий акцент (кнопки, активное, иконки)                  ║
   ║    · --c-*  холодный акцент (сталь/петроль)                            ║
   ║    · нейтраль (--ink/--paper/--line…) и --text-*                       ║
   ║  Подложки, подсветки, тинты и активные состояния собраны из этих       ║
   ║  переменных через color-mix() и пересчитаются сами.                    ║
   ╚══════════════════════════════════════════════════════════════════════╝

   ДИЗАЙН. Опора на белые/кремовые поверхности и волосяные границы; цвет —
   точечный акцент (CTA, активный раздел, ключевые числа, наведение), а не
   фон. Кнопки — с мягким градиентом и тёплой тенью, скругление на уровне
   карточек (--r-md), движение подтверждает действие.

   ПАЛИТРА: «teal & orange» (океан ↔ осень). Чернильно-синий уголь, кремовая
   бумага-пшеница, бирюзовый холодный акцент и оранжево-ржавый горячий.

   ШРИФТЫ. Manrope (заголовки, цифры) + Inter (текст) + IBM Plex Mono
   (телефоны, тоннажи) — все с полной кириллицей.

   СОДЕРЖАНИЕ
     1. Токены и база          5. Формы и списки
     2. Панели и кнопки        6. Появление и меню
     3. Аккордеоны             7. Табы
     4. Секционные фоны        8. Привязка к разметке · доступность
   ========================================================================== */

/* Шрифты Manrope/Inter/IBM Plex Mono подключаются через <link> в <head>
   каждой страницы (см. index.html и др.) — это быстрее, чем @import: ссылка
   в HTML грузится параллельно с остальными ресурсами, а @import в CSS
   блокирует парсинг файла до ответа сервера шрифтов. */

/* ============================ 1. ТОКЕНЫ И БАЗА ========================== */
:root {
    /* ─── ГОРЯЧИЙ АКЦЕНТ: золотой апельсин → карамель → ржавчина → железо ─── */
    --o-50:#FBF4E9; --o-100:#F5E7C8; --o-200:#EAD3A0; --o-300:#E9B457;
    --o-400:#EE9B00; --o-500:#CA6702; --o-600:#BB3E03; --o-700:#AE2012; --o-800:#9B2226;

    /* ─── ХОЛОДНЫЙ АКЦЕНТ: жемчужная аква → тёмный циан → тёмная бирюза ───── */
    --c-100:#CDE7DF; --c-300:#94D2BD; --c-500:#0A9396; --c-600:#0A7E82; --c-700:#005F73;

    /* ─── НЕЙТРАЛЬ: чернильно-синий уголь + кремовая бумага (пшеница) ─────── */
    --ink:#001219; --ink-2:#05262F;
    --paper:#F8F4EA; --sheet:#FFFDF8;
    --line:#ECE4D4; --line-2:#DCD2BE; --line-warm:#F0DFC2;

    /* ─────────── ТЕКСТ (прохладные графит-бирюзовые тона) ───────────────── */
    --text-strong:#14202A;  /* заголовки, «вы здесь» */
    --text-body:  #33424A;  /* основной тёмный текст */
    --text-mut:   #5E6B70;  /* лиды, подписи, капитель */
    --text-soft:  #9AA4A7;  /* плейсхолдеры, приглушённое */

    /* ─────────── ТЕНИ (тонируются прозрачностью) ───────────────────────── */
    --shadow-rgb: 4, 20, 26;
    --shadow-brand-rgb: 150, 46, 12;   /* тёплый след под оранжевой кнопкой */

    /* ─── ПРОИЗВОДНЫЕ ЗАЛИВКИ. Выведены из шкал — отдельно не трогать ─────── */
    --tint-1: color-mix(in srgb, var(--o-600) 5%,  transparent);
    --tint-2: color-mix(in srgb, var(--o-600) 12%, transparent);
    --tint-3: color-mix(in srgb, var(--o-600) 28%, transparent);

    /* Скругления ужаты: 20/28 читались «пузырчато». 14/18 — взрослее.
       Кнопки — на радиусе карточек (--r-md): мягче, чем было, но не «пилюля». */
    --r-sm:10px; --r-md:14px; --r-lg:18px; --r-btn:14px;
    --ease: cubic-bezier(.22, 1, .36, 1);

    --brand:var(--o-700); --brand-soft:var(--o-300);
    --route-sky:var(--c-700); --route-teal:var(--c-600);

    /* Кнопки светлее и звонче базового --o-600: тот работает как фирменный
       акцент по всему сайту (риббон, эйбраузы, иконки), а кнопка — самый
       кликабельный элемент, ей отдельно нужна яркость и энергия. */
    --o-btn:#E85D04; --o-btn-hover:#C94B02;

    /* ─── ЕДИНЫЙ ТОН ИКОНОК УСЛУГ ────────────────────────────────────────
       Раньше шесть карточек услуг несли шесть разных акцентов (оранжевый,
       петроль, бирюза, графит) — набор читался как «светофор». Теперь знак
       всегда графитовый, а фирменный оранжевый остаётся только там, где
       нужен клик: кнопки, ссылка «Подробнее», активный раздел. */
    --icon-mono:var(--o-600);
}

html {
    /* На страницах с малым количеством текста в колонке мобильный Safari/
       Chrome сам увеличивает шрифт («font boosting»), пытаясь «улучшить
       читаемость». Именно из-за этого «Услуги» (где текста стало меньше)
       выглядели крупнее «Главной»/«Автопарка» — там текста много, и авто-
       увеличение не включается. Отключаем безусловно на всём сайте. */
    -webkit-text-size-adjust: 100%;
    text-size-adjust: 100%;
}
body {
    font-family: 'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif;
    background-color: var(--paper);
    font-feature-settings: "cv05" 1, "cv11" 1;
    -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
    text-rendering: optimizeLegibility;
    /* Хиро-баннер намеренно «вылезает» за пределы центральной колонки
       до самых краёв экрана (см. #hero) — подстраховка от горизонтального
       скролла на случай субпиксельных округлений в разных браузерах. */
    overflow-x: hidden;
    /* ── ФОНОВЫЙ «ГРАФ-ПАПЕР» НА ВСЮ СТРАНИЦУ ─────────────────────────────
       По мотивам шаблона пользователя: мягкий диагональный перелив цвета +
       тонкая сетка линий поверх. Перелив — не «постер», а лёгкий намёк:
       бумага чуть holодит к бирюзе в одном углу и чуть теплеет к ржавчине
       в другом (6% примеси, дальше по диагонали не видно совсем). Сетка —
       волосяные линии редко (44px), а не частая миллиметровка, чтобы не
       рябило на большом развороте страницы. Прибито к viewport (fixed). */
    background-image:
        linear-gradient(90deg, rgba(var(--shadow-rgb), .05) 1px, transparent 1px),
        linear-gradient(0deg,  rgba(var(--shadow-rgb), .05) 1px, transparent 1px),
        linear-gradient(135deg,
            color-mix(in srgb, var(--c-500) 6%, var(--paper)) 0%,
            var(--paper) 45%, var(--paper) 55%,
            color-mix(in srgb, var(--o-600) 6%, var(--paper)) 100%);
    background-size: 44px 44px, 44px 44px, 100% 100%;
    background-attachment: fixed, fixed, fixed;
}
/* Липких полос две — шапка и табы, якоря должны вставать под обе */
html { scroll-behavior: smooth; scroll-padding-top: 9.5rem; }
::selection { background: color-mix(in srgb, var(--o-600) 18%, transparent); }
:focus-visible { outline: 2px solid var(--c-600); outline-offset: 3px; border-radius: 6px; }
.panel-dark :focus-visible, footer :focus-visible { outline-color: var(--c-300); }

/* Остаток выпадающего «Услуги» в ШАПКЕ трёх старых страниц: на новой
   главной <nav> в шапке нет, правило гасит дубль только там, где он жив. */
header nav { display: none; }
/* Тот же дубль в МОБИЛЬНОМ меню тех же страниц: единственный <div> внутри
   #mobile-menu — раскрывающийся список подуслуг. На главной пункты меню —
   прямые <a>, поэтому список гасится только там, где он лишний. */
#mobile-menu > div { display: none; }

.font-display { font-family: 'Manrope', 'Inter', sans-serif; letter-spacing: -0.015em; }
.font-mono { font-family: 'IBM Plex Mono', monospace; font-variant-numeric: tabular-nums; }

/* Номер телефона: IBM Plex Mono сюда не подходит — печатный, "техничный"
   рисунок цифр выбивался на фоне Manrope/Inter, которыми набран весь
   остальной сайт. Берём тот же Manrope, что и для крупных цифр в #stats,
   с табличными цифрами, чтобы разряды не "гуляли" по ширине. */
.tel-num { font-family: 'Manrope', 'Inter', sans-serif; font-variant-numeric: tabular-nums; letter-spacing: -0.01em; }

/* Единицы измерения внутри показателей («т», «рейсов», «м³») шли санс-
   шрифтом и мелким кеглем — рядом с моно-цифрами «т» выпадала. Приводим
   к тому же моно и укрупняем, чтобы единица читалась частью числа. */
.font-mono .text-sm { font-family: inherit; font-size: .68em; font-weight: 600; letter-spacing: 0; }

/* Длинные термины вроде «грузоподъёмность» рвали узкие колонки */
p, li, dd, td { overflow-wrap: break-word; }

.brand-ribbon { height: 3px; background-color: var(--o-600); }

.section { margin-top: 5rem; }
@media (min-width: 768px) { .section { margin-top: 7rem; } }

.sec-title {
    font-family: 'Manrope', 'Inter', sans-serif; font-weight: 800;
    letter-spacing: -0.015em; line-height: 1.16;
    font-size: clamp(1.6875rem, 1.15rem + 2vw, 2.375rem);
    text-wrap: balance;
}
.sec-lead { font-size: 0.9375rem; line-height: 1.75; color: var(--text-mut); text-wrap: pretty; max-width: 68ch; }

.eyebrow {
    display: inline-flex; align-items: center; gap: 0.625rem;
    font-size: 0.75rem; font-weight: 700; line-height: 1;
    text-transform: uppercase; letter-spacing: 0.09em; color: var(--text-mut);
}
/* Полоска-надзаголовок сплошная, без градиента — спокойная метка раздела */
.eyebrow::before {
    content: ""; width: 20px; height: 2px; border-radius: 999px;
    background-color: var(--o-600);
}
.eyebrow-cool::before { background-color: var(--c-700); }
.eyebrow-light { color: var(--text-soft); }
.eyebrow-light::before { background-color: var(--o-500); }
.eyebrow-sky   { color: var(--text-soft); }
.eyebrow-sky::before   { background-color: var(--c-500); }
.eyebrow-teal  { color: var(--text-soft); }
.eyebrow-teal::before  { background-color: var(--c-500); }

/* ========================= 2. ПАНЕЛИ И КНОПКИ =========================== */
.hero-scrim {
    /* Переход растянут почти на две трети ширины блока и разбит на много
       мелких шагов — глаз не видит стыка «бумага / фото», плашка с текстом
       выглядит как естественное продолжение снимка, а не наклеенная сверху. */
    background: linear-gradient(90deg,
        var(--paper) 0%, var(--paper) 20%,
        color-mix(in srgb, var(--paper) 92%, transparent) 28%,
        color-mix(in srgb, var(--paper) 76%, transparent) 36%,
        color-mix(in srgb, var(--paper) 56%, transparent) 44%,
        color-mix(in srgb, var(--paper) 36%, transparent) 52%,
        color-mix(in srgb, var(--paper) 20%, transparent) 60%,
        color-mix(in srgb, var(--paper) 9%, transparent) 68%,
        color-mix(in srgb, var(--paper) 2%, transparent) 76%,
        transparent 84%);
}
/* Полноширинное фото-хиро (см. #hero, вылезает за колонку контента до
   краёв экрана): без рамки оно «обрывалось» бесформенным прямоугольником.
   Тонкие акцентные линии сверху/снизу маркируют кадр как осознанную
   вставку. Тень должна лечь поверх самого фото, а не под ним — обычный
   box-shadow на #hero был бы перекрыт непрозрачным <img>, поэтому это
   отдельный слой-накладка (.hero-vignette) внутри картинки. */
.hero-vignette { box-shadow: inset 0 44px 60px -48px rgba(var(--shadow-rgb), .5), inset 0 -44px 60px -48px rgba(var(--shadow-rgb), .5); }
/* Раньше сверху/снизу шла плотная цветная полоса-обводка — она визуально
   резала блок на «своё» и «страницу». Теперь вместо линии — мягкая тень:
   сама секция как будто приподнята над бумагой (box-shadow не обрезается
   overflow-hidden самого блока), а тонкие внутренние градиенты у краёв
   добавляют объём вместо жёсткой границы. */
.hero-framed {
    /* Тонкая линия по периметру визуально «вырезает» блок как отдельную
       карточку, а не просто зону на странице; тень поверх неё довершает
       ощущение, что карточка приподнята и действительно отбрасывает тень. */
    border: 1px solid rgba(var(--shadow-rgb), .12);
    box-shadow:
        0 36px 64px -38px rgba(var(--shadow-rgb), .4),
        0 -22px 48px -34px rgba(var(--shadow-rgb), .16);
}
.hero-framed::before, .hero-framed::after {
    content: ""; position: absolute; left: 0; right: 0; height: 64px; z-index: 20; pointer-events: none;
}
.hero-framed::before {
    top: 0;
    background: linear-gradient(to bottom, rgba(var(--shadow-rgb), .12), transparent);
}
.hero-framed::after {
    bottom: 0;
    background: linear-gradient(to top, rgba(var(--shadow-rgb), .12), transparent);
}
/* Пульсация точки снята: мигающий элемент в шапке героя ничего не сообщает */
#hero .animate-pulse { animation: none; opacity: 1; }
#hero span:has(> .animate-pulse) {
    border-color: var(--line-2);
    box-shadow: 0 1px 3px rgba(var(--shadow-rgb), .06);
}
#hero h1 { font-family: 'Manrope', 'Inter', sans-serif; letter-spacing: -0.02em !important; line-height: 1.1; }

/* Тени приглушены: опора на 1px-границу, дальняя тень намекает на отрыв */
.card {
    background: #fff; border: 1px solid var(--line); border-radius: var(--r-md);
    box-shadow: 0 1px 2px rgba(var(--shadow-rgb), .04);
}
.card-hover { transition: transform .25s var(--ease), box-shadow .25s ease, border-color .25s ease; }
.card-hover:hover {
    transform: translateY(-3px); border-color: var(--line-2);
    box-shadow: 0 1px 2px rgba(var(--shadow-rgb), .05), 0 16px 32px -20px rgba(var(--shadow-rgb), .28);
}
.panel { border-radius: var(--r-lg); }
.panel-dark { background: var(--ink); border-radius: var(--r-lg); box-shadow: 0 20px 44px -34px rgba(var(--shadow-rgb), .7); }
.panel-light {
    background-color: var(--sheet); border: 1px solid var(--line); border-radius: var(--r-lg);
    box-shadow: 0 1px 2px rgba(var(--shadow-rgb), .04), 0 18px 40px -32px rgba(var(--shadow-rgb), .22);
}
/* Два мягких акцентных пятна (точечная сетка убрана по просьбе) */
.blueprint {
    background-image:
        radial-gradient(58% 76% at 90% 8%, color-mix(in srgb, var(--c-500) 6%, transparent), transparent 62%),
        radial-gradient(56% 70% at 5% 95%, color-mix(in srgb, var(--o-600) 8%, transparent), transparent 60%);
}
.panel-warm {
    background-color: var(--o-50); border: 1px solid var(--line-warm); border-radius: var(--r-lg);
    box-shadow: 0 1px 2px rgba(var(--shadow-brand-rgb), .04), 0 18px 40px -32px rgba(var(--shadow-brand-rgb), .2);
}
.glow-warm { background-image: radial-gradient(circle at top right, var(--o-200), transparent 62%); }

/* ── ИНДИВИДУАЛЬНОСТЬ ГЕРОЕВ ВНУТРЕННИХ СТРАНИЦ ────────────────────────────
   Комбинированный подход: у Услуг и О нас — свой цветной фон с градиентом
   (тёплый / чернильный), у Автопарка — нейтральный светлый (без перекраски,
   по просьбе). Поверх всех трёх — свой контурный пиктограм-«водяной знак»
   в углу (кран/трал/график роста), тем же тоном, что и текст на этом фоне. */
.hero-panel--services, .hero-panel--fleet, .hero-panel--about { position: relative; overflow: hidden; }
.hero-panel--services {
    background-color: var(--o-50);
    border-color: var(--line-warm);
    background-image:
        radial-gradient(60% 80% at 92% 6%, color-mix(in srgb, var(--o-500) 18%, transparent), transparent 62%),
        radial-gradient(56% 70% at 5% 95%, color-mix(in srgb, var(--o-600) 11%, transparent), transparent 60%);
}
.hero-panel--about {
    background-color: var(--ink);
    border-color: var(--ink-2);
    box-shadow: 0 1px 2px rgba(var(--shadow-rgb), .1), 0 20px 44px -34px rgba(var(--shadow-rgb), .7);
    background-image:
        radial-gradient(60% 80% at 92% 6%, color-mix(in srgb, var(--c-500) 22%, transparent), transparent 62%),
        radial-gradient(56% 70% at 5% 95%, color-mix(in srgb, var(--o-500) 16%, transparent), transparent 60%);
}
/* Текстовая колонка героя «О нас» лежит на тёмном фоне — переопределяем
   только её (не карточку-бейдж справа, та остаётся белой картой поверх). */
.hero-panel--about .hero-copy h1.sec-title,
.hero-panel--about .hero-copy .text-slate-900 { color: #fff; }
.hero-panel--about .hero-copy .sec-lead { color: color-mix(in srgb, #fff 74%, var(--c-100)); }
.hero-panel--about .hero-copy .eyebrow { color: var(--o-300); }
.hero-panel--about .hero-copy .eyebrow::before { background-color: var(--o-400); }
.hero-panel--about .hero-copy .btn-outline {
    background-color: transparent; border-color: rgba(255, 255, 255, .28); color: #fff;
}
.hero-panel--about .hero-copy .btn-outline:hover {
    border-color: #fff; box-shadow: 0 1px 2px rgba(0, 0, 0, .3);
}
.hero-watermark {
    position: absolute; right: -1.75rem; bottom: -2.25rem;
    width: 17.5rem; height: 17.5rem;
    color: var(--ink); opacity: .1;
    pointer-events: none; user-select: none;
}
.hero-watermark svg { width: 100%; height: 100%; display: block; }
/* Кран в «Услугах» — крупнее остальных водяных знаков, как просили */
.hero-panel--services .hero-watermark { width: 24rem; height: 24rem; right: -2.5rem; bottom: -3rem; }
/* На тёмном фоне «О нас» чернильный тон водяного знака невидим — берём белый */
.hero-panel--about .hero-watermark { color: #fff; opacity: .12; }
@media (max-width: 640px) {
    .hero-watermark { width: 10.5rem; height: 10.5rem; right: -1rem; bottom: -1.25rem; opacity: .09; }
    .hero-panel--services .hero-watermark { width: 13rem; height: 13rem; right: -1.25rem; bottom: -1.5rem; }
}
/* Одинаковый размер героев на десктопе ────────────────────────────────────
   Ширина у всех трёх и так общая (один и тот же max-w-7xl контейнер). Разница
   в высоте на деле небольшая (≈515–546px) — фиксируем по самому высокому
   (Услуги), чуть округлив вверх, чтобы блок при переключении вкладок не
   «прыгал», но и не раздувался. Контент, которому высоты хватает с запасом,
   центрируется по вертикали, а не прилипает к верхнему краю. На мобильных
   не трогаем — там блоки и так вытянуты по контенту, а искусственная высота
   добавила бы пустоты. */
@media (min-width: 1024px) {
    .hero-panel--services, .hero-panel--fleet, .hero-panel--about {
        min-height: 34.5rem;
        display: flex;
        flex-direction: column;
        justify-content: center;
    }
}
/* Заголовок героя на внутренних страницах использовал общий .sec-title
   (клэмп до 2.375rem) — на десктопе он заметно мельче h1 на главной
   (3.25rem), из-за чего при переходе между разделами масштаб «прыгал».
   Уравниваем ровно под размер/леддинг/трекинг героя главной. */
.hero-panel--services h1.sec-title,
.hero-panel--fleet h1.sec-title,
.hero-panel--about h1.sec-title {
    font-size: 2.25rem; line-height: 1.05; letter-spacing: -0.02em;
}
@media (min-width: 768px) {
    .hero-panel--services h1.sec-title,
    .hero-panel--fleet h1.sec-title,
    .hero-panel--about h1.sec-title { font-size: 3.25rem; }
}
/* Чипы-якоря в шапке услуг — весь список направлений виден сразу, без
   пролистывания до карточек. */
.hero-chip {
    display: inline-flex; align-items: center; gap: .5rem;
    padding: .5rem .875rem; border-radius: 9999px;
    background: #fff; border: 1px solid var(--line);
    font-size: .8125rem; font-weight: 700; color: var(--text-body);
    transition: border-color .2s ease, background-color .2s ease, transform .15s ease;
}
.hero-chip::before { content: ""; width: 7px; height: 7px; border-radius: 999px; background: var(--a); flex: none; }
/* Фон на hover смешиваем с белым (а не с transparent), иначе плашка
   «теряет» непрозрачную заливку и сквозь неё просвечивает точечный фон панели */
.hero-chip:hover { border-color: var(--a); background: color-mix(in srgb, var(--a) 12%, white); transform: translateY(-1px); }
/* Бейдж основания на «О нас» — год и две цифры вместо ещё одного абзаца. */
.about-badge { background: var(--sheet); }
.about-badge .badge-year { font-family: 'Manrope', 'Inter', sans-serif; letter-spacing: -0.02em; }

/* КНОПКИ. Объёмная заливка градиентом (тон уходит от светлого к глубокому
   по диагонали), а тёплая размытая тень (--shadow-brand-rgb — тот самый
   «тёплый след под оранжевой кнопкой», описанный в токенах, но раньше
   нигде не задействованный) приподнимает кнопку над страницей.
   Наведение меняет яркость через filter — не через второй слой/градиент:
   у кнопки есть прозрачная рамка (border: 1px solid transparent, нужна
   для одинаковой высоты с .btn-outline), а инсет-элемент (::before)
   с inset:0 позиционируется от края ПОД рамкой и не достаёт до неё —
   на скруглённых углах это давало неровную, «кривую» полоску по контуру
   при наведении. filter красит сам элемент целиком, без этого зазора.
   Нажатие — сдвиг вниз на 1px (общий .btn:active ниже). */
.btn {
    display: inline-flex; align-items: center; justify-content: center; gap: .5rem;
    border-radius: var(--r-btn); font-weight: 600; font-size: .875rem;
    letter-spacing: -0.005em;
    padding: .75rem 1.375rem; white-space: nowrap;
    border: 1px solid transparent;
    transition: background-color .18s ease, color .18s ease, border-color .18s ease,
                box-shadow .18s ease, transform .18s var(--ease), filter .18s ease;
}
/* background-origin: border-box — без этого градиент считает свои размеры
   от внутренней границы прозрачной рамки (border: 1px solid transparent
   в .btn), а красится до внешней; на этот 1px браузер докраивает узор
   повторным фрагментом того же градиента, и по контуру кнопки появляется
   тонкое кольцо чуть другого цвета. На скруглённых углах рамка идёт дугой,
   а не прямой полосой в 1px, поэтому там этот шов не образуется — кольцо
   видно только на прямых участках (верх/низ/бока) и будто обрезано по углам. */
.btn-primary {
    background: linear-gradient(155deg, var(--o-400) 0%, var(--o-btn) 55%, var(--o-600) 100%);
    background-origin: border-box;
    color: #fff; border-color: transparent;
    box-shadow: 0 1px 1px rgba(var(--shadow-rgb), .1),
                0 16px 28px -16px rgba(var(--shadow-brand-rgb), .6);
}
.btn-primary:hover, .btn-primary:focus-visible {
    filter: brightness(.92);
    box-shadow: 0 2px 3px rgba(var(--shadow-rgb), .14),
                0 20px 34px -16px rgba(var(--shadow-brand-rgb), .68);
    transform: translateY(-1px);
}

.btn-ink {
    background: linear-gradient(155deg, var(--ink-2) 0%, var(--ink) 70%);
    background-origin: border-box;
    color: #fff; border-color: transparent;
    box-shadow: 0 1px 1px rgba(var(--shadow-rgb), .14),
                0 16px 28px -18px rgba(var(--shadow-rgb), .55);
}
.btn-ink:hover, .btn-ink:focus-visible {
    filter: brightness(1.2);
    box-shadow: 0 2px 3px rgba(var(--shadow-rgb), .18),
                0 20px 32px -16px rgba(var(--shadow-rgb), .6);
    transform: translateY(-1px);
}

/* Вторичная — светлая с волосяной рамкой; наведение не заливает её в чёрный,
   а лишь усиливает контур и слегка приподнимает. Меньше «скачков» контраста
   в интерфейсе, но та же объёмность, что и у цветных кнопок. */
.btn-outline {
    background-color: #fff; border-color: var(--line-2); color: var(--text-strong);
    box-shadow: 0 1px 2px rgba(var(--shadow-rgb), .05);
}
.btn-outline:hover, .btn-outline:focus-visible {
    border-color: var(--text-strong);
    box-shadow: 0 6px 16px -10px rgba(var(--shadow-rgb), .3);
    transform: translateY(-1px);
}
/* Кнопки шапки/таббара («Главное · Услуги · Автопарк · О нас» и «Позвонить»)
   скруглены сильнее остальных — до полной таблетки. Радиус переопределяем
   точечно, чтобы не задеть кнопки форм и CTA в футере, у которых он общий (--r-btn). */
.btn-sm { padding: .5rem 1rem; border-radius: 9999px; }
.btn:active { transform: translateY(1px); transition-duration: .05s; }

/* ── Наведение: блик на заливных кнопках, тёплый наплыв на обводке ──────
   .btn-primary/.btn-ink — сплошная заливка, ей идёт узкая световая полоса,
   раз проходящая по диагонали при наведении (жест-отклик, не зацикленный
   лоуп: анимация переигрывается заново на каждый новый hover/focus).
   .btn-outline — белая, с рамкой; тот же блик на светлом фоне был бы не
   виден, поэтому вместо него слева наплывает акцентная плашка того же
   тона, что и остальные hover-подсветки сайта (--tint-2). Оба приёма
   заданы в процентах от ширины кнопки, поэтому одинаково читаются что на
   маленькой пилюле в шапке (.btn-sm), что на крупном CTA в футере. */
.btn-primary, .btn-ink { position: relative; overflow: hidden; isolation: isolate; }
.btn-primary::after, .btn-ink::after {
    content: ''; position: absolute; top: 0; left: -35%;
    width: 35%; height: 100%;
    background: linear-gradient(115deg, transparent, rgba(255, 255, 255, .45) 45%, transparent 80%);
    transform: skewX(-18deg);
    pointer-events: none; /* блик лежит поверх текста визуально, но не должен перехватывать клик */
    opacity: 0; /* в состоянии покоя скошенный край блика чуть выступает за левую границу
                   кнопки и на скруглении угла читался как обрывающаяся по контуру полоска —
                   прячем блик до момента наведения/фокуса, где он уже проигрывает анимацию */
}
@media (hover: hover) and (pointer: fine) {
    /* :hover only for devices with a real pointer — touch «hover» на мобильных
       залипает после тапа и полоса осталась бы стоять в кнопке до следующего тача */
    .btn-primary:hover::after, .btn-ink:hover::after { opacity: 1; animation: btn-shine .85s var(--ease); }
}
.btn-primary:focus-visible::after, .btn-ink:focus-visible::after {
    opacity: 1;
    animation: btn-shine .85s var(--ease); /* клавиатурный фокус получает тот же отклик, что и hover */
}
@keyframes btn-shine {
    from { left: -35%; }
    to   { left: 135%; }
}

.btn-outline { position: relative; overflow: hidden; isolation: isolate; }
.btn-outline::after {
    content: ''; position: absolute; inset: 0;
    background: var(--tint-2);
    transform: scaleX(0); transform-origin: left;
    transition: transform .32s var(--ease);
    z-index: -1; /* наплыв лежит под текстом — это заливка, а не блик поверх букв */
}
.btn-outline:hover::after, .btn-outline:focus-visible::after { transform: scaleX(1); }

/* Акценты услуг. --a идёт в текст (нужен AA), --a-2 в заливку, --a-bg —
   бледная подложка иконки, выведена из того же тона через color-mix. */
.acc-brand { --a: var(--o-700); --a-2: var(--o-500); --a-bg: var(--tint-2); }
.acc-sky   { --a: var(--c-700); --a-2: var(--c-500); --a-bg: color-mix(in srgb, var(--c-700) 9%, transparent); }
.acc-teal  { --a: var(--c-600); --a-2: var(--c-300); --a-bg: color-mix(in srgb, var(--c-600) 9%, transparent); }
.acc-ink   { --a: #45525A;      --a-2: #5E6B70;      --a-bg: color-mix(in srgb, #45525A 8%, transparent); }
/* Иконка услуги: белый квадрат, волосяная рамка, знак в акцентном тоне.
   Цвет статичен всегда — при наведении на карточку реагирует лёгким
   поворотом и увеличением, без смены заливки. */
.svc-icon {
    background: #fff; border: 1px solid var(--line); color: var(--a);
    transition: transform .3s var(--ease);
}
.group:hover .svc-icon { transform: scale(1.08) rotate(-4deg); }
.svc-link { color: var(--a); }
.svc-link svg { transition: transform .25s var(--ease); }
.group:hover .svc-link svg { transform: translateX(4px); }

/* ── Модальное окно карточки «Подробнее» ────────────────────────────────
   Клик по карточке услуги раньше прыгал якорем вниз по странице. Теперь
   вместо этого поверх всего сайта открывается отдельное окно с той же
   информацией — сама страница за ним остаётся на месте. */
.svc-modal { position: fixed; inset: 0; z-index: 90; display: none; }
.svc-modal.is-visible { display: block; }
.svc-modal-backdrop {
    position: absolute; inset: 0; background: rgba(15, 23, 32, .6);
    opacity: 0; transition: opacity .28s var(--ease);
}
.svc-modal.is-open .svc-modal-backdrop { opacity: 1; }
.svc-modal-dialog {
    --m-pad-t: 2rem; --m-pad-x: 1.75rem;
    position: relative; z-index: 1; width: calc(100% - 2.5rem); max-width: 640px;
    max-height: 88vh; overflow-y: auto; margin: 6vh auto 0;
    background: #fff; border-radius: 1.75rem;
    box-shadow: 0 30px 70px -28px rgba(var(--shadow-rgb), .55);
    padding: var(--m-pad-t) var(--m-pad-x) 1.75rem;
    opacity: 0; transform: translateY(22px) scale(.96);
    transition: opacity .3s var(--ease), transform .32s var(--ease);
}
.svc-modal.is-open .svc-modal-dialog { opacity: 1; transform: translateY(0) scale(1); }
.svc-modal-close {
    /* Подвинута ближе к углу (было top/right: 1rem) — так кнопка целиком
       попадает в уже существующий белый вырез на фото, а не наполовину
       вылезает за его пределы. Форму/размер выреза не трогаем — его края
       устраивают, менять нужно было только положение кнопки. */
    position: absolute; top: .5rem; right: .5rem; width: 2.25rem; height: 2.25rem; z-index: 2;
    display: flex; align-items: center; justify-content: center; border-radius: 999px;
    background: #fff; border: 1px solid var(--line); color: var(--text-body);
    box-shadow: 0 2px 10px rgba(var(--shadow-rgb), .16);
    cursor: pointer; /* Tailwind v3 больше не ставит cursor:pointer на <button>
                         по умолчанию — без этого крестик выглядел некликабельным */
    transition: background-color .2s ease, color .2s ease;
}
.svc-modal-close:hover { background: var(--tint-3, #E2E8F0); color: var(--text-strong); }
.svc-modal-body .ph {
    --edge-gap: .5rem; /* столько фото не дотягивает до истинного края окна */
    border-radius: 1.25rem; min-height: 140px;
    /* Фото тянется к правому верхнему углу окна на ту же величину, что и
       внутренний отступ окна (--m-pad-*), поэтому её верхний правый угол
       всегда стоит ровно в --edge-gap от края — вырез ниже центрирован
       буквально в этом углу и потому всегда попадает в кнопку закрытия. */
    margin: calc(var(--edge-gap) - var(--m-pad-t)) calc(var(--edge-gap) - var(--m-pad-x)) 0 0;
    width: calc(100% + var(--m-pad-x) - var(--edge-gap));
    /* Центр выреза поставлен ТОЧНО в центр самого крестика — той же
       формулой, что и его позиция: кнопка стоит в top/right: .5rem,
       её размер 2.25rem, значит её центр — в .5rem + 1.125rem = 1.625rem
       от истинного угла окна; фото не дотягивает до угла на --edge-gap
       (.5rem), поэтому в координатах самого фото центр кнопки — в
       1.625rem - .5rem = 1.125rem от угла фото по каждой оси. Вырез
       и кнопка теперь буквально концентричны — двигается кнопка,
       двигай эту же величину и здесь. Радиус — половина кнопки (1.125rem)
       плюс небольшое поле (.5rem) вокруг неё. */
    -webkit-mask-image: radial-gradient(circle at calc(100% - 1.125rem) 1.125rem, transparent 1.625rem, #000 calc(1.625rem + 1px));
            mask-image: radial-gradient(circle at calc(100% - 1.125rem) 1.125rem, transparent 1.625rem, #000 calc(1.625rem + 1px));
}
.svc-modal-body .sec-title { font-size: 1.375rem; }
.svc-modal-body .sec-lead { font-size: .875rem; line-height: 1.6; }
.svc-modal-body .card table { font-size: .8125rem; }
body.modal-open { overflow: hidden; }
@media (max-width: 640px) {
    .svc-modal-dialog { width: 100%; max-height: 100vh; height: 100%; margin: 0; border-radius: 0; padding: 1.5rem 1.25rem 2rem; }
    .svc-modal-body .ph {
        margin: -1rem -1rem 0 0; width: calc(100% + 1rem);
        /* Тот же принцип, что и на десктопе, — центр выреза точно в
           центре кнопки. Здесь фото не дотягивает до угла окна на
           .5rem по вертикали и .25rem по горизонтали (другой --edge-gap
           из-за иного margin/padding на мобильной вёрстке), поэтому
           центр кнопки в координатах фото — 1.375rem по X и 1.125rem
           по Y от её угла. */
        -webkit-mask-image: radial-gradient(circle at calc(100% - 1.375rem) 1.125rem, transparent 1.625rem, #000 calc(1.625rem + 1px));
                mask-image: radial-gradient(circle at calc(100% - 1.375rem) 1.125rem, transparent 1.625rem, #000 calc(1.625rem + 1px));
    }
}
@media (prefers-reduced-motion: reduce) {
    .svc-modal-backdrop, .svc-modal-dialog { transition: none; }
    .svc-modal.is-visible .svc-modal-backdrop { opacity: 1; }
    .svc-modal.is-visible .svc-modal-dialog { opacity: 1; transform: none; }
}

.counter { font-variant-numeric: tabular-nums; }
#stats .font-display { font-family: 'Manrope', 'Inter', sans-serif; font-variant-numeric: tabular-nums; letter-spacing: -0.02em; }
#stats p.text-xs { letter-spacing: 0.06em; }
/* Линейка над цифрой — сплошная и тоньше, без двухцветного градиента */
.stat-rule {
    display: block; width: 2rem; height: 2px; border-radius: 999px;
    margin: 0 auto 1rem; background-color: var(--o-600);
    transform: scaleX(.2); transition: transform .7s var(--ease) .1s;
}
.reveal.visible .stat-rule { transform: scaleX(1); }

/* Пунктир идёт за карточками и виден только в промежутках — дорога
   между пунктами. Требует класс route-steps на сетке из четырёх шагов. */
.route-steps { position: relative; }
.route-steps > * { position: relative; z-index: 1; }
@media (min-width: 1024px) {
    .route-steps::before {
        content: ""; position: absolute; z-index: 0;
        left: 8%; right: 8%; top: 3.5rem; height: 2px;
        background-image: repeating-linear-gradient(90deg,
            var(--line-2) 0 9px, transparent 9px 19px);
    }
}

h2, h3, h4 { font-family: 'Manrope', 'Inter', sans-serif; letter-spacing: -0.01em; }

/* ============================ 3. АККОРДЕОНЫ =============================
   Нативный <details> не анимирует высоту — ей управляет JS: open включается
   ДО замера, высота едет 0 → scrollHeight, при закрытии наоборот.

   ПЕРЕКЛЮЧАТЕЛЬ. «+» в разметке — текстовый символ. Глиф сидит на базовой
   линии и оптически не центрируется, поэтому крест рисуется двумя
   одинаковыми полосами на ::before/::after, а символ гасится font-size: 0.
   ======================================================================== */
details.acc { position: relative; transition: background-color .3s ease, border-color .3s ease; }
details.acc > summary { list-style: none; cursor: pointer; transition: background-color .25s ease; }
details.acc > summary::-webkit-details-marker { display: none; }
details.acc > summary:hover { background: var(--tint-1); }
details.acc > summary > span:first-child { transition: transform .25s var(--ease); }
details.acc > summary:hover > span:first-child { transform: translateX(3px); }
details.acc > summary:focus-visible { outline-offset: -3px; border-radius: var(--r-md); }

/* Корешок раскрытой строки — сплошной акцент, без градиента */
details.acc::before {
    content: ""; position: absolute; left: 5px; top: 1.125rem; bottom: 1.125rem;
    width: 3px; border-radius: 999px;
    background-color: var(--o-600);
    transform: scaleY(0); transform-origin: center;
    transition: transform .45s var(--ease);
}
details.acc.is-open::before { transform: scaleY(1); }
details.acc.is-open { border-color: var(--line-warm); background: #FFFDFA; }
details.acc > summary .font-mono { transition: color .3s ease; }
details.acc.is-open > summary .font-mono { color: var(--o-700); }

.acc-plus {
    position: relative;
    display: inline-flex; align-items: center; justify-content: center;
    width: 1.75rem; height: 1.75rem; border-radius: 9999px; flex: none;
    border: 1px solid var(--line-2); color: var(--text-mut);
    font-size: 0;
    transition: transform .42s var(--ease), background-color .25s, border-color .25s, color .25s;
}
.acc-plus::before,
.acc-plus::after {
    content: ""; position: absolute; top: 50%; left: 50%;
    width: 10px; height: 2px; border-radius: 999px;
    background: currentColor;
}
.acc-plus::before { transform: translate(-50%, -50%); }
.acc-plus::after  { transform: translate(-50%, -50%) rotate(90deg); }

details.acc > summary:hover .acc-plus { border-color: var(--tint-3); color: var(--o-700); }
details.acc.is-open .acc-plus {
    transform: rotate(45deg);
    background: var(--tint-2); border-color: transparent; color: var(--o-700);
}
details.acc-dark .acc-plus { border-color: rgba(255,255,255,.18); color: var(--text-soft); }
details.acc-dark.is-open .acc-plus { background: color-mix(in srgb, var(--o-600) 18%, transparent); border-color: transparent; color: var(--o-300); }

.acc-body { overflow: hidden; transition: height .4s cubic-bezier(.4,0,.2,1); }
.acc-body > * {
    position: relative;
    opacity: 0; transform: translateY(-6px);
    transition: opacity .3s ease .08s, transform .4s var(--ease) .08s;
}
details.acc.is-open .acc-body > * { opacity: 1; transform: none; }
/* Концы полукруглые — поэтому 2px, на однопиксельной линии не видно */
.acc-body > *::before {
    content: ""; position: absolute; left: 1rem; right: 1rem; top: 0; height: 2px;
    border-radius: 999px; background: var(--line-warm);
    transform: scaleX(0); transform-origin: left center;
    transition: transform .55s var(--ease) .06s;
}
details.acc.is-open .acc-body > *::before { transform: scaleX(1); }
.acc-body p, .acc-body ul { max-width: 64ch; }

/* Нормализация списков в один компонент.
   ВНИМАНИЕ: селектор кегля обязан исключать .acc-plus — правило вида
   #faq details.acc > summary > span имеет специфичность (1,1,3) и перебивало
   .acc-plus { font-size: 0 }, из-за чего текстовый «+» проявлялся поверх
   нарисованного креста. */
#tral details.acc > summary,
#faq  details.acc > summary,
#vacancies details.acc > summary { padding: 1.25rem 1.5rem; }
#tral details.acc > summary > span:first-child > span:last-child,
#faq  details.acc > summary > span:not(.acc-plus),
#vacancies details.acc > summary > span:not(.acc-plus) { font-size: .9375rem; }
#tral details.acc > summary > .acc-plus,
#faq  details.acc > summary > .acc-plus,
#vacancies details.acc > summary > .acc-plus { font-size: 0; }
#tral .acc-body > div,
#faq  .acc-body > div,
#vacancies .acc-body > div { padding: 0 1.5rem 1.375rem; }
#tral .acc-body > *::before,
#faq  .acc-body > *::before,
#vacancies .acc-body > *::before { left: 1.5rem; right: 1.5rem; }
#faq  .acc-body > div { max-width: 68ch; }

/* Девять аккордеонов стояли в сетке 2 колонки: высоту строки задаёт самый
   высокий элемент, поэтому раскрытие одного растягивало строку и рядом
   появлялась дыра. Одна колонка — как в FAQ — снимает проблему в корне. */
#tral div:has(> details.acc) { display: block; max-width: 48rem; margin-inline: auto; }
#tral div:has(> details.acc) > details.acc { margin-bottom: .75rem; }
#tral div:has(> details.acc) > details.acc:last-child { margin-bottom: 0; }
#tral .mt-14 > h3 { max-width: 48rem; margin-inline: auto; }
/* Картинка стояла по центру строки и подпрыгивала при раскрытии соседа */
#shpunt .items-center { align-items: flex-start; }

/* ========================= 4. СЕКЦИОННЫЕ ФОНЫ =========================== */
/* Два мягких акцентных пятна на графите (точечная сетка убрана по просьбе) */
.cargo-grid {
    background-image:
        radial-gradient(60% 80% at 88% 10%, color-mix(in srgb, var(--c-500) 18%, transparent), transparent 62%),
        radial-gradient(58% 72% at 6% 94%, color-mix(in srgb, var(--o-600) 14%, transparent), transparent 60%);
}
.glow-cool {
    background-image:
        radial-gradient(circle at top right, var(--c-500), transparent 58%),
        radial-gradient(circle at bottom left, var(--o-500), transparent 52%);
}
.glow-cool-b {
    background-image:
        radial-gradient(circle at bottom right, var(--c-500), transparent 58%),
        radial-gradient(circle at top left, var(--o-500), transparent 52%);
}
.step-num { font-family: 'Manrope', sans-serif; font-weight: 800; line-height: .8; user-select: none; color: #F2EDE6; letter-spacing: -0.03em; }
@supports (background-clip: text) or (-webkit-background-clip: text) {
    .step-num-warm {
        background-image: linear-gradient(160deg, var(--o-200), var(--o-100) 55%, rgba(253,246,240,0) 92%);
        -webkit-background-clip: text; background-clip: text; color: transparent;
    }
}
/* ---------------------- ФОТО: КАДР ЦЕЛИКОМ -----------------------------
   Было background-size: cover — браузер растягивал снимок по большей
   стороне и срезал всё, что не влезало: у тягачей уходили кабина и хвост
   трала, техника на платформе обрубалась по краю рамки.
   Стало contain — кадр вписывается в рамку полностью, ничего не режется.
   Побочный эффект contain — пустые поля по краям, когда пропорции рамки
   и снимка не совпадают; их закрывает размытая копия того же кадра
   (.ph::before). Поле не выглядит дырой, а фото остаётся целым. */
.ph {
    position: relative; overflow: hidden;
    background-color: var(--tint-1);
    background-size: cover; background-position: center; background-repeat: no-repeat;
}
.ph::before, .ph::after {
    content: ""; position: absolute; inset: 0;
    background-image: inherit;              /* тот же файл, что у .ph-* */
    background-position: center; background-repeat: no-repeat;
}
.ph::before { background-size: cover; filter: blur(26px) saturate(.85) brightness(.94); transform: scale(1.18); }
.ph::after  { background-size: contain; }   /* сам кадр — поверх подложки */

/* Рамка принимает пропорции снимка (--ar), тогда полей нет вовсе.
   Используется там, где фото стоит отдельным блоком, а не миниатюрой
   в карточке фиксированной высоты. */
.ph-fit { aspect-ratio: var(--ar, 16 / 9); width: 100%; min-height: 0; }

/* Снимок в блоке «фото + текст» (автопарк). На широком экране колонка
   тянется на всю высоту карточки — кадр стоит вертикальным полем у края,
   как в прежней вёрстке, но уже внутри общей рамки с текстом. Подложка тут
   размывается сильнее обычного: полей больше, и она должна читаться как
   мягкий фон, а не как второй, расфокусированный снимок.
   На узком экране колонки складываются, и рамка берёт пропорции кадра —
   пустых полей не остаётся вовсе. */
.split-shot { aspect-ratio: var(--ar, 16 / 10); }
.split-shot::before { filter: blur(38px) saturate(.75) brightness(.92); transform: scale(1.25); }
@media (min-width: 1024px) {
    .split-shot { aspect-ratio: auto; height: 100%; }
}

/* Каждый файл закреплён ровно за одним местом на сайте: один и тот же
   снимок больше нигде не повторяется. Имя класса — это слот, а не файл,
   поэтому картинку можно поменять здесь, не трогая разметку. */
.ph-tral     { background-image: url(images/hero.webp); }              /* главная — низкорамный трал (экскаватор на трале) */
.ph-evak1    { background-image: url(images/evakuator-1.webp); }       /* главная — грузовой эвакуатор */
.ph-manip    { background-image: url(images/manipulyator.webp); }      /* главная — кран-манипулятор */
.ph-evak2    { background-image: url(images/avtopark-2.webp); }        /* автопарк — грузовые эвакуаторы */
.ph-manip2   { background-image: url(images/tral.webp); }              /* автопарк — бортовая машина с КМУ */
.ph-vakansii { background-image: url(images/rabota-tral-tehnika.webp); }  /* окно вакансий — шапка */
.ph-emkosti  { background-image: url(images/rabota-tral-emkosti.webp); }   /* автопарк — тягачи и тралы */
.ph-katok    { background-image: url(images/rabota-tral-jcb-katok.webp); } /* автопарк — дорожная техника */
.ph-gusenica { background-image: url(images/rabota-tral-gusenica.webp); }  /* о нас — большое панно */
/* Свободные заготовки: файлы лежат в images/, но сейчас на страницах не
   показываются. Подставьте нужный url выше, если понадобятся. */
.ph-evak-alt { background-image: url(images/evakuator-2.webp); }
.ph-shpunt   { background-image: url(images/shpunt.webp); }
.ph-arenda   { background-image: url(images/arenda.webp); }

/* ---------------------- ГАЛЕРЕЯ «НАШИ РАБОТЫ» --------------------------
   Реальные снимки с рейсов. Правило то же: кадр виден полностью
   (object-fit: contain), под ним — размытая подложка из того же файла. */
.works-grid { display: grid; grid-template-columns: 1fr; gap: 1.25rem; }
@media (min-width: 768px) {
    .works-grid { grid-template-columns: 1fr 1fr; }
    .works-grid > .work-wide { grid-column: 1 / -1; }
}
.work-card { overflow: hidden; margin: 0; }
.work-shot {
    position: relative; overflow: hidden;
    aspect-ratio: var(--ar, 16 / 9);
    background-color: var(--tint-1);
}
.work-shot::before {
    content: ""; position: absolute; inset: 0;
    background-image: var(--src); background-size: cover; background-position: center;
    filter: blur(26px) saturate(.85) brightness(.94); transform: scale(1.18);
}
.work-shot img {
    position: relative; display: block;
    width: 100%; height: 100%;
    object-fit: contain;                    /* ничего не обрезаем */
}
.work-cap {
    padding: .875rem 1.125rem 1rem;
    border-top: 1px solid var(--line);
    font-size: .8125rem; line-height: 1.6; color: var(--text-mut);
}
.work-cap b { display: block; font-size: .875rem; font-weight: 700; color: var(--text-strong); margin-bottom: .1875rem; }

/* ========================= 5. ФОРМЫ И СПИСКИ ============================
   Обычные поля и кастомный селект вели себя по-разному в фокусе: у селекта
   было мягкое кольцо, у полей только смена цвета рамки. Сводим к одному. */
form input, form textarea, form button { font-family: inherit; }
form input::placeholder, form textarea::placeholder { color: var(--text-soft); }
form input:focus, form textarea:focus { box-shadow: 0 0 0 3px rgba(var(--shadow-rgb), .06); }

.cselect { position: relative; }
.cselect-btn {
    width: 100%; display: flex; align-items: center; justify-content: space-between; gap: .5rem;
    background: #FAF6EC; border: 1px solid var(--line-2); border-radius: var(--r-sm);
    padding: .8125rem 1rem; font-size: .875rem; color: var(--text-body); text-align: left;
    font-family: inherit;
    transition: border-color .2s, background-color .2s, box-shadow .2s;
}
.cselect-btn:hover { border-color: color-mix(in srgb, var(--line-2) 70%, var(--text-mut)); }
.cselect.open .cselect-btn { border-color: var(--text-strong); background: #fff; box-shadow: 0 0 0 3px rgba(var(--shadow-rgb), .06); }
.cselect-chev { width: 1rem; height: 1rem; color: var(--text-soft); flex: none; transition: transform .3s var(--ease); }
.cselect.open .cselect-chev { transform: rotate(180deg); }
/* 16px снаружи минус 6px отступа = 10px у пунктов: углы идут ровно */
.cselect-list {
    position: absolute; z-index: 40; left: 0; right: 0; top: calc(100% + .5rem);
    background: #fff; border: 1px solid var(--line); border-radius: 14px; padding: .375rem;
    box-shadow: 0 18px 40px -18px rgba(var(--shadow-rgb), .32), 0 2px 6px rgba(var(--shadow-rgb), .06);
    max-height: 17rem; overflow: auto;
    scrollbar-width: thin; scrollbar-color: var(--line-2) transparent;
    opacity: 0; visibility: hidden; transform: translateY(-6px); transform-origin: top center;
    transition: opacity .18s ease, transform .22s var(--ease), visibility .22s;
}
.cselect-list::-webkit-scrollbar { width: 6px; }
.cselect-list::-webkit-scrollbar-thumb { background: var(--line-2); border-radius: 999px; }
.cselect.open .cselect-list { opacity: 1; visibility: visible; transform: translateY(0); }
/* Веерный вылет пунктов убран: список раскрывается целиком, без лесенки */
.cselect-list li {
    display: flex; align-items: center; justify-content: space-between; gap: .5rem;
    padding: .625rem .75rem; border-radius: 8px; font-size: .875rem; color: var(--text-body); cursor: pointer;
    transition: background-color .15s, color .15s;
}
.cselect-list li.is-active { background: var(--tint-1); color: var(--text-strong); }
.cselect-list li[aria-selected="true"] { color: var(--text-strong); font-weight: 700; }
.cselect-list li[aria-selected="true"]::after { content: "✓"; color: var(--o-700); font-weight: 700; font-size: .8125rem; }

/* Таблицы характеристик: заголовки капителью, строка светится под курсором */
.card table thead th { font-size: .6875rem; text-transform: uppercase; letter-spacing: .07em; color: var(--text-mut); }
.card table tbody tr { transition: background-color .18s ease; }
.card table tbody tr:hover { background-color: var(--tint-1); }

/* ======================== 6. ПОЯВЛЕНИЕ И МЕНЮ =========================== */
/* Дистанции появления укорочены (было 24 и 56 px): длинный вылет читался
   как эффект ради эффекта. 14/18 px — движение подтверждает загрузку блока. */
.reveal { opacity: 0; transform: translateY(14px); transition: opacity .5s ease, transform .5s var(--ease); }
.reveal.visible { opacity: 1; transform: translateY(0); }
.reveal-up { opacity: 0; transform: translateY(18px); transition: opacity .55s ease, transform .55s var(--ease); }
.reveal-up.visible { opacity: 1; transform: translateY(0); }

@keyframes heroIn { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: translateY(0); } }
.hero-in { opacity: 0; animation: heroIn .55s var(--ease) forwards; }

.nav-dropdown { visibility: hidden; opacity: 0; transform: translateY(8px); transition: opacity .2s ease, transform .28s var(--ease), visibility .28s; }
.group:hover .nav-dropdown,
.group:focus-within .nav-dropdown { visibility: visible; opacity: 1; transform: translateY(0); }
.nav-dropdown a { opacity: 0; transform: translateY(5px); transition: opacity .25s ease, transform .3s var(--ease), background-color .2s; }
.group:hover .nav-dropdown a,
.group:focus-within .nav-dropdown a { opacity: 1; transform: none; }

.m-sub { max-height: 0; overflow: hidden; transition: max-height .32s var(--ease); }
.m-sub-icon { transition: transform .3s var(--ease); }

footer ul a {
    background-image: linear-gradient(currentColor, currentColor);
    background-size: 0% 1px; background-position: 0 100%; background-repeat: no-repeat;
    transition: background-size .3s var(--ease), color .2s ease;
}
footer ul a:hover { background-size: 100% 1px; }
footer h4 { letter-spacing: -0.005em; }

#to-top { transform: scale(.8); transition: opacity .3s ease, transform .35s var(--ease), background-color .2s; }
#to-top:not(.opacity-0) { transform: scale(1); }
#to-top:hover { transform: scale(1.08); }

/* Бегущая лента марок: прокрутка по кругу, дубликат-ряд для бесшовной
   петли, градиентная маска гасит края, пауза при наведении. */
.marquee { overflow: hidden; -webkit-mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent); mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent); }
.marquee-track { display: flex; width: max-content; animation: marquee 34s linear infinite; }
.marquee-track .font-display { letter-spacing: .045em; }
/* Строка идёт непрерывно, даже под курсором — раньше здесь была пауза на hover */
@keyframes marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }
.freight-layer { will-change: transform; }

/* =============================== 7. ТАБЫ ===============================
   Переключатель разделов живёт прямо в шапке, рядом с логотипом (на lg+;
   ниже — выпадающее меню по бургеру, см. #mobile-menu). Активный раздел
   помечает та же «таблетка», что у главной кнопки: на странице ровно один
   такой элемент, и он означает «вы здесь».
   ======================================================================== */
/* «Остров» со скользящей «таблеткой»: тот же приём, что у переключателя
   День/Неделя/Месяц — один сплошной индикатор едет под активным пунктом
   вместо заливки каждой кнопки по отдельности. Ширина и сдвиг индикатора —
   чистая математика из паддинга/зазоров острова, поэтому переживают любую
   ширину контейнера и любую длину текста. */
.tab-island {
    position: relative;
    width: 100%; max-width: 30rem;
    display: flex; align-items: stretch; gap: 4px;
    background: var(--sheet);
    border: 1px solid var(--line);
    border-radius: 9999px;
    padding: 6px;
    box-sizing: border-box;
}
.tab-indicator {
    position: absolute;
    top: 6px; left: 6px;
    width: calc((100% - 12px - 12px) / 4); /* паддинг острова 6*2, 3 зазора по 4px */
    height: calc(100% - 12px);
    border-radius: 9999px;
    background: linear-gradient(155deg, var(--o-300) 0%, var(--o-btn) 48%, var(--o-700) 100%);
    box-shadow: inset 0 1px 0 rgba(255,255,255,.28),
                inset 0 -8px 12px -8px rgba(var(--shadow-brand-rgb), .35),
                0 1px 1px rgba(var(--shadow-rgb), .1),
                0 10px 22px -9px rgba(var(--shadow-brand-rgb), .65);
    transition: transform .4s var(--ease);
    will-change: transform;
    z-index: 1;
}
/* Позиция индикатора определяется тем, у какого пункта стоит
   aria-current="page" — работает без единой строчки JS. */
.tab-island:has(.tab-btn:nth-child(2)[aria-current="page"]) .tab-indicator { transform: translateX(0); }
.tab-island:has(.tab-btn:nth-child(3)[aria-current="page"]) .tab-indicator { transform: translateX(calc(100% + 4px)); }
.tab-island:has(.tab-btn:nth-child(4)[aria-current="page"]) .tab-indicator { transform: translateX(calc(200% + 8px)); }
.tab-island:has(.tab-btn:nth-child(5)[aria-current="page"]) .tab-indicator { transform: translateX(calc(300% + 12px)); }
.tab-btn {
    position: relative; z-index: 2; flex: 1 1 0; min-width: 0;
    display: flex; align-items: center; justify-content: center; text-align: center;
    border-radius: 9999px; padding: .5rem .75rem;
    font-size: .875rem; font-weight: 600; letter-spacing: -0.005em;
    color: var(--text-mut); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    cursor: pointer;
    transition: color .25s ease, transform .12s ease;
}
.tab-btn:hover { color: var(--text-body); }
.tab-btn:active { transform: scale(.95); }
.tab-btn:focus-visible { outline: 2px solid var(--o-btn); outline-offset: 2px; }
/* Активный раздел — «вы здесь»: белый текст поверх скользящей заливки
   индикатора вместо собственного фона у кнопки. */
.tab-btn[aria-current="page"] { color: #fff; cursor: default; }
.tab-btn[aria-current="page"]:hover { color: #fff; }
.tabpanel[hidden] { display: none; }
.tabpanel > section:first-child { margin-top: 2rem; }
.tabpanel > section#hero:first-child { margin-top: 0; }
@keyframes panelIn { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: none; } }
.tabpanel.is-entering { animation: panelIn .45s var(--ease) both; }

/* ── МИКРОАНИМАЦИЯ ПЕРЕКЛЮЧЕНИЯ РАЗДЕЛОВ ────────────────────────────────
   Раньше здесь стоял @view-transition { navigation: auto } для кросс-фейда
   между страницами. Убрано: когда высота уходящей и приходящей страницы
   отличается (а у «Услуг» она сильно другая), браузер масштабирует
   снимок старой страницы под новую вёрстку — это и читалось как «экран
   увеличивается». Вместо кросс-документного перехода оставлена только
   локальная анимация самого индикатора активного раздела при загрузке. */
@media (prefers-reduced-motion: no-preference) {
    .tab-indicator { animation: tabHere .3s var(--ease); }
    @keyframes tabHere { from { opacity: .6; } to { opacity: 1; } }
}
/* ============ 8. ПРИВЯЗКА К РАЗМЕТКЕ · ДОСТУПНОСТЬ ======================
   Секции, размеченные как .panel-dark, переопределяются в «чертёж»
   и «тёплую панель» без правок в разметке. Приём с --c-300: в HTML есть
   инлайновые style="color:var(--c-300)". Инлайн-стиль не перебить
   специфичностью, но саму переменную переопределить можно.
   ======================================================================== */
#fleet-modes .panel-dark,
#shpunt .panel-dark {
    background: var(--sheet);
    border: 1px solid var(--line);
    box-shadow: 0 1px 2px rgba(var(--shadow-rgb), .04), 0 18px 40px -32px rgba(var(--shadow-rgb), .22);
    --c-300: #005F73;
}
/* Два мягких акцентных пятна на светлой панели (точечная сетка убрана по просьбе) */
#fleet-modes .cargo-grid,
#shpunt .cargo-grid {
    background-image:
        radial-gradient(58% 76% at 90% 8%, color-mix(in srgb, var(--c-500) 7%, transparent), transparent 62%),
        radial-gradient(56% 70% at 5% 95%, color-mix(in srgb, var(--o-600) 9%, transparent), transparent 60%);
}
#fleet-modes .text-white,     #shpunt .text-white     { color: var(--text-strong); }
#fleet-modes .text-slate-400, #shpunt .text-slate-400 { color: var(--text-mut); }
#shpunt .text-slate-300 { color: var(--text-body); }
#fleet-modes .eyebrow-sky,    #shpunt .eyebrow-sky    { color: var(--text-mut); }
#fleet-modes .eyebrow-sky::before,
#shpunt .eyebrow-sky::before { background-color: var(--c-700); }

#shpunt details.acc-dark { background: #fff; border-color: var(--line); }
#shpunt details.acc-dark.is-open { background: #FFFDFA; border-color: var(--line-warm); }
#shpunt details.acc-dark > summary:hover { background: var(--tint-1); }
#shpunt details.acc-dark .acc-plus { border-color: var(--line-2); color: var(--text-mut); }
#shpunt details.acc-dark > summary:hover .acc-plus { border-color: var(--tint-3); color: var(--o-700); }
#shpunt details.acc-dark.is-open .acc-plus { background: var(--tint-2); border-color: transparent; color: var(--o-700); }
#shpunt .acc-body li::marker { color: var(--line-2); }

#about .panel-dark {
    background: var(--o-50);
    border: 1px solid var(--line-warm);
    box-shadow: 0 1px 2px rgba(var(--shadow-brand-rgb), .04), 0 18px 40px -32px rgba(var(--shadow-brand-rgb), .2);
    --c-300: #005F73;
}
#about .glow-cool { background-image: radial-gradient(circle at top right, var(--o-200), transparent 62%); }
#about .text-white { color: var(--text-strong); }
#about .text-slate-300 { color: var(--text-body); }
#about .eyebrow-light { color: #93693A; }
#about .eyebrow-light::before { background-color: var(--o-600); }

@media (prefers-reduced-motion: reduce) {
    details.acc, .acc-body, .acc-body > *, .acc-body > *::before, .acc-plus,
    .cselect-list, .cselect-list li, .nav-dropdown, .nav-dropdown a,
    .stat-rule, details.acc::before, footer ul a, #to-top, .svc-icon, .btn,
    .tab-btn, .tab-indicator, .card table tbody tr,
    .btn-primary::after, .btn-ink::after, .btn-outline::after { transition: none; }
    .btn-primary:hover::after, .btn-ink:hover::after,
    .btn-primary:focus-visible::after, .btn-ink:focus-visible::after { animation: none; }
    .btn-outline:hover::after, .btn-outline:focus-visible::after { transform: scaleX(1); }
    .reveal, .reveal-up { opacity: 1 !important; transform: none !important; transition: none; }
    .hero-in { animation: none; opacity: 1; }
    .marquee-track { animation: none; }
    .freight-layer { transform: none !important; }
    #hero .animate-pulse { animation: none; }
    .stat-rule { transform: none; }
    .acc-body > *::before, details.acc.is-open::before { transform: none; }
    .btn:hover, .card-hover:hover, #to-top:hover, .group:hover .svc-icon { transform: none; }
    .tabpanel.is-entering { animation: none; }
    .tab-indicator { animation: none; }
}

/* ==================== 9. ЗАГРУЗОЧНОЕ ОКНО (ПРЕЛОАДЕР) ===================
   Полноэкранный оверлей с грузовиком. Разметка одинакова на всех страницах
   (первым элементом <body>), поэтому окно перекрывает контент с первого
   кадра — без «мигания». Прячется из atp3.js по событию load. Все селекторы
   вложены в #site-loader, чтобы не пересекаться с классами сайта. */
#site-loader {
    position: fixed;
    inset: 0;
    z-index: 9999;
    display: flex;
    align-items: center;
    justify-content: center;
    background: #fff;              /* белый обязателен: по нему «бегут» белые штрихи дороги */
    transition: opacity .28s ease, visibility .28s ease;
}
#site-loader.is-hidden { opacity: 0; visibility: hidden; pointer-events: none; }

#site-loader .loader { width: fit-content; height: fit-content; display: flex; align-items: center; justify-content: center; }
#site-loader .truckWrapper { width: 200px; height: 100px; display: flex; flex-direction: column; position: relative; align-items: center; justify-content: flex-end; overflow-x: hidden; }
#site-loader .truckBody { width: 130px; height: fit-content; margin-bottom: 6px; animation: truckMotion 1s linear infinite; }
@keyframes truckMotion { 0% { transform: translateY(0); } 50% { transform: translateY(3px); } 100% { transform: translateY(0); } }
#site-loader .truckTires { width: 108px; height: fit-content; display: flex; align-items: center; justify-content: space-between; padding: 0 10px 0 15px; position: absolute; bottom: 0; }
#site-loader .truckTires svg { width: 24px; }
#site-loader .truckTires svg:first-child { margin-left: -10px; }
#site-loader .truckTires svg:last-child { margin-right: -11px; }
#site-loader .road { width: 100%; height: 1.5px; background-color: #282828; position: relative; bottom: 0; align-self: flex-end; border-radius: 3px; }
#site-loader .road::before { content: ""; position: absolute; width: 20px; height: 100%; background-color: #282828; right: -50%; border-radius: 3px; animation: truckRoad 1.4s linear infinite; border-left: 10px solid #fff; }
#site-loader .road::after { content: ""; position: absolute; width: 10px; height: 100%; background-color: #282828; right: -65%; border-radius: 3px; animation: truckRoad 1.4s linear infinite; border-left: 4px solid #fff; }
#site-loader .lampPost { position: absolute; bottom: 0; right: -90%; height: 90px; animation: truckRoad 1.4s linear infinite; }
@keyframes truckRoad { 0% { transform: translateX(0); } 100% { transform: translateX(-350px); } }

/* Уважаем «уменьшенное движение»: грузовик замирает, окно просто гаснет */
@media (prefers-reduced-motion: reduce) {
    #site-loader .truckBody,
    #site-loader .road::before,
    #site-loader .road::after,
    #site-loader .lampPost { animation: none; }
}

/* ==================== 10. СТРАНИЦА 404 · СХЕМА МАРШРУТА =================
   Мини-иллюстрация развилки вместо голого числа: пройденный путь на 210px
   раздваивается — верная дорога гаснет пунктиром и приводит к домику
   («туда, где нужно было»), короткий поворот приводит к текущей точке —
   странице-404. Наглядно поддерживает подпись «машина свернула не туда»
   без буквального рисунка машины. Цвета берутся из общих токенов, поэтому
   иллюстрация не требует отдельной перекраски при смене палитры. */
.route-map { display: block; width: 100%; max-width: 27rem; height: auto; margin-inline: auto; overflow: visible; }
.route-pin-ring { transform-origin: 462px 60px; animation: routePing 2.2s ease-out infinite; }
@keyframes routePing {
    0%   { transform: scale(.6); opacity: .55; }
    70%  { transform: scale(1.9); opacity: 0; }
    100% { transform: scale(1.9); opacity: 0; }
}
.route-label { font-family: 'IBM Plex Mono', monospace; font-size: 11px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; fill: var(--o-600); }
@media (prefers-reduced-motion: reduce) {
    .route-pin-ring { animation: none; opacity: 0; }
}

/* ── Карточки услуг: один графитовый тон знака на все шесть ─────────────
   .svc-card задаёт --a (цвет ссылки «Подробнее») единым оранжевым, а сам
   знак берёт --icon-mono. Инлайновые style="--a: …" в разметке сняты. */
.svc-card { --a: var(--o-700); }
.svc-card .svc-icon {
    width: 3.25rem; height: 3.25rem; border-radius: var(--r-md);
    background: linear-gradient(150deg, var(--o-50) 0%, color-mix(in srgb, var(--o-300) 26%, #fff) 100%);
    border-color: color-mix(in srgb, var(--o-500) 22%, transparent);
    color: var(--icon-mono);
    box-shadow: inset 0 1px 0 #fff, 0 1px 2px rgba(var(--shadow-brand-rgb), .06);
}
.svc-card .svc-icon svg { width: 1.75rem; height: 1.75rem; }
.svc-card:hover .svc-icon {
    background: linear-gradient(150deg, var(--o-100) 0%, color-mix(in srgb, var(--o-400) 26%, #fff) 100%);
    border-color: color-mix(in srgb, var(--o-500) 38%, transparent);
}
/* Строка фактов вместо некликабельных «кнопок»-чипов в шапке услуг */
.hero-facts { display: flex; flex-wrap: wrap; gap: 0 2.25rem; }
.hero-facts > div { padding-right: 2.25rem; border-right: 1px solid var(--line-2); }
.hero-facts > div:last-child { border-right: 0; padding-right: 0; }
.hero-facts dt { font-family: 'Manrope','Inter',sans-serif; font-weight: 800; font-size: 1.5rem; letter-spacing: -0.02em; color: var(--text-strong); }
.hero-facts dd { margin: .25rem 0 0; font-size: .75rem; font-weight: 600; text-transform: uppercase; letter-spacing: .07em; color: var(--text-mut); }
@media (max-width: 640px) { .hero-facts { gap: 0 1.25rem; } .hero-facts > div { padding-right: 1.25rem; } }
