* { box-sizing: border-box; }

/* прячет корневой <main id="app" v-cloak> до тех пор, пока Vue не
   смонтирует приложение — без этого браузер на долю секунды успевает
   отрисовать сырую разметку до обработки v-if/{{ }} (например голый текст
   "{{ error }}" внутри видимого .error), Vue снимает атрибут v-cloak
   автоматически сразу после монтирования */
[v-cloak] { display: none; }

/* общая ширина контента шапки и main — одна переменная, чтобы не менять
   в двух местах и не рассинхронизировать (см. .header-inner и main) */
:root { --content-width: 1200px; }

/* flex-колонка на всю высоту вьюпорта — чтобы .site-footer всегда
   прижимался к низу экрана (не "под контентом", а именно к низу), даже
   на коротких страницах вроде stats.html; main растягивается (flex-grow),
   header/footer остаются своего естественного размера */
body {
    margin: 0;
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    font-family: -apple-system, Segoe UI, Roboto, Arial, sans-serif;
    background: #14161a;
    color: #e8e8e8;
}

/* базовый стиль ссылок — без стандартного синего, чуть жирнее обычного
   текста для заметности; подчёркивание появляется только при наведении.
   Более специфичные правила (header .logo, header nav a, .card a) ниже
   по-прежнему выигрывают там, где нужен свой цвет. */
a {
    color: inherit;
    text-decoration: none;
    font-weight: 600;
}

a:hover {
    text-decoration: underline;
}

header {
    background: linear-gradient(180deg, #20242c 0%, #1a1d23 100%);
    border-bottom: 1px solid #2a2e37;
    box-shadow: 0 2px 16px rgba(0, 0, 0, 0.3);
    position: sticky;
    top: 0;
    /* без z-index позиционированные элементы (в т.ч. иконки флагов .fi
       из flag-icons — у них position:relative) складываются по порядку
       в DOM и перекрывают sticky-шапку при скролле, хотя она визуально
       должна быть поверх всего остального контента */
    z-index: 100;
}

/* та же ширина/центрирование, что и у main — чтобы шапка визуально
   выравнивалась с таблицами на странице, а не была просто "во всю ширину".
   position:relative нужен, чтобы <nav> ниже мог центрироваться абсолютно
   именно внутри этой ширины, а не всей шапки во весь экран. */
.header-inner {
    position: relative;
    max-width: var(--content-width);
    margin: 0 auto;
    display: flex;
    align-items: center;
    padding: 26px 24px;
}

/* логотип остаётся слева (первый flex-элемент .header-inner), меню —
   абсолютно по центру ВСЕЙ шапки (а не центру оставшегося после лого
   места — иначе смещалось бы вправо из-за ширины самого лого), поэтому
   position:absolute + translate, а не flex-соседство с лого */
.header-inner nav {
    position: absolute;
    left: 56%;
    top: 50%;
    transform: translate(-50%, -50%);
    display: flex;
    align-items: center;
    gap: 60px;
}

/* логотип — тот же восьмиугольник с точкой, что в favicon.svg, inline
   (не <img src="favicon.svg">), чтобы красился тем же золотым, что и
   остальной акцентный цвет шапки, без похода за отдельным файлом */
header .logo {
    display: flex;
    align-items: center;
    gap: 10px;
    font-weight: 700;
    font-size: 1.8em;
    letter-spacing: 0.01em;
    color: #e8b23d;
    text-decoration: none;
}
header .logo:hover { text-decoration: none; }
header .logo-mark { flex: none; display: block; }

header nav a {
    position: relative;
    color: #b7bcc7;
    text-decoration: none;
    font-size: 1.15em;
    padding-bottom: 6px;
    transition: color 0.15s ease;
}

header nav a:hover {
    color: #fff;
    text-decoration: none;
}

/* подсветка текущей страницы — золотая полоска под пунктом меню, тот же
   акцентный цвет, что у логотипа/favicon; класс расставлен вручную в
   каждом *.html (общего layout-компонента на сайте нет — см. комментарий
   "no build step" в CLAUDE.md) */
header nav a.nav-current {
    color: #e8b23d;
}
header nav a.nav-current::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: -4px;
    height: 2px;
    border-radius: 2px;
    background: #e8b23d;
}

main {
    max-width: var(--content-width);
    margin: 0 auto;
    padding: 24px;
    width: 100%;
    flex: 1 0 auto;
}

/* подвал — тот же лого-мотив и акцентный золотой, что в шапке, плюс
   краткий список источников данных (отражает реальную архитектуру
   пайплайна — см. "Четыре независимых скрапера" в CLAUDE.md), а не
   просто пустая decorative-плашка */
.site-footer {
    flex: none;
    margin-top: 48px;
    border-top: 1px solid #2a2e37;
    background: #16181d;
}

.footer-inner {
    max-width: var(--content-width);
    margin: 0 auto;
    padding: 28px 24px 32px;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 16px;
    text-align: center;
}

.footer-brand {
    display: flex;
    align-items: center;
    gap: 8px;
    font-weight: 700;
    font-size: 1.1em;
    color: #e8b23d;
}

.footer-nav {
    display: flex;
    gap: 28px;
    flex-wrap: wrap;
    justify-content: center;
}

.footer-nav a {
    color: #7d8591;
    text-decoration: none;
    font-size: 0.95em;
    font-weight: 500;
}

.footer-nav a:hover {
    color: #fff;
    text-decoration: none;
}

.footer-sources {
    color: #6b7280;
    font-size: 0.82em;
    max-width: 560px;
}

