/* =============================================================================
   ash-chrome.css — обвязка страницы asho.to
   Скип-ссылка · розовая плашка · шапка · меню разделов · боковое меню · подвал
   · нижнее меню · фильтры витрины · фасеты · пагинация · /cities · хештеги
   · возрастная заглушка 18+ · кнопка «наверх».

   ПОДКЛЮЧАТЬ ТРЕТЬИМ: ash-tokens.css → ash-catalog.css → ash-chrome.css.
   Отсюда берутся .q-btn, .q-icon и .h-icon (объявлены в ash-catalog.css).

   ОТКУДА ЧИСЛА. Всё из research/chrome.md, где разобран боевой CSS источника
   /var/www/asho_to_usr/data/_handoff/style/index-Cwib1x1t.css плюс сохранённые
   страницы. Там же помечено, что снято с разметки, а что восстановлено по CSS:
   ПРАВАЯ ПОЛОВИНА ШАПКИ в дампе отсутствует (сервер отдал её как <!---->),
   поэтому её состав — доказуемая реконструкция по scoped-правилам, а ПОРЯДОК
   элементов слева направо — единственное, чего в дампе нет вообще.

   ⚠️ СКРОЛЛ-ЛОК. Скролл-контейнер — <html>, НЕ body. В сети это уже чинили
   (моб. меню на CY): при overflow:hidden на body iOS-Safari продолжает
   прокручивать страницу и теряет позицию при закрытии.
   ============================================================================= */


/* =============================================================================
   0. СКИП-ССЫЛКА  (БАГ 49, 57)
   main.tpl → #ash-content (modules/ash-content.tpl). У источника такого элемента
   нет вовсе, поэтому строка обязана быть невидимой до фокуса с клавиатуры: без
   правила она рисовалась обычным inline-текстом 196x20 первым элементом тела и
   сдвигала ВСЮ страницу на 20px вниз — отсюда расхождение по всем вертикальным
   замерам (page-area, шапка, крошки, h1).
   Гасим и :focus, и :focus-visible: мышиный фокус на ссылке нам тоже не мешает
   показать её, а :focus страхует браузеры без :focus-visible.
   ============================================================================= */
.ash-skip {
  position: absolute;
  width: 1px; height: 1px;
  margin: -1px; padding: 0; border: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}
.ash-skip:focus,
.ash-skip:focus-visible {
  position: fixed;
  top: 8px; left: 8px;
  z-index: 10000;
  width: auto; height: auto;
  margin: 0; padding: 8px 12px;
  overflow: visible;
  clip-path: none;
  border-radius: 8px;
  background: var(--Background-Layer1);
  color: var(--Text-Primary);
}


/* =============================================================================
   1. РОЗОВАЯ ПЛАШКА НАД ШАПКОЙ
   Не ссылка, но с cursor:pointer — обработчик у источника клиентский, куда
   ведёт, из дампа не видно. Градиент из четырёх стопов — снят дословно.
   ============================================================================= */
