/* Дополнения к теме: всё, чего в build/css/style.css нет или что она делает
   неверно для наших страниц. Грузится ПОСЛЕ темы (см. master.blade.php),
   поэтому перебивает её правила без !important.

   Раньше файл назывался classifieds-cards.css, но давно вышел за карточки:
   здесь и фильтры, и кабинет, и модалки. Имя приведено к содержимому. */

/* ===== Раскладка карточек =====

   Два режима, и это не дублирование.

   Плотная кладка (главная) — карточки подогнаны вплотную, высоту каждой
   считает home-masonry.js и кладёт в --row-span. Работает ТОЛЬКО там, где
   скрипт подключён: он ищет контейнеры по data-vip-cards / data-feed-cards.

   Обычная сетка (все прочие списки) — высоту считает сам браузер, ряд
   выравнивается по самой высокой карточке. Раньше сюда тоже попадали правила
   плотной кладки, и без скрипта каждая карточка получала запасные 400px:
   высокие наезжали на соседей снизу, низкие оставляли провалы (GT-497). */
.dealer-tabs__cards:not(.row-view) {
    -webkit-column-count: initial; -moz-column-count: initial; column-count: initial;
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    column-gap: 8px;
    align-items: start;
}

/* minmax(0, 1fr), а не 1fr. У 1fr автоминимум трека равен min-content элемента:
   одна карточка с длинным словом, неразрывной ценой или картинкой раздувает
   свою колонку, остальные три ужимаются, сумма перестаёт влезать — грид едет
   за контейнер. С нулевым минимумом колонки всегда равны.

   min-width: 0 обязателен вдобавок: minmax снимает автоминимум с ТРЕКА, но у
   самой карточки width: 100% из темы и min-width: auto по умолчанию — без
   сброса она вылезет за ужатую колонку и наедет на соседнюю.
   Селектор не > *: карточки ленты завёрнуты в .feed-chunk (display: contents),
   то есть лежат на два уровня глубже, чем прямой ребёнок. */
.dealer-tabs__cards:not(.row-view) .dealer-card,
.dealer-tabs__cards:not(.row-view) .feed-loadmore { min-width: 0; }

/* Плотная кладка — только под присмотром скрипта. Высота строки и span нужны
   вместе: мелкая строка делает высоту карточки настраиваемой почти точно.

   Шаг строки задаёт home-masonry.js в --row-step (GT-549). Жёсткий 1px
   упирался в потолок движка: браузер не создаёт больше 10000 строк грида,
   а карточка при строке в пиксель съедает почти 400. На шестидесятой карточке
   (два нажатия «Load more») лента переставала расти, контейнер замирал
   на 9999px, а остальные карточки вываливались поверх подвала — вместе
   с кнопкой подгрузки.

   Значения по умолчанию оставлены прежними намеренно: 1px и span 400 — это
   ровно доправочное поведение. Поэтому скрипт можно откатить в одиночку,
   не трогая этот файл: без --row-step раскладка вернётся к прежней.

   align-items: start (выше) обязателен. По умолчанию грид растягивает элемент
   на всю выделенную область, и тогда home-masonry.js меряет не содержимое
   карточки, а высоту ячейки, которую сам же назначил прошлым прогоном:
   400 → 408 → 416… Карточки расползаются, между ними растут пустоты. */
