/* ===== hf.css — токены :root и шапка/подвал, ОБЩИЕ для сайта и форума (S2 №161, план xenforo-style §4.5) =====
   Грузится СИНХРОННО: сайт — layouts/main.php сразу после custom_bw.css, форум — PAGE_CONTAINER
   (стиль prokoni) после preload custom_bw.css. Здесь живут: единый :root (--hf-*), .header_top,
   подвал .pf-*, кнопки .hf-btn/.hf-btn-ghost, шапка №073/№075 (.hf-topbar/.hf-head/.hf-m*, .navbar
   поверх Bootstrap). Правила перенесены из custom_bw.css (не скопированы) — гейт design-tokens
   читает оба файла как один. Кэш: ?v= бампать и в main.php ($cacheVersion), и в PAGE_CONTAINER (S12).
   Минимум Bootstrap внизу — чтобы на форуме до прихода async custom_bw.css не показывались
   разом обе шапки (десктоп+мобильная) и раскрытое меню (CLS). */

/* ===== №116: единый :root — все дизайн-токены главной (B.1/B.3) =====
   Было: токены объявлены трижды — .pf{--pf-*} (подвал), .hf-block{--hf-*} (секции),
   :root{--hf-*} (шапка) — с одинаковыми значениями. Канон: один блок здесь, в начале
   файла; --pf-* переименованы в --hf-footer-* и --hf-* и используются везде через var().
   (раунд 4, БЛОКЕР revizor: здесь раньше два токена-шаблона стояли слитно через косую
   черту сразу за звёздочкой одного из них — это закрывающая комментарий пара символов
   CSS-грамматики, и она закрывала комментарий ДОСРОЧНО прямо тут; весь хвост
   комментария плюс реальный :root {...} браузер разбирал как один битый CSS-блок и
   отбрасывал — все --hf-* были пустыми, текст рендерился rgb(0,0,0). Такая пара
   символов внутри CSS/JS-комментария впредь недопустима — гейт design-tokens теперь
   это ловит.)
   Контраст (S9, WCAG AA): --hf-soft затемнён (было 3,9:1 на ground — провал,
   стало ≈4,8:1 ground / 5,5:1 card); --hf-tb-note осветлён (было 4,3:1
   на --hf-dark, стало ≈5,9:1). --hf-accent — только фон/обводка/подчёркивание/фокус,
   как цвет текста запрещён (≈1,9:1 на белом) — см. --hf-accent-ink. Старые
   значения — в истории git и в контраст-таблице отчёта S9, не здесь (гейт
   design-tokens запрещает их литералы в файле).
   Раунд 2 (revizor): --hf-soft как ТЕКСТ разрешён только на --hf-ground/--hf-card/
   --hf-tint (4,86 / 5,49 / 5,03 — все AA); на --hf-footer-bg --hf-soft даёт 4,35:1
   (провал) — там вместо него --hf-link (6,09:1). Единственное такое место было
   .pf-legal, исправлено. Новых мест "soft-текст на footer-bg" не заводить без
   пересчёта. Глобальный `a{}`/`a:hover{}` заскоплен `:where(html:not(#XF))` —
   форум (id=XF) грузит этот файл после своего core, голый `a{}` перебивал бы его. */