.approved-banner {
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  font-weight: var(--Font-Weight-Bold, 700);
  color: var(--Special-White);
  background: linear-gradient(90deg, #ff5ebc, #ff5e7d, #ff5e9c, #92d4ff);
}
.approved-banner .h-icon { font-size: 18px; color: var(--Special-Verified); }


/* =============================================================================
   2. ШАПКА
   Фон — --Background-Black (#242424) в светлой теме и --Background-BG (#121212)
   в тёмной: то есть шапка сливается с контентом только в тёмной теме, а в
   светлой над белым контентом видна тёмная полоса. Это и есть разгадка вопроса
   ДИЗАЙН_ASHOO.md §7 (сам каркас .page-area/.content-area — в ash-tokens.css).
   ============================================================================= */
.header { background: var(--Background-Black); }
body.body--dark .header { background: var(--Background-BG); }

.header-row {
  height: 44px;
  display: flex;
  align-items: center;
  flex-wrap: nowrap;
}
@media (min-width: 1024px) { .header-row { height: 64px; } }
/* Правило источника «.header-row div{height:44px}» слишком широкое: оно задирает
   высоту любому вложенному диву. Ограничиваем прямыми детьми — вид тот же,
   а вложенные колонки инструментов не ломаются. */
.header-row > div { height: 44px; display: flex; align-items: center; flex-wrap: nowrap; }
.header-row > div button { min-width: 44px; }
.header-row .q-btn--fab-mini { width: 44px; min-width: 44px; height: 44px; min-height: 44px; }

/* Бургер ВИДЕН НА ВСЕХ ШИРИНАХ: у источника это не «мобильный бургер», а
   постоянная кнопка бокового меню. Сдвиги −10/+3 — оптическая правка источника. */
.burger { margin-left: -10px; position: relative; top: 3px; color: var(--Special-White); }

/* Логотип — инлайновый SVG с единственной заливкой .logo-main, поэтому он
   автоматически белый в обеих темах (никаких двух файлов). */
.app-logo { width: 134px; height: 44px; display: block; }
.app-logo .logo-main { fill: var(--Special-White); }
@media (max-width: 1023.98px) { .app-logo { width: 82px; height: 30px; } }

/* --- правая половина: инструменты ---------------------------------------
   overflow:hidden здесь не «на всякий случай»: это прямое указание источника,
   что на узком экране инструменты НЕ переносятся на вторую строку и НЕ уходят
   в бургер, а физически обрезаются по правому краю. */
.mobile-header-tools { min-width: 0; overflow: hidden; }
.header-tools { display: flex; align-items: center; flex-wrap: nowrap; gap: 8px; margin-left: auto; }

.nav-header,
.nav-header .q-btn { height: 32px; min-height: 32px; }

/* Выбор города и выбор страны — два экземпляра одного компонента. */
.selector {
  height: 32px;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  color: var(--Special-White);
  font-size:   var(--font-size-label-m, 12px);
  line-height: var(--line-height-label-m, 16px);
  font-weight: var(--Font-Weight-Regular, 400);
  cursor: pointer;
}
.selector .q-btn-dropdown__arrow { color: var(--Text-Secondary); }
.selector .city,
.selector .country { min-width: 0; display: inline-flex; align-items: center; gap: 4px; }
.selector .h-icon { flex: none; }
.selector .name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@media (max-width: 1023.98px) { .selector .name { max-width: 96px; } }

.dark-mode-toggle {
  height: 20px;
  border: 0;
  padding: 0;
  background: transparent;
  color: var(--Special-White);
  cursor: pointer;
  display: inline-flex;
  align-items: center;
}
/* В разметке лежат ОБЕ иконки, видимую выбирает класс темы на body. Так кнопка
   показывает верное состояние ещё до того, как приедет хоть один скрипт: при
   светлой теме предлагаем месяц, при тёмной — солнце. */
body.body--light .dark-mode-toggle .icon-light { display: none; }
body.body--dark  .dark-mode-toggle .icon-dark  { display: none; }
.language-switch-icon { height: 20px; }
@media (max-width: 1023.98px) {
  .dark-mode-toggle { height: 24px; }
  .language-switch-icon { height: 24px; }
}

.map-btn { border: 2px solid var(--Special-Primary); border-radius: 8px; color: var(--Special-White); }
.pwa-install-btn,
.top-btn {
  width: 44px;
  height: 44px;
  border: 1px solid var(--Special-White);
  border-radius: 50%;
  background: transparent;
  color: var(--Special-White);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}

/* Поле поиска в шапке */
.header-form .q-field__control {
  height: 44px;
  border-radius: 8px;
  display: flex;
  align-items: center;
  padding: 0 12px;
  background: var(--Background-Layer1);
}
.header-form input {
  border: 0;
  outline: 0;
  width: 100%;
  background: transparent;
  color: var(--Text-Primary);
  font-family: inherit;
  font-size: var(--Font-Size-Body-Small, 14px);
}


/* =============================================================================
   3. МЕНЮ РАЗДЕЛОВ (вторая строка шапки)
   Три вещи, которые надо повторить:
     1) ряд листается горизонтально, полоса прокрутки скрыта (.scroll-area);
     2) ЛИПКИМ ряд становится ТОЛЬКО ниже 1024px — на десктопе он уезжает
        вместе со страницей. Sticky везде — самая частая ошибка при копировании;
     3) кнопка «Фильтр» ведёт на /search, а НЕ открывает диалог (диалог
        открывает другая кнопка, в самом листинге, см. §5).
   В шапке выводятся ВСЕ СЕМЬ разделов + «Салоны», а не пять с options:["menu"].
   ============================================================================= */
@media (max-width: 1023.98px) {
  .header.sticky { position: sticky; top: 0; z-index: 1000; padding: 8px 0; }
}
.menu-sections { display: flex; align-items: center; flex-wrap: nowrap; gap: 4px; }
@media (min-width: 1024px) { .menu-sections { gap: 8px; } }

.menu-sections a {
  display: flex;
  align-items: center;
  height: 40px;
  padding: 8px;
  border: 1px solid var(--Special-White);
  border-radius: 8px;
  color: var(--Special-White);
  background-color: inherit;
  text-wrap: nowrap;
  white-space: nowrap;
}
@media (min-width: 1024px) { .menu-sections a { padding: 10px 8px; } }
.menu-sections a[active="true"],
.menu-sections a[data-active="true"] { background: var(--Elements-Dark-Gray) !important; }

.menu-sections a.filter-btn {
  background: var(--Special-Primary);
  border: none;
  padding: 8px 12px;
  gap: 4px;
  color: var(--Special-White) !important;
}
.menu-sections a.filter-btn .search-icon { width: 16px; height: 16px; font-size: 16px; }


/* =============================================================================
   4. БОКОВОЕ МЕНЮ ОТ БУРГЕРА
   Разметки в дампе нет, стили компонента есть целиком. Примета, которую нельзя
   потерять: зазор между ссылками 44px — очень крупный шаг.
   ⚠️ Это НЕ .index-header/.index-footer из того же CSS: те принадлежат второй,
   маркетинговой шапке посадочной страницы, для каталога они не годятся.
   ============================================================================= */
.q-drawer {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  z-index: 3000;
  width: 300px;
  max-width: 85vw;
  overflow-y: auto;
  transform: translateX(-100%);
  transition: transform .25s ease;
}
.q-drawer[open],
.q-drawer.is-open { transform: translateX(0); }
.q-drawer__backdrop {
  position: fixed;
  inset: 0;
  z-index: 2999 !important;
  background: #0009;
  opacity: 0;
  pointer-events: none;
  transition: opacity .25s ease;
}
.q-drawer__backdrop.is-open { opacity: 1; pointer-events: auto; }

.index-drawer { background: var(--Background-Black); color: var(--Special-White); }
.drawer-inner { display: flex; flex-direction: column; gap: 24px; min-height: 100%; padding: 16px; }
.drawer-nav { display: flex; flex-direction: column; gap: 44px; }
.drawer-nav a { color: var(--Special-White); text-decoration: none; }
.drawer-nav a:hover { color: var(--Special-Primary); }
.drawer-contacts {
  display: flex;
  flex-direction: column;
  gap: 20px;
  margin-top: auto;
  padding-top: 24px;
  color: var(--Special-White);
}
.drawer-contacts a { display: flex; align-items: center; gap: 12px; text-decoration: none; }
.drawer-contacts a span { text-decoration: underline; }

/* Скролл-лок при открытом меню и при открытой заглушке 18+.
   Контейнер — <html>: см. предупреждение в шапке файла. */
html.ash-lock { overflow: hidden; }


/* =============================================================================
   5. ПОДВАЛ
   Фон --Special-Black: подвал остаётся тёмным и в СВЕТЛОЙ теме (это не
   --Background-*). На десктопе три колонки в один ряд, ссылки «Компания» —
   в две колонки с зазором 64px. На мобиле одна колонка, заголовки колонок
   скрыты классом gt-sm, и появляется разделитель separator1.
   ============================================================================= */
.footer-wrap { background: var(--Special-Black); width: 100%; margin-top: auto; }
.footer {
  display: grid;
  gap: 24px 64px;
  padding-top: 40px;
  padding-bottom: 40px;
  color: var(--Special-White);
  grid-template-areas:
    "description links contacts"
    "separator2  separator2 separator2"
    "eula        eula       eula";
}
.footer .description { grid-area: description; }
@media (min-width: 1024px) { .footer .description { margin-right: 76px; } }
.footer .description svg { color: var(--Special-White); }

.footer .links { grid-area: links; gap: 16px; }
.footer .links a,
.footer .links div { color: var(--Special-White); cursor: pointer; }
.footer .links a:hover,
.footer .links div:hover { color: var(--Special-Primary); }
@media (min-width: 1024px) {
  .footer .links { display: grid; grid-template-columns: 1fr 1fr; column-gap: 64px; }
}
@media (max-width: 1023.98px) {
  .footer .links { display: flex; flex-direction: row; flex-wrap: wrap; }
}

.footer .contacts { grid-area: contacts; display: flex; flex-direction: column; gap: 20px; }
.footer .contacts > a { display: flex; align-items: center; text-decoration: underline !important; color: var(--Special-White); }
.footer .contacts .h-icon { margin-right: 12px; font-size: 24px; }

.footer .separator1 { grid-area: separator1; }
.footer .separator2 { grid-area: separator2; }

/* Юридический ряд. В дампе область eula отрисована как <!----> — то есть
   состав ссылок источника нам НЕИЗВЕСТЕН (chrome.md §3.3). Стили есть, а
   содержимое закрываем своими страницами; это дырка, а не «один в один». */
.footer .eula { grid-area: eula; display: flex; flex-direction: row; justify-content: center; gap: 16px; }
.footer .eula a {
  color: var(--Text-Secondary);
  text-align: left;
  padding-bottom: 8px;
  text-decoration-line: underline !important;
}
.footer .eula a:hover { color: var(--Special-Primary); }
@media (max-width: 1023.98px) { .footer .eula { flex-direction: column; } }

@media (max-width: 1023.98px) {
  .footer {
    padding-top: 24px;
    padding-bottom: 0;
    grid-template-areas: "description" "links" "separator1" "contacts" "separator2" "eula";
  }
  /* место под фиксированное нижнее меню, иначе оно накрывает подвал */
  .footer-wrap { margin-bottom: 50px; }
  /* БАГ 21: на анкете и салоне над меню стоит ещё и полоса контактов (60px),
     и вдвоём они накрывали подвал. :has сам выключается там, где полосы нет
     (на витринах, /cities, /salons её в разметке не печатают). */
  body:has(.q-page-sticky) .footer-wrap { margin-bottom: 110px; }
}

/* Круглый значок «18+»: в подвале белый, в заглушке розовый — цвет даёт
   currentColor, поэтому правило одно на оба места. */
.warn {
  width: 44px;
  height: 44px;
  border: 2px solid currentColor;
  font-size: 14px;
  font-weight: 500;
  line-height: 16px;
}
.footer .rta img { display: block; height: 32px; width: auto; }


/* =============================================================================
   6. НИЖНЕЕ МЕНЮ (только уже 1024px)
   Высота 50, фон --Special-Black, подписи 10px.
   БАГ 51: размер значка задаёт font-size на обёртке <i class="q-icon h-icon">,
   svg тянется в 1em. Правило источника .menu .item svg{width:20px} у него самого
   НЕ применяется — на svg нет scoped-атрибута, поэтому у источника значок 22×22.
   Наш клон этого правила резал значки до 20×20; он удалён, размер задаётся ниже.
   ============================================================================= */
.q-footer.fixed-bottom { position: fixed; left: 0; right: 0; bottom: 0; z-index: 2000; }
.menu-bottom {
  display: flex;
  flex-flow: row;
  justify-content: center;
  height: 50px;
  padding: 0 16px;
  background-color: var(--Special-Black);
}
.menu-bottom .item {
  display: flex;
  flex-direction: column;
  flex: 1 1 0;
  margin: 8px;
  color: var(--Special-White);
  text-align: center;
  white-space: nowrap;
  cursor: pointer;
  font-size:   var(--font-size-label-s, 10px);
  line-height: var(--line-height-label-s, 12px);
}
/* БАГ 51: 22px — замер источника (значок 22×22, y 802..824 один в один) */
.menu-bottom .item .h-icon { font-size: 22px; }
.menu-bottom .item:visited { color: var(--Special-White); }
.menu-bottom .item[active="true"],
.menu-bottom .item[data-active="true"] { color: var(--Special-Primary) !important; }


/* =============================================================================
   7. ФИЛЬТРЫ ВИТРИНЫ
   Один ряд из шести кнопок, горизонтально листается, высота у всех 40px.
   Сортировки на витрине НЕТ — в разметке источника её нет ни в одном виде.
   ============================================================================= */
.filters-block { display: flex; flex-wrap: nowrap; gap: 5px; align-items: center; }
.filters-block > .q-btn,
.filters-block > .ash-btn { height: 40px !important; min-height: 40px; }

/* «Фильтр» — кнопка с обводкой, розовая, скруглённая. Подпись скрыта на мобиле
   классом gt-sm, остаётся только иконка. Это КНОПКА (открывает диалог), не
   ссылка — не путать со ссылкой «Фильтр» в шапке, ведущей на /search. */
.filters-block .filter-dialog-btn {
  border: 1px solid currentColor;
  border-radius: 28px;
  color: var(--Special-Primary);
  padding: 0 12px;
  background: transparent;
}
.filters-block .filter-dialog-btn .h-icon { font-size: 24px; }

/* Пять выпадающих: плоские, на --Elements-Light-Gray, стрелка 18px серая,
   подпись обрезается по calc(100% - 27px). */
.multi-select-btn {
  height: 56px;
  min-width: 96px;
  padding: 0 12px;
  border: 0;
  border-radius: 8px;
  background: var(--Elements-Light-Gray);
  color: var(--Text-Primary);
  cursor: pointer;
}
.multi-select-btn .label {
  width: calc(100% - 27px);
  text-align: left;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.multi-select-btn .h-icon { font-size: 18px; color: var(--Text-Secondary); }

/* Липкая подложка ВНУТРИ выпадающего диалога — под кнопку «Показать N анкет». */
.sticky-content { position: sticky; bottom: -16px; margin-bottom: -16px; padding-bottom: 16px; background: var(--Background-BG); }

/* Диалог фильтра. Разметки в дампе нет, есть только .sticky-content и
   .dropdown-button-dialog-*.css. Каркас — наш, геометрия по мотивам age-dialog. */
.filter-dialog {
  position: fixed;
  inset: 0;
  z-index: 6000;
  display: none;
  background: #0009;
}
.filter-dialog[open],
.filter-dialog.is-open { display: flex; align-items: flex-end; justify-content: center; }
.filter-dialog .content {
  width: 100%;
  max-width: 560px;
  max-height: 90vh;
  overflow-y: auto;
  padding: 16px;
  border-top-left-radius: 16px;
  border-top-right-radius: 16px;
  background: var(--Background-Layer1);
  color: var(--Text-Primary);
}
@media (min-width: 600px) {
  .filter-dialog[open],
  .filter-dialog.is-open { align-items: center; }
  .filter-dialog .content { border-radius: 16px; }
}

/* ФАСЕТЫ ВИТРИНЫ (БАГ 25, 52).
   У источника это шесть кнопок с Vue-диалогами, отрисованными на уровне body.
   У нас — ряд <details>, и выпадающая панель лежит ВНУТРИ ряда. Отсюда три
   обязательных условия, каждое проверено замером:
   1) overflow:visible на самом ряду. Класс .scroll-area делает его скролл-
      контейнером высотой 40px и обрезает панель насмерть — она перестаёт ловить
      клики. Меняем только для ряда фасетов, общую .scroll-area не трогаем;
   2) flex-wrap:wrap вместо nowrap из .filters-block: на 390px ряд шириной 426px
      иначе даёт горизонтальную прокрутку всей страницы;
   3) align-self:flex-start у самих фасетов — из-за align-items:center в
      .filters-block раскрытие одного фасета растягивало и центрировало
      закрытых соседей (замер: 60/60/40 вместо 20).
   Панель тянется по ширине БЛОКА (left:0;right:0), а не от кнопки: при
   min-width от кнопки на 390px она уезжала за правый край (замер 476 > 390).
   Кегль 16px и паддинг 4px/16px — из базового .q-btn источника, не 14/12:
   у источника у кнопок ряда нет своего font-size, его даёт правило
   .q-btn:not(.q-btn--fab-mini)… = var(--Font-Size-Body,16px). */
.filters-block.ash-facets { position: relative; overflow: visible; flex-wrap: wrap; row-gap: 8px; }
.filters-block > .ash-facet { position: static; flex: 0 0 auto; align-self: flex-start; }
.ash-facet__btn {
  box-sizing: border-box;
  height: 40px;
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 4px 16px;
  border: 0;
  border-radius: 8px;
  background: var(--Elements-Light-Gray);
  color: var(--Text-Primary);
  font-size: var(--Font-Size-Body, 16px);
  white-space: nowrap;
  cursor: pointer;
  list-style: none;
}
.ash-facet__btn::-webkit-details-marker { display: none; }
.ash-facet__btn::marker { content: ""; }
.ash-facet__total { color: var(--Text-Secondary); }
.ash-facet[open] .ash-facet__btn { color: var(--Special-Primary); }
.ash-facet__list {
  position: absolute;
  top: calc(100% + 6px);
  left: 0; right: 0;
  z-index: 40;
  margin: 0;
  padding: 8px;
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  gap: 4px 8px;
  max-height: 320px;
  overflow-y: auto;
  background: var(--Background-Layer1);
  color: var(--Text-Primary);
  border-radius: 8px;
  box-shadow: 0 8px 24px rgb(0 0 0 / .18);
}
.ash-facet__list li { list-style: none; }
.ash-facet__cnt { color: var(--Text-Secondary); }


/* =============================================================================
   8. ПАГИНАЦИЯ
   Кнопки 32×32, радиус 8, активная — розовая с белым текстом. Многоточие —
   такая же плашка 32×32 с иконкой more-horizontal.
   Источник печатает ссылки на ВСЕ страницы и прячет лишние инлайновым
   display:none — поисковик обходит пагинацию за один заход. Повторять это
   решение или печатать только видимые — дело рендера; вёрстка работает с любым.
   ============================================================================= */
.pagination { display: flex; flex-wrap: nowrap; justify-content: center; }
.pagination-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  min-width: 32px;
  border: 0;
  border-radius: 8px;
  background: var(--Elements-Light-Gray);
  color: var(--Text-Primary);
  opacity: 1 !important;
}
.pagination-btn[active="true"],
.pagination-btn[data-active="true"] { background-color: var(--Special-Primary); color: var(--Special-White); }
/* «Показать еще» над пагинацией */
.show-more-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  height: 40px;
  padding: 0 16px;
  border: 1px solid currentColor;
  border-radius: 8px;
  background: transparent;
  color: var(--Special-Primary);
  cursor: pointer;
}