h1 { font-size: 1.6em; margin-bottom: 8px; }
h2 { font-size: 1.2em; color: #b7bcc7; font-weight: 500; }

.collapse-arrow { font-size: 0.7em; color: #9aa0ab; margin-left: auto; }

/* Fight History / Rank History на fighter.html — переключаемые вкладки
   (одна активна за раз), а не два независимых спойлера. Тот же визуальный
   язык активного состояния, что у .page-number.active (сплошная золотая
   заливка) — самое узнаваемое "активно" на сайте */
.section-tabs {
    display: flex;
    gap: 8px;
    margin-top: 16px;
    margin-bottom: 16px;
}
.section-tab {
    font-size: 1em;
    font-weight: 500;
    color: #b7bcc7;
}
.section-tab.active {
    background: #e8b23d;
    border-color: #e8b23d;
    color: #14161a;
    font-weight: 700;
    cursor: default;
}

input[type="text"] {
    width: 100%;
    max-width: 420px;
    padding: 10px 14px;
    border-radius: 8px;
    border: 1px solid #2a2e37;
    background: #1c1f26;
    color: #fff;
    font-size: 1em;
}

/* крестик сброса текста в поле поиска бойцов — поверх input, показывается
   только когда есть что стирать (v-if="search") */
.search-wrap {
    position: relative;
    width: 100%;
    max-width: 420px;
}
.search-wrap input[type="text"] {
    max-width: none;
    padding-right: 34px;
}
.search-clear {
    position: absolute;
    top: 50%;
    right: 6px;
    transform: translateY(-50%);
    width: 24px;
    height: 24px;
    padding: 0;
    border: none;
    background: transparent;
    color: #9aa0ab;
    font-size: 1.3em;
    line-height: 1;
    cursor: pointer;
    border-radius: 4px;
}
.search-clear:hover { color: #e8b23d; }

.filters-row {
    display: flex;
    gap: 12px;
    flex-wrap: wrap;
}

.results-count {
    margin-top: 8px;
    font-size: 0.85em;
    color: #9aa0ab;
}

select {
    padding: 10px 14px;
    border-radius: 8px;
    border: 1px solid #2a2e37;
    background: #1c1f26;
    color: #fff;
    font-size: 1em;
}

/* кнопка "Фильтры" + выпадающая панель на index.html (страна, диапазоны
   кол-ва боёв/побед/поражений) — визуально как раскрытый select: карточка
   с тенью, всплывающая под кнопкой, а не отдельная секция страницы */
.filters-dropdown-wrap { position: relative; }

/* та же высота, что у поля поиска рядом (40px) — точным padding не
   попасть из-за разной line-height у input/button, поэтому фиксируем
   height явно */
.filters-btn { display: flex; align-items: center; gap: 8px; padding: 10px 14px; height: 40px; }
.filters-btn.active { border-color: #e8b23d; }
/* пока без панели фильтров (events.html) — кнопка присутствует для
   единообразия со страницей бойцов, но явно показывает, что неактивна */
.filters-btn:disabled { opacity: 0.5; cursor: not-allowed; }

.filters-count {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 18px;
    height: 18px;
    padding: 0 5px;
    border-radius: 9px;
    background: #e8b23d;
    color: #14161a;
    font-size: 0.75em;
    font-weight: 700;
}

.filters-panel {
    position: absolute;
    top: calc(100% + 8px);
    left: 0;
    z-index: 50;
    width: 340px;
    background: #1c1f26;
    border: 1px solid #2a2e37;
    border-radius: 10px;
    padding: 16px;
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
    display: flex;
    flex-direction: column;
    gap: 14px;
}

.filters-panel-field { display: flex; flex-direction: column; gap: 6px; }
.filters-panel-field label { font-size: 0.85em; color: #9aa0ab; }
.filters-panel-field select { width: 100%; }

/* кнопка "Сортировка" на events.html — визуально тот же .filters-btn, что
   у "Фильтры" рядом, и та же pending-схема (Применить/Сбросить); без
   подписи "Сортировать по" — select (тот же вид, что у "Страна" в
   фильтрах) и кнопка-стрелка направления стоят в одну строку */
.sort-panel { width: 320px; }
.sort-field-row { display: flex; gap: 8px; }
/* min-width: 0 обязателен — без него flex-элемент не сжимается уже своего
   контента (min-width: auto по умолчанию), и длинные подписи вроде
   "Кол-во нокаутов" вылезали за рамки панели вместе с кнопкой-стрелкой */
.sort-field-row select { flex: 1; width: auto; min-width: 0; }

/* одна кнопка-стрелка вместо пары "Возрастание"/"Убывание" с подписями —
   просто иконка ↑/↓, меняется в зависимости от pendingSortDir */
.sort-dir-btn {
    flex: none;
    width: 40px;
    padding: 0;
    border-radius: 8px;
    border: 1px solid #2a2e37;
    background: #14161a;
    color: #d7dae0;
    font-size: 1.1em;
    cursor: pointer;
}
.sort-dir-btn:hover { border-color: #e8b23d; color: #e8b23d; }

/* чекбокс "Чемпион" в спойлере "Карьера" — обычный <label> с флажком
   вместо слайдера, тот же приглушённый цвет текста, что у остальных
   подписей полей панели */
/* несколько чекбоксов в один ряд, а не друг под другом (каждый
   .filters-checkbox-label сам по себе flex-контейнер только для своей
   galочки+текста, но соседние лейблы — обычные блочные соседи, без этой
   обёртки встают каждый на свою строку) — сейчас только у наград вечера
   на fights.html, где это уместно (4 коротких кода FN/PN/SN/KN) */
.filters-checkbox-row {
    display: flex;
    flex-wrap: wrap;
    gap: 4px 16px;
}

.filters-checkbox-label {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 0.9em;
    color: #d7dae0;
    cursor: pointer;
}
/* свой чекбокс вместо нативного accent-color — тот держит один цвет сразу
   на фон И галочку, а нужен серый фон (в цвет остальных элементов сайта,
   тот же #2a2e37, что у .record-badge-nc/.fighter-row img) с золотой
   галочкой отдельно; appearance:none снимает системный вид, галочка
   нарисована уголком border ::after, повёрнутым на 45° */
.filters-checkbox-label input[type="checkbox"] {
    appearance: none;
    -webkit-appearance: none;
    width: 16px;
    height: 16px;
    margin: 0;
    border-radius: 4px;
    border: 1px solid #454b57;
    background: #2a2e37;
    cursor: pointer;
    position: relative;
    flex: none;
}
.filters-checkbox-label input[type="checkbox"]:hover { border-color: #5a616f; }
.filters-checkbox-label input[type="checkbox"]:checked {
    border-color: #e8b23d;
}
.filters-checkbox-label input[type="checkbox"]:checked::after {
    content: "";
    position: absolute;
    left: 5px;
    top: 2px;
    width: 4px;
    height: 8px;
    border: solid #e8b23d;
    border-width: 0 2px 2px 0;
    transform: rotate(45deg);
}
/* "Порядок бойцов не важен" на fights.html — задизейблен, пока не выбрана
   ни одна из двух стран (canToggleIgnoreOrder), иначе бессмысленный
   фильтр: нечему меняться местами. cursor:not-allowed и на самом лейбле
   (.muted уже гасит текст через JS-класс), не только на чекбоксе — иначе
   клик рядом с галочкой (но по тексту) выглядел бы кликабельным */
.filters-checkbox-label.muted { cursor: not-allowed; }
.filters-checkbox-label input[type="checkbox"]:disabled {
    cursor: not-allowed;
    opacity: 0.5;
}
.filters-checkbox-label input[type="checkbox"]:disabled:hover { border-color: #454b57; }

/* спойлер "Бои" в панели фильтров — сворачивает кол-во боёв/побед/поражений,
   чтобы не растягивать панель по умолчанию; тот же принцип, что у
   .collapsible-heading (история боёв на fighter.html), но по размеру шрифта
   как обычный <label> в этой панели, а не h2 */
.filters-spoiler-heading {
    display: flex;
    align-items: center;
    gap: 6px;
    font-size: 0.85em;
    color: #9aa0ab;
    cursor: pointer;
    user-select: none;
    margin-top: -6px;
}
.filters-spoiler-heading:hover { color: #e8b23d; }

/* жёлтая точка рядом с названием спойлера — внутри уже настроен фильтр,
   даже пока сам спойлер свёрнут (см. hasStatsFilters/hasCareerFilters/
   hasAnthroFilters в fighters.js) */
.filters-spoiler-dot {
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: #e8b23d;
    flex-shrink: 0;
}

/* двухсторонний слайдер годов дебюта/последнего боя — САМОДЕЛЬНЫЙ, не два
   наложенных input[type=range] (это ломало запрет пересечения ползунков —
   см. onThumbDown/onThumbMove в fighters.js). Ползунок — просто <div> с
   position:absolute и left:X%, позиция считается из pointer-события вручную */
.range-slider { position: relative; height: 20px; margin-top: 6px; }

.range-slider-track {
    position: absolute;
    top: 50%;
    left: 0;
    right: 0;
    height: 4px;
    background: #2a2e37;
    border-radius: 2px;
    transform: translateY(-50%);
}

.range-slider-fill {
    position: absolute;
    top: 50%;
    height: 4px;
    background: #e8b23d;
    border-radius: 2px;
    transform: translateY(-50%);
}

.range-slider-thumb {
    position: absolute;
    top: 50%;
    width: 16px;
    height: 16px;
    margin-left: -8px;
    border-radius: 50%;
    background: #e8b23d;
    border: 2px solid #14161a;
    cursor: pointer;
    transform: translateY(-50%);
    /* touch-action:none — иначе на тачскрине перетаскивание ползунка
       конфликтует со скроллом страницы вместо того, чтобы двигать сам
       ползунок */
    touch-action: none;
}
.range-slider-thumb:focus-visible { outline: 2px solid #e8b23d; outline-offset: 2px; }

/* при равных значениях (min=max) оба центрируются в одну точку — сдвигаем
   их в разные стороны от неё на 4px (половина ширины кружка), чтобы даже
   тогда каждый оставался наполовину открытым и его можно было снова
   схватить, а не только тот, что оказался сверху по z-index. На реальную
   выбранную дату это не влияет — координата для перетаскивания считается
   от track, а не от текущего визуального центра ползунка */
.range-slider-thumb-min { margin-left: -12px; z-index: 1; }
.range-slider-thumb-max { margin-left: -4px; z-index: 2; }

.range-slider-values {
    display: flex;
    justify-content: space-between;
    margin-top: 6px;
    font-size: 0.85em;
    color: #9aa0ab;
}

/* слайдер "Серии" — один ползунок, 0 всегда строго по центру (домен
   симметричный, [-N, N], см. streakSlider в fighters.js), число подписано
   НАД самим ползунком и двигается вместе с ним (та же left:X%, что и у
   .range-slider-thumb) — margin-top на .range-slider-with-value освобождает
   место сверху под эту подпись, под слайдером — только статичные подписи
   направлений ("Поражения"/"Победы"), не меняющиеся числа */
.range-slider-with-value { margin-top: 26px; }
.streak-value {
    position: absolute;
    top: -21px;
    transform: translateX(-50%);
    white-space: nowrap;
    font-size: 1em;
    font-weight: 700;
    /* серый по умолчанию — только 0 (фильтр не активен), ни красный, ни
       зелёный ниже сюда не подходят */
    color: #9aa0ab;
}
/* приглушённее, чем стандартные .result-win/.record-badge-win зелёный/
   красный — этой цифре не нужно бросаться в глаза так же ярко */
.streak-value.streak-positive { color: #439a46; }
.streak-value.streak-negative { color: #c24d4d; }

/* подпись направления ("Поражения"/"Победы") под слайдером — жирным и
   обычным цветом текста, когда ползунок смещён в её сторону, вместо
   минуса перед числом у поражений (см. .streak-value выше — там теперь
   всегда положительное число, Math.abs) */
.streak-side-active { font-weight: 700; color: #e8e8e8; }

.filters-panel-actions {
    display: flex;
    justify-content: space-between;
    gap: 10px;
    margin-top: 4px;
}
.filters-reset { flex: 1; }
.filters-apply {
    flex: 1;
    background: #e8b23d;
    border-color: #e8b23d;
    color: #14161a;
    font-weight: 700;
}

.card {
    position: relative;
    background: #1c1f26;
    border: 1px solid #2a2e37;
    border-radius: 10px;
    /* слева чуть больше, чем справа/сверху/снизу — освобождает место под
       card-badge, чтобы у точки был одинаковый отступ и от края карточки,
       и от контента справа (см. .card-badge и .fighter-list-header ниже,
       где отступ слева увеличен на столько же, чтобы шапка не съехала) */
    padding: 16px 16px 16px 24px;
    margin-bottom: 12px;
}

/* точка-маркер лучшего боя карьеры (см. fighterBadgeClass в fighters.js) —
   слева от карточки бойца на index.html, внутри её левого поля (не
   вылезает за границу карточки). Тот же принцип, что у точек весовых
   (.wc-dot) — закрашенная, если лучший бой этого уровня выигран, контурная,
   если нет; без свечения, цвет уровня виден напрямую через саму точку */
.card-badge {
    position: absolute;
    left: 7px;
    top: 50%;
    transform: translateY(-50%);
    width: 10px;
    height: 10px;
    border-radius: 50%;
    border: 2px solid currentColor;
    background: transparent;
    cursor: help;
}
.card-badge.filled { background: currentColor; }

.card-badge-title { color: #e8b23d; }
.card-badge-title-minor { color: #b89a5e; }
.card-badge-main-event { color: #4caf50; }
.card-badge-co-main { color: #a5d6a7; }
.card-badge-main-card { color: #4a90d9; }
.card-badge-prelim { color: #9aa0ab; }

.card a { color: inherit; text-decoration: none; }
.card:hover { border-color: #e8b23d; }

.opponent-thumb {
    width: 62px;
    height: 62px;
    border-radius: 8px;
    object-fit: cover;
    background: #2a2e37;
    display: block;
}

.fighter-row {
    display: flex;
    align-items: center;
    gap: 11px;
}

.fighter-row-main {
    display: flex;
    align-items: center;
    gap: 14px;
    /* фиксированная ширина — иначе колонка точек весовых съезжает в
       сторону в зависимости от длины конкретного имени. 280px — с
       запасом под самое длинное имя в базе ("Elizeu Zaleski dos Santos") */
    flex: 0 0 280px;
    min-width: 0;
}

.fighter-row img {
    width: 48px;
    height: 48px;
    border-radius: 8px;
    object-fit: cover;
    background: #2a2e37;
}

.fighter-name { font-weight: 600; }
.fighter-nickname { color: #9aa0ab; font-size: 0.9em; }

/* постер турнира на events.html — вдвое крупнее обычного фото бойца
   (96px вместо 48px), поэтому отдельный класс с более специфичным
   селектором, а не правка .fighter-row img (та осталась бы общей и для
   index.html/fighter.html) */
.fighter-row-main img.event-poster-img {
    width: 96px;
    height: 96px;
    border-radius: 16px;
}

/* колонка названия турнира на events.html шире, чем у .fighter-row-main
   по умолчанию (280px, рассчитан под 48px-фото бойца + его имя) — из-за
   вдвое более крупного постера (96px) там оставалось слишком мало места
   под текст и названия турниров переносились на 2-3 строки почти всегда.
   .event-name-col — второй класс (не замена .fighter-row-main), чтобы
   сама .fighter-row-main осталась общей с index.html/fighter.html */
.fighter-row-main.event-name-col { flex: 0 0 480px; }
.fighter-list-header-name.event-name-col { flex: 0 0 480px; }

/* рекорд карьеры (W-L-D-NC) справа в строке списка бойцов — тот же цвет,
   что и у исхода конкретного боя в истории (.result-win/.result-loss/...),
   просто переиспользуем те классы. Фиксированная ширина (4 * 30px значков +
   3 * 8px gap) — иначе у шапки (там просто слово "Record", узкое) остаётся
   больше "свободного" места перед ней, чем у настоящего ряда значков, и
   колонка перед ней съезжает относительно шапки (см. .fighter-list-header-
   record). margin-left:auto — весь оставшийся зазор строки собирается
   перед этой колонкой, поэтому она всегда прижата к правому краю */
.fighter-record {
    display: flex;
    justify-content: flex-end;
    gap: 5px;
    flex: 0 0 144px;
    /* margin-left: auto здесь раньше собирал весь остаток строки — теперь
       эту роль взял на себя .fighter-rank-badges (следующая колонка перед
       этой) */
    margin-left: 5px;
}

/* точки-индикаторы формы (последние 5 боёв, от старого к новому слева
   направо) — третья строка внутри .fighter-dates, под Last/First, тот же
   размер точки, что у весовых (.wc-dot), но всегда закрашены (исход уже
   известен, не "дрался/не дрался"); центрируются наравне с датами через
   align-items:center родителя */
.fighter-last-fights {
    display: flex;
    justify-content: flex-start;
    gap: 5px;
    /* ширина ~ строки "First: YYYY-MM-DD" (самой длинной из двух дат выше,
       "First:" на 1 символ длиннее "Last:") — блок центрируется наравне с
       датами (align-items:center родителя), а точки внутри него прижаты
       влево, поэтому левый край точек совпадает с левым краем текста
       "First:", а не с краем всей 150px-колонки */
    width: 112px;
    /* дополнительный отступ поверх общего gap:4px у .fighter-dates — только
       перед этой строкой, между Last/First он не меняется */
    margin-top: 4px;
    /* небольшой сдвиг вправо от левого края текста "First:" */
    margin-left: 5px;
}

.form-dot {
    width: 10px;
    height: 10px;
    /* скруглённый квадрат, не круг — та же пропорция скругления, что у
       .record-badge (25px/7px) и чекбокса фильтра "Чемпион" (16px/4px) */
    border-radius: 3px;
    cursor: help;
}

/* та же палитра, что у .record-badge-*, но прозрачность посередине между
   приглушённой (0.4/0.35) и полностью непрозрачной (1) версиями */
.form-dot-win { background: rgba(76, 175, 80, 0.7); }
.form-dot-loss { background: rgba(224, 86, 86, 0.7); }
.form-dot-draw { background: rgba(74, 144, 217, 0.7); }
.form-dot-nc { background: rgba(154, 160, 171, 0.675); }

/* сетка 15 весовых категорий рядом с именем (см. .weight-class-slide на
   fighter.html — тот же принцип и порядок, тут просто точки без цифр и
   компактнее). Закрашенная точка (filled) — боец дрался в этой весовой,
   контурная (только border, background прозрачный) — не дрался */
.wc-dots {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    /* фиксированная ширина — сама сетка точек намного уже слова "Weight
       Classes" в шапке; без этого колонки правее (Career/Record) сдвигались
       бы в зависимости от того, чьей ширины (точек или текста подписи)
       здесь на самом деле больше. justify-content:center — чтобы точки
       внутри этой ширины стояли по центру, под centered-подписью в шапке,
       а не прижимались к левому краю */
    flex: 0 0 130px;
}

.wc-dots-main {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    grid-template-rows: repeat(3, 1fr);
    gap: 3px;
}

.wc-dots-side {
    display: flex;
    flex-direction: column;
    gap: 3px;
}

.wc-dot {
    width: 10px;
    height: 10px;
    border-radius: 50%;
    border: 1px solid currentColor;
    background: transparent;
}

.wc-dot.filled { background: currentColor; }

.wc-dot-pink { color: #e0629e; }
.wc-dot-blue { color: #4a90d9; }
.wc-dot-gray { color: #9aa0ab; }

/* тот же виджет точек весовых, но в панели фильтров — кликабельный (выбор
   фильтра, а не "дрался/не дрался"), поэтому без унаследованной от карточек
   бойцов flex: 0 0 130px (та ширина держала колонку под centered-шапкой
   таблицы, тут просто содержимое одного поля панели) и покрупнее для
   удобного клика */
.wc-dots-filter { flex: none; justify-content: flex-start; }
.wc-dots-filter .wc-dot {
    width: 14px;
    height: 14px;
    cursor: pointer;
}
.wc-dots-filter .wc-dot:hover { opacity: 0.7; }

/* даты первого/последнего боя — друг под другом, фиксированная ширина
   (формат даты всегда одной длины), чтобы шапка "Career" встала ровно
   над колонкой */
.fighter-dates {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
    flex: 0 0 150px;
    font-size: 0.9em;
    color: #7d838d;
}
.fighter-date-label { color: #7d838d; }

/* клик по дате First/Last ведёт на страницу турнира (см. goToEvent в
   fighters.js) — курсор и подсветка при наведении как явная подсказка,
   что это кликабельно, а не просто текст */
.fighter-date-link { cursor: pointer; }
.fighter-date-link:hover { color: #e8b23d; }
.fighter-date-link:hover .fighter-date-label { color: #e8b23d; }
.fighter-list-header-dates { flex: 0 0 150px; text-align: center; }
.fighter-list-header-wc { flex: 0 0 130px; text-align: center; }

/* рост/размах рук — стиль один в один с .fighter-dates (Career) выше,
   просто отдельная колонка после неё. Ширина уже, чем у Career (125 вместо
   150) — короткого заголовка "Vitals" и самих строк "Height: NNN cm" для
   этого хватает с запасом, а колонок на строке уже 7 (добавился Rank),
   каждый лишний px тут считается, чтобы Record не выезжал за карточку */
.fighter-anthro {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    flex: 0 0 125px;
}
.fighter-list-header-anthro { flex: 0 0 125px; text-align: center; }

/* два квадрата Height/Reach в стиле .stat-cell-full (турниры/боец) —
   число крупно в центре, приглушённая подпись под ним — но отдельный,
   более мелкий класс: .stat-cell-full рассчитан на квадратный виджет
   130-150px, тут же колонка списка бойцов всего 125px на ОБА квадрата
   сразу, обычный .stat-cell-full туда не влез бы */
.fighter-vitals-cell {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    width: 58px;
    height: 46px;
    flex-shrink: 0;
    background: #1c1f26;
    border: 1px solid rgba(255, 255, 255, 0.05);
    border-radius: 8px;
}
.fighter-vitals-num { font-size: 0.95em; font-weight: 700; line-height: 1; color: #a9adb5; }
.fighter-vitals-label { font-size: 0.52em; color: #9aa0ab; text-transform: uppercase; margin-top: 3px; white-space: nowrap; }

/* награды вечера бойца за карьеру — между Anthropometrics и Record, все 4
   (если есть) друг под другом. Сама метка (.fighter-bonus-badge) — та же
   палитра/форма, что у .bonus-badge на странице бойца (золотой овал), но
   шире и с текстом "PN ×N" вместо голого кода — там ширина фиксирована под
   2 буквы, здесь ещё и число */
.fighter-bonuses {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
    flex: 0 0 70px;
    margin-left: 5px;
}
.fighter-list-header-bonuses { flex: 0 0 70px; margin-left: 5px; text-align: center; }

/* RANK — официальный рейтинг UFC (ufcalendar.com), между Bonuses и Record —
   овалы в стиле Bonuses (.fighter-bonus-badge), по одному на каждый
   дивизион из f.rankings, друг под другом (та же раскладка, что у
   .fighter-bonuses, просто шире — текст длиннее "PN ×N"). margin-left:
   auto — та же роль, что раньше была у .fighter-record (см. комментарий
   там) — собирает весь остаток строки перед этой колонкой, Record после
   неё сдвинут уже своим обычным маленьким отступом */
.fighter-rank-badges {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
    flex: 0 0 130px;
    margin-left: auto;
}
.fighter-list-header-rank { flex: 0 0 130px; margin-left: auto; text-align: center; }

/* тот же приём (сплошная заливка + тёмный текст), что у золотого
   .fighter-bonus-badge — здесь только своя заливка на категорию
   дивизиона: розовый (женский), синий (мужской), золотой (P4P, тот же
   акцент, что и у наград вечера/чемпионских точек графика на fighter.html).
   Цвет категории — CSS-переменная (--rank-badge-color), а не только
   background напрямую — нужна отдельно для .fighter-rank-badge-outline
   ниже (тот же цвет, но контуром, без заливки) */
.fighter-rank-badge {
    display: inline-block;
    padding: 1px 6px;
    border-radius: 6px;
    background: var(--rank-badge-color);
    color: #14161a;
    font-size: 0.62em;
    font-weight: 700;
    line-height: 1.3;
    white-space: nowrap;
    cursor: help;
}
.fighter-rank-badge-women { --rank-badge-color: #e0629e; }
.fighter-rank-badge-men { --rank-badge-color: #4a90d9; }
.fighter-rank-badge-p4p { --rank-badge-color: #e8b23d; }

/* боец когда-то был в этом дивизионе (Best заполнен), но сейчас не
   ранжирован (current_position === null) — тот же цвет, но контуром без
   заливки, чтобы сразу отличить от актуальных мест. Кант тонкий (1px) —
   на auto-размере inline-block он чуть увеличивает сам овал (на толщину
   канта), но настолько незаметно, что подгонять padding под это не нужно */
.fighter-rank-badge-outline {
    background: transparent;
    border: 1px solid var(--rank-badge-color);
    color: var(--rank-badge-color);
}

.fighter-bonus-badge {
    display: inline-block;
    padding: 1px 5px;
    border-radius: 6px;
    background: #e8b23d;
    color: #14161a;
    font-size: 0.62em;
    font-weight: 700;
    line-height: 1.3;
    white-space: nowrap;
    cursor: help;
}

.record-badge {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 25px;
    height: 25px;
    border-radius: 7px;
    font-size: 1em;
    font-weight: 700;
    color: #b7bcc7;
    cursor: help;
}

.record-badge-win { background: rgba(76, 175, 80, 0.4); }
.record-badge-loss { background: rgba(224, 86, 86, 0.4); }
.record-badge-draw { background: rgba(74, 144, 217, 0.4); }
.record-badge-nc { background: rgba(154, 160, 171, 0.35); }

/* Decision/Draw в блоке "Results" на events.html — НЕ переиспользуют
   .record-badge-draw/.record-badge-nc (те заняты своим смыслом — рекорд
   W-L-D-NC бойца на index.html), у Decision свой синий (тот же тон, что
   у .record-badge-draw, просто отдельный класс с другим значением),
   у Draw — новый фиолетовый (NC внизу справа переиспользует обычный
   .record-badge-nc — там смысл тот же, No Contest) */
.record-badge-decision { background: rgba(74, 144, 217, 0.4); }
.record-badge-event-draw { background: rgba(156, 89, 209, 0.45); }
.record-badge-dq { background: rgba(214, 129, 46, 0.4); }

/* блок "Fights" на events.html (состав карда турнира) — один большой
   значок "всего боёв" в фирменном золотом цвете сайта — тот же #e8b23d,
   что у логотипа UFC-HUB в шапке (.record-badge-xl, 58x58) — и рядом сетка
   2х2 из отдельных скруглённых квадратов с зазором между собой
   (.event-fight-grid, 27x27 каждый + gap:4px — footprint сетки (58x58)
   специально подогнан под размер большого квадрата):
       [золотой — основной титул]   [зелёный — main card]
       [бледно-золотой — интерим]   [серый — prelim/postlim]
   title/title-minor — те же 2 оттенка золота, что у card-badge-title/
   card-badge-title-minor, просто приглушённые rgba-версии (как и остальные
   .record-badge-*); maincard — тот же зелёный, что у win; prelim — серый.
   Значок total (.record-badge-brand) — без заливки, только тонкий белый
   контур (чтобы визуально не сливаться ни с одним из 4 маленьких значков
   и при этом не добавлять ещё один сплошной цвет) */
.record-badge-xl {
    width: 58px;
    height: 58px;
    border-radius: 14px;
    font-size: 1.3em;
}
.record-badge-brand {
    background: transparent;
    border: 1.5px solid rgba(183, 188, 199, 0.6);
    color: #b7bcc7;
}
.record-badge-title { background: rgba(232, 178, 61, 0.5); }
.record-badge-title-minor { background: rgba(184, 154, 94, 0.4); }
.record-badge-maincard { background: rgba(76, 175, 80, 0.5); }
.record-badge-prelim { background: rgba(154, 160, 171, 0.45); }

.event-fight-grid {
    display: grid;
    grid-template-columns: repeat(2, 27px);
    grid-template-rows: repeat(2, 27px);
    gap: 4px;
}
.event-fight-grid .record-badge {
    width: 27px;
    height: 27px;
    border-radius: 7px;
    font-size: 0.85em;
}

/* контейнер значков "Fights" на events.html — фиксированная ширина (как у
   .fighter-record), чтобы подпись "Fights" в шапке списка встала ровно над
   ним независимо от длины чисел внутри значков. 58 (большой) + 8 (зазор) +
   58 (сетка 2х2 с gap:4px) = 124 */
.event-fight-counts {
    display: flex;
    align-items: center;
    gap: 8px;
    flex: 0 0 124px;
    margin-left: 6px;
}
/* .col-header-label — узкая обёртка ровно по ширине текста (display:
   inline-block, без него ширина была бы во всю колонку), сама
   центрируется внутри колонки через display:flex на родителе. Глаз —
   position:absolute относительно ЭТОЙ обёртки (не всей колонки), поэтому
   встаёт вплотную к тексту, а не у правого края всей ширины колонки, и при
   этом не влияет на центровку самого текста (abs-элемент не в потоке) —
   одинаково для всех колонок с глазом */
.col-header-label { position: relative; display: inline-block; }
.col-header-label .col-eye-toggle {
    position: absolute;
    top: 50%;
    left: 100%;
    transform: translateY(-50%);
    margin-left: 4px;
}

.event-list-header-fights {
    display: flex;
    justify-content: center;
    flex: 0 0 124px;
    margin-left: 6px;
}

/* длительность турнира — сумма фактического времени всех боёв (только
   реально прошедшие раунды) — теперь пишется мелким шрифтом прямо внутри
   значка total fights (.record-badge-brand/.record-badge-xl), вместо
   отдельного прямоугольного поля: число боёв сдвинуто чуть выше центра,
   под ним — hh:mm:ss */
.event-fight-total {
    flex-direction: column;
    gap: 1px;
    line-height: 1.1;
}
.event-fight-total-num {
    font-size: 1.3em;
    transform: translateY(-3px);
}
.event-fight-total-duration {
    font-size: 0.53em;
    font-weight: 400;
    color: rgba(183, 188, 199, 0.75);
}

/* "Results" на events.html — способ завершения боёв турнира: слева сетка
   2х2 (KO/TKO, Submission сверху; Decision, Disqualification снизу), с
   отступом (12px — заметно больше внутреннего gap:4px сетки, "третья
   колонка чуть подальше от первых четырёх") справа — отдельный столбец
   из 2 значков (Draw сверху, No Contest снизу). Значки того же размера,
   что у сетки "Fights" (27x27, gap:4px). Footprint: 2х2 (58px) + отступ
   (12px) + 3-я колонка (27px) = 97px — именно эта ширина у
   .event-results-wrap/.event-list-header-results. CNC/Overturned method
   ни в одну из 6 категорий не попадают, поэтому сумма значков не обязана
   совпадать с total_fights. Скрыт по умолчанию (hiddenColumns), как и
   Upset Score */
.event-results-grid {
    display: flex;
    align-items: center;
    gap: 12px;
}
.event-results-2x2 {
    display: grid;
    grid-template-columns: repeat(2, 27px);
    grid-template-rows: repeat(2, 27px);
    gap: 4px;
}
.event-results-col3 {
    display: flex;
    flex-direction: column;
    gap: 4px;
}
.event-results-grid .record-badge {
    width: 27px;
    height: 27px;
    border-radius: 7px;
    font-size: 0.85em;
}

.event-list-header-results {
    display: flex;
    justify-content: center;
    flex: 0 0 97px;
    margin-left: 28px;
}
.event-results-wrap {
    display: flex;
    flex: 0 0 97px;
    margin-left: 28px;
}

/* Rank Score/Upset/Results — общая "группа продвинутой статистики" (в
   этом порядке — Rank Score первой, см. events.html), Rank Score сейчас
   не скрыта по умолчанию (в отличие от Upset/Results, см. hiddenColumns в
   events.js). .col-hidden прячет колонку через visibility:hidden (не
   display:none), чтобы остальные не скакали при переключении глаза — но
   именно из-за этого margin-left каждой колонки всегда резервирует своё
   место, даже когда сама колонка невидима. Раньше у всех трёх стоял
   одинаковый margin-left:70px — они не образовывали одну группу, а
   КАЖДАЯ следующая добавляла свои 70px поверх предыдущей (+ 11px gap
   самого .fighter-row), в сумме уводя Results почти на 250px правее, чем
   нужно, и раздвигая Weights ещё дальше — 70px оставлен только на первой
   колонке группы, как единственный отступ, отделяющий её от Fights;
   Upset и Results внутри группы — вплотную (12px, тот же зазор, что и в
   .event-fight-counts/.event-results-grid) */
.event-list-header-rank-score {
    display: flex;
    justify-content: center;
    flex: 0 0 58px;
    margin-left: 40px;
    line-height: 1.2;
}

/* "Rank Score" турнира — насколько звёздным был кард по официальным
   рейтингам UFC (ufcalendar.com) на момент турнира, см. _EVENT_RANK_SCORE_SQL
   в events.py. Тот же вид/размер контура, что у Upset Score рядом (не
   процент — просто число, шкала не 0..100, а открытая, сравнивать имеет
   смысл только между турнирами) */
.event-rank-score-gauge {
    width: 58px;
    height: 58px;
    flex: none;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    border-radius: 14px;
    border: 1.5px solid rgba(183, 188, 199, 0.6);
    background: transparent;
    margin-left: 40px;
    cursor: help;
}
.event-rank-score-value { font-size: 1.05em; font-weight: 400; color: rgba(183, 188, 199, 0.9); }
/* "HI: x" — Hub Score турнира (см. _EVENT_HUB_SCORE_SQL в events.py),
   приглушённой строкой под самим Rank Score, в том же квадрате — не
   отдельный виджет, а дополнение к уже существующему */
.event-hub-score-value { font-size: 0.72em; color: #7d838d; margin-top: 2px; }

.event-list-header-upset {
    display: flex;
    justify-content: center;
    flex: 0 0 58px;
    margin-left: 28px;
    line-height: 1.2;
}

/* Weights на events.html — сетка 15 ячеек С ЧИСЛОМ боёв в каждой весовой,
   тот же вид/расчёт, что у слайда "WEIGHT CLASSES" в виджете бойца на
   fighter.html (.weight-class-slide/.weight-cell*), а не точки "дрался/
   не дрался", как у .wc-dots (тот виджет — для index.html, где считается
   только сам факт, здесь же есть число боёв на турнир, показываем его).
   Свои классы (не переиспользуют .weight-class-slide/.weight-cell — те
   рассчитаны на fixed-size виджет со своим фоном/padding под слайд, тут
   просто ещё одна компактная колонка в строке карточки). Последняя
   колонка в строке — margin-left:auto прижимает к правому краю (та же
   роль, что раньше у Date/Fights) */
/* "Апсет-скор" турнира — просто число (xx.x%) в контуре того же
   размера/стиля, что у total fights (.record-badge-xl/.record-badge-brand
   — 58x58, скругление 14px, тонкий серый кант без заливки), цвет текста —
   тот же тон, что у канта (было со шкалой-дугой, убрали — число само по
   себе достаточно читаемо в таком контексте) */
.event-upset-gauge {
    width: 58px;
    height: 58px;
    flex: none;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 14px;
    border: 1.5px solid rgba(183, 188, 199, 0.6);
    background: transparent;
    margin-left: 28px;
    cursor: help;
}
.event-upset-value { font-size: 1.05em; font-weight: 400; color: rgba(183, 188, 199, 0.9); }

.event-weight-wrap {
    display: flex;
    gap: 4px;
    margin-left: auto;
}
.event-weight-grid {
    display: grid;
    grid-template-columns: repeat(4, 20px);
    grid-template-rows: repeat(3, 20px);
    gap: 2px;
}
.event-weight-side {
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.event-weight-cell {
    width: 20px;
    height: 20px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 0.7em;
    font-weight: 700;
    border-radius: 3px;
    cursor: help;
}
.event-weight-cell-pink { background: rgba(224, 98, 158, 0.18); color: #e0629e; }
.event-weight-cell-blue { background: rgba(74, 144, 217, 0.18); color: #4a90d9; }
.event-weight-cell-gray { background: rgba(154, 160, 171, 0.15); color: #9aa0ab; }

.event-list-header-weights {
    display: flex;
    justify-content: center;
    flex: 0 0 110px;
    margin-left: auto;
}

/* шапка над списком карточек — те же отступы/выравнивание по горизонтали,
   что у самих карточек (.card padding: 16px), чтобы подписи оказались
   ровно над фото/именем и рекордом */
.fighter-list-header {
    display: flex;
    align-items: center;
    gap: 11px;
    /* слева совпадает с увеличенным padding-left карточек (.card) — иначе
       подписи съедут относительно колонок из-за места под card-badge */
    padding: 0 16px 0 24px;
    margin-top: 20px;
    color: #9aa0ab;
    font-size: 0.85em;
    text-transform: uppercase;
    letter-spacing: 0.02em;
}

/* та же фиксированная ширина, что у .fighter-row-main в самих карточках —
   иначе подписи "Weight Classes"/"Record" не встанут ровно над своими
   колонками */
.fighter-list-header-name { flex: 0 0 280px; }
.fighter-list-header-record { flex: 0 0 144px; text-align: right; margin-left: 9px; }

/* подписи колонок с глазом-переключателем (все, кроме Fighter) — текст и
   кнопка в один ряд, тем же выравниванием (центр/право), что было у
   голого текста через text-align на самом span */
.fighter-list-header-wc,
.fighter-list-header-dates,
.fighter-list-header-anthro,
.fighter-list-header-bonuses,
.fighter-list-header-rank,
.fighter-list-header-record {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 4px;
}
.fighter-list-header-record { justify-content: flex-end; }

/* кнопка-глаз в шапке колонки — скрывает/показывает значения этой колонки
   во всех карточках списка (сама подпись колонки остаётся видна), см.
   toggleColumn/hiddenColumns и .col-hidden ниже */
.col-eye-toggle {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    border: none;
    background: none;
    color: #6b717c;
    cursor: pointer;
    line-height: 0;
}
.col-eye-toggle:hover { color: #9aa0ab; }

/* значения колонки скрыты (глаз закрыт), но место под них сохраняется —
   иначе остальные колонки съедут и шапка перестанет совпадать со строками */
.col-hidden { visibility: hidden; }

/* .fi — класс из подключённой библиотеки flag-icons (см. <head>), сама
   иконка рисуется через background-image; тут только отступ от имени */
.fi { margin-right: 6px; border-radius: 2px; }

/* если таблице не хватает 960px (много колонок — как на fighter.html),
   скроллится сама, а не раздвигает всю страницу вправо */
.table-wrap {
    overflow-x: auto;
    margin-top: 12px;
}

/* только вкладка Fight History на fighter.html — тот же серый фрейм,
   что у соседних вкладок (Rank/Hub-index/Rivals); .table-wrap сам по
   себе общий для таблиц по всему сайту (event.html, stats.html,
   fights.html), поэтому фрейм добавлен отдельным классом, а не в него */
.fight-history-wrap {
    background: #1c1f26;
    border: 1px solid #2a2e37;
    border-radius: 12px;
    padding: 10px;
}

table {
    width: 100%;
    border-collapse: collapse;
}

.table-wrap table {
    margin-top: 0;
}

/* вкладка "Rank History" на fighter.html, сразу после Fight History —
   ступенчатый график места в официальном рейтинге UFC по датам (см.
   rankChartPath/rankChartPoints в fighter.js). SVG на всю ширину через
   viewBox (не px) + preserveAspectRatio="none" — сама фигура тянется под
   контейнер, а не сохраняет пропорции, ширине карточки бойца это не мешает
   (высота всегда 220 "юнитов" viewBox = фиксированная высота блока) */
.rank-chart-wrap {
    background: #1c1f26;
    border: 1px solid #2a2e37;
    border-radius: 12px;
    padding: 10px 6px 10px;
    margin-top: 12px;
}
.rank-chart-svg { width: 100%; height: 440px; display: block; }
.rank-chart-grid { stroke: #2a2e37; stroke-width: 1; }
.rank-chart-axis-label { font-size: 11px; fill: #9aa0ab; }
/* цвет — inline style per-сегменту (rankChartColoredSegments, свой на
   дивизион, см. RANK_DIVISION_PALETTE в fighter.js), здесь только форма */
.rank-chart-line { fill: none; stroke-width: 2; }
/* разрывы (боец выпадал из топ-15, см. rankChartGapPaths) — пунктиром и
   цветом поражений (тот же #e05656, что у .record-badge-loss/.stat-loss),
   чтобы явно читалось "не ранжирован", а не просто продолжение обычной
   линии мест до самого низа шкалы */
.rank-chart-gap-line { fill: none; stroke: #e05656; stroke-width: 1.5; stroke-dasharray: 5 4; opacity: 0.75; }
/* тот же приём, что у .fighter-rank-gauge/.rank-slide-cell — 1.5px канта
   цветом фона карточки отделяет точку от линии под ней. Цвет заливки —
   inline style (p.color, дивизион или золото у чемпионских точек, rank=0
   — та же RANK_DIVISION_PALETTE/спец-случай в fighter.js) */
.rank-chart-point { stroke: #1c1f26; stroke-width: 1.5; cursor: help; }

/* легенда под графиком — по одному цветному кружку на весовой дивизион
   в истории этого бойца, плюс P4P (если есть) и Unranked (rankChartLegend
   в fighter.js) — кликабельна, скрывает/показывает свою линию
   (toggleRankChartSeries/rankChartHidden) */
.rank-chart-legend {
    display: flex;
    flex-wrap: wrap;
    gap: 4px 16px;
    padding: 8px 6px 6px;
    font-size: 0.8em;
    color: #9aa0ab;
}
.rank-chart-legend-item {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    cursor: pointer;
    user-select: none;
}
/* та же приглушённая полупрозрачность, что у .col-header-label скрытых
   колонок на index.html/events.html — тот же язык "выключено" на сайте */
.rank-chart-legend-item-hidden { opacity: 0.4; text-decoration: line-through; }
.rank-chart-legend-swatch { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; }

/* Hub-index — собственный рейтинг "в стиле шахматного Эло" (Glicko-2, см.
   hubChartLinePath/hubChartBandPath в fighter.js). Один непрерывный ряд
   (не multi-track, как rank-chart-*), поэтому проще: одна линия + одна
   полупрозрачная лента неуверенности (rating±rd), без легенды */
.hub-chart-wrap {
    background: #1c1f26;
    border: 1px solid #2a2e37;
    border-radius: 12px;
    padding: 10px 6px 10px;
    margin-top: 12px;
}
.hub-chart-summary {
    display: flex;
    gap: 20px;
    padding: 2px 10px 8px;
    font-size: 0.85em;
    color: #9aa0ab;
}
.hub-chart-summary strong { color: #e7e9ee; font-weight: 700; }
.hub-chart-svg { width: 100%; height: 440px; display: block; }
.hub-chart-grid { stroke: #2a2e37; stroke-width: 1; }
.hub-chart-axis-label { font-size: 11px; fill: #9aa0ab; }
.hub-chart-band { fill: #5bc8c0; opacity: 0.12; stroke: none; }
.hub-chart-line { fill: none; stroke: #5bc8c0; stroke-width: 2; }
/* цвет точки — inline style (win/loss/draw, см. hubChartPoints в
   fighter.js), тот же приём канта фона карточки, что у .rank-chart-point */
.hub-chart-point { stroke: #1c1f26; stroke-width: 1.5; cursor: help; }

/* вкладка Rivals — один блок на соперника, с которым было больше одного
   боя (см. rivals в fighter.js), сама карточка того же тёмного тона и
   канта, что остальные виджеты сайта (.fighter-stats-box и т.п.) */
.rivals-list { display: flex; flex-direction: column; gap: 12px; }
.rivals-card {
    background: #1c1f26;
    border: 1px solid #2a2e37;
    border-radius: 12px;
    padding: 12px;
}
.rivals-card-header {
    display: flex;
    align-items: center;
    gap: 12px;
    margin-bottom: 10px;
}
.rivals-card-info { display: flex; flex-direction: column; gap: 4px; }
.rivals-card-name { font-weight: 600; display: flex; align-items: center; gap: 6px; }
/* .fighter-record переиспользуется как есть (те же 4 бейджа W/L/D/NC), но
   её flex: 0 0 144px рассчитан на ГОРИЗОНТАЛЬНЫЙ .fighter-row (144px —
   ширина) — здесь родитель .rivals-card-info колоночный (flex-direction:
   column), та же величина становится ВЫСОТОЙ вместо ширины и раздувает
   карточку; сбрасываем flex здесь же, где контекст сменился */
.rivals-card-info .fighter-record { flex: none; justify-content: flex-start; }

/* вкладка Attributes — радар-чарт из 13 атрибутов (см. fighter.js
   attrChart-computed'ы и preprocessing/compute_fighter_attributes.py),
   тот же тёмный фрейм, что у .rank-chart-wrap/.hub-chart-wrap */
.attr-chart-wrap {
    background: #1c1f26;
    border: 1px solid #2a2e37;
    border-radius: 12px;
    padding: 16px 20px;
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
    gap: 24px;
}
.attr-chart-svg { width: 100%; max-width: 450px; aspect-ratio: 1 / 1; display: block; flex: 2 1 400px; }
.attr-chart-ring { fill: none; stroke: #2a2e37; stroke-width: 1; }
.attr-chart-axis { stroke: #2a2e37; stroke-width: 1; }
.attr-chart-polygon { fill: rgba(232, 178, 61, 0.18); stroke: #e8b23d; stroke-width: 2; stroke-linejoin: round; }
.attr-chart-point { fill: #e8b23d; stroke: #14161a; stroke-width: 1.5; }
.attr-chart-point-empty { fill: #4a4e58; }
.attr-chart-label { font-size: 13px; fill: #b7bcc7; font-weight: 600; }

/* столбик-легенда справа от радара — те же 13 пунктов, но с точным
   процентилем (радар нарочно "зумит" 50-100, тут — честная шкала 0-100,
   для сверки конкретных цифр) */
.attr-chart-bars { display: flex; flex-direction: column; gap: 11px; flex: 1 1 340px; max-width: 460px; }
.attr-bar-row { display: flex; align-items: center; gap: 10px; }
.attr-bar-label { flex: 0 0 130px; font-size: 1em; color: #b7bcc7; text-align: right; }
.attr-bar-track { flex: 1; height: 13px; border-radius: 6px; background: #2a2e37; overflow: hidden; }
.attr-bar-fill { height: 100%; background: #e8b23d; border-radius: 6px; }
.attr-bar-fill-empty { background: #4a4e58; }
.attr-bar-value { flex: 0 0 36px; font-size: 1em; color: #7d838d; text-align: right; }
.rivals-card:first-child { margin-bottom: 4px; }
/* фикс. раскладка колонок (colgroup в fighter.html) — иначе у каждого
   соперника своя <table> со своей авто-шириной колонок и они "плавают"
   между карточками при разной длине текста (названия турнира и т.п.) */
.rivals-fight-table { width: 100%; table-layout: fixed; }
.rivals-fight-table td { border-top: 1px solid #2a2e37; }
.rivals-fight-table tr:first-child td { border-top: none; }

th, td {
    text-align: left;
    padding: 8px 6px;
    border-bottom: 1px solid #2a2e37;
}

th { color: #9aa0ab; font-weight: 500; font-size: 0.9em; }

/* колонка Weight Class в истории боёв — левого отступа меньше (ближе к
   Event), правого больше (заметный интервал перед фото/именем соперника) */
.weight-class-cell { padding-left: 0; padding-right: 28px; }

.result-win { color: #4caf50; font-weight: 600; }
.result-loss { color: #e05656; font-weight: 600; }
.result-draw { color: #4a90d9; font-weight: 600; }
.result-nc { color: #9aa0ab; }
.result-other { color: #9aa0ab; }

/* полоска-индикатор исхода вместо отдельной текстовой колонки — цвет
   берёт из тех же .result-* классов (color) через currentColor, чтобы не
   дублировать палитру */
td.outcome-stripe-cell {
    width: 10px;
    padding: 0 4px;
    vertical-align: middle;
}

.outcome-stripe {
    display: inline-block;
    width: 5px;
    height: 20px;
    border-radius: 3px;
    background: currentColor;
    vertical-align: middle;
}

/* единая метка боя — кружок слева от №. Титульный статус важнее позиции
   на карде (см. fightBadgeClass в api.js): даже титульный мейн-ивент
   красится золотым, а не зелёным. Пусто у обычных нетитульных боёв без
   известного bout_type (span не рендерится через v-if). */
td.title-badge-cell {
    width: 16px;
    padding: 0 4px;
    text-align: center;
}

.fight-badge {
    display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    cursor: help;
}

/* награды вечера (Fight/Performance/Submission/Knockout of the Night) —
   справа от Round/Time, тем же принципом вертикального стека, что у
   .title-badge-cell слева от названия турнира (вертикально по центру
   строки — align-items:center на самой ячейке, а не flex внутри неё, у
   .round-time тоже нет обёртки-flex, оба спана просто друг под другом) */
td.bonus-badge-cell {
    width: 26px;
    padding: 0 4px 0 0;
    text-align: center;
    vertical-align: middle;
}
.bonus-badge {
    display: block;
    width: 20px;
    margin: 2px auto;
    padding: 1px 0;
    border-radius: 7px;
    background: #e8b23d;
    color: #14161a;
    font-size: 0.65em;
    font-weight: 700;
    line-height: 1.3;
    cursor: help;
}
/* если наград на бой две — увеличенный зазор именно МЕЖДУ ними (не трогая
   отступ у одиночного значка) */
.bonus-badge + .bonus-badge {
    margin-top: 6px;
}

.has-hint { cursor: help; }

/* постоянный пояс весовой — золотой, полное свечение */
.badge-title {
    background: #e8b23d;
    box-shadow: 0 0 6px #e8b23d, 0 0 12px rgba(232, 178, 61, 0.6);
}

/* интерим/турнирные/суперфайт-титулы — не постоянный пояс весовой,
   золото более блёклое и свечение заметно слабее */
.badge-title-minor {
    background: #b89a5e;
    box-shadow: 0 0 2px #b89a5e;
}

/* главный бой турнира — зелёный, полное свечение */
.badge-main-event {
    background: #4caf50;
    box-shadow: 0 0 6px #4caf50, 0 0 12px rgba(76, 175, 80, 0.6);
}

/* со-мейн — тот же зелёный, но светлее/бледнее и слабее свечение */
.badge-co-main {
    background: #a5d6a7;
    box-shadow: 0 0 4px #a5d6a7;
}

/* основной кард (не мейн/со-мейн) — синий */
.badge-main-card {
    background: #4a90d9;
    box-shadow: 0 0 6px #4a90d9, 0 0 12px rgba(74, 144, 217, 0.6);
}

/* прелимы/постлимы — серая точка, совсем без свечения */
.badge-prelim {
    background: #9aa0ab;
    box-shadow: none;
}

/* подсветка коэффициентов — только фон, текст остаётся обычным */
.odds-favorite { color: #4caf50; }
.odds-underdog { color: #e05656; }

.muted { color: #9aa0ab; }

/* индикатор загрузки списка бойцов на index.html — вращающееся кольцо в
   золотом акценте сайта (тот же #e8b23d, что у логотипа/активной страницы
   пагинации) вместо голого текста "Загрузка..." */
.loading-state {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 12px;
    color: #9aa0ab;
    font-size: 1em;
    padding: 32px 0;
}

.spinner {
    width: 22px;
    height: 22px;
    flex-shrink: 0;
    border-radius: 50%;
    border: 3px solid #2a2e37;
    border-top-color: #e8b23d;
    animation: spin 0.8s linear infinite;
}

@keyframes spin {
    to { transform: rotate(360deg); }
}

/* объединённая колонка "Раунд / Время" — одной строкой "Rn - мм:сс",
   время чуть мельче и приглушённее раунда, чтобы не выглядели равнозначно */
.round-time { text-align: center; padding-right: 0; white-space: nowrap; }
.round-time span:last-child { font-size: 0.85em; color: #9aa0ab; }

/* объединённая колонка "Коэффициент" — сверху коэффициент самого
   бойца (крупнее), снизу — соперника (мельче); цвет каждой строки
   независимо от .odds-favorite/.odds-underdog, как и раньше */
.odds-merged { text-align: center; }
.odds-main { font-size: 1.05em; font-weight: 600; }
.odds-sub { font-size: 0.75em; opacity: 0.7; }

/* объединённая колонка "Турнир" — дата под названием, мельче и приглушённее */
.event-date { font-size: 0.75em; color: #9aa0ab; }
.error { color: #e05656; padding: 12px; }

/* страница 404.html — отдаётся app.py вместо стандартного ответа
   StaticFiles на несуществующий путь, см. not_found_handler в app.py */
.not-found {
    text-align: center;
    padding: 100px 24px;
}
.not-found-code {
    font-size: 5em;
    font-weight: 700;
    color: #e8b23d;
    line-height: 1;
}
.not-found-text {
    font-size: 1.2em;
    color: #b7bcc7;
    margin: 12px 0 28px;
}
.not-found-link {
    display: inline-block;
    padding: 10px 22px;
    border: 1px solid #2a2e37;
    border-radius: 8px;
    background: #1c1f26;
}
.not-found-link:hover {
    text-decoration: none;
    border-color: #e8b23d;
}

.fighter-header {
    display: flex;
    gap: 20px;
    align-items: flex-start;
    margin-bottom: 20px;
}

.fighter-stats-wrap {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 6px;
}

.fighter-stats-box {
    width: 120px;
    height: 120px;
    flex-shrink: 0;
    display: flex;
    flex-direction: column;
    border: 1px solid #2a2e37;
    border-radius: 12px;
    overflow: hidden;
    cursor: pointer;
    user-select: none;
}

.stats-slide-title {
    flex-shrink: 0;
    padding: 3px 0 2px;
    font-size: 0.6em;
    font-weight: 600;
    letter-spacing: 0.03em;
    text-align: center;
    text-transform: uppercase;
    color: #9aa0ab;
    background: #14161a;
}

.stats-slide-grid {
    flex: 1;
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-template-rows: 1fr 1fr;
    min-height: 0;
}

.stats-dots { display: flex; gap: 6px; }
.stats-dot {
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: #2a2e37;
    cursor: pointer;
}
.stats-dot.active { background: #e8b23d; }

.fighter-gauges-wrap {
    margin-left: auto;
}

/* шапка event.html — те же 2 квадрата-виджета (FIGHTS/RESULTS), что
   BONUSES/RECORD у бойца, но там 3-я секция (гейджи) уже прижимает их к
   правому краю через .fighter-gauges-wrap; здесь всего 2 секции и такого
   отступа нет — сдвигаем их вправо, к краю таблицы под шапкой, тем же
   приёмом (margin-left:auto на первом из двух виджетов) */
.event-stats-wrap-first {
    margin-left: auto;
}

/* постер и виджеты FIGHTS/RESULTS в шапке event.html крупнее, чем фото/
   BONUSES/RECORD у бойца (120px) — здесь всего 2 виджета вместо 3, места
   под них больше, а сам постер турнира с плотным коллажем бойцов лучше
   читается на большем размере. Scoped через .event-header (второй класс
   на том же элементе, что .fighter-header), а не переопределением самих
   .fighter-header img/.fighter-stats-box — те общие с fighter.html */
/* .fighter-header.event-header (2 класса на одном элементе — выше
   специфичность, чем у .fighter-header img: та объявлена НИЖЕ по файлу и
   иначе побеждала бы при равной специфичности одного класса) */
.fighter-header.event-header img { width: 160px; height: 160px; }
.event-header .fighter-stats-box { width: 150px; height: 150px; }
/* текст внутри FIGHTS/RESULTS тоже крупнее (базовые .stat-num/.stat-label/
   .stats-slide-title общие с BONUSES/RECORD у бойца — не трогаем их
   напрямую) */
.event-header .stat-num { font-size: 1.8em; }
.event-header .stat-label { font-size: 0.75em; }
.event-header .stats-slide-title { font-size: 0.7em; }

/* тот же виджет-квадрат (.fighter-stats-box), что у CAREER/RECORD, только
   в 3 раза шире — под три спидометра в ряд вместо одной сетки 2x2 */
.fighter-gauges-box {
    width: 390px;
    cursor: default;
}

.fighter-gauges-row {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 12px;
    background: #1c1f26;
}

.fighter-gauge-box {
    width: 120px;
    flex-shrink: 0;
    text-align: center;
}

.gauge-svg { width: 100%; height: auto; display: block; }

.gauge-value { font-size: 1.1em; font-weight: 700; margin-top: -26px; }
.gauge-caption { font-size: 0.65em; color: #9aa0ab; text-transform: uppercase; margin-top: 1px; }

/* отступ под значением у роста/рича (одна строка-значение + подпись) —
   у веса вместо подписи сразу вторая строка-число (диапазон), ей такой
   отступ не нужен, поэтому класс отдельный, а не на .gauge-value целиком */
.gauge-value-gap { margin-bottom: 15px; }

/* вторая строка подписи веса (min/max, вместо одной строки-значения +
   подписи-названия метрики у роста/рича) — та же роль, что у gauge-caption,
   но это тоже число, а не название метрики */
.gauge-value-sub { font-size: 0.65em; font-weight: 600; color: #9aa0ab; margin-top: 0; }

.stat-cell {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    background: #1c1f26;
}

.stat-num { font-size: 1.5em; font-weight: 700; line-height: 1; }
.stat-label { font-size: 0.65em; color: #9aa0ab; margin-top: 4px; text-transform: uppercase; }

.stat-win .stat-num { color: #4caf50; }
.stat-loss .stat-num { color: #e05656; }
.stat-draw .stat-num { color: #4a90d9; }
.stat-nc .stat-num { color: #9aa0ab; }

/* победы/поражения по методу (слайды статистики 2 и 3) — все 4 ячейки
   одного цвета, а не разного, как у WIN/LOSS/DRAW/NC */
.stat-cell-green .stat-num { color: #4caf50; }
.stat-cell-red .stat-num { color: #e05656; }
.stat-cell-blue .stat-num { color: #4a90d9; }
.stat-cell-gold .stat-num { color: #e8b23d; }
/* DQ (Results) в шапке event.html — тот же цвет, что и у
   .record-badge-dq на events.html (сетка Results списка турниров) */
.stat-cell-orange .stat-num { color: #d6812e; }
/* второстепенный титул (Fights) в шапке event.html — тот же приглушённый
   золотой, что у .card-badge-title-minor/.record-badge-title-minor на
   events.html — основной титул рядом остаётся ярким .stat-cell-gold */
.stat-cell-gold-pale .stat-num { color: #b89a5e; }
/* Draw/No Contest — 2-й слайд RESULTS в шапке event.html — те же цвета,
   что у .record-badge-event-draw (фиолетовый)/.record-badge-nc (серый)
   на events.html (сетка Results списка турниров) */
.stat-cell-purple .stat-num { color: #9c59d1; }
.stat-cell-gray .stat-num { color: #9aa0ab; }

/* даты первого/последнего боя (второй вид .fighter-stats-box по клику) —
   каждая строка на всю ширину квадрата (grid-column: 1 / -1), а не в
   своей четверти, как у WIN/LOSS/DRAW/NC */
.stat-cell-full {
    grid-column: 1 / -1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    background: #1c1f26;
}
.stat-date { font-size: 0.85em; font-weight: 700; }

/* Upset Score (3-й слайд RESULTS, шапка event.html) — единственная
   метрика на слайде, в отличие от .stat-cell-full (который всегда в паре,
   занимает только одну строку сетки 2x2) растягивается на обе строки
   (grid-row: 1 / -1) и весь квадрат слайда */
.stat-cell-fullwidget {
    grid-column: 1 / -1;
    grid-row: 1 / -1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    background: #1c1f26;
}

/* слайд RANK (4-й слайд CAREER, fighter.html) — вся история официальных
   рейтингов бойца (fighter.rankings[]), не только текущий дивизион: 0/1
   дивизион — одна ячейка на всю площадь квадрата (.rank-slide-cell-full,
   как раньше было всегда), 2-4 — каждая в своём квадранте той же сетки
   2x2 (.stats-slide-grid), без .rank-slide-cell-full — по аналогии с
   WIN/LOSS/DRAW/NC (.stat-cell) на других слайдах. Контент ячейки тот же,
   что у компактного гейджа .fighter-rank-gauge на index.html (дивизион/
   место/лучшее место) */
.rank-slide-cell {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 1px;
    background: #1c1f26;
}
.rank-slide-cell-full {
    grid-column: 1 / -1;
    grid-row: 1 / -1;
    gap: 2px;
}
/* ровно 2 дивизиона — друг под другом на всю ширину (та же раскладка, что
   у Win/Loss Streak, .stat-cell-full), а не бок о бок в 2 колонки.
   Тот же класс (не только своим названием — и буквально: grid-column:
   1/-1, ничего больше) переиспользуется и для ТРЕТЬЕЙ ячейки при РОВНО 3
   дивизионах (см. fighter.html) — первые два занимают строку 1 как обычно
   (.rank-slide-cell без модификаторов, по одному на колонку), третья сама
   собой падает в строку 2, и с этим классом растягивается на всю её
   ширину — та же раскладка, что у WIN-DEC/LOSS-DEC (M-DEC/S-DEC в ряд,
   U-DEC на всю ширину под ними), а не пустая 4-я ячейка сетки 2x2 */
.rank-slide-cell-half { grid-column: 1 / -1; }
.rank-slide-division {
    font-size: 0.55em;
    font-weight: 600;
    color: #9aa0ab;
    text-transform: uppercase;
    letter-spacing: 0.02em;
}
.rank-slide-value { font-size: 1.15em; font-weight: 700; line-height: 1; color: rgba(183, 188, 199, 0.9); }
.rank-slide-best { font-size: 0.55em; color: #7d838d; }
/* P4P — всегда первая ячейка (левый верхний квадрант, порядок уже задан
   ORDER BY в _FIGHTER_RANK_HISTORY_SQL), золотой — тот же акцентный цвет,
   что у наград вечера (.stat-cell-gold) и активной точки слайдера */
.rank-slide-cell-p4p .rank-slide-division,
.rank-slide-cell-p4p .rank-slide-value,
.rank-slide-cell-p4p .rank-slide-best { color: #e8b23d; }
/* крупнее — как было раньше, когда на весь квадрат всегда шёл только один
   дивизион */
.rank-slide-cell-full .rank-slide-division { font-size: 0.7em; }
.rank-slide-cell-full .rank-slide-value { font-size: 1.9em; }
.rank-slide-cell-full .rank-slide-best { font-size: 0.7em; }

/* сетка 15 весовых категорий (второй слайд CAREER) — 4 колонки x 3 строки
   слева (женские/мужские-лёгкие/мужские-тяжёлые) + отдельная правая
   колонка (Catch/Open/Super Heavyweight), отнесённая от основной сетки
   бОльшим gap, чем между самими ячейками — по просьбе пользователя */
.weight-class-slide {
    flex: 1;
    display: flex;
    gap: 6px;
    padding: 3px 4px;
    min-height: 0;
    background: #1c1f26;
}

.weight-class-grid {
    flex: 4;
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    grid-template-rows: repeat(3, 1fr);
    gap: 2px;
}

.weight-class-side {
    flex: 1;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.weight-class-side .weight-cell {
    flex: 1;
}

.weight-cell {
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 0.85em;
    font-weight: 700;
    border-radius: 3px;
}

.weight-cell-pink { background: rgba(224, 98, 158, 0.18); color: #e0629e; }
.weight-cell-blue { background: rgba(74, 144, 217, 0.18); color: #4a90d9; }
.weight-cell-gray { background: rgba(154, 160, 171, 0.15); color: #9aa0ab; }

.fighter-header img {
    width: 120px;
    height: 120px;
    border-radius: 12px;
    object-fit: cover;
    background: #2a2e37;
}

.pagination {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-top: 16px;
}

button {
    background: #1c1f26;
    border: 1px solid #2a2e37;
    color: #e8e8e8;
    padding: 8px 14px;
    border-radius: 6px;
    cursor: pointer;
}

button:disabled { opacity: 0.4; cursor: default; }

.page-number {
    padding: 8px 12px;
    min-width: 38px;
}

.page-number.active {
    background: #e8b23d;
    border-color: #e8b23d;
    color: #14161a;
    font-weight: 700;
    cursor: default;
}

/* общий список боёв по всей истории (fights.html) — те же карточки
   .event-fight-card, что и на вкладке "Бои" турнира, только тут нет общей
   шапки турнира, поэтому у каждой карточки в центральной колонке, строкой
   над весовой категорией, добавлено название турнира (ссылка на его
   страницу) */
.event-fight-tournament {
    font-size: 0.72em;
    font-weight: 600;
    color: #9aa0ab;
    text-decoration: none;
    text-align: center;
    white-space: nowrap;
}
.event-fight-tournament:hover { color: #e8b23d; }

/* шапка общего списка боёв (fights.html) — та же сетка 3 колонки, что у
   самих .event-fight-card, чтобы подписи Winner/Bout Info/Loser вставали
   точно над соответствующими колонками карточек; глаз-переключатель —
   тот же .col-eye-toggle/.col-hidden, что у .fighter-list-header на
   index.html */
.fights-list-header {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
    gap: 10px 16px;
    /* те же горизонтальные отступы, что у padding самой .event-fight-card
       (14px 18px) — иначе подписи не встанут точно над колонками карточек;
       вертикальные (margin-top/bottom) — как у .fighter-list-header на
       index.html/других страницах с поиском */
    padding: 0 18px;
    margin-top: 20px;
    margin-bottom: 10px;
    color: #9aa0ab;
    font-size: 0.78em;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.02em;
}
.fights-list-header-col {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 4px;
}
.fights-list-header-col:first-child { justify-content: flex-start; }
.fights-list-header-col:last-child { justify-content: flex-end; }
button:not(:disabled):hover { border-color: #e8b23d; }

/* детальная карточка боя на event.html (замена прежней короткой таблицы
   Боец1/Боец2/Победитель) — тот же набор полей, что у вкладки Fight
   History на fighter.html (см. EventFightDetailed в schemas.py), но в
   виде 3-колоночной карточки: победитель слева, проигравший справа,
   информация о самом бое (категория/метод/раунд-время) по центру —
   см. cardFights в event.js, который решает, кто слева/справа */
.event-fight-list { display: flex; flex-direction: column; gap: 10px; }
.event-fight-card {
    display: grid;
    /* minmax(0,1fr), не голый 1fr — у grid-треков по умолчанию неявный
       минимум "auto" (по содержимому), из-за него карточка не сжималась
       уже вместе с узким viewport и вылезала горизонтальным скроллом на
       телефонной ширине */
    grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
    align-items: center;
    gap: 10px 16px;
    background: #1c1f26;
    border: 1px solid #2a2e37;
    border-radius: 12px;
    padding: 14px 18px;
}
/* вся карточка целиком открывает бой (goToFight(f) на самой карточке,
   см. event.js/fights.js) — фото и инфо-блок бойца внутри каждой стороны
   остаются СВОИМИ отдельными <a> на fighter.html (.event-fight-photo-link/
   .event-fight-side-info, у обоих @click.stop — иначе их клик улетал бы
   ещё и сюда), а .event-fight-side вокруг них — просто обычный div,
   без собственной ссылки */
.event-fight-card { cursor: pointer; }
.event-fight-card:hover { border-color: #e8b23d; }

.event-fight-side {
    display: flex;
    align-items: center;
    gap: 12px;
    min-width: 0;
}
/* DOM-порядок правой стороны уже написан зеркально в event.html (info,
   photo, stripe) — flex-direction тут обычный (не row-reverse), только
   выравнивание текста вправо. justify-content:flex-end — раньше группу
   прижимал к правому краю сам .event-fight-side-info своим flex-grow:1
   (рос на всё свободное место ПЕРЕД фото/полоской), но после его фикса
   на flex:0 1 auto (см. комментарий там — растянутый <a> перехватывал
   клики по пустой зоне правее имени) расти стало нечему, и вся группа
   (имя+фото+полоска) съехала к левому краю своей колонки вместо правого
   — justify-content здесь теперь делает ту же работу явно, а не
   побочным эффектом растущего текста */
.event-fight-right { justify-content: flex-end; text-align: right; }

.event-fight-photo {
    /* 93px (62*1.5) на широких карточках, но не ломает узкие — без этого
       на телефонной ширине текст имени/веса налезал на центр колонку */
    width: clamp(44px, 11vw, 93px);
    height: clamp(44px, 11vw, 93px);
    border-radius: 8px;
    object-fit: cover;
    background: #2a2e37;
    flex: none;
}
/* обёртка-ссылка вокруг фото — сама по себе без визуальных отступов
   (line-height:0 убирает паразитный inline-зазор под <img> внутри <a>),
   подсветка фото рамкой при наведении — тот же сигнал "это ссылка на
   бойца", что подчёркивание у текста рядом */
.event-fight-photo-link { flex: none; line-height: 0; }
.event-fight-photo-link:hover .event-fight-photo { outline: 2px solid #e8b23d; outline-offset: -2px; }

/* сама <a> на бойца (была просто div, пока ссылкой была вся сторона
   целиком) — text-decoration:none, чтобы не ловить обычное подчёркивание
   ссылок по всему блоку, подчёркиваем только имя/рекорд при наведении,
   остальное (коэффициент, рейтинг-бейджи) не нужно. flex-grow теперь 0
   (было 1 1 auto, пока ссылкой была вся сторона целиком) — иначе этот
   <a> растягивался на всё свободное место внутри .event-fight-side
   вплоть до центральной колонки, и клик по пустой зоне правее имени
   (а на самом деле всё ещё "внутри" невидимой растянутой ссылки) уводил
   на бойца вместо боя. flex-shrink остаётся (narrow viewport) */
.event-fight-side-info { display: flex; flex-direction: column; gap: 4px; min-width: 0; flex: 0 1 auto; color: inherit; text-decoration: none; }
/* глобальный a:hover{text-decoration:underline} специфичнее побеждал бы
   text-decoration:none выше при наведении (сам тег — <a>) и подчёркивал
   бы ВСЮ ссылку целиком, включая флаг и овалы рейтинга (им нечего
   подчёркивать текстом, но линия всё равно рисуется под всей строкой) —
   явно гасим его здесь и подчёркиваем только имя/рекорд точечно */
.event-fight-side-info:hover { text-decoration: none; }
.event-fight-side-info:hover .event-fight-name-text,
.event-fight-side-info:hover .event-fight-record { text-decoration: underline; }
.event-fight-name { font-weight: 600; display: flex; align-items: center; gap: 6px; }
.event-fight-right .event-fight-name { flex-direction: row-reverse; justify-content: flex-start; }
.event-fight-record { font-size: 0.8em; color: #9aa0ab; }

.event-fight-odds-row { display: flex; align-items: center; gap: 8px; font-size: 0.85em; }
.event-fight-right .event-fight-odds-row { flex-direction: row-reverse; justify-content: flex-start; }
.event-fight-odds { font-weight: 600; }

/* рейтинг UFC НА МОМЕНТ боя (f.left.rankings/f.right.rankings, см.
   rank1/rank2 в _EVENT_FIGHTS_DETAILED_SQL) — тот же овал, что в колонке
   Rank на index.html (.fighter-rank-badge), без "(Best: ...)". Порядок
   элементов в самом HTML уже зеркальный (слева рейтинг+стрелочка, справа
   стрелочка+рейтинг) — здесь просто обычный flex без row-reverse */
.event-fight-rank-list { display: flex; flex-direction: row; flex-wrap: wrap; align-items: center; gap: 4px 10px; margin-top: 1px; }
.event-fight-rank-row { display: flex; align-items: center; gap: 4px; }
/* несколько дивизионов сразу — в одну строку (не друг под другом), с
   увеличенным зазором МЕЖДУ дивизионами (gap у списка, 10px) против
   зазора ВНУТРИ одной пары рейтинг+стрелочка (gap у ряда, 4px) — у
   правого бойца ещё и прижимаем всё к правому краю */
.event-fight-right .event-fight-rank-list { justify-content: flex-end; }
.fighter-rank-badge-up { --rank-badge-color: #4caf50; }
.fighter-rank-badge-down { --rank-badge-color: #e05656; }

/* исход боя — .outcome-stripe переиспользован как есть (та же полоска,
   что и в Fight History бойца): у левого (победитель) она перед фото, у
   правого (проигравший) — после, т.е. у самого внешнего края карточки с
   обеих сторон */
.event-fight-side .outcome-stripe { flex: none; }

.event-fight-center {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
    /* не фикс. 140px — на узких карточках это отъедало почти всё место у
       имени/флага/рекорда бойцов по бокам (fixed-width колонка не
       сжимается вместе с card) */
    width: clamp(66px, 15vw, 140px);
    flex: none;
    text-align: center;
}
.event-fight-weightclass-row { display: flex; align-items: center; gap: 6px; }
/* nowrap — иначе у длинных названий ("Women's Bantamweight") текст рвался
   на 2 неровные строки (короткая "Women's" сверху), и точка сбоку от
   строки "зависала" заметно дальше от короткой верхней строки, чем от
   нижней — весь .event-fight-center ширину под это уже тянет сам (auto
   grid-колонка, см. .event-fight-card), так что переносить незачем */
.event-fight-weightclass { font-size: 0.78em; color: #9aa0ab; white-space: nowrap; }
/* Награды вечера — не в колонках бойцов, а прямо у итога боя по центру:
   FN (общая на обоих) — с обеих сторон названия метода, PN/SN/KN (только у
   победителя) — с той стороны, где победитель физически стоит на карточке
   (f.left.bonuses/f.right.bonuses уже без FN, см. _buildFightSide).
   grid вместо flex — 1fr по бокам РАВНЫ друг другу независимо от того,
   сколько в них бейджей (0/1/2 с одной стороны и другое число с другой),
   поэтому сам текст метода (средняя auto-колонка) всегда строго по центру
   строки, а не смещается в сторону пустой половины */
/* minmax(0,1fr), не голый 1fr — у голых 1fr-треков неявный минимум
   "по содержимому", и когда с одной стороны 2 метки (FN+KN и т.п.), а с
   другой ни одной/одна, этот трек растягивается под СВОЁ содержимое шире
   соседнего, несмотря на формально равные 1fr — средний текст метода
   уезжает от истинного центра строки. minmax(0,...) убирает контент-
   минимум, оставляя 1fr/1fr поровну всегда, лишняя метка просто чуть
   выходит за пределы своей колонки (та же причина/лечение, что у
   .event-fight-card выше) */
.event-fight-method-row { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: center; gap: 6px; }
.event-fight-method-badges { display: flex; align-items: center; gap: 4px; }
.event-fight-method-badges:first-child { justify-self: end; }
.event-fight-method-badges:last-child { justify-self: start; }
.event-fight-method-row .bonus-badge { display: inline-block; width: auto; margin: 0; padding: 1px 6px; }
.event-fight-method { font-weight: 600; }
.event-fight-methoddetail { font-size: 0.8em; color: #9aa0ab; text-decoration: none; }
a.event-fight-methoddetail:hover { text-decoration: underline; }
/* .round-time ("Rn - мм:сс" одной строкой, тултипы регламента и общего
   времени боя) переиспользован как есть из истории боёв бойца */

/* клик по всей карточке боя (event.html/fights.html — div.event-fight-card)
   или по всей строке Fight History/Rivals (fighter.html — tr.fight-row-click)
   — экран боя со статистикой по раундам (fight.html, см. goToFight в
   event.js/fights.js/fighter.js). Фото и инфо-блок бойца внутри карточки/
   ссылки на турнир и соперника внутри строки — свои собственные ссылки
   на fighter.html/event.html, см. @click.stop у них — иначе их клик
   улетал бы ещё и сюда */
.fight-row-click { cursor: pointer; }
.fight-row-click:hover { background: rgba(232, 178, 61, 0.06); }

/* Экран боя (fight.html) — шапка в стиле .fighter-header (фото+имя слева
   направо, как у самого бойца), но зеркально с двух сторон сразу:
   победитель слева (f.left — buildFightCard уже решает это), текст
   прижат влево, как на fighter.html; проигравший справа, флекс и текст
   развёрнуты зеркально (row-reverse + text-align:right). По центру —
   тот же .event-fight-center, что раньше был внутри .event-fight-card
   (категория/метод/раунд-время) */
.fight-detail-header { align-items: center; margin-bottom: 8px; }
.fight-detail-fighter {
    display: flex;
    align-items: center;
    gap: 16px;
    flex: 1 1 0;
    min-width: 0;
    color: inherit;
    text-decoration: none;
}
.fight-detail-fighter:hover { text-decoration: none; }
/* подчёркиваем ТОЛЬКО сам текст имени (.fight-detail-name-text) — не весь
   h1 с исключением флага через .fi: h1 — flex-контейнер, и "голый" текстовый
   узел (пробел между флагом и именем, если не обёрнут в свой тег) всё
   равно ловит подчёркивание от родителя, даже когда у флага explicitly
   text-decoration:none — поэтому у имени теперь свой <span>, который и
   подчёркиваем напрямую, без исключений */
.fight-detail-fighter:hover .fight-detail-name-text { text-decoration: underline; }
.fight-detail-fighter img { width: 120px; height: 120px; border-radius: 12px; object-fit: cover; background: #2a2e37; flex: none; }
.fight-detail-fighter h1 { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; }
.fight-detail-fighter-right { flex-direction: row-reverse; text-align: right; }
.fight-detail-fighter-right h1 { flex-direction: row-reverse; }
.fight-detail-fighter-right .event-fight-rank-list { justify-content: flex-end; }
.fight-detail-result { font-size: 0.85em; font-weight: 600; margin-top: 2px; }
.fight-detail-odds { font-weight: 600; margin-top: 2px; }

/* вкладки раундов — те же .section-tabs/.section-tab, что у Fight
   History/Rank History на fighter.html (золотая активная), просто со
   своими подписями ("Весь бой"/"Раунд N") */
.fight-round-tabs { flex-wrap: wrap; }

/* серый фрейм вокруг всей статистики под вкладками раундов — тот же
   приём (фон/кант/скругление), что у .fight-history-wrap/.rank-chart-wrap/
   .hub-chart-wrap/.attr-chart-wrap на fighter.html: там у КАЖДОЙ вкладки
   своя копия этих же трёх строк (не общий класс-утилита) — здесь
   продолжаем ту же конвенцию */
.fight-stats-frame {
    background: #1c1f26;
    border: 1px solid #2a2e37;
    border-radius: 12px;
    padding: 16px 20px 20px;
    margin-top: 12px;
}

/* имена бойцов над самими строками статистики — по краям, тем же
   порядком лево/право, что у .event-fight-card (f.left слева, f.right
   справа, флаг рядом с именем зеркально с каждой стороны) */
.fight-stat-names-row {
    display: flex;
    justify-content: space-between;
    align-items: center;
    font-weight: 600;
}
.fight-stat-name-left, .fight-stat-name-right { display: flex; align-items: center; gap: 6px; }
.fight-stat-name-right { flex-direction: row-reverse; }

.fight-stat-group { margin-top: 20px; }
.fight-stat-group-title {
    font-size: 0.8em;
    font-weight: 600;
    color: #9aa0ab;
    text-transform: uppercase;
    text-align: center;
    margin-bottom: 10px;
}

/* одна строка сравнения ("Significant Strikes", "Takedowns" и т.п.) —
   число слева/справа фиксированной ширины (чтобы бар между ними был
   одной высоты по всем строкам независимо от длины чисел), сам бар —
   две заливки без зазора, их ширина пропорциональна landed-значению
   каждого бойца (50/50, если оба 0 — "нет разницы", а не "у правого
   больше", что было бы неверно при пустых данных). Левый акцент —
   золотой (основной на сайте), правый — синий (тот же, что у
   .fighter-rank-badge-men) — просто две равнозначные стороны сравнения,
   не победитель/проигравший (для этого есть зелёный/красный .result-win/
   .result-loss на самой карточке сверху) */
.fight-stat-row {
    display: grid;
    grid-template-columns: 64px 1fr 64px;
    align-items: center;
    gap: 10px;
    padding: 6px 0;
}
.fight-stat-value { font-size: 0.92em; font-weight: 600; text-align: center; white-space: nowrap; }
.fight-stat-mid { display: flex; flex-direction: column; align-items: center; gap: 5px; min-width: 0; }
.fight-stat-label { font-size: 0.88em; color: #9aa0ab; text-align: center; }
.fight-stat-bar {
    position: relative;
    display: flex;
    width: 100%;
    height: 6px;
    border-radius: 3px;
    overflow: hidden;
    background: #2a2e37;
}
.fight-stat-bar-left { background: #e8b23d; height: 100%; }
.fight-stat-bar-right { background: #4a90d9; height: 100%; }
/* метка центра (50/50) — тонкий "разрез" тем же цветом, что и фон карточки
   вокруг бара (.fight-stats-frame), поверх заливки обеих сторон, чтобы
   сразу было видно, у кого реальный перевес, а не только кто номинально
   "больше" (при 51/49 бар почти не отличается от 50/50 на глаз без
   опорной точки) */
.fight-stat-bar::after {
    content: "";
    position: absolute;
    top: 0;
    bottom: 0;
    left: 50%;
    width: 2px;
    margin-left: -1px;
    background: #1c1f26;
}
/* "нечем сравнить" (row.isTie в fight.js — у кого-то из бойцов данных
   вообще нет, либо у обоих ровно 0) — просто гасим обе цветные заливки,
   остаётся только собственный серый фон .fight-stat-bar (#2a2e37); метку
   центра тоже прячем — делить тут нечего */
.fight-stat-bar-tie .fight-stat-bar-left,
.fight-stat-bar-tie .fight-stat-bar-right { display: none; }
.fight-stat-bar-tie::after { display: none; }