:root {
  /* поверхности */
  --hf-ground: #f2f1ed;
  --hf-card: #ffffff;
  --hf-tint: #f6f5f2;
  --hf-footer-bg: #e6e5e1;

  /* текст */
  --hf-ink: #2b2a27;
  --hf-link: #55534e;
  --hf-soft: #6b6963;
  --hf-tb-note: #a9a7a0;
  --hf-tb-link: #cfcdc7;

  /* линии */
  --hf-line: #dbd9d3;
  --hf-line-soft: #eceae5;
  --hf-footer-line: #cfcdc7;

  /* акцент */
  --hf-accent: #ffa600;
  --hf-accent-ink: #8a5a00;

  /* тёмные поверхности */
  --hf-dark: #2b2a27;
  --hf-dark-hover: #45433e;

  /* геометрия */
  --hf-r: 14px;
  --hf-r-ctl: 10px;
  /* S14 V5 (B.5.5): --hf-shadow на главной больше не применяется — карточки внутри
     плиты живут фоном --hf-card, тени сняты; токен оставлен для шапки/выпадашек. */
  --hf-shadow: 0 1px 2px rgba(43, 42, 39, .05), 0 6px 18px rgba(43, 42, 39, .07);
  --hf-shadow-lift: 0 2px 4px rgba(43, 42, 39, .06), 0 14px 32px rgba(43, 42, 39, .12);

  /* типографика */
  --hf-font: "IBM Plex Sans", -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
  --hf-serif: Georgia, "Noto Serif", "Times New Roman", serif; /* S13 V2: Noto Serif — системный serif Android */

  /* S13 V1: шкала кеглей (ТЗ главной B.5.4). S14 V3 довёл её до таблицы B.5.4:
     H-M 16 → 17 (.hf-ntitle = .hf-atitle) и мета 12 → 13; остальные значения — из main.
     Суффикс -sm = значение на компактном пороге (620). */
  --hf-fs-sec: 25px;        /* H-sec: h2 секции */
  --hf-fs-sec-sm: 21px;
  --hf-fs-l: 26px;          /* H-L: h3 лида */
  --hf-fs-l-sm: 22px;
  --hf-fs-overlay: 21px;    /* L-overlay: заголовок карточки блога */
  --hf-fs-overlay-sm: 19px;
  --hf-fs-m: 17px;          /* H-M: h3 карточки M */
  --hf-fs-m-sm: 16px;
  --hf-fs-s: 15px;          /* H-S: строки хвоста новостей */
  --hf-fs-t: 14px;          /* H-T: плитка объявления, строки рейтинга */
  --hf-fs-lede: 15px;       /* лид-абзац */
  --hf-fs-ui: 14px;         /* кнопки, вкладки, ссылки «все» */
  --hf-fs-small: 13px;      /* подписи CTA, ссылки в подвале карточки */
  --hf-fs-meta: 13px;       /* мета, даты, хост (S14 V3: было 12, B.5.4 — читаемость) */
  --hf-fs-tag: 11px;        /* рубрика, пометка «Реклама» */

  /* S13 V1: шкала отступов 4/8/12/16/24/32 и гаттер карточных сеток (B.5.3) */
  --hf-sp-1: 4px;
  --hf-sp-2: 8px;
  --hf-sp-3: 12px;
  --hf-sp-4: 16px;
  --hf-sp-5: 24px;
  --hf-sp-6: 32px;
  --hf-gap: 18px;           /* на компактном пороге 12 — переопределение ниже */

  /* №165: единая ширина страницы — сайт и форум. Канон значений; extra.less форума
     (полосы p-*-inner) и custom_bw.css берут их отсюда, своих литералов не держат.
     Решение владельца 20.09.2026: «такую же ширину, как сейчас на проде», то есть как
     полосы XF прода — замер prokoni.ru/forum на 375/1280/1440/1920 даёт внешние 1200
     при padding 10 (контент 1180) на любом вьюпорте. Одна ширина на все вьюпорты
     вместо прежней лесенки 740/960/960/1200 (сайт) и 1200 без лесенки (форум). */
  --page-w: 1200px;
  --page-pad: 10px;

  /* S13 V7: пятый, «компактный» порог — ТОЛЬКО для карточных сеток главной (на
     621..767 две колонки карточек ещё помещаются). Всё остальное — пороги
     Bootstrap 768/992/1200. var() внутри условия @media браузер не вычисляет,
     поэтому в самих @media стоит литерал 620; токен — документация и единая
     точка поиска (grep hf-bp-compact). Меняешь порог — меняй литералы рядом
     с каждым упоминанием токена. */
  --hf-bp-compact: 620px;
}
/* S13: гаттер карточных сеток на компактном пороге (литерал = --hf-bp-compact) */
@media (max-width: 620px) {
  :root { --hf-gap: 12px; }
}


.header_top {
  padding: 3px 0 3px 0;
}

/* ===== Подвал сайта (redesign №045) ===== */
.pf {
  background: var(--hf-footer-bg);
  color: var(--hf-link);
  font-family: var(--hf-font);
  /* №165: боковые поля даёт .pf-in по общему стандарту — здесь они удваивались бы */
  padding: 48px 0 28px;
}
/* №165: было max-width:1170px — третья независимая ширина, подвал не совпадал
   с шапкой ни на одном вьюпорте. */
.pf-in { box-sizing: border-box; width: 100%; max-width: var(--page-w); margin: 0 auto; padding-left: var(--page-pad); padding-right: var(--page-pad); }
.pf a { color: inherit; text-decoration: none; }
.pf a:focus-visible { outline: 2px solid var(--hf-accent); outline-offset: 2px; border-radius: 2px; }

/* 312px: три бейджа приложений (90+101+101 при высоте 30) + 2 зазора = 308px в один ряд (№055) */
.pf-top { display: grid; grid-template-columns: 312px 1fr; gap: 56px; }
.pf-brand { display: grid; gap: 22px; align-content: start; }
.pf-logo img { display: block; width: 149px; height: 41px; }
.pf-social { display: flex; gap: 10px; }
.pf-social img { display: block; width: 32px; height: 32px; border-radius: 6px; transition: transform .15s; }
.pf-social a:hover img { transform: translateY(-2px); }
.pf-apps { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.pf-apps img { display: block; height: 30px; width: auto; }

.pf-nav { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 24px; min-width: 0; }
.pf-col { min-width: 0; }
/* .pf-col-title вместо тега h4 (D6 №111: h2 подвала -> h4 без h3 ломал heading-order;
   тег сменился на h3, вид сохранён классом, а не тегом) */
.pf-col-title {
  margin: 0 0 14px; color: var(--hf-ink); line-height: 1.3;
  font-size: 13px; font-weight: 600; letter-spacing: .06em; text-transform: uppercase;
}
.pf-col ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 9px; }
.pf-col a { font-size: 15px; line-height: 1.35; overflow-wrap: anywhere; background: linear-gradient(var(--hf-accent), var(--hf-accent)) 0 100% / 0 2px no-repeat; transition: background-size .2s, color .2s; }
.pf-col a:hover { color: var(--hf-ink); background-size: 100% 2px; }