/* =============================================================================
   9. /cities, ХЕШТЕГИ, SEO-ПОДВАЛ
   .all-seo-grid и .seo-footer объявлены в ash-tokens.css. Здесь — только то,
   чего там нет: сами хештеги и подссылки города.
   БАГ 71: прежняя строка «количества анкет у города НЕ показываются» врала —
   счётчик печатался в <span class="ash-city__cnt">. Сейчас он снят из разметки
   (вариант «как у источника»: у ashoo.me счётчика на /cities нет), поэтому и
   правила под него тут нет. Если счётчик вернут — набирать его теми же 12/16
   серым, что «Районы»/«Метро» рядом, то есть правилом .city-sub a ниже.
   ============================================================================= */
.city-sub { display: flex; gap: 4px; }
.city-sub a {
  color: var(--Text-Secondary);
  font-size:   var(--font-size-label-m, 12px);
  line-height: var(--line-height-label-m, 16px);
}

/* БАГ 42/58/62: у источника хештег — ТЁМНАЯ ПЛАШКА, а не серый текст:
   .hashtag{background:var(--Badges-MainBG);color:var(--Special-White);
   border-radius:4px;padding:2px 4px} + :hover{opacity:.9}.
   font-size/line-height здесь именно УДАЛЕНЫ, а не переопределены: ash-chrome
   подключается третьим и любая строка font-size тут перебила бы класс
   text-label-m из разметки (12/16), с которым высота плашки и выходит 20px.
   Ховер на цвет убран — на тёмной плашке белый текст синел. */