[data-vip-cards]:not(.row-view),
[data-feed-cards]:not(.row-view) {
    grid-auto-rows: var(--row-step, 1px);
}
@media (max-width: 1150px) { .dealer-tabs__cards:not(.row-view) { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 850px)  { .dealer-tabs__cards:not(.row-view) { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 650px)  { .dealer-tabs__cards:not(.row-view) { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 12px; } }
[data-vip-cards]:not(.row-view) .dealer-card,
[data-vip-cards]:not(.row-view) .feed-loadmore,
[data-feed-cards]:not(.row-view) .dealer-card,
[data-feed-cards]:not(.row-view) .feed-loadmore { grid-row-end: span var(--row-span, 400); }
/* Кнопка «Load more» тянется на всю ширину внизу ленты */
.dealer-tabs__cards:not(.row-view) .feed-loadmore { grid-column: 1 / -1; }

/* Цена — одним куском. Разделитель тысяч это обычный пробел, и в узкой
   колонке «4 157 AZN» ломается на «4» и «157 AZN». */
.dealer-card__price { white-space: nowrap; }

/* ===== Счётчик в заголовке страницы (GT-552) =====
   Та же болезнь, что у цены строкой выше, и лечится тем же: разделитель тысяч
   в number_format — обычный пробел, а по нему браузер переносит строку.

   Тема делает .sale-top__title флексом с gap. Счётчик оказывается вторым
   флекс-элементом: при длинном названии ему достаётся узкая полоска справа,
   он сжимается до min-content и рвётся по разделителю — «(9» на одной строке,
   «890)» на другой.

   Обычный текст вместо флекса: счётчик становится инлайновым, встаёт сразу
   после названия и переносится вместе с ним, а не отдельным столбиком у края.
   Базовую линию инлайн держит сам, поэтому align-items: baseline из темы
   больше не нужен, а gap заменяем отступом слева.

   Чинит сразу две страницы: категорию — «(9 890)» и поиск — «Tapıldı: 18 334».

   .detail исключён намеренно: на странице объявления внутри того же заголовка
   лежит плашка состояния («İkinci əl»), у неё своя раскладка и свой display
   из темы — запрет переноса и отступ ей не нужны. */
.sale-top:not(.detail) .sale-top__title { display: block; }
.sale-top:not(.detail) .sale-top__title > span {
    white-space: nowrap;
    margin-left: clamp(12px, 1.2698vw, 16px);
}

/* ===== Галерея карточки (перенесено из ads-card @once) =====

   height: auto у КАЖДОГО варианта — не копипаста, а необходимость.

   Тема задаёт галерее жёсткую высоту в vw (252 / 302 / 352px по вариантам), а
   aspect-ratio браузер учитывает только когда одна из сторон auto. Пока высота
   определённая, все пропорции ниже — мёртвый код: в ряду оказывались 213px
   (.small, единственный вариант, которому тема сама поставила height: auto) и
   352px (.big) — разброс в 1,65x, это и есть «крошечная карточка».
   Хуже: vw меряется от окна, а .small — от ширины колонки, поэтому на разных
   ширинах порядок вариантов по высоте переворачивался.

   Базовым правилом варианты не сбросить: у темы селектор .dealer-card.<вариант>
   .dealer-card__gallery — специфичность (0,3,0) против (0,1,0). Наши селекторы
   повторяют её и побеждают только порядком подключения (classifieds.css после
   style.css), поэтому height: auto нужен в каждой строке.

   Итог: высота всегда считается от ширины колонки, разброс 1,0w..1,33w. */
.dealer-card__gallery { position: relative; overflow: hidden; height: auto; aspect-ratio: 4 / 5; }
.dealer-card.big    .dealer-card__gallery { height: auto; aspect-ratio: 3 / 4; }
.dealer-card.medium .dealer-card__gallery { height: auto; aspect-ratio: 4 / 5; }
.dealer-card.small  .dealer-card__gallery { height: auto; aspect-ratio: 1 / 1; }
.dealer-card__gallery picture { display: block; width: 100%; height: 100%; }
.dealer-card__gallery img { display: block; width: 100%; height: 100%; object-fit: cover; object-position: center; }

/* ===== Кнопка «в избранное» (перенесено из _dealer-card-favorite-styles @once) ===== */
.dealer-card__gallery .object-slider__like { position: absolute; top: 8px; right: 8px; z-index: 5; width: 32px; height: 32px; border: 0; border-radius: 8px; background: rgba(0, 0, 0, .3); display: flex; align-items: center; justify-content: center; cursor: pointer; transition: background .2s; }
.dealer-card__gallery .object-slider__like:hover { background: rgba(0, 0, 0, .5); }
.dealer-card__gallery .object-slider__like .sprite { width: 24px; height: 24px; color: #fff; display: inline-flex; }
.dealer-card__gallery .object-slider__like .sprite svg { width: 100%; height: auto; transition: .3s; }
.dealer-card__gallery .object-slider__like[disabled] { opacity: .5; cursor: not-allowed; }

/* ===== Спиннер «Load more» (@keyframes не было в теме → спиннер не крутился) ===== */
@keyframes spin { to { transform: rotate(360deg); } }

/* ===== «Load more» чанк ленты (вынос инлайна из listing-feed-chunk) ===== */
.feed-chunk { display: contents; }
.feed-loadmore { display: flex; justify-content: center; padding: 40px 0; width: 100%; }
.feed-loadmore__btn { min-width: 200px; display: inline-flex; justify-content: center; align-items: center; gap: 8px; }
.feed-loadmore__spinner { display: flex; align-items: center; gap: 8px; }
.feed-loadmore__spinner-icon { animation: spin 1s linear infinite; }

/* ===== Пометка «снято» (витрины продавца и компании, вкладка «Закрытые») =====
   Тема даёт только .dealer-card__label с синим и зелёным вариантом — серого для
   снятых нет, поэтому плашка своя. Позиционируется от .dealer-card__gallery,
   у которой position: relative уже задан выше. */
.dealer-card__closed {
    position: absolute; top: 8px; left: 8px; z-index: 5;
    padding: 6px 10px; border-radius: 8px;
    background: rgba(0, 0, 0, .65); color: #fff;
    font-family: var(--font-family);
    font-size: 12px; font-weight: 500; line-height: 16px; letter-spacing: .5px;
}
/* Приглушаем фото — по ТЗ снятые «лучше затемнять». Текст не трогаем: заголовок
   и цена должны оставаться читаемыми, карточка ведь кликабельна. */
.dealer-card.is-closed .dealer-card__gallery img { opacity: .5; }

/* ===== Остаток срока (кабинет владельца) =====
   Оранжевый — когда осталось не больше трёх дней, то есть ровно с того момента,
   когда владельцу уходит письмо-напоминание: интерфейс и почта говорят одно и то же. */
.dealer-card__expiry {
    margin-top: 8px;
    font-family: var(--font-family);
    font-size: 12px; font-weight: 500; line-height: 16px;
    color: rgba(0, 0, 0, .5);
}
.dealer-card__expiry.soon { color: #e07000; }

/* ===== Состояние объявления (кабинет владельца) =====
   Стоит на том же месте и в том же наборе, что остаток срока: внизу карточки
   всегда одна строка, и она отвечает на вопрос «что с объявлением».

   Раскраска по смыслу, а не по палитре админки: оранжевый — ждём модератора,
   красный — нужно действие владельца, серый — штатное завершение. */
.dealer-card__status {
    margin-top: 8px;
    font-family: var(--font-family);
    font-size: 12px; font-weight: 500; line-height: 16px;
    color: rgba(0, 0, 0, .5);
}
.dealer-card__status.warn { color: #e07000; }
.dealer-card__status.bad  { color: rgba(var(--cl-j), 1); }

/* ===== Счётчики у значений фильтров (ТЗ стр. 12, «Apple (154)») =====
   Само число стилей не требует: тема уже красит <b> внутри подписи чекбокса
   приглушённым. Свой span сюда ставить нельзя — правило
   `.custom-checkbox span::before` пририсует ему второй квадратик. */
/* Вариант, под который сейчас нет ни одного объявления. Не прячем: список
   фильтров не должен прыгать при каждом клике — человек теряет глазами то,
   что искал. Приглушаем и выключаем: видно, что вариант есть, но пуст. */
.custom-checkbox.is-empty { opacity: .45; }
.custom-checkbox.is-empty .custom-checkbox__field { pointer-events: none; }
/* Курсор тоже должен говорить «нельзя». Тема ставит pointer и на подпись,
   и на сам квадратик (`.custom-checkbox span` и его ::before), поэтому
   перебиваем оба — иначе рука обещает клик, которого не случится.
   not-allowed, а не обычная стрелка: стрелка читалась бы как «это просто
   текст», а тут вариант есть, просто сейчас недоступен. */
.custom-checkbox.is-empty span,
.custom-checkbox.is-empty span::before {
    cursor: not-allowed;
}

/* ===== Быстрые фильтры под заголовком категории (ТЗ стр. 10) =====
   Разметку берём у чипов подкатегорий, а вид делаем свой: там ссылки-строки,
   растянутые по сетке в шесть колонок, а здесь нужны компактные кнопки по
   размеру содержимого. Отдельный модификатор — чтобы не задеть подкатегории,
   которые выше и должны остаться как были. */
/* Подложка досталась от блока подкатегорий, где она уместна: там большой
   список ссылок отдельным блоком страницы. Ряду кнопок она не нужна — две
   серые полосы одна под другой только утяжеляют экран. */
.sale-nav--quick {
    background: none;
    padding: 0;
    margin-bottom: 12px;
}

.sale-nav--quick .sale-nav__list {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}
/* Тема прячет всё после двенадцатого элемента — рассчитано на длинный список
   подкатегорий. Здесь значений и так не больше десяти, а скрытый хвост читался
   бы как обрыв. */
.sale-nav--quick .sale-nav__item { display: block; }

.sale-nav--quick .sale-nav__link {
    height: auto;
    padding: 6px 12px;
    gap: 6px;
    font-size: 14px;
    line-height: 20px;
    border: 1px solid var(--br-c);
    border-radius: 8px;
    background: rgba(var(--bg-a), 1);
}
.sale-nav--quick .sale-nav__link:hover {
    background: rgba(var(--bg-a), 1);
    border-color: rgba(var(--cl-c), 1);
    color: rgba(var(--cl-c), 1);
}
/* Значение выбрано. Заливка, а не только рамка: среди десятка кнопок рамку
   легко проглядеть, а по ряду должно быть сразу видно, что уже нажато. */
.sale-nav--quick .sale-nav__link.is-active {
    background: rgba(var(--cl-c), 1);
    border-color: rgba(var(--cl-c), 1);
    color: rgba(var(--cl-a), 1);
}

/* ===== Кабинет: состояние активного поиска =====
   Поиск идёт по всем статусам, поэтому вкладки на это время не работают.
   Показываем их приглушёнными, а не прячем: иначе список раздела внезапно
   исчезает с экрана и непонятно, куда он делся. */
.dealer-tabs__nav .dealer-tabs__btn.is-muted { opacity: .45; cursor: default; }

.cabinet-search-note {
    margin: 12px 0 4px;
    font-size: 14px;
    color: rgba(var(--cl-d), 1);
}
.cabinet-search-note a {
    margin-left: 8px;
    color: rgba(var(--cl-c), 1);
    text-decoration: underline;
}

/* ===== Пустой список (нет объявлений / ничего не найдено) =====
   В теме этот блок не оформлен вовсе — идёт голым текстом вплотную к кнопке.
   Задаём сами: крупнее, темнее, с воздухом до кнопки. */
.dealer-tabs__empty {
    /* Блок лежит внутри сетки карточек и по умолчанию занимает одну колонку
       из четырёх — текст переносился, хотя справа было пусто. */
    grid-column: 1 / -1;
    padding: 32px 0 40px;
}
.dealer-tabs__empty p {
    margin-bottom: 24px;
    font-size: 18px;
    font-weight: 600;
    line-height: 1.4;
    color: rgba(var(--cl-f), 1);
}
.dealer-tabs__empty .main-btn {
    display: inline-flex;
}

/* ===== Галочки в «Советах перед публикацией» =====
   Галочка щёлкает и загорается, от неё вниз тянется луч к следующей. Один
   проход за загрузку страницы, циклов нет.

   Галочка у темы — фоновая картинка, и цвет зашит внутрь неё: перекрасить
   свойством нельзя, поэтому оранжевая версия — вторая картинка.

   Всё оформление списка приходится повторять: правило темы работает только
   для списков без класса, а класс мы добавили. */

@keyframes tipPop {
    0%   { transform: scale(.7); }
    55%  { transform: scale(1.35); }
    100% { transform: scale(1); }
}

.tips-anim { display: flex; flex-direction: column; gap: 8px; }

.tips-anim li {
    position: relative;
    display: flex; gap: 8px;
    color: rgba(var(--cl-b), .95);
    font-family: var(--font-family);
    font-size: 16px; line-height: 24px;
}

.tips-anim li::before {
    content: '';
    width: 13px; height: 13px; margin-top: 6.5px; align-self: start;
    flex: 0 0 13px;
    background-repeat: no-repeat; background-position: center;
    /* Картинка 14x14 в блоке 13x13: без указания размера браузер обрезает
       по пикселю справа и снизу, и круг выглядит сплюснутым. */
    background-size: contain;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' fill='none' viewBox='0 0 14 14'%3E%3Cpath fill='%23d9d5d4' d='m6.066 10.066 4.7-4.7-.933-.933L6.066 8.2l-1.9-1.9-.933.933zm.934 3.6a6.5 6.5 0 0 1-2.6-.525 6.7 6.7 0 0 1-2.117-1.425A6.7 6.7 0 0 1 .858 9.6 6.5 6.5 0 0 1 .333 7q0-1.385.525-2.6a6.7 6.7 0 0 1 1.425-2.117q.9-.9 2.117-1.425A6.5 6.5 0 0 1 7 .333q1.383 0 2.6.525 1.216.525 2.116 1.425T13.141 4.4q.525 1.215.525 2.6 0 1.383-.525 2.6a6.7 6.7 0 0 1-1.425 2.116q-.9.9-2.116 1.425a6.5 6.5 0 0 1-2.6.525'/%3E%3C/svg%3E");
    opacity: .4;
    transform: scale(.7);
    transition: opacity .3s;
}

/* Зажжённая: оранжевая картинка плюс подскок. Подскок совмещён с зажиганием —
   это отклик на событие. Отдельно «до» читался бы как предупреждение,
   «после» — как сбой. */
.tips-anim li.is-lit::before {
    opacity: 1;
    animation: tipPop .55s ease-out forwards;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' fill='none' viewBox='0 0 14 14'%3E%3Cpath fill='%23F1582E' d='m6.066 10.066 4.7-4.7-.933-.933L6.066 8.2l-1.9-1.9-.933.933zm.934 3.6a6.5 6.5 0 0 1-2.6-.525 6.7 6.7 0 0 1-2.117-1.425A6.7 6.7 0 0 1 .858 9.6 6.5 6.5 0 0 1 .333 7q0-1.385.525-2.6a6.7 6.7 0 0 1 1.425-2.117q.9-.9 2.117-1.425A6.5 6.5 0 0 1 7 .333q1.383 0 2.6.525 1.216.525 2.116 1.425T13.141 4.4q.525 1.215.525 2.6 0 1.383-.525 2.6a6.7 6.7 0 0 1-1.425 2.116q-.9.9-2.116 1.425a6.5 6.5 0 0 1-2.6.525'/%3E%3C/svg%3E");
}

/* Луч к следующему пункту. Подложки нет намеренно: линия тянется по пустому
   месту — это читается как прокладывание пути, а не как заполнение готовой
   полоски, которое выглядит индикатором загрузки.

   Границы впритык к галочкам: сверху — сразу под текущей (отступ 6.5 + высота
   13), снизу — до верха следующей, а это зазор списка (8) плюс её собственный
   отступ сверху (6.5). */
.tips-anim li:not(:last-child)::after {
    content: '';
    position: absolute;
    left: 6px;
    top: 19.5px;
    bottom: -14.5px;
    width: 2px;
    border-radius: 2px;
    background: rgba(var(--cl-c), .55);
    transform: scaleY(0);
    transform-origin: top;
    transition: transform 1.2s ease-in-out;
}
.tips-anim li.is-flowing::after { transform: scaleY(1); }

/* Уважаем системную настройку «поменьше движения»: для людей с чувствительностью
   к анимации это источник реального дискомфорта, а не придирка. Галочки при
   этом всё равно зажигаются — просто мгновенно. */
@media (prefers-reduced-motion: reduce) {
    .tips-anim li::before { animation: none !important; transition: none !important; opacity: 1; transform: none; }
    .tips-anim li::after  { transition: none !important; }
}

/* ===== Кнопка в шапке секции (страница-хаб) =====

   Тема под модификатором .mode готовит кнопку к мобильной раскладке: снимает
   рамку, растягивает на всю ширину, держит min-width 240px и центрирует в гриде.
   Плюс сам .main-btn задаёт жёсткую height: 46px при padding 14px и строке
   в 24px — содержимое выше коробки, и верх подрезается.

   Здесь кнопка стоит в строке заголовка и должна быть по размеру текста,
   поэтому гасим оба набора правил. Точечно, своим классом: .mode используется
   ещё в формах и мобильных блоках, там поведение темы верное. */
.listing-section__link.main-btn {
    width: fit-content;
    min-width: 0;
    height: auto;
    min-height: 46px;
    padding: 10px 20px;
    white-space: nowrap;
    grid-column: auto;
    justify-self: end;
    flex: 0 0 auto;
}
.listing-section__link.main-btn--transparent { border: 1px solid var(--br-c); }

/* ===== Декоративная плашка секции — отключена =====

   Тема рисует поверх .dealer-section белый градиент .dealer-section::before
   («затухание» первого экрана). Его положение считается как
   top: calc(100vh - var(--dealers-section-offset)), а эту переменную в исходной
   теме выставлял её скрипт. В проекте её не задаёт никто — ни CSS, ни JS.

   Что происходит без переменной: calc становится невалидным, браузер целиком
   отбрасывает объявление top, элемент встаёт на статическую позицию (верх
   секции), а transform: translateY(-98%) поднимает его ещё выше. Нижняя, самая
   белая часть градиента с z-index: 3 ложится на верх содержимого — на главной
   она закрашивала верхнюю рамку формы поиска, и это выглядело как обрезанный
   блок, хотя overflow тут ни при чём.

   Плашка сломана одинаково на всех пятнадцати страницах с этим классом, просто
   заметна только под светлой рамкой. Эффект не задумывался — гасим целиком. */
.dealer-section::before { content: none; }

/* ===== Порядок блоков на узких экранах =====

   Блок отзывов на ≤1024px переносит СКРИПТ ТЕМЫ, а не раскладка. В main.js:

       const move = (block, aside, content, bp, whenNarrow, whenWide) => {
           const w = document.documentElement.clientWidth;
           if (w <= bp) content.insertAdjacentElement(whenNarrow, block); // afterbegin
           if (w >  bp) aside.insertAdjacentElement(whenWide,   block);   // beforeend
       };

   То есть на узком экране .dealer-aside__content физически вынимается из
   сайдбара и вставляется ПЕРВЫМ элементом в .dealer-tabs__content, а на
   широком возвращается в конец сайдбара. Отзывы наверху — задумка темы,
   просто вставка идёт afterbegin вместо beforeend.

   Со скриптом не воюем: пусть кладёт куда кладёт, а мы переставляем
   результат. Для этого .dealer-tabs__content делаем флекс-колонкой — сам по
   себе он обычный блок, и order в нём бессилен.

   На витринах .dealer-tabs__content это <ul> с панелями вкладок, но видима
   всегда ровно одна (остальные display: none), поэтому флекс их раскладку
   не меняет.

   Крючок --secondary ставит сам виджет (widgets/review-list): после переезда
   отличить блок от соседей больше нечем — обёртку data-tab-content="3",
   в которой он лежал на витринах, скрипт оставляет в сайдбаре пустой. */
@media (max-width: 1024px) {
    /* contents, а не flex+column. Своей флекс-колонкой .dealer-tabs__content
       переставлял блоки только ВНУТРИ себя, а пагинация лежит СНАРУЖИ — рядом
       с ним в .dealer-tabs. Отзывы уходили в конец контейнера, и пагинация
       оказывалась под ними, оторванной от списка объявлений.

       Растворяем контейнер: карточки и отзывы становятся элементами внешней
       колонки .dealer-tabs (она уже flex-column с gap: 24px), где лежит и
       пагинация. Теперь все трое сравниваются одним order, и порядок выходит
       фильтры → объявления → пагинация → отзывы.

       Работает независимо от того, где пагинация в разметке: на «Избранном»
       она внутри контейнера, на остальных страницах снаружи — результат
       одинаковый. */
    .dealer-tabs__content { display: contents; }
    .dealer-tabs__content > .dealer-aside__content--secondary { order: 3; }

    /* Главная — отдельный случай. Скрипт темы отзывы тут не переносит: ему нужен
       .dealer-tabs__content, а на главной .dealer-tabs содержит __top и __cards
       напрямую. Условие if (dealerParentMob) не проходит, блок так и остаётся
       в <aside> — то есть первым грид-элементом колонки, над лентой.

       Переставляем сам aside, а не отзывы внутри него: на главной в нём только
       список категорий и отзывы, а список на ≤1024px уходит в position: fixed
       и места в потоке не занимает. Двигать больше нечего.

       Модификатор обязателен. Без него правило поймало бы витрину объявления,
       витрину компании и кабинет, где в той же колонке лежат кнопки связи
       с продавцом и навигация — увести их под ленту нельзя. */
    .dealer-section__content--feed-first > .dealer-aside { order: 2; }
    .dealer-section__content--feed-first > .dealer-tabs  { order: 1; }
}

/* ===== Строка фильтров кабинета на узких экранах =====

   На ≤768px тема делает .dealer-tabs__top гридом «1fr auto»: слева селекты,
   справа переключатель вида, форма поиска отдельной строкой на всю ширину
   (grid-column: 1/-1).

   1fr — это minmax(auto, 1fr), а автоминимум трека равен min-content его
   содержимого. В первом треке лежит .dealer-tabs__selects — флекс из двух
   селектов, которые сжиматься не умеют: у флекс-элементов min-width по
   умолчанию auto. Значит минимум трека равен полной ширине обеих подписей
   («Bütün kateqoriyalar» + «Əvvəlcə yeni»).

   Трек распирало, и получалось два симптома с одним корнем: переключатель
   вида уезжал за правый край экрана, а форма поиска, растянутая на всю
   ширину грида, выходила за пределы вместе с ним.

   Та же болезнь, что чинили в сетке карточек (GT-531) — 1fr без minmax(0, …).

   Обрезка подписей при сжатии выглядит нормально: у .select__current в теме
   уже стоят overflow: hidden и text-overflow: ellipsis. */
@media (max-width: 768px) {
    .dealer-tabs__top { grid-template-columns: minmax(0, 1fr) auto; }

    /* Нулевого минимума у ТРЕКА мало — сжиматься должны и сами селекты. */
    .dealer-tabs__selects { min-width: 0; }
    .dealer-tabs__selects > .select { min-width: 0; flex: 1 1 0; }
}

/* ===== Вкладки списка на телефоне =====

   У .dealer-tabs__btn в теме жёсткая высота:

       padding: 14px 16px;  line-height: 24px;
       height: 48px;  border-bottom: 2px solid transparent;

   Под содержимое остаётся 48 − 14 − 14 − 2 = 18px. Ровно одна строка туда не
   влезает даже впритык, но на широком экране подпись со счётчиком умещается
   в строку и переполнение незаметно.

   На телефоне «Yoxlamada (2264)» переносится на две строки, это 48px против
   доступных 18. Лишние 30px делятся поровну вверх и вниз (в колонке стоит
   justify-content: center), и нижняя строка вылезает на 15px — прямо на
   подчёркивание вкладки.

   Отпускаем высоту, 48px оставляем минимумом: там, где подпись в одну строку
   (витрины продавца и компании — у них вкладки без счётчиков), не изменится
   ничего. Боковой отступ с 16 до 8px — при трёх вкладках на 414px это даёт
   подписям запас и уменьшает сам шанс переноса. */
@media (max-width: 576px) {
    .dealer-tabs__nav .dealer-tabs__btn {
        height: auto;
        min-height: 48px;
        padding: 10px 8px;
    }

    /* Как только высота перестала быть жёсткой, вкладки стали разной высоты:
       «Aktiv (13161)» умещается в строку, «Yoxlamada (2264)» переносится, и
       подчёркивания встают на разных уровнях.

       У кнопки в теме уже стоит align-self: stretch, но он бездействует:
       флекс-элементы здесь — это <li>, а <a> внутри просто содержимое блока.
       Делаем <li> флекс-контейнером — тогда <li> растянется по самому высокому
       соседу, кнопка растянется по <li>, и подчёркивания снова на одной линии.
       Раньше это скрывала жёсткая высота: одинаковыми кнопки были не из-за
       выравнивания, а потому что у всех стояло 48px. */
    .dealer-tabs__nav .dealer-tabs__item { display: flex; }
}

/* ===== Подпорка: верхняя рамка поля поиска =====

   ЭТО ОБХОД, А НЕ ПОЧИНКА. Причина не найдена — фиксирую, что проверено, чтобы
   следующий не проходил тот же круг заново.

   Симптом: на главной у поля поиска не рисуется ВЕРХНЯЯ рамка. Три остальные
   на месте. Заметно на зуме меньше 100%.

   Отвергнуто измерениями, не догадками:
   - перекрытие шапкой — низ шапки 136, контент начинается со 137, зазор есть;
   - округление высоты шапки — она ровно 136, целое, округлять нечего;
   - дробный зум — на 100% симптом остаётся;
   - что-то лежит сверху — перебор всех позиционированных элементов и
     псевдоэлементов над верхней кромкой поля не нашёл ничего нарисованного;
   - толщина линии — замена border на box-shadow не изменила ничего.

   Единственное, что достоверно работает: сдвинуть блок вниз. При сдвиге на
   64px рамка появляется целиком. Отступ ниже — минимальный сдвиг того же рода.

   Ставим на .dealer-section__top, а не на main: сдвигается только строка
   «заголовок + поиск», а не весь сайт. Родитель .dealer-section__wrapp —
   флекс-колонка, поэтому margin не схлопывается и применяется как есть.

   Когда найдётся настоящая причина — этот блок удалить целиком. */
.dealer-section__top { margin-top: 4px; }

/* ===== Модалка жалобы =====

   Раскладка обязана жить в классе, а НЕ в атрибуте style. Alpine x-show
   управляет инлайновым display: при скрытии ставит none, при показе — удаляет
   свойство целиком, вместе с нашим display:flex. Остальные инлайновые свойства
   при этом остаются, поэтому затемнение работало, а диалог падал в левый
   верхний угол как обычный блок.

   Оформление собрано из переменных темы (цвета, рамки, шрифт) и повторяет поле
   поиска: рамка var(--br-b), радиус 4px, отступы 10/16. Своих цветов не вводим,
   иначе при смене палитры темы модалка останется старой. */
.report-modal {
    position: fixed;
    inset: 0;
    z-index: 1000;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 16px;
    background: rgba(0, 0, 0, .5);
}

.report-modal__dialog {
    width: 100%;
    max-width: 460px;
    max-height: 90vh;
    overflow-y: auto;
    padding: clamp(20px, 2.5vw, 32px);
    border-radius: 16px;
    background: rgba(var(--bg-a), 1);
    box-shadow: 0 1px 3px rgba(0, 0, 0, .3), 0 4px 16px rgba(0, 0, 0, .15);
}

.report-modal__title {
    margin: 0 0 24px;
    font-family: var(--font-family);
    font-weight: 600;
    font-size: clamp(20px, 1.9048vw, 24px);
    line-height: 133%;
    color: rgba(var(--cl-b), .95);
}

.report-modal__field { display: block; margin-bottom: 20px; }
.report-modal__field--last { margin-bottom: 24px; }

.report-modal__label {
    display: block;
    margin-bottom: 8px;
    font-family: var(--font-family);
    font-weight: 600;
    font-size: 14px;
    line-height: 150%;
    color: rgba(var(--cl-b), .95);
}

/* Поля — по образцу .search-form__input темы. Для select добавлена своя стрелка:
   нативная у каждого браузера своя и рядом с полями темы смотрится чужеродно.

   Текстовое поле одето тем же набором, а не классом .main-form__input темы:
   у того своя геометрия и ограничение ширины в 297px, из-за которых поле
   выбивалось из ряда соседей по окну. */
.report-modal__input,
.report-modal__select,
.report-modal__area {
    width: 100%;
    padding: 10px 16px;
    background: rgba(var(--bg-a), 1);
    border: 1px solid var(--br-b);
    border-radius: 4px;
    font-family: var(--font-family);
    font-weight: 400;
    font-size: 16px;
    line-height: 150%;
    color: rgba(var(--cl-b), 1);
    transition: .3s;
}

.report-modal__select {
    height: 46px;
    cursor: pointer;
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    padding-right: 40px;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%232f2f2f' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 14px center;
}

/* Потолок высоты обязателен: поле тянется вручную, и без него человек может
   растянуть его на несколько экранов — кнопки уедут за пределы диалога. */
.report-modal__area { min-height: 110px; max-height: 220px; resize: vertical; }

.report-modal__input { height: 46px; }

.report-modal__input:focus,
.report-modal__select:focus,
.report-modal__area:focus { border-color: var(--br-c); outline: none; }

.report-modal__error { display: block; margin-top: 6px; color: #dc2626; font-size: 13px; }

.report-modal__actions { display: flex; gap: 12px; justify-content: flex-end; }

/* Тема под .mode растягивает .main-btn на всю ширину и держит min-width 240px —
   в диалоге на 460px две такие кнопки не помещаются. Здесь размер по содержимому. */
.report-modal__btn.main-btn { width: fit-content; min-width: 0; }

@media (max-width: 480px) {
    .report-modal__actions { flex-direction: column-reverse; }
    .report-modal__btn.main-btn { width: 100%; }
}

/* Пока Alpine не инициализировался, элементы с x-cloak не должны мелькать.
   В теме такого правила нет, а атрибут используется в трёх шаблонах: модалка
   жалобы, ветки ответов в вопросах и в отзывах. */
[x-cloak] { display: none !important; }

/* ===== Навигация кабинета =====

   Пункт «Выйти» — форма с кнопкой, а не ссылка (выход обязан быть POST).
   Правила перенесены сюда из @once-блока cabinet/partials/nav: тот печатал
   <style> внутри <body>, то есть НИЖЕ подключения этого файла в <head>, и при
   равной специфичности всегда побеждал. Любая правка отсюда молча не работала.
   Инлайновый <style> в теле страницы — ловушка каскада, держим стили в одном
   месте. */
.aside-nav__list .aside-nav__logout {
    margin-top: 8px;
    padding-top: 8px;
    border-top: 1px solid #e1e3e6;
}
.aside-nav__list .aside-nav__logout form { display: contents; }
.aside-nav__list .aside-nav__logout button {
    width: 100%;
    background: none;
    border: 0;
    cursor: pointer;
}

/* ===== Навигация кабинета на узких экранах =====

   На ≤768px тема разворачивает .aside-nav__list в горизонтальный ряд
   (flex-direction: row; justify-content: space-between), но не даёт ему
   прокрутки. Восемь пунктов в 360px не влезают, и ряд просто обрезался
   правым краем экрана — до последних разделов было не добраться.

   Отступ между пунктами тема задала не тому элементу:

       .aside-nav__list li { gap: 15px }

   gap действует только на флекс- и грид-контейнеры, а li здесь обычный
   блок — контейнер это сам список. Свойство игнорировалось целиком,
   отсюда слипшиеся подписи «ŞirkətlərSeçilmişlərMesajlar».

   Наружу карточки ряд НЕ выводим (в отличие от .dealer-tabs__links, где
   тема тянет его до краёв экрана): у .aside-nav свой фон и скругление,
   прокрутка обязана идти внутри них. */
@media (max-width: 768px) {
    .aside-nav__list {
        /* 20px, а не 12: при 12 подписи читались одной сплошной строкой —
           глаз не отделял «Mesajlar» от «Statistika». */
        gap: 20px;
        justify-content: flex-start;
        overflow-x: auto;

        /* Полосу прокрутки НЕ прячем. Без неё не видно, что ряд вообще
           прокручивается — первая версия правки была именно такой, и это
           оказалось главным нареканием. Затухание-градиент у края
           рассматривалось и отвергнуто: без скрипта оно висит всегда и
           мажет последний пункт, когда ряд домотан до конца. */
        scrollbar-width: thin;
    }
    .aside-nav__list::-webkit-scrollbar { height: 4px; }
    .aside-nav__list::-webkit-scrollbar-thumb {
        background: rgba(0, 0, 0, .25);
        border-radius: 2px;
    }

    /* Не сжимаются и не переносятся: без этого браузер вместо прокрутки
       ужимает пункты до min-content и рвёт подписи на две строки —
       «İctimai profil» ломал высоту всего ряда. */
    .aside-nav__list > li { flex: 0 0 auto; }
    .aside-nav__list a,
    .aside-nav__list button { white-space: nowrap; }

    /* Разделитель перед «Выйти» осмыслен только в вертикальном списке.
       В ряду это черта над одним пунктом плюс сдвиг его вниз на 17px —
       пункт выпадал из строя. */
    .aside-nav__list .aside-nav__logout {
        margin-top: 0;
        padding-top: 0;
        border-top: 0;
    }
}

@media (max-width: 576px) {
    /* Здесь тема разворачивает пункт в колонку (иконка над подписью), и бейдж
       «YENİ» вставал третьей строкой — оторванной от своего пункта. Уводим в
       правый верхний угол и уменьшаем: в исходном размере (10px + падинги
       2/6) он выходил шире 40px и накрывал иконку.

       Строго внутри границ пункта, без отрицательных отступов: у списка выше
       задан overflow-x, а по спецификации это делает и вертикальную ось
       не-visible — свес сверху обрезался бы или добавлял лишнюю прокрутку.

       !important на каждой строке — вынужденно: у компонента <x-ui.badge>
       стили инлайновые (решение D12, чтобы не пересобирать бандл темы), а
       инлайн бьёт любой селектор по специфичности. Свойства, которых в
       инлайне нет (position, top, right), в !important не нуждаются. */
    .aside-nav__list a { position: relative; }
    .aside-nav__list .ui-badge {
        position: absolute;
        top: 0;
        right: 0;
        margin-inline-start: 0 !important;
        padding: 1px 4px !important;
        font-size: 8px !important;
        line-height: 1.2 !important;
        letter-spacing: 0 !important;
        border-radius: 4px !important;
    }
}

/* ===== Пагинация: тема прячет четвёртый номер страницы =====

   В теме лежит правило:

       .page-nav ul:not([class]) li:nth-child(4) { display: none }

   Оно выключает четвёртый по счёту пункт списка страниц — жёстко, по
   порядковому номеру, без всяких условий. Наследие статичного шаблона, где
   пагинация была нарисована руками с фиксированным набором элементов и
   четвёртый там был чем-то лишним.

   Селектор написан через :not([class]) — «у списка нет класса». У нашего <ul>
   класса нет, поэтому правило попадает и в нас, а список у нас динамический:
   выбивает произвольную страницу. Если ею окажется текущая — человек потеряет
   отметку «вы здесь» и не поймёт, где находится.

   Селектор повторён один в один, чтобы перебить по порядку подключения.
   display: flex — то же значение, что тема даёт всем остальным пунктам
   (.page-nav ul li). */
.page-nav ul:not([class]) li:nth-child(4) { display: flex; }

/* ===== Пагинация не помещалась в узкий экран =====

   .page-nav — флекс-элемент колонки .dealer-tabs, а у флекс-элементов
   min-width по умолчанию auto: «не ужимайся меньше своего содержимого».
   Содержимое — две стрелки и список номеров; на длинной пагинации это 730px.

   Замер при окне 414: nav шириной 730, координаты от −158 до 572. То есть ряд
   торчал на 158px за каждый край, а justify-content: center делил переполнение
   поровну. Номера «1» и «2» стояли на −113 и −63 — физически левее экрана, и
   достать их было нечем: прокрутки у элемента нет, а влево её и не бывает.

   Та же болезнь, что в сетке карточек, в строке фильтров и в колонке селектов:
   автоминимум флекса и грида — самая частая причина «вылезает за экран».

   min-width: 0 разрешает ужаться, flex-wrap переносит номера на вторую строку.
   Без медиазапроса: перенос срабатывает, только когда места действительно не
   хватает, на широком экране ряд остаётся одной строкой. */
   Перенос — ТОЛЬКО у списка номеров. На самом .page-nav он отправлял стрелки
   на отдельные строки: ряд из трёх детей (стрелка, список, стрелка) переносился
   целиком, и получалось четыре строки вместо одной. Стрелки обязаны оставаться
   по краям — это основной способ листать.

   Сам перенос номеров теперь страховка, а не рабочий режим: число пунктов
   ограничено в шаблонах через onEachSide(1). Сработает на совсем узких экранах
   и на многозначных номерах. */
.page-nav { min-width: 0; }
.page-nav ul { flex-wrap: wrap; justify-content: center; }

/* ===== Пагинация на телефоне =====

   Арифметика при 414px: внутри блока доступно 414 − 16 − 16 = 382px.
   Полный ряд в исходных размерах просит 530px (две стрелки по 35, девять
   кружков по 40, десять зазоров по 10) — не влезает на 148px.

   Уменьшать всё до 30px пробовали: влезает, но кнопка 30px с зазором 4px
   заметно мельче разумного минимума для касания (около 44px).

   Пошли другим путём — сократили САМ НАБОР на телефоне, а размер вернули
   ближе к исходному. Класс page-nav__sm-hide ставит шаблон пагинации:
   в начальной группе прячется всё после третьего номера (или после текущей,
   если человек ушёл дальше), в последней остаётся только последняя страница —
   «658 659» превращается в «659». Текущая не прячется никогда.

   Что режем на телефоне:
       начальная группа  — всё после третьего номера (или после текущей,
                           если человек ушёл дальше по списку);
       хвостовая группа  — обычно остаётся только последняя страница
                           («658 659» → «659»), а когда текущая внутри неё
                           (человек на последних страницах) — убираем всё
                           раньше её соседа слева;
       средняя группа    — НЕ трогаем. Соседние номера вокруг текущей и есть
                           способ шагнуть на страницу мышью; без них остаются
                           одни стрелки.

   Что получается:
       страница 1    →  ‹ [1] 2 3 … 659 ›            7 кнопок
       страница 5    →  ‹ 1 2 3 4 [5] 6 … 659 ›      10 кнопок, максимум
       страница 9    →  ‹ 1 2 … 8 [9] 10 … 659 ›     9 кнопок
       страница 659  →  ‹ 1 2 … 658 [659] ›          7 кнопок

   Максимум: 10 x 32 + 9 x 6 = 374px — влезает в 382 без запаса, но влезает.
   Отсюда и 32px: при 36px тот же случай давал 394 и уезжал на вторую строку.

   Пятую страницу ужать сильнее нельзя: там номера идут подряд одной группой,
   а вырезать из середины запрещено — «1 2 5 6» прочтётся как «страниц 3 и 4
   не существует». Прятать можно только край группы.

   Селектор скрытия с двумя классами: одного не хватит, тема задаёт
   .page-nav ul li { display: flex } со специфичностью выше. */
@media (max-width: 576px) {
    .page-nav { gap: 6px; }
    .page-nav ul { gap: 6px; }
    .page-nav ul li { width: 32px; font-size: 13px; }
    .page-nav__btn { width: 32px; }

    .page-nav ul li.page-nav__sm-hide { display: none; }
}

/* ===== Раздел «Компании» кабинета =====

   Вёрстки дизайнер не давал, оформлено своими классами cmp-*. Переменные
   только те, что есть в бандле темы (--cl-b, --cl-d, --bg-j).

   Стили перенесены сюда из @once-блока cabinet/companies/_styles.blade.php.
   Тот печатал <style> внутри <body>, то есть НИЖЕ подключения этого файла
   в <head>, и при равной специфичности всегда побеждал — любая правка отсюда
   молча не работала. На этих же граблях мы уже стояли с навигацией кабинета.
   Инлайновый <style> в теле страницы — ловушка каскада, держим стили
   в одном месте. */

/* ---- список ---- */
.cmp-toolbar { display: flex; justify-content: flex-end; margin-bottom: 16px; }
.cmp-list { display: flex; flex-direction: column; gap: 12px; }
.cmp-card {
    display: flex; align-items: center; gap: 16px;
    padding: 14px 16px; border: 1px solid #e1e3e6; border-radius: 12px;
}
.cmp-card__logo {
    width: 56px; height: 56px; border-radius: 10px; object-fit: cover;
    background: rgba(var(--bg-j), .5); flex: none;
    display: flex; align-items: center; justify-content: center;
    color: rgba(var(--cl-d), 1); font-weight: 600;
}
.cmp-card__body { flex: 1; min-width: 0; }
.cmp-card__name { font-weight: 600; font-size: 16px; color: rgba(var(--cl-b), .95); }
.cmp-card__meta { color: rgba(var(--cl-d), 1); font-size: 13px; margin-top: 2px; }
.cmp-badge {
    display: inline-block; padding: 2px 8px; border-radius: 100px;
    background: rgba(17, 166, 81, .12); color: #11a651; font-size: 12px; margin-left: 8px;
}
.cmp-empty { padding: 24px; text-align: center; color: rgba(var(--cl-d), 1); }

/* ---- форма ---- */
.cmp-form { display: flex; flex-direction: column; gap: 20px; max-width: 760px; }
.cmp-fieldset { border: 1px solid #e1e3e6; border-radius: 12px; padding: 16px; }
.cmp-fieldset > legend { padding: 0 8px; font-weight: 600; color: rgba(var(--cl-b), .95); }
.cmp-field { margin-bottom: 14px; }
.cmp-field:last-child { margin-bottom: 0; }
.cmp-field > label { display: block; margin-bottom: 6px; font-size: 14px; color: rgba(var(--cl-b), .95); }
.cmp-field input[type="text"],
.cmp-field input[type="email"],
.cmp-field input[type="url"],
.cmp-field input[type="tel"],
.cmp-field input[type="file"],
.cmp-field select,
.cmp-field textarea {
    width: 100%; padding: 10px 12px; border: 1px solid #e1e3e6;
    border-radius: 8px; font: inherit; background: #fff;
}
.cmp-field textarea { min-height: 90px; resize: vertical; }
.cmp-hint { color: rgba(var(--cl-d), 1); font-size: 12px; margin-top: 4px; }
.cmp-error { color: #e2342f; font-size: 13px; margin-top: 4px; }
.cmp-actions { display: flex; gap: 12px; align-items: center; }
.cmp-logo-preview { width: 72px; height: 72px; border-radius: 10px; object-fit: cover; margin-bottom: 8px; }

/* ---- список на телефоне ----

   Карточка была одной нерушимой строкой: логотип 56 + название + две кнопки.
   Кнопки темы имеют width: fit-content, то есть размер по содержимому — около
   178 и 128px. Вместе с логотипом и отступами это ~410px при доступных ~350,
   а переноса не было. Тело сжималось в узкую полосу, текст из неё вылезал,
   и кнопки ложились прямо поверх названия и города.

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

   height: auto у кнопок обязателен: в теме стоят жёсткие 46px, и если подпись
   всё же перенесётся на две строки, вторая вылезет за кнопку. */
@media (max-width: 576px) {
    .cmp-card { flex-wrap: wrap; }
    .cmp-card__body { flex: 1 1 calc(100% - 72px); }
    .cmp-card .main-btn {
        flex: 1 1 calc(50% - 8px);
        min-width: 0;
        height: auto;
        min-height: 46px;
        padding: 10px 12px;
    }
}

/* ===== Таблицы статистики кабинета =====

   Вёрстки дизайнер не давал: обёртка .stats-wrap плюс собственная .stats-table.
   Класс темы .dealer-tabs__cards тут не годится — он раскладывает содержимое
   в четыре колонки. Переменные только из бандла (--cl-b, --cl-d, --bg-j).

   Перенесено из @once-блока cabinet/statistics/_styles.blade.php: тот печатал
   <style> внутри <body>, ниже подключения этого файла в <head>, и при равной
   специфичности всегда побеждал. Второй и последний такой блок в проекте —
   первый был у раздела «Компании». */
.stats-wrap { overflow-x: auto; }

.stats-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 14px;
}

.stats-table th,
.stats-table td {
    padding: 12px 14px;
    text-align: left;
    border-bottom: 1px solid #e1e3e6;
    white-space: nowrap;
    vertical-align: middle;
}

.stats-table thead th {
    font-weight: 600;
    color: rgba(var(--cl-b), .95);
    background: rgba(var(--bg-j), .6);
}

.stats-table tbody tr:hover { background: rgba(var(--bg-j), .35); }

/* Числа и действия — вправо и в одну строку. */
.stats-table th:not(:first-child),
.stats-table td:not(:first-child) { text-align: right; }

/* Название объявления переносится по словам (числа и кнопка — нет). */
.stats-table th:first-child,
.stats-table td:first-child { white-space: normal; }

/* Компактная кнопка «Инсайты» в строке — не раздувает высоту строки. */
.stats-table .main-btn {
    padding: 6px 14px;
    font-size: 13px;
    line-height: 1.3;
    white-space: nowrap;
}

.stats-table .stats-empty {
    text-align: center;
    color: rgba(var(--cl-d), 1);
    padding: 24px 16px;
}

/* ---- на телефоне строка становится карточкой ----

   Пять столбцов в 414px не помещаются, и .stats-wrap отдавал их горизонтальной
   прокруткой. Прокрутка работает, но читать так нельзя: шапка уезжает, и уже
   через столбец непонятно, какое число к чему относится.

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

   ТОЛЬКО по модификатору --cards. Вторая таблица раздела (инсайты по дням:
   дата, просмотры, показы телефона) в ширину влезает, а карточками стала бы
   втрое длиннее — тридцать дней по три строки вместо компактного списка. */
@media (max-width: 576px) {
    .stats-table--cards,
    .stats-table--cards tbody,
    .stats-table--cards tr,
    .stats-table--cards td { display: block; }

    .stats-table--cards thead { display: none; }

    .stats-table--cards tr {
        border: 1px solid #e1e3e6;
        border-radius: 12px;
        padding: 12px 14px;
        margin-bottom: 12px;
    }
    .stats-table--cards tbody tr:hover { background: none; }

    .stats-table--cards td {
        border: 0;
        padding: 4px 0;
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: 12px;
        text-align: right;
    }
    .stats-table--cards td::before {
        content: attr(data-label);
        font-weight: 600;
        color: rgba(var(--cl-d), 1);
        text-align: left;
    }

    /* Название — заголовок карточки: во всю ширину, без подписи. */
    .stats-table--cards td:first-child {
        display: block;
        text-align: left;
        font-weight: 600;
        font-size: 15px;
        margin-bottom: 8px;
    }

    /* Кнопка «Инсайты» — во всю ширину карточки. */
    .stats-table--cards td:last-child { padding-top: 10px; }
    .stats-table--cards td:last-child .main-btn { width: 100%; }

    /* Строка «ничего нет» — не карточка, обычный текст. */
    .stats-table--cards .stats-empty { display: block; text-align: center; }
}

/* ===== Окно переписки на телефоне (модуль Chat) =====

   Тема переиспользует для окна переписки свой ПЛАВАЮЩИЙ виджет .chat — тот
   самый кружок в углу на главной. Его базовое состояние — скрытое:

       .chat { position: fixed; opacity: 0; visibility: hidden;
               pointer-events: none; transform: translateY(120%) }
       .chat.active { opacity: 1; visibility: visible; transform: none }

   Внутри .dealer-chat тема его переопределяет, но по-разному:
     ≥577px — position: static, opacity/visibility/transform сброшены,
              окно становится обычным блоком страницы;
     ≤576px — заданы полноэкранные размеры (100vw / 100dvh), а вот
              opacity, visibility и transform НЕ сброшены.

   Отсюда и симптом «на телефоне переписки нет, а при расширении появляется»:
   ниже 577px окно ждёт класс active, который вешает кнопка-кружок. У нас оно
   рендерится компонентом сразу, вешать некому.

   По замыслу темы на телефоне это выезжающая полноэкранная панель. Делаем
   проще и предсказуемее: обычный блок в потоке, как и на широком экране.
   Порядок на телефоне выходит навигация → список собеседников → переписка,
   ничего не выезжает и ничего не нужно закрывать.

   Селектор ОБЯЗАТЕЛЬНО с .dealer-chat: на главной живёт настоящий плавающий
   виджет с той же разметкой, и общее правило раскрыло бы его на всех
   страницах. */
@media (max-width: 576px) {
    .dealer-chat .chat {
        position: static;
        opacity: 1;
        visibility: visible;
        transform: none;
        pointer-events: all;
        width: 100%;
        height: auto;
        max-height: none;
        border: 1px solid rgba(var(--bg-j), 1);
        border-radius: 16px;
        box-shadow: none;
    }

    /* Лента сообщений со своей прокруткой, но не во весь экран: в потоке
       страницы 100dvh означало бы, что до поля ввода надо домотать. */
    .dealer-chat .chat__body { max-height: 60dvh; }

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

       На широком экране панель остаётся: там это левая колонка, по которой
       переключаются между собеседниками не уходя со страницы.

       Путь назад с телефона есть — крестик в шапке переписки ведёт в список
       (chat.index), это явная ссылка, а не только скриптовый тоггл.

       Селектор с прямым потомком намеренно: на странице СПИСКА переписок этой
       обёртки нет вовсе, там список рендерится в .dealer-tabs с другим классом,
       так что сам себя он не спрячет. */
    .dealer-chat > .dealer-chat__wrapp { display: none; }

    /* Цена в шапке переписки — одним куском. Разделитель тысяч это обычный
       пробел, и в узкой шапке «40 800» рвётся на «40» и «800». Тот же случай,
       что у .dealer-card__price на карточках. */
    .dealer-chat .chat__price { white-space: nowrap; }
}

/* ===== Кнопка «Сохранить поиск» в строке над выдачей (GT-554) =====
   Строка .dealer-tabs__top.mode расталкивает содержимое по краям. Пока в ней
   было двое — заголовок и сортировка — это работало. Третий элемент попадал
   ровно в середину и читался как главное действие страницы, хотя подписка
   вспомогательная.

   Прижимаем к сортировке: они соседи по смыслу, оба про «что сделать
   со списком». Заголовок остаётся у левого края сам — расталкивание
   на оставшихся двух работает как раньше. */
.dealer-tabs__top.mode .save-search { margin-left: auto; }

/* Вид вспомогательного действия: только текст, без коробки. Рамка и высота
   от .main-btn делали кнопку равной по весу главным действиям страницы. */
.save-search__btn {
    height: auto;
    padding: 0;
    border: none;
    background: none;
    font-size: 16px;
    line-height: 24px;
    color: rgba(var(--cl-c), 1);
    white-space: nowrap;
}
/* Наведение сбрасываем целиком. Тема под .main-btn--transparent:hover заливает
   кнопку оранжевым и красит текст в белый, а .main-btn:hover добавляет тень.
   Фон мы сняли — и белый текст оставался на белой странице: кнопка пропадала,
   от неё виднелась одна тень. */
.save-search__btn:hover {
    opacity: .7;
    background: none;
    color: rgba(var(--cl-c), 1);
    box-shadow: none;
}

/* Телефон: разрешаем перенос — двое в строку могут не поместиться, и тогда второй
   элемент уезжает вниз сам.

   А вот ПРИНУДИТЕЛЬНЫЙ перенос (заголовок на всю ширину) нужен только там, где в
   строке ТРОЕ: заголовок, подписка и сортировка. Отсюда модификатор. Без него
   правило ловило все пять страниц с .dealer-tabs__top.mode, а трое из них только
   на одной: на главной на вторую строку уезжал переключатель вида, в подборках —
   кнопка «Все объявления», хотя оба помещались рядом с заголовком. Выглядело как
   сдвиг, потому что у кнопки 44×44 иконка 24px по центру — она начинается на 10px
   правее края, а заголовок и карточки идут от самого края. */
@media (max-width: 576px) {
    .dealer-tabs__top.mode { flex-wrap: wrap; }
    .dealer-tabs__top--save-search .dealer-tabs__subtitle { flex: 1 0 100%; }
    /* Прижимать вправо больше нечего: на своей строке кнопка и сортировка
       расходятся по краям сами, расталкиванием родителя. Без сброса обе
       жались к правому краю, а слева оставалась пустая половина.
       Модификатор не нужен — .save-search есть только в этой строке. */
    .dealer-tabs__top.mode .save-search { margin-left: 0; }
}

/* Сводка условий и пояснение в окне подписки. Отступ снизу у пояснения —
   не косметика: без него текст упирается в кнопки, а на телефоне они ещё и
   растягиваются во всю ширину и встают вплотную. */
.save-search-modal__list {
    margin: 0;
    padding: 0;
    list-style: none;
    font-family: var(--font-family);
    font-size: 16px;
    line-height: 24px;
    color: rgba(var(--cl-b), .95);
}
.save-search-modal__list li + li { margin-top: 4px; }

.save-search-modal__hint {
    margin: 0 0 24px;
    font-family: var(--font-family);
    font-size: 14px;
    line-height: 20px;
    color: rgba(var(--cl-b), .58);
}

/* ===== Раздел кабинета «Мои подписки» (GT-559, переделан в GT-560) =====

   Строка вместо карточки: подписок до пяти, и каждая занимала блок с четырьмя
   кнопками — список читался как свалка. Теперь строка несёт название, раздел
   и дату, а правка ушла в окно.

   Каналы из строки убраны намеренно: переключаемые одним кликом, они легко
   задевались случайно, и было непонятно, сохранилось ли. */
.ss-toolbar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: 16px;
}
/* Счётчик — обычный текст страницы, не мелкая сноска: он отвечает на вопрос
   «сколько ещё можно», и читать его должно быть так же легко, как названия
   подписок рядом. */
.ss-toolbar__count {
    font-family: var(--font-family);
    font-size: 16px;
    line-height: 24px;
    color: rgba(var(--cl-b), .95);
    white-space: nowrap;
}

.ss-list { display: flex; flex-direction: column; gap: 8px; }

.ss-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    padding: 12px 16px;
    border: 1px solid var(--br-b);
    border-radius: 12px;
    background: rgba(var(--bg-a), 1);
    transition: opacity .3s;
}

/* Приостановленная приглушается, но остаётся читаемой: человек должен видеть
   её условия, чтобы решить — возобновить или удалить. Прятать нельзя, место
   под пределом она всё равно занимает. */
.ss-row.is-paused { opacity: .6; }

.ss-row__body { display: flex; flex-direction: column; gap: 2px; min-width: 0; }

.ss-row__title {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
    font-family: var(--font-family);
    font-weight: 600;
    font-size: 16px;
    line-height: 24px;
    color: rgba(var(--cl-b), .95);
}

.ss-row__badge {
    padding: 2px 8px;
    border-radius: 8px;
    background: rgba(var(--bg-d), 1);
    font-size: 12px;
    font-weight: 400;
    line-height: 16px;
    color: rgba(var(--cl-b), .58);
}

.ss-row__meta {
    font-family: var(--font-family);
    font-size: 14px;
    line-height: 20px;
    color: rgba(var(--cl-b), .58);
}

/* Каналы под датой: тем же приглушённым, что и раздел с датой, — это
   справочная строка, а не заголовок. */
.ss-row__channels {
    font-family: var(--font-family);
    font-size: 14px;
    line-height: 20px;
    color: rgba(var(--cl-b), .58);
}

.ss-row__actions { display: flex; gap: 8px; flex-shrink: 0; }
.ss-row__actions .main-btn { height: 36px; padding: 8px 16px; font-size: 14px; }

/* Удаление красим предупреждающе — но только текстом и рамкой: сплошная красная
   кнопка в ряду со сдержанными соседями читается как главное действие, а оно
   здесь как раз самое опасное. */
.ss-row__delete.main-btn--transparent {
    border-color: rgba(220, 38, 38, .4);
    color: #dc2626;
}
.ss-row__delete.main-btn--transparent:hover {
    background: none;
    border-color: #dc2626;
    color: #dc2626;
    box-shadow: none;
    opacity: .7;
}

/* Каналы в окне: в строку с переносом, на телефоне три подписи в ряд не влезают. */
.ss-modal__channels { display: flex; flex-wrap: wrap; gap: 8px 20px; }
.ss-modal__channels .custom-checkbox { padding: 0; }

/* Каскад разделов: списки идут друг под другом, по одному на уровень. */
.ss-modal__level + .ss-modal__level { margin-top: 8px; }

/* Пара полей «от — до»: minmax(0, …) и min-width обязательны вместе — у поля
   ввода собственная предпочитаемая ширина, и без сброса пара распирает окно. */
.ss-modal__range {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 12px;
}
.ss-modal__range .report-modal__input { min-width: 0; }

/* Значения характеристики: в колонку, с прокруткой при длинном списке — иначе
   сотня марок вытолкнет кнопки окна за пределы экрана. */
.ss-modal__options {
    display: flex;
    flex-direction: column;
    gap: 4px;
    max-height: 180px;
    overflow-y: auto;
}
.ss-modal__options .custom-checkbox { padding: 0; }

/* Счётчик подходящих. Ноль подсвечиваем: подписка на условия, под которые
   ничего не подходит, будет молчать, и человек должен это увидеть до сохранения. */
.ss-modal__matches {
    margin: 0 0 20px;
    font-family: var(--font-family);
    font-size: 14px;
    line-height: 20px;
    color: rgba(var(--cl-b), .58);
}
.ss-modal__matches.is-empty { color: #dc2626; }

/* Статус отделён чертой: без неё галочка «уведомления включены» вставала
   четвёртой в ряд каналов и читалась как ещё один способ доставки. */
.ss-modal__status {
    border-top: 1px solid var(--br-b);
    padding-top: 16px;
}
.ss-modal__status .custom-checkbox { padding: 0; }

/* Телефон: строка разворачивается в колонку, кнопки делят ширину пополам. */
@media (max-width: 576px) {
    .ss-row { flex-direction: column; align-items: stretch; gap: 12px; }
    .ss-row__actions .main-btn { flex: 1 1 0; }
}

/* ===== Карточка каталога кликается целиком (GT-581) =====

   Приём «растянутая ссылка»: настоящая ссылка одна — заголовок, а её ::after
   раскрывается на всю карточку и ловит клики. Обернуть карточку в <a> нельзя:
   внутри кнопка «в избранное», а кнопка внутри ссылки — невалидная разметка,
   браузеры ведут себя по-разному, и клик может не дойти до Livewire.

   Модификатор, а не общий .dealer-card: тот же класс носят карточки кабинета
   («мои объявления», «избранное»), где внутри кнопки правки и удаления —
   накрывать их плёнкой нельзя. Разметку под модификатор даёт отдельный
   компонент ads-card-linked. */
.dealer-card--linked .dealer-card__link::after {
    content: '';
    position: absolute;
    inset: 0;
    z-index: 1;
}

/* Тема даёт галерее z-index: 2, и это ловушка. Элемент с position и заданным
   z-index создаёт собственный контекст наложения — замкнутую систему слоёв,
   которая наружу выходит одним куском. Значит кнопка «в избранное» со своим
   z-index: 5 заперта ВНУТРИ уровня 2, и плёнка накрыла бы её вместе с
   картинкой. Сбрасываем z-index галереи: контекст исчезает, кнопка поднимается
   в слои самой карточки и честно оказывается выше плёнки.

   Остальное у галереи не трогаем — overflow, скругление и aspect-ratio
   от z-index не зависят. */
.dealer-card--linked .dealer-card__gallery { z-index: auto; }

/* Значок VIP лежит выше плёнки (z-index: 3 из темы). Сам он никуда не ведёт —
   пропускаем клики насквозь, иначе по алмазу карточка не открывалась бы. */
.dealer-card--linked .dealer-card__btn { pointer-events: none; }

/* Фото к отзыву и вопросу: кнопка-камера, превью выбранных, подсказка */
.feedback-photos__pick { cursor: pointer; }
.feedback-photos { display: flex; flex-wrap: wrap; gap: 8px; }
.feedback-photos__item {
    position: relative; width: 64px; height: 64px; border-radius: 8px; overflow: hidden;
    background: #EDEFF2; display: flex; align-items: center; justify-content: center;
}
.feedback-photos__item img { width: 100%; height: 100%; object-fit: cover; }
.feedback-photos__name { font-size: 10px; padding: 4px; word-break: break-all; text-align: center; }
.feedback-photos__remove {
    position: absolute; top: 2px; right: 2px; width: 20px; height: 20px; border-radius: 50%;
    background: rgba(0, 0, 0, .6); color: #fff; line-height: 20px; font-size: 14px; text-align: center;
}
.feedback-photos__hint { font-size: 12px; color: #8E8B8A; margin: 0; }
.feedback-photos__item--cover { width: 96px; height: 96px; }
.feedback-photos__more {
    position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
    background: rgba(0, 0, 0, .45); color: #fff; font-size: 18px; font-weight: 600;
}

/* Чат: кнопка прикрепления, полоса превью, фото в сообщении */
.chat__attach { flex: 0 0 auto; width: 24px; height: 24px; color: #8E8B8A; cursor: pointer; }
.chat__attach-preview { padding: 8px 16px 0; }
.chat__attachments {
    display: grid; grid-template-columns: repeat(auto-fill, minmax(96px, 1fr));
    gap: 4px; max-width: 240px; margin-bottom: 4px;
}
.chat__attachments img { width: 100%; aspect-ratio: 1; object-fit: cover; border-radius: 8px; }

/* Шапка: выпадающее меню «Справочник», как на портале.
   Кнопка-триггер оформлена темой через .menu-button — как соседние ссылки. */
.header__nav .nav-dropdown {
    position: relative;
}

.header__nav .nav-dropdown .menu-button {
    background: none;
    border: 0;
    cursor: pointer;
}

.header__nav .nav-dropdown__menu {
    position: absolute;
    top: 100%;
    left: 0;
    z-index: 100;
    display: flex;
    flex-direction: column;
    gap: 4px;
    width: 260px;
    padding: 10px 12px;
    background: rgba(var(--bg-a), 1);
    border: 1px solid var(--br-b);
    border-radius: 8px;
}

.header__nav .nav-dropdown__menu[hidden] {
    display: none;
}

/* Тема тянет все ссылки меню на 50px и рисует под ними полоску активного
   пункта — внутри выпадающего меню это лишнее. */
.header__nav ul .nav-dropdown__menu a {
    height: auto;
    padding: 6px 8px;
    justify-content: flex-start;
    text-align: left;
    white-space: normal;
    font-size: 16px;
}

.header__nav ul .nav-dropdown__menu a::before {
    content: none;
}

/* Мобильное меню прокручивается — всплывающий блок обрезался бы.
   Здесь подпункты раскрываются в потоке, со сдвигом вправо. */
@media (max-width: 1024px) {
    .header__nav .nav-dropdown {
        display: flex;
        flex-direction: column;
        align-items: center;
    }

    .header__nav .nav-dropdown__menu {
        position: static;
        width: auto;
        align-items: center;
        padding: 8px 0 0;
        background: none;
        border: 0;
    }

    .header__nav ul .nav-dropdown__menu a {
        justify-content: center;
        text-align: center;
        font-weight: 500;
    }
}

/* Модалка входа — перенесена с портала (public/css/custom.css, блок .login-modal).
   Открывает и закрывает тема: .overlay.active + [data-popup].active. */
.overlay.active [data-popup="login"].active {
    display: flex !important;
    visibility: visible !important;
    opacity: 1 !important;
}

.overlay .login-modal {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    width: 900px;
    min-height: 420px;
    max-height: 90vh;
    margin: 0;
    background: rgba(var(--bg-a), 1);
    border-radius: 12px;
    box-shadow: 0 20px 60px rgba(0, 0, 0, 0.25);
    border: 1px solid var(--br-b);
    z-index: 100000;
    display: none;
    overflow-y: auto;
}

.login-modal__close {
    position: absolute;
    top: 12px;
    right: 12px;
    z-index: 100001;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    padding: 0;
    border: none;
    border-radius: 8px;
    background: transparent;
    color: inherit;
    cursor: pointer;
    transition: background 0.2s;
}

.login-modal__close:hover {
    background: rgba(0, 0, 0, 0.05);
}

.login-modal__inner {
    display: flex;
    width: 100%;
    min-height: 420px;
}

.login-modal__poster {
    position: relative;
    width: 50%;
    min-width: 0;
    overflow: hidden;
    border-right: 1px solid var(--br-b);
}

.login-modal__poster-img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center;
}

.login-modal__form-side {
    width: 50%;
    min-width: 0;
    padding: 24px 28px 28px;
    overflow-y: auto;
}

.login-modal .registration-section__inner {
    width: 100%;
}

.login-modal .registration-section__title {
    margin: 0 0 12px;
    font-size: 18px;
    font-weight: 600;
    color: rgba(var(--cl-b), 0.95);
}

.login-modal__intro {
    margin: 0 0 20px;
    padding: 12px 14px;
    font-family: var(--font-family);
    font-size: 14px;
    line-height: 1.5;
    color: rgba(var(--cl-b), 0.8);
    background: rgba(var(--cl-c), 0.08);
    border-left: 3px solid rgba(var(--cl-c), 0.6);
    border-radius: 0 8px 8px 0;
}

.login-modal .main-form.pass {
    display: flex;
    flex-direction: column;
    gap: 16px;
    max-width: 100%;
}

.login-modal .main-form__label {
    position: relative;
    display: flex;
    flex-direction: column;
    max-width: 100%;
}

.login-modal .main-form__input {
    width: 100%;
    max-width: 100%;
    box-sizing: border-box;
}

.login-modal .main-form__label:has(.main-form__icon) .main-form__input {
    padding-right: 44px;
}

.login-modal .main-form__icon {
    position: absolute;
    top: 11px;
    right: 12px;
    z-index: 2;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 24px;
    height: 24px;
    padding: 0;
    border: none;
    background: transparent;
    cursor: pointer;
}

.login-modal .main-form .main-btn {
    width: 100%;
    max-width: 100%;
    margin-top: 4px;
}

.login-modal .main-form__link {
    margin-top: 4px;
}

.login-modal__footer {
    margin: 16px 0 0;
    font-family: var(--font-family);
    font-size: 14px;
    color: rgba(var(--cl-b), 0.75);
}

.login-modal__footer .login-modal__link {
    font-weight: 600;
    color: rgba(var(--cl-c), 1);
    text-decoration: underline;
}

.login-modal .valid-tip {
    margin-top: 4px;
    font-size: 12px;
    color: #c71212;
}

@media (max-width: 940px) {
    .overlay .login-modal {
        width: calc(100% - 32px);
        max-width: 900px;
    }
}

@media (max-width: 640px) {
    .overlay .login-modal {
        width: calc(100% - 24px);
    }

    .login-modal__inner {
        flex-direction: column;
        min-height: auto;
    }

    .login-modal__poster {
        width: 100%;
        min-height: 120px;
        border-right: none;
        border-bottom: 1px solid var(--br-b);
    }

    .login-modal__form-side {
        width: 100%;
    }
}