.pf-bottom {
  margin-top: 44px; padding-top: 20px; border-top: 1px solid var(--hf-footer-line);
  display: grid; grid-template-columns: 1fr auto; gap: 40px; align-items: center;
}
/* №116 раунд 2: --hf-soft на --hf-footer-bg = 4,35:1 (провал AA), --hf-link = 6,09:1 (AA) */
.pf-legal { margin: 0; max-width: 78ch; font-size: 12.5px; line-height: 1.6; color: var(--hf-link); }
.pf-legal b { font-weight: 600; color: var(--hf-link); }
.pf-counters { display: grid; grid-template-columns: repeat(3, 88px); gap: 8px; margin: 0; padding: 0; }
.pf-counters > li { margin: 0; padding: 0; }
.pf-counter { display: block; width: 88px; height: 31px; }
.pf-counter img { display: block; width: 88px; height: 31px; filter: grayscale(1); opacity: .7; transition: opacity .2s, filter .2s; }
.pf-counter:hover img { filter: none; opacity: 1; }

@media (min-width: 768px) and (max-width: 991px) {
  .pf-top { grid-template-columns: 1fr; gap: 32px; }
  .pf-brand { grid-auto-flow: column; align-items: center; justify-content: start; gap: 24px; }
  .pf-nav { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 24px 16px; }
}
@media (max-width: 767px) {
  .pf { padding: 32px 0 24px; } /* №165: боковые поля только у .pf-in */
  .pf-top { grid-template-columns: 1fr; gap: 32px; }
  .pf-nav { order: -1; grid-template-columns: 1fr 1fr; gap: 28px 16px; }
  .pf-col-title { margin-bottom: 10px; }
  .pf-col ul { gap: 8px; }
  .pf-brand { padding-top: 24px; border-top: 1px solid var(--hf-footer-line); justify-items: start; }
  .pf-bottom { margin-top: 24px; grid-template-columns: 1fr; gap: 18px; }
  .pf-legal { font-size: 12px; line-height: 1.55; }
  .pf-counters { grid-template-columns: repeat(3, auto); gap: 6px; }
  .pf-counter { width: auto; }
  .pf-counter img { width: auto; height: 27px; }
}
@media (prefers-reduced-motion: reduce) { .pf * { transition: none !important; } }