.hashtag {
  background: var(--Badges-MainBG);
  color: var(--Special-White);
  border-radius: 4px;
  padding: 2px 4px;
}
.hashtag:hover { opacity: .9; }
/* Единственный сегодняшний потребитель .hashtag — НАШ ряд «Разделы» на главной
   (nav.ash-sections), которого у источника нет вообще: у него разделы живут в
   липкой шапке, а плашки — только в seo-подвале. Чтобы правка выше не
   перекрасила этот ряд в бейджи, оставляем ему прежний серый вид. Когда
   seo-подвал будет подключён, он получит плашки источника. */
.ash-sections .hashtag {
  background: transparent;
  color: var(--Text-Secondary);
  border-radius: 0;
  padding: 0;
}
.ash-sections .hashtag:hover { opacity: 1; color: var(--Special-Primary); }


/* =============================================================================
   10. ВОЗРАСТНАЯ ЗАГЛУШКА 18+
   Механизм из трёх кусков, и все три обязательны — иначе заглушка мигает у
   вернувшегося посетителя или не закрывается вовсе:
     1) в <head> до всего: правила показа + чтение localStorage (см. main.tpl);
     2) разметка первым элементом в теле;
     3) размеры — здесь.
   Согласие: localStorage['age-accepted'] = String(Date.now()), срок жизни
   ровно сутки (86 400 000 мс). Это решение источника, не баг.
   Приметы: ДВОЙНОЕ размытие (20px у подложки + 10px у карточки), карточка
   ровно 350×280, спозиционирована вычислением от 50vh/50vw, а не transform.
   ============================================================================= */