.hf-btn {
  flex: 0 0 auto;
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0 var(--hf-sp-4);
  border-radius: var(--hf-r-ctl);
  background: var(--hf-accent);
  color: #2b2113;
  font-weight: 600;
  font-size: var(--hf-fs-ui);
  white-space: nowrap;
  transition: background .18s ease;
}
.hf-btn:hover { background: #f09a00; color: #2b2113; }

/* ======================================================================
   №168 — база Bootstrap 3/normalize для шапки до прихода custom_bw.css.
   На форуме custom_bw.css грузится асинхронно, hf.css — синхронно: без этой
   секции nav.navbar до загрузки был 176 px вместо 64 и контент прыгал
   (CLS ~0.15; гейт deploy-scripts/width/fouc-gate.mjs). Значения — ровно
   итоговые из custom_bw.css. Область — узлы шапки через :where(), он не
   добавляет специфичности: у правила она та же, что у исходного в
   custom_bw.css, и секции №073/№075 ниже перекрывают его как раньше.
   Исходные правила в custom_bw.css остаются: на них держатся страницы
   сайта (pills .nav, сетка .row/.col-*) и админка на теме bootstrap3.
   ====================================================================== */
/* html { line-height: 24px } и img { vertical-align: middle } из custom_bw.css */
:where(.hf-topbar, .hf-head, .navbar.navbar-default) { line-height: 24px; }
:where(.hf-topbar, .hf-head, .navbar.navbar-default) img { vertical-align: middle; }
:where(.hf-topbar, .hf-head, .navbar.navbar-default) .icon { display: inline-block; vertical-align: -0.125em; fill: currentColor; }
/* элементы форм (normalize + Bootstrap) и старый id формы поиска */
:where(.hf-head, .navbar.navbar-default) :is(button, input) { color: inherit; font: inherit; margin: 0; }
:where(.hf-head, .navbar.navbar-default) button { overflow: visible; text-transform: none; }
:where(.hf-head, .navbar.navbar-default) :is(button, input) { font-family: inherit; font-size: inherit; line-height: inherit; }
/* hf-scale-ok padding-top 7px: повтор #top_find_form из custom_bw.css (№168) */
:where(.hf-head) #top_find_form { padding-top: 7px; }
:where(.navbar.navbar-default) .text-uppercase { text-transform: uppercase; }
/* clearfix */
.navbar:where(.navbar-default)::before,
.navbar:where(.navbar-default)::after,
:where(.hf-topbar, .navbar.navbar-default, section:has(> .container > .hf-head)) :is(.container, .row, .nav, .navbar-header, .navbar-collapse)::before,
:where(.hf-topbar, .navbar.navbar-default, section:has(> .container > .hf-head)) :is(.container, .row, .nav, .navbar-header, .navbar-collapse)::after { content: " "; display: table; }
.navbar:where(.navbar-default)::after,
:where(.hf-topbar, .navbar.navbar-default, section:has(> .container > .hf-head)) :is(.container, .row, .nav, .navbar-header, .navbar-collapse)::after { clear: both; }
/* сетка */
:where(.navbar.navbar-default) .row { margin-left: 7px; margin-right: 0; padding-bottom: 10px; }
:where(.navbar.navbar-default) .col-sm-12 { position: relative; min-height: 1px; padding: 0 7px 4px 0; }
/* поле поиска мобильной шапки */
:where(.hf-head, .navbar.navbar-default) input { border: 1px solid #b8b8b8 !important; box-shadow: none !important; background-color: #fff; }
:where(.navbar.navbar-default) .form-control {
  display: block;
  width: 100%;
  height: 34px;
  padding: 6px 7px;
  font-size: 14px;
  line-height: 1.42857143;
  color: #555;
  border-radius: 4px;
  background-color: #fff;
  background-image: none;
}
/* .nav / .navbar */
.navbar:where(.navbar-default) { position: relative; min-height: 50px; }
:where(.navbar.navbar-default) .nav { margin-bottom: 0; padding-left: 0; list-style: none; }
:where(.navbar.navbar-default) .nav > li { position: relative; display: block; }
:where(.navbar.navbar-default) .nav > li > a { position: relative; display: block; padding: 10px 15px; }
:where(.navbar.navbar-default) .navbar-collapse { overflow-x: visible; padding-right: 10px; padding-left: 10px; border-top: 1px solid transparent; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); }
:where(.navbar.navbar-default) .navbar-nav { margin: 7.5px -10px; }
:where(.navbar.navbar-default) .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; }
:where(.navbar.navbar-default) .navbar-toggle {
  position: relative;
  float: left;
  margin-right: 10px;
  padding: 9px 10px;
  margin-top: 8px;
  margin-bottom: 8px;
  background-color: transparent;
  background-image: none;
  border: 1px solid transparent;
  border-radius: 2px;
}
:where(.navbar.navbar-default) .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; }
:where(.navbar.navbar-default) .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; }
.navbar-default:where(.navbar) .navbar-toggle { border-color: #ddd; }
.navbar-default:where(.navbar) .navbar-toggle .icon-bar { background-color: #888; }
/* выпадающие меню */
:where(.navbar.navbar-default) .dropdown { position: relative; }
:where(.navbar.navbar-default) .dropdown-menu {
  position: absolute;
  top: 100%;
  left: 0;
  z-index: 1000;
  float: left;
  min-width: 160px;
  padding: 5px 0;
  margin: 2px 0 0;
  list-style: none;
  font-size: 14px;
  text-align: left;
  background-color: #e7e7e7;
  border: 1px solid #e7e7e7;
  border-radius: 4px;
  background-clip: padding-box;
}
:where(.navbar.navbar-default) .dropdown-menu .divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; }
:where(.navbar.navbar-default) .dropdown-menu > li > a {
  display: block;
  padding: 3px 20px;
  clear: both;
  color: #000;
  line-height: 1.3;
  white-space: nowrap;
  font-family: var(--hf-font);
  font-style: normal;
  font-weight: bold;
  font-size: 20px;
  text-transform: none;
}
:where(.navbar.navbar-default) .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-right-radius: 0; border-top-left-radius: 0; }
@media (max-width: 767px) {
  :where(.navbar.navbar-default) .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; box-shadow: none; }
  :where(.navbar.navbar-default) .navbar-nav .open .dropdown-menu > li > a { padding: 5px 15px 5px 25px; line-height: 20px; }
  .navbar-default:where(.navbar) .navbar-nav .open .dropdown-menu > li > a { color: #777; }
}
@media (min-width: 768px) {
  .navbar:where(.navbar-default) { border-radius: 2px; }
  :where(.navbar.navbar-default) .navbar-header { float: left; }
  :where(.navbar.navbar-default) .col-sm-12 { float: left; width: 100%; }
  :where(.navbar.navbar-default) .navbar-collapse { width: auto; border-top: 0; box-shadow: none; }
  :where(.navbar.navbar-default) .navbar-collapse.collapse { padding-bottom: 0; }
  :where(.navbar.navbar-default) .navbar-toggle { display: none; }
  :where(.navbar.navbar-default) .navbar-nav { float: left; margin: 0; }
  :where(.navbar.navbar-default) .navbar-nav > li { float: left; }
  :where(.navbar.navbar-default) .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; }
}

/* ======================================================================
   №073 — шапка сайта: тонкая тёмная полоса, компактная строка с логотипом,
   поиск с кнопкой, липкое меню. Токены — из единого :root в начале файла (№116).
   ====================================================================== */

/* --- тонкая тёмная полоса --- */
.hf-topbar { background: var(--hf-dark); font-size: 13px; }
.hf-topbar-in {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  min-height: 36px;
}
/* hf-scale-ok gap 10px: шапка №073, вне объёма S13 */
.hf-topbar-left { display: flex; align-items: center; gap: 10px; }
.hf-tb-soc,
.hf-tb-app {
  display: inline-flex;
  align-items: center;
  opacity: .8;
  transition: opacity .18s ease;
}
.hf-tb-soc:hover,
.hf-tb-app:hover { opacity: 1; }
.hf-tb-soc img { width: 18px; height: 18px; }
.hf-tb-app img { height: 18px; width: auto; }
.hf-tb-sep { width: 1px; height: 16px; background: rgba(255, 255, 255, .16); }
.hf-tb-note { color: var(--hf-tb-note); }
.hf-tb-link { color: var(--hf-tb-link); }
/* №116: --hf-accent как цвет текста запрещён по умолчанию (1,96:1 на белом), но здесь
   фон тёмный (--hf-dark #2b2a27) — 7,32:1 AA, а --hf-accent-ink (рассчитан под светлый
   card) дал бы тут только 2,42:1 — провал AA. Осознанное исключение, не регресс.
   hf-accent-text-ok: топбар тёмный фон, 7,32:1 AA */
.hf-tb-link:hover,
.hf-tb-link:focus { color: var(--hf-accent); text-decoration: none; }

/* --- строка с логотипом, поиском и кнопками --- */
.hf-head {
  display: flex;
  align-items: center;
  gap: 24px;
  padding: 16px 0;
}
.hf-logo { flex: 0 0 auto; display: inline-flex; align-items: center; }
.hf-logo img { height: 40px; width: auto; max-width: none; display: block; }
.hf-search {
  /* №074: поиск тише логотипа — короче, ниже, без заливки */
  flex: 0 1 280px;
  width: 280px;
  max-width: 100%;
  display: flex;
  align-items: stretch;
  margin: 0;
  padding: 0;
  border: 1px solid var(--hf-line-soft);
  border-radius: var(--hf-r-ctl);
  background: transparent;
  overflow: hidden;
  transition: border-color .18s ease, background .18s ease, flex-basis .18s ease, width .18s ease;
}
.hf-search:hover { border-color: var(--hf-line); }
.hf-search:focus-within {
  flex-basis: 400px;
  width: 400px;
  border-color: var(--hf-line);
  background: #fff;
}
.hf-search .hf-search-input {
  flex: 1 1 auto;
  height: 34px;
  min-width: 0;
  padding: 0 12px;
  border: 0;
  background: transparent;
  box-shadow: none;
  font-size: 14px;
  color: var(--hf-ink);
  outline: none;
}
.hf-search .hf-search-input::-webkit-input-placeholder { color: var(--hf-soft); font-weight: 400; }
.hf-search .hf-search-input::placeholder { color: var(--hf-soft); font-weight: 400; }
.hf-search-btn {
  flex: 0 0 auto;
  width: 34px;
  height: 34px;
  padding: 0;
  border: 0;
  background: transparent;
  color: #a8a6a0;
  cursor: pointer;
  transition: color .18s ease;
}
.hf-search-btn:hover,
.hf-search:focus-within .hf-search-btn { color: var(--hf-link); }
.hf-search-btn svg { display: block; width: 16px; height: 16px; margin: 0 auto; }
/* hf-scale-ok gap 10px: шапка №073, вне объёма S13 */
.hf-head-act { margin-left: auto; display: flex; align-items: center; gap: 10px; }
.hf-head-act .hf-btn { font-size: 14px; }
/* hf-scale-ok padding 18px: шапка №073, вне объёма S13 */
.hf-btn-ghost {
  flex: 0 0 auto;
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0 18px;
  border: 1px solid var(--hf-line);
  border-radius: var(--hf-r-ctl);
  background: #fff;
  color: var(--hf-link);
  font-weight: 600;
  font-size: 14px;
  white-space: nowrap;
  transition: border-color .18s ease, color .18s ease;
}
.hf-btn-ghost:hover,
.hf-btn-ghost:focus {
  border-color: var(--hf-ink);
  color: var(--hf-ink);
  text-decoration: none;
}
/* №171: «пилюля» бейджа алертов залогиненного (шапка и мобильная .hf-mact). Раньше её давал
   сайтовый .badge из custom_bw.css; на форуме его больше нет, а core XF .badge другой (80%, radius 6px).
   Шрифт — var(--hf-font): на сайте IBM Plex, как было; на форуме Golos, как вся шапка (@font-face
   IBM Plex жил в custom_bw) — единственное допущенное расхождение в cbw-drop-gate.
   hf-scale-ok padding 3px 7px font-size 12px: значения сайтового .badge (custom_bw.css:4640), 1:1 */
.hf-head-act .badge,
.hf-mact .badge {
  display: inline-block;
  min-width: 10px;
  padding: 3px 7px;
  font-family: var(--hf-font);
  font-size: 12px;
  font-weight: 700;
  line-height: 1;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  vertical-align: baseline;
  white-space: nowrap;
  text-align: center;
  border-radius: 10px;
}
/* hf-scale-ok margin-left 6px: шапка №073, вне объёма S13 */
.hf-head-act .badge {
  margin-left: 6px;
  background: #fff;
  color: var(--hf-accent-ink);
}