.age-dialog {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 10000;
  overflow: hidden;
  background: #000c;
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
}
.age-dialog .content {
  position: absolute;
  width: 350px;
  height: 280px;
  top:  calc(50vh - 140px);
  left: calc(50vw - 175px);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  display: flex;
  flex-direction: column;
  gap: 16px;
  padding: 16px;
  border-radius: 8px;
  background: var(--Background-Layer1);
  color: var(--Text-Primary);
}
.age-dialog .content .q-btn,
.age-dialog .content .ash-btn { height: 44px; }
/* На экранах уже 382px карточка фиксированной ширины вылезала бы за край. */
@media (max-width: 382px) {
  .age-dialog .content { width: calc(100% - 32px); left: 16px; }
}
/* Заглушка скрывается ЧИСТЫМ CSS, до загрузки любого скрипта: атрибут ставит
   инлайновый <script> в <head>. Правило дублируется и там, в критическом
   <style>, — здесь оно на случай, если лист приедет раньше разметки. */
html[data-age-accepted] .age-dialog { display: none; }
html:not([data-age-accepted]) { overflow: hidden; }


/* Затемнение под диалогом жалобы. Сам диалог собирает ash-scripts.tpl готовыми
   утилитами, но у нативного <dialog> подложка по умолчанию почти прозрачная
   (UA даёт rgba(0,0,0,.1)) — карточка «висит» над читаемой страницей. Берём ту
   же плотность, что у заглушки 18+ и диалога фильтра. */
.ash-dialog::backdrop { background: #0009; }


/* =============================================================================
   11. ХЛЕБНЫЕ КРОШКИ, ЗАГОЛОВОК И СЧЁТЧИК ВИТРИНЫ
   Разделитель крошек — ТОЧКА «•» через ::after (правило в ash-tokens.css).
   Обойма крошек листается горизонтально: на телефоне длинная цепочка иначе
   ломает вёрстку.
   ============================================================================= */
.scroll-area {
  width: 100%;
  overflow-x: auto;
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.scroll-area::-webkit-scrollbar { display: none; }

.found-count { color: var(--Text-Primary); }


/* =============================================================================
   12. КНОПКА «НАВЕРХ»
   Назначение .top-btn у источника не доказано (chrome.md §9.1), поэтому свою
   кнопку держим отдельным классом и прячем, пока скрипт её не покажет.
   ============================================================================= */
.ash-up {
  position: fixed;
  right: 16px;
  bottom: 16px;
  z-index: 1500;
  width: 44px;
  height: 44px;
  border: 1px solid var(--Special-White);
  border-radius: 50%;
  background: var(--Special-Black);
  color: var(--Special-White);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}
.ash-up[hidden] { display: none; }
/* Место под полосу контактов в подвале на ДЕСКТОПЕ. На узких то же делает
   правило в §5 (110px = меню + полоса); здесь меню нет, поэтому только 60px.
   Без этого фиксированная полоса накрывает нижние ссылки подвала. */
@media (min-width: 1024px) { body:has(.q-page-sticky) .footer-wrap { margin-bottom: 60px; } }
@media (max-width: 1023.98px) { .ash-up { bottom: 58px; } }
/* БАГ 10: полоса контактов 60px стоит и на ДЕСКТОПЕ (гасить её нельзя — правой
   колонки с контактами у нас нет, см. разбор в ash-catalog.css), и она делала
   кнопку «наверх» некликабельной: настоящий клик на 1440 давал 0 попаданий.
   58px — проверенное значение, полоса при этом остаётся на месте. :has сам
   выключает правило на витринах, где полосы в разметке нет. */
body:has(.q-page-sticky) .ash-up { bottom: 58px; }
/* БАГ 21: на узких снизу стоят ДВА слоя — нижнее меню 50px и полоса 60px,
   и кнопка уходила под них (замер: upHit=false). 118 = 50 + 60 + 8 зазор.
   Правило идёт ПОСЛЕ десктопного: вес у них одинаковый, решает порядок. */
@media (max-width: 1023.98px) { body:has(.q-page-sticky) .ash-up { bottom: 118px; } }