/* --- меню: липкая полоса, ровные пункты, карточки выпадашек --- */
/* №165: ряд меню внутри .container имел свой margin (.row), padding
   (.navbar-collapse, .col-sm-12) — меню начиналось на 147 px вместо 130 и было
   уже контента форума. Боковые поля даёт только .container по общему стандарту. */
.navbar.navbar-default > .container > .row,
.navbar.navbar-default .navbar-collapse,
.navbar.navbar-default [class*="col-"] {
  margin-left: 0;
  margin-right: 0;
  padding-left: 0;
  padding-right: 0;
}
.navbar.navbar-default {
  position: -webkit-sticky;
  position: sticky;
  top: 0;
  z-index: 1030;
  margin-bottom: 0;
  border: 0;
  border-radius: 0;
  background: #fff;
  min-height: 0;
}
.navbar.navbar-default::before {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: 50%;
  width: 100vw;
  margin-left: -50vw;
  background: #fff;
  border-top: 1px solid var(--hf-line-soft);
  border-bottom: 1px solid var(--hf-line-soft);
  z-index: -1;
}
.navbar-default .navbar-nav > li > a {
  padding: 15px 14px;
  font-size: 14px;
  font-weight: 600;
  line-height: 18px;
  letter-spacing: .02em;
  color: var(--hf-ink);
  border-bottom: 2px solid transparent;
  transition: color .18s ease, border-color .18s ease;
}
.navbar-default .navbar-nav > li > a:hover,
.navbar-default .navbar-nav > li > a:focus,
.navbar-default .navbar-nav > .open > a,
.navbar-default .navbar-nav > .open > a:hover,
.navbar-default .navbar-nav > .open > a:focus {
  background-color: transparent;
  color: var(--hf-ink);
  border-bottom-color: var(--hf-accent);
}
.navbar-default .navbar-nav > li > a .caret { margin-left: 5px; opacity: .5; }
.navbar-default .navbar-nav .dropdown-menu {
  margin-top: 0;
  padding: 8px;
  border: 1px solid var(--hf-line-soft);
  border-radius: 12px;
  box-shadow: var(--hf-shadow-lift);
  min-width: 236px;
}
.navbar-default .navbar-nav .dropdown-menu > li > a {
  padding: 9px 12px;
  border-radius: 8px;
  font-size: 14px;
  color: var(--hf-link);
  white-space: normal;
}
.navbar-default .navbar-nav .dropdown-menu > li > a:hover,
.navbar-default .navbar-nav .dropdown-menu > li > a:focus {
  background: var(--hf-tint);
  color: var(--hf-ink);
}
.navbar-default .navbar-nav .dropdown-menu > .divider { margin: 6px 8px; background: var(--hf-line-soft); }


/* --- мобильная шапка (№075) --- */
@media (max-width: 767px) {
  /* полоса липнет к верху: лого слева, действия справа */
  .navbar.navbar-default {
    position: -webkit-sticky;
    position: sticky;
    top: 0;
    z-index: 1030;
    margin-bottom: 0;
    background: var(--hf-card);
    border-bottom: 1px solid var(--hf-line-soft);
  }
  .navbar.navbar-default::before { display: none; }
  /* №165: боковые поля — общие (--page-pad), здесь только позиционирование */
  .navbar.navbar-default > .container { position: relative; }

  /* hf-scale-ok padding 6px: шапка №073, вне объёма S13 */
  .hf-mhead {
    display: flex;
    align-items: center;
    gap: 4px;
    min-height: 56px;
    padding: 6px 0;
  }
  .hf-mlogo { flex: 0 1 auto; display: flex; align-items: center; min-width: 0; margin-right: auto; }
  .hf-mlogo img { height: 30px; width: auto; max-width: 100%; display: block; }
  /* hf-scale-ok gap 2px: шапка №073, вне объёма S13 */
  .hf-mact { flex: 0 0 auto; display: flex; align-items: center; gap: 2px; }

  .hf-mact .hf-micon,
  .hf-mhead .navbar-toggle {
    flex: 0 0 auto;
    width: 42px;
    height: 42px;
    margin: 0;
    padding: 0;
    border: 0;
    border-radius: var(--hf-r-ctl);
    background: transparent;
    color: var(--hf-ink);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 17px;
    position: relative;
  }
  .hf-mact .hf-micon:hover,
  .hf-mact .hf-micon:focus,
  .hf-mhead .navbar-toggle:hover,
  .hf-mhead .navbar-toggle:focus { background: var(--hf-tint); color: var(--hf-ink); }
  /* hf-scale-ok font-size 10px: шапка №073, вне объёма S13 */
  .hf-mact .hf-micon .badge {
    position: absolute;
    top: 4px;
    right: 4px;
    background: var(--hf-accent);
    color: var(--hf-dark);
    font-size: 10px;
    line-height: 14px;
    padding: 0 4px;
    min-width: 14px;
  }
  .hf-msearch-toggle[aria-expanded="true"] { background: var(--hf-tint); }

  /* три полоски бургера — в стопку, а не в строку */
  .hf-mhead .navbar-toggle {
    flex-direction: column;
    flex-wrap: nowrap;
  }
  .hf-mhead .navbar-toggle .icon-bar {
    display: block;
    width: 20px;
    height: 2px;
    border-radius: 1px;
    background: var(--hf-ink);
  }
  /* hf-scale-ok margin-top 5px: шапка №073, вне объёма S13 */
  .hf-mhead .navbar-toggle .icon-bar + .icon-bar { margin-top: 5px; }

  /* hf-scale-ok margin-left 2px: шапка №073, вне объёма S13 */
  .hf-mact .hf-btn.hf-mlogin {
    width: auto; /* перебиваем .hf-btn{width:100%} из медиа 620px — из-за неё шапку распирало вбок */
    min-height: 36px;
    padding: 0 12px;
    margin-left: 2px;
    font-size: 14px;
    white-space: nowrap;
  }

  /* строка поиска: раскрывается по тапу на лупу, на всю ширину шапки */
  /* hf-scale-ok padding 10px: шапка №073, вне объёма S13 */
  .hf-msearchbar { padding: 0 0 10px; }
  .hf-msearchbar .form-control {
    height: 42px;
    border: 1px solid var(--hf-line);
    border-radius: var(--hf-r-ctl);
    box-shadow: none;
    background: var(--hf-tint);
    font-size: 16px; /* iOS не зумит поле при фокусе */
  }
  .hf-msearchbar .form-control:focus {
    background: #fff;
    border-color: var(--hf-soft);
    box-shadow: none;
  }

  /* меню выпадает поверх контента, чтобы липкая полоса оставалась тонкой */
  .navbar-default .navbar-collapse {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    margin: 0;
    padding: 0;
    max-height: calc(100vh - 56px);
    overflow-y: auto;
    background: var(--hf-card);
    border-top: 1px solid var(--hf-line-soft);
    box-shadow: var(--hf-shadow-lift);
  }
  .navbar-default .navbar-collapse .row,
  .navbar-default .navbar-collapse .col-sm-12 { margin: 0; padding: 0; }
  .navbar-default .navbar-nav { margin: 0; }
  .navbar-default .navbar-nav > li > a {
    padding: 15px 16px;
    min-height: 50px;
    border-bottom: 1px solid var(--hf-line-soft);
  }
  .navbar-default .navbar-nav .open .dropdown-menu > li > a { padding: 13px 24px; min-height: 48px; }

  /* ничего не должно вылезать за ширину экрана */
  .hf-mhead, .hf-msearchbar, .navbar-default .navbar-collapse { max-width: 100%; }
  img, table { max-width: 100%; }
}

/* ===== минимум Bootstrap 3 для шапки/подвала до загрузки custom_bw.css (форум грузит его async).
   Дубль с custom_bw.css намеренный, декларации те же по смыслу, но текст не побайтный:
   здесь var(--page-w)/var(--page-pad) без fallback (:root с токенами — в этом же файле выше),
   в custom_bw.css — с fallback 1200px/10px на случай загрузки без hf.css. Cascade одинаковый. ===== */
/* №165: max-width + box-sizing вместо фиксированной width — вложенный .container
   (ряд рекламы внутри .p-body-inner форума) перестаёт выезжать за родителя. */
.container { box-sizing: border-box; width: 100%; max-width: var(--page-w); margin-right: auto; margin-left: auto; padding-left: var(--page-pad); padding-right: var(--page-pad); }
/* №165: вложенный .container удваивал боковые поля — контент секций сайта шёл
   по 140 px при полосах форума на 130. Поля даёт только внешний контейнер. */
.container .container { padding-left: 0; padding-right: 0; }
/* №167: ряд секций сайта. custom_bw.css задаёт .row margin-left:7px / margin-right:0, а у колонок
   padding-right:7px — секции главной шли 137…1303 при полосах 130…1310 (на 14 px уже). Гаттер колонок
   (7px справа) компенсируем отрицательным margin-right; левый край — по контейнеру. Специфичность
   (0,2,0) выше .row из custom_bw.css, порядок загрузки не важен; .row.openx и ряд меню
   (.navbar … > .row) заданы своими правилами и не затронуты. */
.container > .row { margin-left: 0; margin-right: -7px; }
.list-unstyled { padding-left: 0; list-style: none; }
.sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; }
.collapse:not(.in) { display: none; }
.dropdown-menu { display: none; }
.open > .dropdown-menu { display: block; }
.visible-xs-block { display: none !important; }
@media (max-width: 767px) { .hidden-xs { display: none !important; } .visible-xs-block { display: block !important; } }
@media (min-width: 768px) { .navbar-collapse.collapse { display: block !important; height: auto !important; overflow: visible !important; } }

/* ======================================================================
   №171 — форум больше не грузит custom_bw.css (решение владельца 21.09): он ломал
   штатный вид XF (html line-height, h1–h6, dt/dd, blockquote, label, input !important,
   `*{outline:none}`). То, что форуму из него было нужно, живёт здесь, в общем hf.css.
   Значения — ровно итоговые из custom_bw.css (гейт deploy-scripts/width/cbw-drop-gate.mjs:
   зоны шапки/Revive/подвала на форуме без custom_bw ≡ с ним). На сайте custom_bw.css
   по-прежнему грузится до hf.css и даёт те же значения — повтор здесь ничего не меняет.
   ====================================================================== */
/* input { border-radius: 5px } из custom_bw.css (normalize-блок) — поле поиска шапки */
.hf-search .hf-search-input { border-radius: 5px; }
/* button { cursor: pointer } (normalize) — лупа мобильной шапки */
.hf-micon { cursor: pointer; }
/* img { vertical-align: middle } — подвал и ряд Revive (шапка — в секции №168 выше) */
:where(.pf, .hf-revive) img { vertical-align: middle; }
/* a:hover { text-decoration: none !important } — в зонах сайта XF подчёркивал бы ссылки шапки
   при наведении. На форуме вне зон — штатное подчёркивание XF (цель №171). */
:where(.hf-topbar, .hf-head, .navbar.navbar-default, .hf-revive, .pf) a:hover { text-decoration: none !important; }

/* Revive (tv03.ru) — новые зоны D-left/D-right/M (№136 S15, ТЗ C.5 «вариант Б», стр. 247/327): один креатив
   3:1 на все устройства, резерв aspect-ratio 3/1 у каждого слота, <ins> заполняет asyncjs.php. Инлайн-скрипт
   main.php выбирает набор зон ДО загрузки asyncjs.php: зоны 6+7 (D-left/D-right, ≥768, по 555×185 —
   фиксированный формат креатива A3b) или зона 8 (M, <768, фиксированные 345×115 — см. медиа-запрос ниже).
   Класс на #hf-revive один — `.hf-revive`, счётчик слотов CSS не нужен (округление до 1/2 не влияет на
   flex-разметку). У темы `.container` реально 740/960/960/1200 БЕЗ padding (~1624), а не бутстраповские
   1170/970/750. Ширина ряда = ширина колонки контента на всех брейкпоинтах (решение владельца 18.09, №144,
   ТЗ H.0): ряд живёт в родном .container без расширения, креатив 3:1 масштабируется CSS. Слоты: 355×118 на
   768–991, 465×155 на 992–1599 (до №144 на 1200–1599 ряд расширялся до 1140 и был шире колонки 960),
   555×185 на ≥1600. flex вместо grid: item сжимается вместе с контейнером (меньше 555, без переполнения),
   на ≥1600 (container 1200 > 1140) лишнее место уходит в гаттер через space-between, внешние края слотов
   совпадают с краями колонки, слот сверх 555 не растёт (бюджет высоты первого экрана 185). */
.hf-adslot--revive { margin: var(--hf-sp-1) 0 var(--hf-sp-3); } /* S13: было 6/10, сумма та же */
/* hf-scale-ok gap 30px: гаттер Revive-ряда — арифметика ТЗ 2×555+30=1140, не ритм-токен */
.hf-revive {
  display: flex;
  gap: 30px;
  align-items: flex-start;
  justify-content: space-between; /* 2 слота (≥768): внешние края к краям контейнера, а не к левому краю строки */
}
.hf-revive-slot { flex: 0 1 555px; max-width: 555px; width: 100%; aspect-ratio: 3 / 1; }
.hf-revive-slot ins { display: block; width: 100%; height: 100%; text-decoration: none; }
.hf-revive-slot img { display: block; width: 100%; height: auto; }
@media (max-width: 767px) {
  /* ТЗ стр. 247/327: «< 768 — одно место 345×115», размер задаёт CSS, не растёт с вьюпортом (правка
     ревью №136 round 2 — было padding:0 15px без ограничения ширины слота, давало 345/360/398/737
     на 375/390/428/767 вместо фиксированных 345). Слот — max-width:345, flex-shrink остаётся (flex: 0 1 345px),
     аспект 3/1 держит высоту 115 при любой ширине ≤ 345. justify-content:center — слот по центру строки, а не
     прижат к левому краю (на 586–767 при старом max-width:555 упирался в 555 и оставлял пустоту справа).
     padding 15px — не голый безопасный отступ «как у остальной темы» (у .hf-news-grid/.hf-ncard на мобиле
     полей нет вовсе, это другой блок), а точный расчёт под 375: 375-345=30, по 15 с каждой стороны, слот
     садится ровно в размер без остатка. На 320 — 320-30=290 < 345, flex-shrink ужимает слот до 290×97 —
     тоже допустимо (ТЗ фиксирует верхнюю границу, не нижнюю). */
  /* №165: боковое поле даёт единый контейнер страницы (--page-pad = 10px, как на проде),
     своего у ряда нет — два поля подряд сжали бы слот (375-2*10-2*15=325 вместо 345).
     Контент на 375 — 355, слот остаётся 345 по центру, как в ТЗ. */
  .hf-revive { justify-content: center; }
  .hf-revive-slot { flex: 0 1 345px; max-width: 345px; }
}
