/*
 * LigaHub — Theme V3 ("light / flat", EPL-style).
 *
 * Standalone theme for the PUBLIC area only. The public shell
 * (templates/public/base.html) does NOT load Tabler/Bootstrap — this file is
 * the whole visual system for anonymous pages, auth and the user profile.
 * Organizer/admin templates load this file too (plus admin-v3.css); Tabler is gone.
 *
 * Source of truth for tokens/components: the design mockups under
 * docs/design/epl-style/ligahub_design/mockups. Green (--win) appears ONLY on
 * results (Form W, leader/qualify zone, bracket winner, positive ±, LIVE);
 * everything else (header, buttons, links, active tabs, "Опубликован") is
 * aubergine-purple (--brand / --brand-2).
 */

/* ===== Self-hosted Manrope (SEO audit §8: off the render-critical path) ====
 * Variable font (weights 200–800 in one file per subset), served first-party so
 * there is no cross-origin Google Fonts CSS+font chain before render. Cyrillic +
 * latin subsets only (the public site is Russian). display:swap keeps text
 * visible while the font loads. `url()` is rewritten/hashed by collectstatic. */
@font-face {
  font-family: 'Manrope';
  font-style: normal;
  font-weight: 200 800;
  font-display: swap;
  src: url("../fonts/manrope-cyrillic.d02c8c2a9140.woff2") format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: 'Manrope';
  font-style: normal;
  font-weight: 200 800;
  font-display: swap;
  src: url("../fonts/manrope-latin.fc03edc2c673.woff2") format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
    U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
    U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* ===== Tokens ===========================================================  */
:root{
  --brand:#2A0E4F;      /* dark aubergine: header text, headings, primary buttons */
  --brand-2:#5B2A9E;    /* purple: links, accents */
  --brand-lt:#F4F0FA;   /* light lavender: icon pads, active tab, chips, champion banner */
  --bg:#FAF9FC;         /* page background (near-white) */
  --surface:#FFFFFF;    /* cards, header, footer */
  --surface-2:#F7F4FB;  /* hovers, secondary fills */
  --line:#ECE7F3;       /* outer borders */
  --line-2:#F2EEF8;     /* inner dividers */
  --ink:#1B1330;        /* primary text */
  --muted:#6B6484;      /* secondary text */
  --faint:#767090;      /* tertiary text, placeholders (WCAG AA: 4.7:1 on white) */
  /* result accents — the ONLY place green is allowed. Darkened to clear WCAG AA
     (≥4.5:1) as text on white and as a badge bg under white text (Form W/D/L). */
  --win:#0A7D52;        /* win / leader / qualify / Form W / positive ± / LIVE (5.2:1) */
  --draw:#767090;       /* draw — Form D badge bg (white text 4.7:1) */
  --loss:#BE4478;       /* loss (pink) — Form L badge + negative ± (4.9:1) */
  --neg:#E5484D;        /* negative counter (e.g. losses count) */
  /* spacing (8pt) */
  --s1:4px;--s2:8px;--s3:12px;--s4:16px;--s5:20px;--s6:24px;--s8:32px;--s10:40px;--s12:48px;--s16:64px;
  /* radii */
  --r-sm:10px;--r:14px;--r-lg:18px;
  --sh:0 1px 2px rgba(42,14,79,.04);
  --sh-pop:0 8px 24px rgba(42,14,79,.10);
  /* Типографическая шкала. Семь ступеней, шаг 1.11–1.33. Всё, что не попадает
     в шкалу, — ошибка, а не исключение. Монограммы (.tlogo/.tmono/.gmono) вне
     шкалы намеренно: это глиф в кружке, а не текст. (Применяется в C3.) */
  --fs-1:.75rem;    /* 12px — микро-лейбл: th, uppercase-подписи. Пол читаемого текста */
  --fs-2:.875rem;   /* 14px — вторичный UI: кнопки, подсказки, данные плотных таблиц */
  --fs-3:1rem;      /* 16px — body, заголовок карточки */
  --fs-4:1.125rem;  /* 18px — lead */
  --fs-5:1.25rem;   /* 20px — заголовок секции */
  --fs-6:1.5rem;    /* 24px — H1 на мобильном */
  --fs-7:2rem;      /* 32px — H1 страницы */
  /* Кривые и длительности. Вход/выход — только ease-out; ease-in в UI запрещён.
     Потолок UI — 300мс. (Применяется в C2/C3.) */
  --ease-out:cubic-bezier(.23,1,.32,1);
  --ease-in-out:cubic-bezier(.77,0,.175,1);
  --dur-press:160ms;   /* отклик на нажатие */
  --dur-ui:200ms;      /* дропдауны, поповеры, алерты, FLIP */
  /* Недостающие ступени шкал — легализуем реально нужные значения вместо
     россыпи 2/5/6/7/9px по файлу. (Применяется в C4.) */
  --s05:2px;
  --s15:6px;
  --r-xs:6px;          /* мелкие плитки-монограммы */
}

/* ===== Base =============================================================  */
*{box-sizing:border-box}
html,body{overflow-x:hidden}
body{
  margin:0;background:var(--bg);color:var(--ink);
  font-family:'Manrope',system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;
  line-height:1.45;-webkit-font-smoothing:antialiased;
  min-height:100vh;display:flex;flex-direction:column;
}
a{color:var(--brand-2);text-decoration:none;font-weight:600}
/* No underline on hover anywhere (matches the mockups) — links read via colour
   + weight, buttons/cards via their own bg/border hover. */
a:hover{text-decoration:none}
/* C2.4 браузерные поверхности — выделение, каретка, подчёркивание ссылок
   принадлежат нашей палитре, а не браузеру. */
::selection{background:var(--brand-lt);color:var(--brand)}
input,textarea{caret-color:var(--brand-2)}
a{text-underline-offset:2px}
h1,h2,h3,h4{color:var(--ink)}
img{max-width:100%}
.wrap{max-width:1080px;margin:0 auto;padding:0 var(--s5)}
/* Container width matches the mockups per page: 1080px everywhere, widened to
   1120px only on home / catalog / bracket-tool (body.wide). Header, footer and
   content all use .wrap-wide, so the whole page stays one consistent width. */
.wrap-wide{max-width:1080px}
body.wide .wrap-wide{max-width:1120px}
main{flex:1 0 auto;display:block}

/* Skip link (WCAG 2.4.1) */
.skip{position:absolute;left:var(--s2);top:-60px;z-index:60;background:var(--brand);color:#fff;
  padding:var(--s2) var(--s4);border-radius:var(--r-sm);font-weight:700;transition:top .15s}
.skip:focus{top:var(--s2);text-decoration:none}

:focus-visible{outline:2px solid var(--brand-2);outline-offset:2px}

/* ===== Buttons =========================================================  */
.btn{height:38px;display:inline-flex;align-items:center;justify-content:center;gap:var(--s2);
  font-weight:800;font-size:var(--fs-2);padding:0 var(--s4);border-radius:var(--r-sm);cursor:pointer;
  text-decoration:none;white-space:nowrap;border:none;font-family:inherit;line-height:1}
.btn:hover{text-decoration:none}
.btn.pri{background:var(--brand);color:#fff}
.btn.pri:hover{background:#3d1a6e}
.btn.ghost{background:transparent;color:var(--brand);border:1.5px solid var(--line)}
.btn.ghost:hover{border-color:var(--brand-2)}
.btn-o{height:34px;font-size:var(--fs-2);padding:0 var(--s3);font-weight:800;color:var(--brand-2);
  background:transparent;border:1.5px solid var(--brand-2);border-radius:var(--r-sm);
  display:inline-flex;align-items:center;gap:var(--s2);cursor:pointer;text-decoration:none}
.btn-o:hover{background:var(--brand-lt);text-decoration:none}
.btn-o svg{flex-shrink:0}
.btn-o.n{color:var(--ink);border-color:var(--line)}
.btn-o.n:hover{background:var(--surface-2);border-color:var(--line)}
.btn.lg{height:48px;font-size:var(--fs-3);padding:0 var(--s6)}
.btn.sm{height:34px;font-size:var(--fs-2);padding:0 var(--s3)}
.btn svg{flex-shrink:0}
.btn[disabled]{opacity:.55;cursor:not-allowed}
/* C2.1 отклик на нажатие — нажимаемое отвечает на нажатие. Поля таблицы
   (.st-n/.st-name) намеренно исключены: ввод результатов повторяется десятки
   раз за сессию, анимация там мешает. */
.btn,.btn-o,.chip,button{transition:transform var(--dur-press) var(--ease-out)}
.btn:active,.btn-o:active,button:active{transform:scale(.97)}
/* C2.3 prefers-reduced-motion — мгновенно, но смена состояния и обратная связь
   (в т.ч. :active-сжатие) сохраняются; обнуляется только сглаживание. */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{transition-duration:.01ms!important;animation-duration:.01ms!important;
    animation-iteration-count:1!important;scroll-behavior:auto!important}
}

/* ===== Header ==========================================================  */
.hd{background:var(--surface);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:30}
.hd .in{display:flex;align-items:center;gap:var(--s5);height:62px}
.brand{display:flex;align-items:center;gap:var(--s2);font-weight:800;font-size:1.1rem;color:var(--brand);flex-shrink:0}
.brand:hover{text-decoration:none}
.brand svg{color:var(--brand)}
.nav{display:flex;align-items:center;gap:var(--s1);list-style:none;margin:0;padding:0}
.nav>li{position:relative}
.nav a,.nav .navlink{display:block;color:var(--brand);opacity:.72;font-weight:700;font-size:.88rem;
  padding:var(--s2) var(--s3);border-radius:var(--r-sm);white-space:nowrap;cursor:pointer;
  background:none;border:none;font-family:inherit;line-height:1.45}
.nav a:hover,.nav .navlink:hover{opacity:1;background:var(--surface-2);text-decoration:none}
.nav a.on,.nav .navlink.on{opacity:1;color:var(--brand);position:relative}
.nav a.on::after,.nav .navlink.on::after{content:"";position:absolute;left:var(--s3);right:var(--s3);
  bottom:-1px;height:2.5px;background:var(--brand);border-radius:2px}
.nav .navlink{display:inline-flex;align-items:center;gap:4px}
.nav .navlink .caret{transition:transform .18s}
.nav .dd.open .navlink .caret{transform:rotate(180deg)}
.hd .r{margin-left:auto;display:flex;align-items:center;gap:var(--s2);flex-shrink:0}

/* Dropdown menu (Инструменты, profile, bell) */
.dd{position:relative}
.dd-menu{position:absolute;top:calc(100% + 6px);min-width:220px;background:var(--surface);
  border:1px solid var(--line);border-radius:var(--r-sm);box-shadow:var(--sh-pop);padding:6px;
  display:none;z-index:40}
.dd-menu.end{right:0}
.dd.open>.dd-menu{display:block}
.dd-menu a,.dd-menu button{display:flex;align-items:center;gap:var(--s2);width:100%;padding:var(--s2) var(--s3);
  border-radius:8px;color:var(--ink);font-weight:600;font-size:var(--fs-2);opacity:1;background:none;border:none;
  cursor:pointer;font-family:inherit;text-align:left;white-space:nowrap}
.dd-menu a:hover,.dd-menu button:hover{background:var(--surface-2);text-decoration:none}
.dd-menu a.on{color:var(--brand-2)}
.dd-menu svg{flex-shrink:0;color:var(--brand-2)}
.dd-sep{height:1px;background:var(--line-2);margin:6px 4px}
.dd-menu.card-menu{min-width:280px;max-width:340px;padding:0;overflow:hidden}
.dd-menu .dm-head{padding:var(--s3) var(--s4);border-bottom:1px solid var(--line-2);font-weight:800;font-size:.9rem}
/* the notification item is a link, so it inherits .dd-menu a{white-space:nowrap};
   its title/description must wrap instead of stretching the whole menu wide. */
.dd-menu .dm-item{display:flex;gap:var(--s3);padding:var(--s3) var(--s4);align-items:flex-start;white-space:normal}
.dd-menu .dm-item .dm-body{display:flex;flex-direction:column;gap:2px;min-width:0}
.dd-menu .dm-item .dm-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.dd-menu .dm-item .t{font-weight:700;font-size:.88rem}
.dd-menu .dm-item .s{color:var(--muted);font-size:.8rem;line-height:1.4}
.dd-menu .dm-empty{padding:var(--s5);color:var(--muted);text-align:center;font-size:.88rem}

/* Notifications bell */
.iconbtn{width:40px;height:40px;padding:0;border:1px solid var(--line);background:var(--surface-2);border-radius:var(--r-sm);
  color:var(--brand);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;position:relative}
.iconbtn:hover{background:var(--surface)}
.iconbtn .dot{position:absolute;top:6px;right:7px;width:8px;height:8px;border-radius:50%;
  background:var(--neg);border:2px solid var(--surface)}

/* Profile chip */
.chip-prof{display:flex;align-items:center;gap:var(--s2);padding:var(--s1);border:none;border-radius:var(--r-sm);
  background:transparent;cursor:pointer;font-family:inherit}
.chip-prof:hover{background:var(--surface-2)}
.avatar{width:34px;height:34px;border-radius:var(--r-sm);background:var(--brand);color:#fff;
  display:inline-flex;align-items:center;justify-content:center;font-weight:800;font-size:.85rem;flex-shrink:0}
.chip-prof .meta{display:flex;flex-direction:column;line-height:1.15;text-align:left;min-width:0}
.chip-prof .meta .nm{font-weight:800;font-size:.82rem;color:var(--brand);max-width:180px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.chip-prof .meta .rl{font-size:var(--fs-1);color:var(--muted)}
@media(max-width:1200px){.chip-prof .meta{display:none}}

/* Burger + mobile panel */
.burger{display:none;width:40px;height:40px;border:1px solid var(--line);background:var(--surface);
  border-radius:var(--r-sm);color:var(--brand);cursor:pointer;align-items:center;justify-content:center;flex-shrink:0}
.mnav{display:none;position:fixed;left:0;right:0;top:62px;bottom:0;background:var(--surface);
  border-top:1px solid var(--line);z-index:29;overflow-y:auto;padding:var(--s4) 0}
.mnav.open{display:block}
body.mnav-lock{overflow:hidden}
.mnav a,.mnav .m-sub-h{display:block;padding:var(--s3) var(--s5);color:var(--brand);font-weight:700;font-size:var(--fs-3)}
.mnav a:hover{background:var(--surface-2);text-decoration:none}
.mnav a.on{color:var(--brand-2)}
.mnav .m-sub-h{color:var(--faint);font-size:var(--fs-1);text-transform:uppercase;letter-spacing:.05em;font-weight:800;padding-bottom:var(--s1)}
.mnav .m-sub a{padding-left:var(--s8)}
.mnav .sep{height:1px;background:var(--line-2);margin:var(--s3) var(--s5)}
.mnav .actions{padding:var(--s4) var(--s5);display:flex;flex-direction:column;gap:var(--s3)}
/* Restore button rendering for action buttons that are <a> elements: the broad
   `.mnav a` rule above forces display:block + left padding, which turns a
   `.btn.ghost` link into something that reads as an empty input. */
.mnav .actions .btn{width:100%;display:inline-flex;align-items:center;justify-content:center;padding:0 var(--s4)}

/* ===== Page hero band ==================================================  */
.hero{background:var(--surface);border-bottom:1px solid var(--line)}
.hero .in{padding-top:var(--s6);padding-bottom:var(--s8)}
.hero .bc{color:var(--muted);font-size:var(--fs-2);font-weight:600;margin-bottom:var(--s3)}
.hero .bc a{color:var(--muted)}
.hero .bc a:hover{color:var(--brand)}
.hero h1{font-size:var(--fs-7);font-weight:800;letter-spacing:-.02em;margin:0;display:flex;align-items:center;gap:var(--s3);flex-wrap:wrap}
.hero h1 svg{color:var(--brand);flex-shrink:0}
.hero .lead{color:var(--muted);font-size:var(--fs-4);margin-top:var(--s3);max-width:640px;line-height:1.55}

/* ===== Content shell ===================================================  */
.body{padding:var(--s8) 0 var(--s10)}
.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--sh);overflow:hidden}
.card-pad{padding:var(--s6)}
.chip{font-size:var(--fs-1);font-weight:800;padding:var(--s05) var(--s2);border-radius:999px;background:var(--surface-2);color:var(--muted);display:inline-flex;align-items:center;gap:4px}
.chip.pub{background:rgba(91,42,158,.12);color:var(--brand-2)}

/* Alerts (Django messages) */
.alert{border:1px solid var(--line);border-radius:var(--r-sm);padding:var(--s3) var(--s4);
  margin-bottom:var(--s4);font-size:.92rem;font-weight:600;display:flex;justify-content:space-between;gap:var(--s3);align-items:flex-start}
.alert-info{background:var(--brand-lt);color:var(--brand);border-color:var(--line)}
.alert-success{background:rgba(14,160,106,.10);color:#0b7a52;border-color:rgba(14,160,106,.25)}
/* C2.5 ссылка на цветной подложке — наследует текст алерта (brand-2 на зелёном
   давал 2.76:1, провал WCAG AA); аффорданс несёт подчёркивание. */
.alert a{color:inherit;text-decoration:underline;text-underline-offset:2px;font-weight:800}
.alert-warning{background:#fff6e6;color:#8a5a00;border-color:#f0d9a8}
.alert-danger{background:rgba(229,72,77,.08);color:#b02a2f;border-color:rgba(229,72,77,.25)}
/* Non-field errors — нейтральный modifier .form-errors (Phase 2). Значения повторяют
   .alert-danger (public/auth); .alert-danger не трогаем. Внутренние <p> — без внешнего
   margin, интервал между ошибками существующим токеном (общее для обеих поверхностей). */
.form-errors{background:rgba(229,72,77,.08);color:#b02a2f;border-color:rgba(229,72,77,.25)}
.form-errors p{margin:0}
.form-errors p+p{margin-top:var(--s2)}
.alert .x{background:none;border:none;color:inherit;cursor:pointer;font-size:1.1rem;line-height:1;opacity:.6;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;flex-shrink:0}
.alert .x:hover{opacity:1}

/* ===== Team page: tabs, roster table, match filters (ADR 0015) ===========  */
/* Screen-reader-only text. Same rule as the cabinet's .vh — the public surface
   needs it now that the roster table has a column whose header is an icon. */
.vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}

/* Scope line under the header figures: quiet, but always present. */
.rec-scope{margin:var(--s2) 0 0;font-size:var(--fs-1);color:var(--faint)}

/* Page sections. Server-rendered links, not a widget: heavier than any filter
   below them, two equal zones on mobile, 44px tall so a thumb can hit them. */
.ptabs{display:flex;gap:var(--s2);margin-bottom:var(--s5);border-bottom:1px solid var(--line);scroll-margin-top:var(--s6)}
.ptab{flex:1 1 0;min-height:44px;display:inline-flex;align-items:center;justify-content:center;padding:0 var(--s4);font-weight:800;font-size:1rem;color:var(--muted);border-bottom:2px solid transparent;margin-bottom:-1px}
.ptab:hover{color:var(--ink);text-decoration:none}
.ptab.on{color:var(--brand);border-bottom-color:var(--brand)}

/* Match filters — the secondary layer, deliberately lighter than .ptabs. */
.mfilter{padding:var(--s4) var(--s5);border-bottom:1px solid var(--line-2);display:flex;flex-direction:column;gap:var(--s3)}
.tpick{display:flex;flex-direction:column;gap:var(--s2)}
.tpick-l{font-size:var(--fs-1);font-weight:800;text-transform:uppercase;letter-spacing:.04em;color:var(--faint)}
.tpick-row{display:flex;gap:var(--s2);align-items:stretch}
.tpick-s{flex:1 1 auto;min-width:0;min-height:44px;padding:0 var(--s3);border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);color:var(--ink);font:inherit}
.tpick-b{flex:0 0 auto;min-height:44px}
.tpick-one{margin:0;font-size:var(--fs-2);color:var(--ink)}
.tpick-one .tpick-l{display:block;margin-bottom:2px}

/* Three equal zones that stay on one line at 320px; the counters are the part
   that gives way, because the words are what the link is for. */
.sfilter{display:flex;gap:var(--s2)}
.sf{flex:1 1 0;min-width:0;min-height:44px;display:inline-flex;align-items:center;justify-content:center;text-align:center;padding:0 var(--s2);border:1px solid var(--line);border-radius:var(--r-sm);font-size:var(--fs-2);font-weight:700;color:var(--muted);background:var(--surface)}
.sf:hover{color:var(--ink);text-decoration:none}
.sf.on{background:var(--brand);border-color:var(--brand);color:#fff}
.sfn{font-variant-numeric:tabular-nums}

.msec{padding:var(--s4) var(--s5) var(--s2);font-size:var(--fs-1);font-weight:800;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);border-top:1px solid var(--line-2)}
.msec:first-of-type{border-top:none}
.mempty{color:var(--muted)}
.mempty-l{display:inline-block;margin-left:var(--s2);font-weight:700}

/* Roster: a real table on every width. A card per player loses the column
   alignment that makes a squad readable at a glance. */
.rtbl{width:100%;border-collapse:separate;border-spacing:0;font-size:var(--fs-2);table-layout:fixed}
.rtbl th,.rtbl td{padding:var(--s3) var(--s2);text-align:left;vertical-align:middle}
.rtbl thead th{font-size:var(--fs-1);text-transform:uppercase;letter-spacing:.03em;color:var(--faint);font-weight:700}
.rtbl tbody td{border-top:1px solid var(--line-2)}
.rtbl .rgrp th{background:var(--surface-2);font-size:var(--fs-1);font-weight:800;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);border-top:1px solid var(--line-2)}
.rtbl .c-num{width:44px;padding-left:var(--s5);color:var(--faint);font-weight:800;font-variant-numeric:tabular-nums}
.rtbl .c-pic{width:56px}
.rtbl .c-nm{font-weight:600;overflow-wrap:break-word}
.rtbl .c-age{width:88px;font-variant-numeric:tabular-nums;color:var(--muted)}
.rtbl .c-pos{width:150px;color:var(--muted);padding-right:var(--s5)}
.rtbl .rgrp th{padding-left:var(--s5);padding-right:var(--s5)}
.pphoto{width:40px;height:40px;border-radius:var(--r-sm);object-fit:cover;display:block;font-size:var(--fs-1)}

/* Compact tournament row in the sidebar: name + one meta line. No logo — it
   does not help tell two rows apart and eats the width the name needs. */
.crow{display:block;padding:var(--s3) var(--s5);border-top:1px solid var(--line-2);color:var(--ink)}
.crow:first-of-type{border-top:none}
a.crow:hover{background:var(--surface-2);text-decoration:none}
.cnm{display:block;font-weight:700;font-size:var(--fs-2);overflow-wrap:break-word}
.cmeta{display:block;margin-top:2px;font-size:var(--fs-1);color:var(--muted)}

@media (max-width:820px){
    /* Mobile order (ADR 0015 §7): tabs → Форма → the active section → Турниры.
       `display:contents` lifts the two sidebar cards into the single-column grid
       so they can be ordered around the main column; on desktop they go back to
       being one column and this rule does not apply.

       Селекторы намеренно скоупятся `.team-lay`: пока они были глобальными
       `.lay …`, они переставляли и страницу лиги, у которой правильный DOM уже
       является правильным mobile-порядком (ТЗ страницы лиги §9). */
    .team-lay > .col-side{display:contents}
    .team-lay > .col-main{order:2}
    .team-lay .side-form{order:1;margin-top:0}
    .team-lay .side-tours{order:3}
}

@media (max-width:560px){
    /* The position already names the group in the row header above, so the
       column is duplication — hidden visually, still in the accessibility tree
       through that <th scope="rowgroup">. */
    .rtbl .c-pos{display:none}
    /* `table-layout:fixed` still hands the hidden column its share of the leftover
       width, so the name column got half of what was free — ~65px, enough to split
       ordinary surnames across three lines. Auto layout distributes by content
       instead: the numeric columns keep their hints below and the name takes the
       rest. */
    .rtbl{table-layout:auto}
    .rtbl th,.rtbl td{padding:var(--s3) var(--s1)}
    .rtbl .c-num{width:32px;padding-left:var(--s3)}
    .rtbl .c-pic{width:48px}
    .rtbl .c-age{width:48px;padding-right:var(--s3)}
    .rtbl .c-nm{width:auto}
    .rtbl .rgrp th{padding-left:var(--s3);padding-right:var(--s3)}

    /* Three EQUAL zones on one line at 320px (§7). The card's own side padding
       is what decides whether «Предстоящие» fits: at s5 each zone was 75px for
       79px of text, so the words overlapped their neighbours. */
    .mfilter{padding:var(--s4) var(--s2)}
    .sfilter{gap:var(--s05)}
    .sf{font-size:var(--fs-1);padding:0 var(--s05)}
    .sfn{display:none}

    /* Side by side, the select shrank to ~130px and truncated «Все турниры»
       mid-word. A full-width stack keeps the option readable (§7). */
    .tpick-row{flex-direction:column}
    .tpick-b{width:100%}
}

/* ===== Footer ==========================================================  */
.ft{background:var(--surface);border-top:1px solid var(--line);margin-top:var(--s10);flex-shrink:0}
.ft .in{display:flex;justify-content:space-between;gap:var(--s5);flex-wrap:wrap;
  padding-top:var(--s6);padding-bottom:var(--s6);color:var(--muted);font-size:.84rem}
.ft a{color:var(--muted);font-weight:600}
.ft a:hover{color:var(--brand)}
.ft .lk{display:flex;gap:var(--s3) var(--s5);flex-wrap:wrap;max-width:680px}

/* ===== Forms ===========================================================  */
.field{margin-bottom:var(--s4)}
.field>label,label.field-label{display:block;font-weight:800;font-size:var(--fs-2);margin-bottom:var(--s15);color:var(--ink)}
.field-label.required::after{content:" *";color:var(--neg)}
input:not([type="checkbox"]):not([type="radio"]):not([type="submit"]):not([type="button"]):not([type="file"]),
select,textarea{
  /* Width/padding/font-size are parametrised so a control can opt into a compact
     box by setting the custom property on itself (e.g. .st-n) — no specificity
     fight with this 5×:not() selector, no !important. Fallbacks keep every other
     control's computed defaults unchanged. */
  display:block;width:var(--control-w,100%);padding:var(--control-pad,10px 12px);font-family:inherit;
  font-size:var(--control-fs,.94rem);color:var(--ink);
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);appearance:auto;line-height:1.4}
/* :focus/:disabled repeat the base :not() chain so they outrank it (the base
   selector's five :not([type]) parts otherwise win and keep the --line border). */
input:not([type="checkbox"]):not([type="radio"]):not([type="submit"]):not([type="button"]):not([type="file"]):focus,
select:focus,textarea:focus{outline:none;border-color:var(--brand-2);box-shadow:0 0 0 3px rgba(91,42,158,.12)}
input::placeholder,textarea::placeholder{color:var(--faint);opacity:1}
input:not([type="checkbox"]):not([type="radio"]):not([type="submit"]):not([type="button"]):not([type="file"]):disabled,
select:disabled,textarea:disabled{background:var(--surface-2);color:var(--muted);cursor:not-allowed}
textarea{min-height:96px;resize:vertical}
.form-hint,.helptext{display:block;margin-top:var(--s15);font-size:var(--fs-2);color:var(--muted)}
.errorlist{margin:6px 0 0;padding-left:1rem;color:var(--neg);font-size:var(--fs-2);list-style:disc}
.form-narrow{max-width:32rem}

/* Small compat shims (kept minimal, non-Bootstrap markup elsewhere) */
[hidden]{display:none!important}

/* Responsive-embed shim: admin-authored flatpage/FAQ content embeds videos
   (VK Video) with Bootstrap's .ratio helper. Keep it working without Bootstrap. */
.ratio{position:relative;width:100%}
.ratio::before{display:block;padding-top:var(--bs-aspect-ratio,56.25%);content:""}
.ratio>*{position:absolute;inset:0;width:100%;height:100%;border:0}
.ratio-16x9{--bs-aspect-ratio:56.25%}
.ratio-4x3{--bs-aspect-ratio:75%}
.ratio-1x1{--bs-aspect-ratio:100%}
.ratio-21x9{--bs-aspect-ratio:42.857%}
.legal-content img,.qa .ans img{border-radius:var(--r-sm)}

/* ===== Prose (flatpages / legal / about) ===============================  */
.prose{font-size:1.02rem;color:var(--ink);line-height:1.65;max-width:760px}
.prose p{margin:0 0 var(--s4)}
.prose h2{font-size:1.3rem;font-weight:800;margin:var(--s8) 0 var(--s4)}
.prose h3{font-size:1.08rem;font-weight:800;margin:var(--s6) 0 var(--s3)}
.prose ul,.prose ol{margin:0 0 var(--s4);padding-left:1.3rem}
.prose li{margin-bottom:var(--s2)}
.prose a{color:var(--brand-2)}
.legal-content{font-size:var(--fs-3);color:var(--ink);line-height:1.7}
.legal-content h2{font-size:var(--fs-5);font-weight:800;margin:var(--s6) 0 var(--s3)}
.legal-content h3{font-size:1.05rem;font-weight:800;margin:var(--s5) 0 var(--s2)}
.legal-content p{margin:0 0 var(--s4)}
.legal-content ul,.legal-content ol{margin:0 0 var(--s4);padding-left:1.3rem}
.legal-content li{margin-bottom:var(--s2)}

/* ===== FAQ accordion ===================================================  */
.faq{max-width:760px}
.grp-h{font-size:.78rem;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--faint);margin:var(--s8) 0 var(--s4)}
.grp-h:first-child{margin-top:0}
.qa{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);margin-bottom:var(--s3);overflow:hidden;box-shadow:var(--sh)}
.qa summary{padding:var(--s4) var(--s5);font-weight:700;font-size:var(--fs-3);cursor:pointer;display:flex;
  justify-content:space-between;align-items:center;gap:var(--s4);list-style:none}
.qa summary::-webkit-details-marker{display:none}
.qa summary:hover{background:var(--surface-2)}
.qa .chev{color:var(--faint);flex-shrink:0;transition:transform .2s}
.qa[open] summary .chev{transform:rotate(180deg)}
.qa[open] summary{border-bottom:1px solid var(--line-2)}
.qa .ans{padding:var(--s4) var(--s5);color:var(--muted);line-height:1.65;font-size:.95rem}
.qa .ans p{margin:0 0 var(--s3)}.qa .ans p:last-child{margin:0}
.askmore{margin-top:var(--s10);display:flex;align-items:center;gap:var(--s4);flex-wrap:wrap;
  background:var(--brand-lt);border:1px solid var(--line);border-radius:var(--r);padding:var(--s5) var(--s6);max-width:760px}
.askmore .t{font-weight:800}.askmore .s{color:var(--muted);font-size:.92rem}
.askmore .btn{margin-left:auto}

/* ===== Section rhythm + info-page components ===========================  */
.sec{margin-top:var(--s10)}.sec:first-child{margin-top:0}
.sec>h2{font-size:1.3rem;font-weight:800;margin:0 0 var(--s5)}
.features{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--s4)}
.feat{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:var(--s5);box-shadow:var(--sh)}
.feat .ic{width:40px;height:40px;border-radius:var(--r-sm);background:var(--brand-lt);color:var(--brand-2);
  display:flex;align-items:center;justify-content:center;margin-bottom:var(--s4)}
.feat h3{font-size:var(--fs-3);font-weight:800;margin:0 0 var(--s1)}
.feat p{margin:0;color:var(--muted);font-size:.92rem;line-height:1.5}
.callout{display:flex;align-items:center;gap:var(--s5);background:var(--brand-lt);border:1px solid var(--line);
  border-radius:var(--r);padding:var(--s6);flex-wrap:wrap}
.callout .big{font-size:var(--fs-6);font-weight:800;color:var(--brand)}
.callout .sub{color:var(--muted);font-size:.95rem}
.ctacard{background:var(--brand);color:#fff;border-radius:var(--r-lg);padding:var(--s10) var(--s8);text-align:center;margin-top:var(--s10)}
.ctacard h2{font-size:1.6rem;margin:0 0 var(--s2);color:#fff}
.ctacard p{color:rgba(255,255,255,.82);margin:0 0 var(--s6)}
.ctacard .btn.lg{background:#fff;color:var(--brand)}
.audience{display:flex;gap:var(--s2);flex-wrap:wrap}
.audience .chip{font-size:var(--fs-2);padding:var(--s2) var(--s4);background:var(--brand-lt);color:var(--brand-2);border-radius:999px;font-weight:700}
.sec-gap{margin-top:var(--s6)}

/* ===== Contacts page (mockup 11) ======================================  */
.ct-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--s6);align-items:start}
@media(max-width:760px){.ct-grid{grid-template-columns:1fr}}
.support{padding:var(--s6)}
.support .ic{width:44px;height:44px;border-radius:var(--r-sm);background:var(--brand-lt);color:var(--brand-2);display:flex;align-items:center;justify-content:center;margin-bottom:var(--s4)}
.support .k{color:var(--muted);font-size:.8rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em}
.support .email{font-size:1.3rem;font-weight:800;margin:var(--s1) 0 var(--s3);display:inline-block;word-break:break-word}
.support .hint{color:var(--muted);font-size:.92rem;margin:0}
.ptxt{padding:var(--s4) var(--s5) 0;color:var(--muted);font-size:.9rem}
.rrow{display:flex;gap:var(--s4);padding:var(--s3) var(--s5);border-top:1px solid var(--line-2);font-size:.92rem}
.rrow:first-of-type{border-top:none}
.rrow .k{color:var(--muted);flex:0 0 168px}
.rrow .v{flex:1;font-weight:600;min-width:0;word-break:break-word}
.cnote{padding:var(--s3) var(--s5) var(--s5);color:var(--faint);font-size:.82rem;line-height:1.5}
@media(max-width:560px){.rrow{flex-direction:column;gap:2px}.rrow .k{flex:none}}
.pbody{padding:var(--s5);font-size:.95rem;line-height:1.6}
.fbbody{padding:var(--s5)}
.fbbody .lead{color:var(--muted);font-size:.95rem;margin:0 0 var(--s5);max-width:560px;line-height:1.55}
.fbbody .form-narrow{max-width:520px}
.consent{color:var(--muted);font-size:.82rem;margin-top:var(--s3);line-height:1.55;max-width:520px}

/* ===== Auth (login / signup / reset / verify) ==========================  */
.authwrap{min-height:100vh;padding:var(--s12) var(--s5) var(--s16)}
.authbrand{display:flex;align-items:center;justify-content:center;gap:var(--s2);color:var(--brand);font-weight:800;font-size:var(--fs-6);margin-bottom:var(--s8)}
.authbrand:hover{text-decoration:none}
.authbrand svg{color:var(--brand)}
.acard{max-width:400px;margin:0 auto;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);
  box-shadow:0 8px 30px rgba(42,14,79,.06);padding:var(--s8) var(--s6)}
.acard h2{text-align:center;font-size:1.35rem;font-weight:800;margin:0 0 var(--s2)}
.acard .a-badge{display:block;text-align:center;font-size:var(--fs-1);font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--brand-2);margin-bottom:var(--s2)}
.acard .lead{color:var(--muted);font-size:.9rem;text-align:center;margin:0 0 var(--s5);line-height:1.5}
.acard .btn{width:100%}
.acard.state{text-align:center}
.acard.state .ic{margin-bottom:var(--s3);display:flex;justify-content:center}
.acard.state .btn{width:auto;min-width:180px;margin:var(--s3) auto 0}
.lbl-row{display:flex;justify-content:space-between;align-items:baseline;gap:var(--s2)}
.lbl-row a{font-weight:600;font-size:.82rem}
.chkrow{display:flex;gap:var(--s2);align-items:flex-start;font-size:var(--fs-2);color:var(--muted);line-height:1.5;margin-bottom:var(--s5)}
.chkrow input{margin-top:3px;width:18px;height:18px;accent-color:var(--brand-2);flex-shrink:0}
.authfoot{text-align:center;color:var(--muted);font-size:var(--fs-2);margin-top:var(--s5)}
.authfoot form{display:inline;margin:0}
.link-btn{background:none;border:none;padding:0;font:inherit;color:var(--brand-2);font-weight:600;cursor:pointer;vertical-align:baseline}
.link-btn:hover{text-decoration:underline}

/* ===== Profile / account ==============================================  */
.pre{color:var(--brand-2);font-size:var(--fs-1);font-weight:800;text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--s2)}
.col-narrow{max-width:720px;margin:0 auto}
.col-narrow>.card+.card{margin-top:var(--s6)}
.acct{display:flex;align-items:center;gap:var(--s4);padding:var(--s6)}
.acct .av{width:60px;height:60px;border-radius:var(--r);background:var(--brand-lt);color:var(--brand-2);font-weight:800;font-size:1.5rem;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.acct .nm{font-size:var(--fs-5);font-weight:800;word-break:break-word}
.acct .sub{color:var(--muted);font-size:var(--fs-2);margin-top:2px}
.acct .lg{color:var(--muted);font-size:.85rem;margin-top:var(--s2);display:flex;align-items:center;gap:5px}
.acct .lg svg{color:var(--faint);flex-shrink:0}
.acctnote{padding:0 var(--s6) var(--s6);color:var(--faint);font-size:.85rem}
.ph{padding:var(--s4) var(--s5);border-bottom:1px solid var(--line-2);font-weight:800;font-size:var(--fs-3);display:flex;justify-content:space-between;align-items:center;gap:var(--s3)}
.ph .phi{display:flex;align-items:center;gap:var(--s2)}
.ph .phi svg{color:var(--brand-2);flex-shrink:0}
.fbody{padding:var(--s6)}
.frow{display:grid;grid-template-columns:1fr 1fr;gap:var(--s4)}
.factions{display:flex;justify-content:flex-end;gap:var(--s3);margin-top:var(--s5);align-items:center}
.sec-row{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:var(--s4);padding:var(--s6)}
.sec-row .t{color:var(--muted);font-size:.95rem}
/* Profile security action pairs with the primary button — full height (mockup 12). */
.sec-row .btn-o{height:38px;font-size:var(--fs-2);padding:0 var(--s4)}
.req{color:var(--brand-2)}
.field-err{color:var(--neg);font-size:var(--fs-2);margin-top:4px;font-weight:600}
.field-err.center{text-align:center}

/* ===== Entity band (league / team / tournament sub-header) =============  */
.band{background:var(--surface);border-bottom:1px solid var(--line)}
.band .in{padding-top:var(--s6);padding-bottom:var(--s8)}
.band .bc{color:var(--muted);font-size:.82rem;font-weight:600;margin-bottom:var(--s4)}
.band .bc a{color:var(--brand-2)}
.band .bc a:hover{color:var(--brand)}
.band .row1{display:flex;align-items:center;gap:var(--s5);flex-wrap:wrap}
.band .blogo{width:64px;height:64px;font-size:1.25rem;border-radius:var(--r);flex-shrink:0}
.band h1{font-size:var(--fs-7);font-weight:800;letter-spacing:-.02em;margin:0;line-height:1.1;display:flex;align-items:center;gap:var(--s3);flex-wrap:wrap}
.band h1 svg{color:var(--brand);flex-shrink:0}
.band .lead{color:var(--muted);font-size:1.02rem;margin-top:var(--s3);max-width:680px;line-height:1.55}
.st-badge{background:rgba(91,42,158,.12);color:var(--brand-2);border-radius:999px;padding:3px 12px;font-weight:800;font-size:var(--fs-2)}
.st-badge.mut{background:var(--surface-2);color:var(--muted)}
.band .meta{color:var(--muted);font-size:var(--fs-2);margin-top:var(--s3);display:flex;gap:var(--s2) var(--s4);flex-wrap:wrap;align-items:center}
.band .meta a{color:var(--brand-2)}
.band .meta .mi{display:flex;align-items:center;gap:5px}
.band .meta .mi svg{color:var(--faint);flex-shrink:0}
.band .meta .sep{color:var(--faint)}
.band .cta{margin-left:auto;display:flex;gap:var(--s2)}
.btn.wg{background:var(--surface-2);color:var(--brand);border:1px solid var(--line)}
.btn.wg:hover{border-color:var(--brand-2)}

/* ===== Two-column dashboard layout ====================================  */
.lay{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:var(--s6);align-items:start}
.col-main,.col-side{min-width:0}
.col-main>.card+.card,.col-side>.card+.card{margin-top:var(--s6)}

/* ===== Team crest (public V3 partial) =================================  */
.tlogo{object-fit:contain;border-radius:7px;background:var(--surface-2);flex-shrink:0}
/* Logos sit in the fixed square box each per-context rule defines; object-fit:
   contain fits the mark inside without cropping or squashing (a non-square logo
   is letterboxed, centred on the --surface-2 pad). The square box is reserved
   before the image loads, so logos never shift layout (CLS). The monogram
   fallback (.tmono / .mono span) is not an image element and keeps the same square box. */
/* Monogram avatar for logo-less entities: coloured square, white letters. The
   background colour is set inline per name (mono_color filter), matching the
   design's coloured monograms rather than a single flat tint. */
.tmono{color:#fff;background:var(--brand-2)}

/* ===== Match rows (upcoming / results feeds) ==========================  */
.mrow{padding:var(--s3) var(--s5);border-top:1px solid var(--line-2)}
.mrow:first-of-type{border-top:none}
.mrow:hover{background:var(--surface-2)}
.match{display:flex;align-items:stretch;gap:var(--s3)}
.match .status{flex:0 0 64px;width:64px;min-width:64px;max-width:64px;display:flex;flex-direction:column;align-items:flex-start;justify-content:center;
  text-align:left;gap:2px;font-size:var(--fs-1);font-weight:600;color:var(--muted);border-right:1px solid var(--line-2);line-height:1.25;padding-right:var(--s3);white-space:nowrap;overflow:hidden}
.match .rows{flex:1;min-width:0;display:flex;flex-direction:column;gap:var(--s2);padding-left:var(--s2)}
.mr{display:flex;align-items:center;gap:var(--s2);min-width:0}
.mr .mono,.mr .tlogo{width:22px;height:22px;font-size:.56rem;border-radius:7px}
/* Одна командная ссылка = герб + название, и ТОЛЬКО они (§9.2).
   flex-grow здесь запрещён: с `flex:1` ссылка занимала всю свободную ширину строки
   (828px из 1038px при видимых 115px герба и названия), и ~721px пустоты после
   названия открывали страницу команды вместо матча. `0 1 auto` даёт плотную
   геометрию — можно сжиматься до ellipsis, но не расти, — а свободный хвост
   остаётся за stretched-link матча. Счёт прижимает к правому краю `margin-left:auto`,
   а не растянутый сосед. */
.mr .tlink{flex:0 1 auto;min-width:0;display:flex;align-items:center;gap:var(--s2);
  color:inherit;text-decoration:none}
.mr .tlink .mono,.mr .tlink .tlogo{flex:none}
.mr .nm{min-width:0;font-weight:500;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:var(--fs-2)}
a.tlink:hover .nm{color:var(--brand-2)}
.mr .sc{flex:0 0 22px;margin-left:auto;text-align:center;font-weight:600;color:var(--muted);font-variant-numeric:tabular-nums}
.mr.win .nm{font-weight:700}.mr.win .sc{color:var(--ink);font-weight:700}
.mr.lose .nm{color:var(--muted)}
.mcap{color:var(--faint);font-size:.78rem;text-align:center;margin-top:var(--s2)}
/* ---- Opt-in match link (ADR 0012 §9.2) — sibling stretched anchor --------
   Only `.mrow.linked` (match_link=True) gets this; the default row and the
   organizer reuse of the same partial stay plain. The anchor is a SIBLING of the
   team links, never their parent, and it is stretched against the whole `.mrow`
   (not just `.match`), so the caption line, the score, the date gutter, the
   chevron and every gap open the match — the row has no dead spots. Exactly two
   things are lifted above it: the two team links. No user-select/touch-callout
   resets, no JS handler — a native <a href> that works with scripting off. */
.mrow.linked{position:relative}
.mlink-o{position:absolute;inset:0;z-index:0;border-radius:var(--r-xs)}
.mlink-o:focus-visible{outline:2px solid var(--brand-2);outline-offset:-2px}
.mrow.linked .mr .tlink{position:relative;z-index:1}
/* Self-contained affordance column: ≥44px even at 320px, and it belongs to the
   stretched link rather than becoming a second anchor. */
.mchev{flex:0 0 44px;min-width:44px;min-height:44px;display:flex;align-items:center;
  justify-content:center;color:var(--faint);pointer-events:none}
/* On narrow rows the affordance keeps its full 44px, but takes it from the row's
   own trailing padding instead of from the team names: without this the column
   cost the names 56px at 320px and truncated even short ones. The anchor still
   covers the whole strip, so the touch zone does not shrink. */
@media(max-width:520px){
  .mrow.linked{padding-right:0}
  .mrow.linked .mchev{margin-right:0}
}
/* 320px: сначала уступают собственные отступы, gap и date-gutter компонента, и
   только потом — названия команд (ТЗ страницы лиги §9). Тач-зоны не трогаем:
   шеврон остаётся 44px, командные ссылки — своей высоты. Правило общее, потому
   что теснит на 320px не только лига: тот же ряд стоит в лентах турнира и
   команды. */
@media(max-width:359px){
  .mrow{padding-left:var(--s3)}
  .match{gap:var(--s2)}
  .match .status{flex-basis:52px;width:52px;min-width:52px;max-width:52px;padding-right:var(--s2)}
  .match .rows{padding-left:var(--s1)}
}
.mchev svg{width:18px;height:18px}
.mrow.linked:hover .mchev{color:var(--brand-2)}

/* ===== Tournament rows / teams grid / venues / organizer ==============  */
.trow{display:flex;align-items:center;justify-content:space-between;gap:var(--s3);padding:var(--s4) var(--s5);
  border-top:1px solid var(--line-2);flex-wrap:wrap;color:var(--ink)}
.trow:first-of-type{border-top:none}.trow:hover{background:var(--surface-2);text-decoration:none}
.trow .l{display:flex;align-items:center;gap:var(--s3);min-width:0}
.trow .tlogo,.trow .tmono{width:40px;height:40px;border-radius:var(--r-sm);font-size:.78rem}
.trow .tnm{font-weight:700;font-size:var(--fs-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--ink)}
.trow:hover .tnm{color:var(--brand-2)}
.trow .r{display:flex;align-items:center;gap:var(--s3);color:var(--muted);font-size:.88rem;flex-shrink:0}
.trow .r .mi{display:flex;align-items:center;gap:4px}.trow .r .mi svg{color:var(--faint)}
.about{padding:var(--s5);color:var(--ink);font-size:.95rem;line-height:1.6;white-space:pre-line}
.tgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--s4) var(--s5);padding:var(--s5)}
.titem{display:flex;align-items:center;gap:var(--s2);min-width:0;color:var(--ink)}
.titem:hover{text-decoration:none}
.titem .tlogo,.titem .tmono{width:38px;height:38px;border-radius:var(--r-sm);font-size:.72rem}
.titem .info{display:flex;flex-direction:column;min-width:0}
.titem .tn{font-weight:700;font-size:.92rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--ink)}
.titem:hover .tn{color:var(--brand-2)}
.titem .ts{color:var(--muted);font-size:.78rem}
.venue{padding:var(--s4) var(--s5);font-size:var(--fs-2);border-top:1px solid var(--line-2)}
.venue:first-of-type{border-top:none}
.venue b{font-weight:700}
.venue .sub{color:var(--muted);margin-top:var(--s1)}
.org{display:flex;align-items:center;gap:var(--s3);padding:var(--s5)}
.org .av{width:46px;height:46px;border-radius:var(--r-sm);background:var(--brand-lt);color:var(--brand-2);font-weight:800;font-size:1.05rem;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center}
.org .nm{font-weight:700}.org .sub{color:var(--muted);font-size:.85rem;margin-top:1px}
.contact-line{padding:var(--s4) var(--s5);border-top:1px solid var(--line-2);display:flex;align-items:center;gap:var(--s2);font-size:var(--fs-2)}
.contact-line svg{color:var(--brand-2);flex-shrink:0}

/* ===== Team record line + matches grouped + form + roster =============  */
.band .rec{display:flex;gap:var(--s5);flex-wrap:wrap;margin-top:var(--s4);font-size:var(--fs-2)}
.band .rec .ri{display:flex;gap:6px;align-items:baseline}
.band .rec .rk{color:var(--muted)}
.band .rec .rv{font-weight:800;color:var(--ink)}
.band .rec .rv.g{color:var(--win)}   /* wins — a result, green is allowed */
.band .rec .rv.r{color:var(--neg)}
.match .status.wide{flex-basis:88px;width:88px;min-width:88px;max-width:88px}
.match .status .rn{font-weight:800;color:var(--brand-2);font-size:var(--fs-1)}
.match .status .sp{color:var(--faint);font-size:var(--fs-1);font-weight:700}
.mr.me .nm{color:var(--brand-2)}
.form{padding:var(--s5);display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap}
.fp{width:28px;height:28px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;font-size:.76rem;font-weight:800;color:#fff}
.fw{background:var(--win)}.fl{background:var(--loss)}.fd{background:var(--draw)}
.form .note{color:var(--muted);font-size:.82rem;margin-left:var(--s2)}
.ph+.rgh{border-top:none}

/* ===== League catalog ==================================================  */
.mono{border-radius:var(--r-sm);display:inline-flex;align-items:center;justify-content:center;color:#fff;font-weight:800;flex-shrink:0}
.catalog{display:grid;grid-template-columns:264px minmax(0,1fr);gap:var(--s6);align-items:start}
.filters{padding:var(--s6);position:sticky;top:78px}
.flg{margin-bottom:var(--s5)}
.flg:last-of-type{margin-bottom:0}
.fll{font-weight:700;font-size:.78rem;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin-bottom:var(--s3)}
.chk{display:flex;align-items:center;gap:var(--s2);padding:var(--s2) 0;cursor:pointer;font-size:.92rem;font-weight:600}
.chk input{width:18px;height:18px;accent-color:var(--brand-2);cursor:pointer;flex-shrink:0}
.filters .apply{width:100%;margin-top:var(--s2)}
.filters .clear{display:block;text-align:center;margin-top:var(--s3);color:var(--muted);font-weight:700;font-size:.88rem}
.rhead{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--s3);margin-bottom:var(--s4);min-width:0}
.rhead .cnt{color:var(--muted);font-size:.95rem}
.rhead .cnt b{color:var(--ink)}
.rhead .sort{display:flex;align-items:center;gap:var(--s2);min-width:0;margin:0}
.rhead .sort label{color:var(--muted);font-size:.88rem;white-space:nowrap}
.rhead .sort select{width:auto;min-width:0;padding:var(--s2) var(--s3);font-size:.9rem;font-weight:600}
.llist{display:flex;flex-direction:column;gap:var(--s3);min-width:0}
.lcard{display:flex;align-items:center;gap:var(--s4);padding:var(--s5);min-width:0;color:var(--ink);transition:box-shadow .12s,border-color .12s}
.lcard:hover{border-color:var(--brand-2);box-shadow:0 0 0 1px var(--brand-2);text-decoration:none}
.lcard .logo{width:48px;height:48px;font-size:.9rem}
img.lcard-logo{width:48px;height:48px;border-radius:var(--r-sm);object-fit:contain;flex-shrink:0;background:var(--surface-2)}
.lcard .main{flex:1;min-width:0}
.lcard .top{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--s3)}
.lcard .nm{font-size:1.12rem;font-weight:800;line-height:1.25;min-width:0;overflow-wrap:break-word;color:var(--ink)}
.lcard:hover .nm{color:var(--brand-2)}
.lbadges{display:flex;gap:6px;flex-wrap:wrap;flex-shrink:0}
.lbadge{border:1px solid var(--line);color:var(--muted);font-size:var(--fs-1);font-weight:700;padding:2px 9px;border-radius:999px;white-space:nowrap;margin-top:2px}
.lcard .meta{display:flex;flex-wrap:wrap;gap:var(--s4);color:var(--muted);font-size:.88rem;margin-top:var(--s2)}
.lcard .mi{display:flex;align-items:center;gap:5px}
.lcard .mi svg{color:var(--faint);flex-shrink:0}
.empty-box{padding:var(--s10);text-align:center;color:var(--muted)}
.empty-box b{display:block;color:var(--ink);font-size:1.05rem;margin-bottom:var(--s2)}
.empty-box .btn{margin-top:var(--s4)}
/* Standalone error pages (404 / 500). Full-page centered layout — these DB-free
   templates load ONLY this stylesheet, so this small shared block is their whole
   layout (no {% extends %}, no base.html). */
.errpage{flex:1;display:grid;place-items:center;padding:var(--s12) var(--s5)}
.errpage__in{text-align:center;max-width:30rem}
.errpage__code{font-size:var(--fs-7);font-weight:800;color:var(--brand-2);line-height:1}
.errpage h1{font-size:var(--fs-6);margin:var(--s3) 0 var(--s2)}
.errpage p{color:var(--muted);margin:0 0 var(--s6)}
.pager{display:flex;justify-content:center;flex-wrap:wrap;gap:var(--s2);margin-top:var(--s6)}
.pager a,.pager span{min-width:38px;height:38px;display:inline-flex;align-items:center;justify-content:center;
  border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);color:var(--ink);font-weight:700;font-size:var(--fs-2);padding:0 var(--s3)}
.pager a:hover{border-color:var(--brand-2);text-decoration:none}
.pager .on{background:var(--brand-lt);color:var(--brand);border-color:transparent}
.pager .off{color:var(--faint);cursor:default}

/* ===== Tournament sub-header + tabs ===================================  */
.tsub{background:var(--surface);border-bottom:1px solid var(--line)}
.crumb{color:var(--faint);font-size:.82rem;font-weight:600;padding-top:var(--s6)}
.crumb a{color:var(--muted)}
.crumb a:hover{color:var(--brand)}
/* Публичный разделитель крошек — видимый «/» в собственном классе. Organizer
   использует другой рецепт (пустой `.sep` + CSS-mask chevron) и сюда не входит. */
.crumb-sep{color:var(--faint)}
.thead{display:flex;justify-content:space-between;align-items:flex-end;gap:var(--s5);flex-wrap:wrap;padding:var(--s3) 0 var(--s5)}
.trow1{display:flex;align-items:center;gap:0;min-width:0}
.thead .tlogo,.thead .tmono{width:56px;height:56px;border-radius:var(--r);font-size:1.15rem;margin-right:var(--s3);flex-shrink:0}
.thead h1{margin:0;font-size:1.65rem;font-weight:800;letter-spacing:-.02em}
.thead .meta{display:flex;gap:var(--s3);flex-wrap:wrap;align-items:center;color:var(--muted);font-size:.86rem;font-weight:600;margin-top:var(--s2)}
.thead .acts{display:flex;gap:var(--s2);flex-wrap:wrap}
.tabs{display:flex;gap:var(--s1);list-style:none;margin:0;padding:0;overflow-x:auto;scrollbar-width:none}
.tabs::-webkit-scrollbar{display:none}
.tabs a{display:block;padding:var(--s3) var(--s4);font-weight:700;font-size:var(--fs-2);color:var(--muted);white-space:nowrap;border-bottom:2.5px solid transparent;cursor:pointer;background:none;border-left:none;border-right:none;border-top:none;font-family:inherit}
.tabs a.on{color:var(--brand);border-bottom-color:var(--brand)}
.tabs a:hover{color:var(--brand);text-decoration:none}

/* ===== Tournament body layouts ========================================  */
.t-main-side{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:var(--s6);align-items:start}
.t-2col{display:grid;grid-template-columns:1fr 1fr;gap:var(--s6);align-items:start}
.rounds2{display:grid;grid-template-columns:1fr 1fr;gap:var(--s6)}
.side .card+.card,.t-main-side .col-main .card+.card{margin-top:var(--s5)}
.card .ch{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:var(--s3);padding:var(--s4) var(--s5);border-bottom:1px solid var(--line-2)}
.card .ch h2{margin:0;font-size:var(--fs-3);font-weight:800}
.card .ch .phi{display:flex;align-items:center;gap:var(--s2);min-width:0}
.card .ch .phi svg{color:var(--brand-2);flex-shrink:0}
.card .ch .rnd{color:var(--muted);font-size:var(--fs-2);font-weight:600}
.irow{padding:var(--s3) var(--s5);border-top:1px solid var(--line-2);font-size:.9rem;display:flex;justify-content:space-between;gap:var(--s4)}
.irow:first-of-type{border-top:none}
.irow .k{color:var(--muted)}
.irow span:last-child{text-align:right;font-weight:600}

/* ===== Full standings table (tournament Таблица tab) ==================  */
/* Full-width fixed table per mockup 05 (team column takes the slack, numbers
   right). Wrapped in .stx-wrap (overflow-x:auto) so it scrolls inside the card
   on very narrow screens instead of the page. */
.stx-wrap{overflow-x:auto}
/* min-width makes the table wider than a narrow card so .stx-wrap scrolls
   sideways instead of collapsing the team column; on wide cards width:100% wins. */
table.stx{width:100%;min-width:460px;border-collapse:separate;border-spacing:0;font-size:.9rem;table-layout:fixed}
.stx thead th{white-space:nowrap;text-align:center;font-size:var(--fs-1);font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:var(--faint);padding:var(--s3) var(--s2);border-bottom:1px solid var(--line)}
.stx thead th.l{text-align:left;padding-left:var(--s3)}
/* Sticky #/Команда: pinned while the stats scroll sideways. Opaque background so
   scrolling cells pass underneath; team stays width:auto but is bounded by the
   table min-width, so when it actually scrolls the columns are at exact widths
   and the left offsets line up. */
.stx th.l:first-child,.stx td.pos{width:34px;position:sticky;left:0;z-index:3;background:var(--surface)}
.stx th.l:nth-child(2),.stx td.team{width:auto;position:sticky;left:34px;z-index:2;background:var(--surface)}
.stx th:nth-child(n+3),.stx tbody td.num{width:34px}
.stx th.opt,.stx td.opt{width:48px}
.stx td.diff,.stx th:nth-child(8){width:42px}
.stx td.pts,.stx th:nth-child(9){width:32px}
.stx th.col-h,.stx td.col-h{width:126px}
.stx tbody td{padding:var(--s3) var(--s2);text-align:center;border-bottom:1px solid var(--line-2);vertical-align:middle;font-variant-numeric:tabular-nums}
.stx tbody tr:last-child td{border-bottom:none}
.stx tbody tr:hover td{background:var(--surface-2)}
.stx .pos{position:relative;font-weight:800;color:var(--muted)}
.stx .pos::before{content:"";position:absolute;left:0;top:6px;bottom:6px;width:3px;border-radius:2px;background:transparent}
.stx tr.lead .pos::before{background:var(--win)}
.stx tr.lead .pos-num{color:var(--win)}
.stx .pos-num{color:var(--brand)}
.stx .team{text-align:left;padding-left:var(--s3)!important}
.stx .team .c{display:flex;align-items:center;gap:var(--s3);min-width:0}
.stx .team .tlogo,.stx .team .tmono{width:26px;height:26px;font-size:.62rem;border-radius:7px}
.stx .team .nm{font-weight:700;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.stx .team .nm a{color:var(--ink)}
.stx .team .nm a:hover{color:var(--brand-2)}
.stx .pts{font-weight:800;color:var(--ink);font-size:var(--fs-3)}
.stx td.diff.p{color:var(--win);font-weight:700}
.stx td.diff.n{color:var(--loss);font-weight:700}
.stx .form{display:inline-flex;gap:4px;flex-wrap:nowrap;padding:0}
.stx .form span{width:18px;height:18px;border-radius:var(--r-xs);font-size:var(--fs-1);font-weight:800;color:#fff;display:flex;align-items:center;justify-content:center}
.stx .form .w{background:var(--win)}.stx .form .d{background:var(--draw)}.stx .form .l{background:var(--loss)}
.stx-legend{padding:var(--s3) var(--s5) var(--s4);color:var(--muted);font-size:.78rem;border-top:1px solid var(--line-2);line-height:1.55}

/* ===== Champion banner (knockout / playoff) ===========================  */
.champ-banner{display:flex;align-items:center;gap:var(--s4);background:var(--brand-lt);border:1px solid var(--line);border-radius:var(--r);padding:var(--s5) var(--s6);margin-bottom:var(--s6)}
.champ-banner .cup{width:48px;height:48px;border-radius:50%;background:var(--surface);color:var(--win);display:flex;align-items:center;justify-content:center;flex-shrink:0;box-shadow:var(--sh)}
.champ-banner .lbl{color:var(--muted);font-size:.8rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em}
.champ-banner .who{display:flex;align-items:center;gap:var(--s2);font-size:1.3rem;font-weight:800;margin-top:2px;min-width:0}
.champ-banner .who .tlogo,.champ-banner .who .tmono{width:30px;height:30px;border-radius:var(--r-xs);font-size:.7rem}

/* ===== Календарь filter + rounds ======================================  */
.cal-filter{display:flex;align-items:center;gap:var(--s2);padding:var(--s4) var(--s5);border-bottom:1px solid var(--line-2);flex-wrap:wrap}
.cal-filter label{color:var(--muted);font-size:.88rem;font-weight:600;white-space:nowrap}
.cal-filter select{width:auto;min-width:160px;padding:var(--s2) var(--s3);font-size:.9rem;font-weight:600}
.cal-round{border-top:1px solid var(--line-2)}
.cal-round:first-of-type{border-top:none}
.cal-round .rh{padding:var(--s3) var(--s5);font-weight:800;font-size:.92rem;display:flex;justify-content:space-between;align-items:center;gap:var(--s3);background:var(--surface-2)}
.cal-round .rh .rd{color:var(--muted);font-weight:600;font-size:.82rem}
.rest-row{padding:var(--s3) var(--s5);color:var(--muted);font-size:.88rem;font-style:italic;border-top:1px solid var(--line-2)}

/* ===== Teams grid (Команды tab) =======================================  */
.teams-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--s3);padding:var(--s5)}
.tcard{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) var(--s4);border:1px solid var(--line);border-radius:var(--r-sm);color:var(--ink);min-width:0}
.tcard:hover{border-color:var(--brand-2);text-decoration:none}
.tcard .tlogo,.tcard .tmono{width:34px;height:34px;border-radius:8px;font-size:.7rem}
.tcard .tn{font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tcard:hover .tn{color:var(--brand-2)}

/* ===== Bracket generator tool =========================================  */
.tool-layout{display:grid;grid-template-columns:344px minmax(0,1fr);gap:var(--s6);align-items:start}
[data-bracket-count]{background:var(--surface-2);border-radius:999px;padding:2px 10px;font-size:.78rem;font-weight:700;color:var(--muted)}
[data-bracket-grid]{display:flex;align-items:stretch;min-width:max-content}
.tool-col{display:flex;flex-direction:column;flex:0 0 210px}
.tool-rlabel{color:var(--faint);font-size:var(--fs-1);font-weight:800;text-transform:uppercase;letter-spacing:.05em;text-align:center;height:1.25rem;line-height:1.25rem;margin-bottom:var(--s2)}
.tool-cells{display:flex;flex-direction:column;flex:1}
.tool-slot{display:flex;flex-direction:column;justify-content:center;flex:1 1 0;padding:var(--s2) var(--s5);position:relative}
.tool-slot.spread{justify-content:space-around}
/* Bracket tree connectors (mockup 08) — skip the compact play-in (spread) column. */
[data-bracket-grid] .tool-col:not(:last-child) .tool-slot:not(.spread):nth-child(odd)::after{content:"";position:absolute;right:0;top:50%;width:var(--s5);height:50%;border-top:2px solid var(--line);border-right:2px solid var(--line)}
[data-bracket-grid] .tool-col:not(:last-child) .tool-slot:not(.spread):nth-child(even)::after{content:"";position:absolute;right:0;bottom:50%;width:var(--s5);height:50%;border-bottom:2px solid var(--line);border-right:2px solid var(--line)}
[data-bracket-grid] .tool-col:not(:first-child) .tool-slot:not(.spread)::before{content:"";position:absolute;left:0;top:50%;width:var(--s5);height:2px;background:var(--line)}
.bs[role="button"]{cursor:pointer}
.bs[role="button"]:hover{background:var(--surface-2)}
.tool-champ{display:inline-flex;align-items:center;gap:6px;background:rgba(14,160,106,.10);color:#0b7a52;font-weight:800;font-size:var(--fs-2);padding:3px 10px;border-radius:999px}
.tool-champ svg{color:var(--win)}
/* Tool bracket: no logos, so a filled seed box anchors each row (mockup 08). */
[data-bracket-grid] .bs{padding:var(--s3)}
[data-bracket-grid] .bs .nm{font-weight:600}
[data-bracket-grid] .bs.tbd .nm{font-weight:500}
/* Per-side score field on real matches (name is flex:1, so the score sits right).
   width/padding/font use !important to beat the broad `input:not(...)` base reset
   (width:100%;padding:10px), which would otherwise stretch the field and swallow
   the name. The static export span (a <span>, not an input) shares the same box. */
[data-bracket-grid] .bs .score-inp{box-sizing:border-box;width:38px!important;flex-shrink:0;text-align:center;font-variant-numeric:tabular-nums;font-size:.82rem!important;font-weight:600;line-height:1.3!important;color:var(--ink);padding:3px 4px!important;border:1px solid var(--line);border-radius:var(--r-xs);background:var(--surface)}
[data-bracket-grid] .bs .score-inp:focus{outline:none;border-color:var(--brand-2);box-shadow:0 0 0 2px rgba(91,42,158,.15)}
[data-bracket-grid] .bs.win .score-inp{font-weight:600}
/* "пен" tag next to a team that advanced on penalties (a decided draw). */
[data-bracket-grid] .bs .nm .pen-badge{display:inline-block;vertical-align:middle;margin-left:6px;font-size:var(--fs-1);font-weight:800;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);background:var(--surface-2);border-radius:5px;padding:1px 5px;line-height:1.5}
/* Export clone: static score span mirrors the input box so the PNG matches. */
[data-bracket-grid] .bs span.score-static{display:inline-block}
/* Accent tints the winner stripe and the round labels (carried into the PNG). */
/* Winner highlight: a bright accent border on the left + a soft accent glow in
   the background (--xa = the chosen accent, set on the grid and the export wrap).
   One rule for both the on-screen generator and the PNG export. */
[data-bracket-grid] .bs.win{box-shadow:inset 3px 0 0 var(--xa);background:color-mix(in srgb, var(--xa) 9%, transparent)}
[data-bracket-grid] .bs.win .nm{font-weight:600;color:var(--ink)}
[data-bracket-grid] .tool-rlabel{color:var(--xa)}

/* ===== Bracket PNG export poster (offscreen; always light) ================ */
/* Re-declares the palette vars with the project's LIGHT values so the exported
   card stays light even under a dark screen theme. --xa = the chosen accent hex. */
.bracket-export{
  --surface:#FFFFFF;--surface-2:#F7F4FB;--line:#ECE7F3;--line-2:#F2EEF8;
  --ink:#1B1330;--muted:#6B6484;--faint:#A79FBC;--win:#0B8F5E;
  --r-sm:10px;--sh:0 1px 2px rgba(42,14,79,.04);--xa:#5B2A9E;
  box-sizing:border-box;display:inline-block;background:#fff;color:var(--ink);
  padding:40px;font-family:"Manrope",system-ui,-apple-system,sans-serif;line-height:1.4}
.bracket-export *{box-sizing:border-box}
.bx-head{display:flex;align-items:center;justify-content:space-between;gap:24px;width:100%}
.bx-brand{display:flex;align-items:center;gap:9px}
.bx-logo{width:26px;height:26px;flex-shrink:0}
.bx-word{font-size:18px;font-weight:800;letter-spacing:-.01em;color:var(--ink)}
.bx-title{font-size:28px;font-weight:800;letter-spacing:-.02em;color:var(--ink);margin:18px 0 2px;overflow-wrap:anywhere}
.bx-sub{font-size:13px;font-weight:600;color:var(--muted);margin:0 0 12px}
.bx-bar{height:4px;width:100%;background:var(--xa);border-radius:2px}
.bx-champ{display:flex;align-items:center;gap:12px;width:100%;margin:18px 0 4px;padding:14px 18px;border-radius:var(--r-sm);background:color-mix(in srgb, var(--xa) 9%, #fff);border:1px solid color-mix(in srgb, var(--xa) 22%, #fff)}
.bx-champ .bx-cup{color:var(--win);flex-shrink:0}
.bx-champ-in{display:flex;flex-direction:column;gap:1px;min-width:0}
.bx-champ-lbl{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--muted)}
.bx-champ-name{font-size:20px;font-weight:800;color:var(--ink);line-height:1.15}
.bracket-export [data-bracket-grid]{margin-top:20px}
/* Card polish inside the poster: bigger names, cleaner cards, stronger winner. */
.bracket-export .bm{border:1px solid var(--line);box-shadow:0 1px 3px rgba(42,14,79,.06)}
.bracket-export .bs{padding:10px 12px;border-left:3px solid transparent}
.bracket-export .bs .nm{font-size:15px}
/* PNG-safe winner glow: html2canvas renders `color-mix(…, transparent)` AND inset
   box-shadows as solid fills, so on the poster we mix with #fff and draw the left
   accent as a real border instead (both render correctly). */
.bracket-export .bs.win{box-shadow:none;border-left-color:var(--xa);background:color-mix(in srgb, var(--xa) 9%, #fff)}
/* Scores as plain text on the poster (no input box), right after the name. */
.bracket-export .score-static{font-variant-numeric:tabular-nums;font-weight:700}
.bracket-export .bs.win .score-static{font-weight:600}
.bracket-export .bs .score-static{width:auto!important;min-width:14px;padding:0!important;margin-left:10px;border:0!important;background:transparent!important;text-align:right}
.bx-foot{display:flex;align-items:center;justify-content:space-between;gap:24px;width:100%;margin-top:22px;padding-top:14px;border-top:1px solid var(--line);font-size:12px;font-weight:600;color:var(--muted)}

.team-row{display:flex;align-items:center;gap:var(--s2);padding:var(--s2) 0;border-top:1px solid var(--line-2)}
.team-row:first-child{border-top:none}
.seed-badge{width:24px;height:24px;border-radius:var(--r-xs);background:var(--surface-2);color:var(--muted);font-weight:800;font-size:var(--fs-1);display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}
.team-inp{flex:1;min-width:0;padding:6px 10px;font-size:.9rem}
.team-del{flex-shrink:0;border:none;background:none;border-radius:var(--r-xs);color:var(--faint);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;padding:var(--s1) var(--s2)}
.team-del:hover:not(:disabled){color:var(--loss);background:var(--surface-2)}
.team-del:disabled{opacity:.4;cursor:not-allowed}
.is-invalid{border-color:var(--neg)!important}
.accent-swatches{display:flex;gap:var(--s2)}
.accent-swatches button{background:none;border:none;padding:0;cursor:pointer;line-height:0}
.accent-swatches .sw{display:block;width:1.6rem;height:1.6rem;border-radius:50%}
.reftable{width:100%;border-collapse:collapse;font-size:var(--fs-2)}
.reftable th{text-align:center;font-size:var(--fs-1);text-transform:uppercase;letter-spacing:.03em;color:var(--faint);font-weight:800;padding:var(--s4) var(--s4) var(--s3);white-space:nowrap}
.reftable th:first-child{text-align:left}
.reftable td{text-align:center;padding:var(--s3) var(--s4);border-top:1px solid var(--line-2);font-weight:400;font-variant-numeric:tabular-nums}
.reftable td:first-child{text-align:left;font-weight:600}
.reftable tbody tr:hover td{background:var(--surface-2)}
.reftable-scroll{overflow-x:auto}
.tool-note{padding:var(--s4) var(--s5) var(--s5);color:var(--muted);font-size:var(--fs-2);line-height:1.55;border-top:1px solid var(--line-2)}
.tool-details{border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden}
.tool-details summary{color:var(--brand-2);font-weight:800;cursor:pointer;font-size:var(--fs-2);list-style:none;display:flex;align-items:center;gap:6px;padding:var(--s3) var(--s4)}
.tool-details summary::-webkit-details-marker{display:none}
.tool-details .tool-bulk-body{padding:0 var(--s4) var(--s4)}

/* ===== Standings tool (/tools/standings/) editable table ===============  */
.st-table{width:100%;border-collapse:collapse;font-size:var(--fs-2);font-variant-numeric:tabular-nums;--st-pos-w:2.25rem}
.st-table th{text-align:center;font-size:var(--fs-1);text-transform:uppercase;letter-spacing:.03em;color:var(--faint);font-weight:800;padding:var(--s3) 6px;white-space:nowrap}
.st-table th.l{text-align:left}
.st-table td{text-align:center;padding:var(--s1) var(--s15);border-top:1px solid var(--line-2)}
.st-table td.l{text-align:left}
.st-pos{font-weight:800;width:var(--st-pos-w)}
.st-gd,.st-pts{font-weight:600}
.st-gd.up{color:var(--win)}
.st-table tr.is-leader td{background:var(--brand-lt)}
.st-played{color:var(--muted);font-weight:600}
/* Рамку/фон/цвет/радиус общее правило input задаёт как раньше; ширину, padding и
   font-size .st-n переопределяет через custom-property контракт (--control-*),
   а не борьбой специфичности: компактное поле ~44px, крупный шрифт 16px гасит
   iOS-zoom, значение центрируется под коротким заголовком (В/Н/П/ГЗ/ГП). */
.st-table .st-n{--control-w:2.75rem;--control-pad:6px 4px;--control-fs:16px;margin-inline:auto;text-align:center;font-variant-numeric:tabular-nums}
.st-table .st-name{min-width:8rem;font-weight:600}
/* Sticky identity columns (# и «Команда») держат контекст строки при
   горизонтальной прокрутке статистики на узких экранах; фон непрозрачный по
   состоянию строки, чтобы прокручиваемые ячейки не просвечивали. */
.st-table .st-pos,.st-table .st-team{position:sticky;z-index:1;background:var(--surface)}
/* Pin the # column to exactly --st-pos-w so the team column's sticky offset
   matches its real width (border-collapse otherwise shrinks a plain `width`
   hint, leaving a gap where scrolled inputs peek through). */
.st-table .st-pos{left:0;min-width:var(--st-pos-w);max-width:var(--st-pos-w)}
.st-table .st-team{left:var(--st-pos-w)}
.st-table tr.is-leader .st-pos,.st-table tr.is-leader .st-team{background:var(--brand-lt)}
.st-table tbody tr:hover .st-pos,.st-table tbody tr:hover .st-team{background:var(--surface-2)}
/* On narrow screens the 8rem name column would eat the whole viewport once the
   #/team stay sticky; cap it (via the --control-w contract) so at least two
   stat inputs stay usable while editing. Desktop keeps the wide name column.
   Keyboard: Tab-focusing a stat input must scroll it clear of the sticky #/team
   overlay — scroll-margin-inline-start = that zone's width (position + team +
   the team cell's side padding) plus the focus-ring allowance; the end margin
   keeps the ring off the right edge. All derived from the width vars, no magic. */
@media(max-width:760px){
  .st-table{--st-team-w:6rem}
  .st-table .st-name{min-width:0;--control-w:var(--st-team-w)}
  .st-table .st-n{scroll-margin-inline:calc(var(--st-pos-w) + var(--st-team-w) + var(--s3) + var(--s1)) var(--s1)}
}
.st-x{border:none;background:none;color:var(--faint);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;min-width:24px;min-height:24px}
.st-x:hover{color:var(--neg)}
.st-toolbar{display:flex;gap:var(--s3) var(--s4);flex-wrap:wrap;align-items:center;margin-bottom:var(--s4)}
.st-preset{padding:var(--s15) var(--s3);border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);color:var(--ink);font-weight:600;font-size:var(--fs-2)}
.st-h2h{display:inline-flex;align-items:center;gap:var(--s15);color:var(--muted);font-size:var(--fs-2)}
.st-h2h label{display:inline-flex;align-items:center;gap:5px;opacity:.6;cursor:not-allowed}
.st-h2h label input{width:18px;height:18px;accent-color:var(--brand-2);flex-shrink:0}
.st-h2h .form-hint{display:inline;margin:0}

/* Standings PNG export poster — an offscreen, theme-independent light card built
   from a static clone of the table (inputs → text, delete column dropped, sticky
   neutralised). Palette vars are pinned light so the poster never inherits a dark
   on-screen theme; brand header / title / footer reuse the shared .bx-* classes. */
.st-export{--surface:#fff;--surface-2:#F7F4FB;--line:#ECE7F3;--line-2:#F2EEF8;
  --ink:#1B1330;--muted:#6B6484;--faint:#A79FBC;--win:#0B8F5E;--brand-lt:#F4F0FA;--xa:#5B2A9E;
  position:absolute;left:-99999px;top:0;box-sizing:border-box;display:inline-block;
  background:#fff;color:var(--ink);padding:40px;font-family:"Manrope",system-ui,-apple-system,sans-serif;line-height:1.4}
.st-export *{box-sizing:border-box}
.st-export .st-table{width:auto;margin-top:20px;font-size:15px;white-space:nowrap}
.st-export .st-table th{padding:9px 14px}
.st-export .st-table td{padding:11px 14px}
.st-export .st-table .st-pos,.st-export .st-table .st-team{position:static;min-width:0;max-width:none;left:auto;background:transparent}
.st-export .st-table .st-team{padding-right:28px;font-weight:600}

/* ===== Home hero (centered) ===========================================  */
.hero.home{text-align:center}
.hero.home .in{padding:var(--s16) var(--s5);max-width:820px;margin:0 auto}
.hero.home .pill{display:inline-block;background:var(--brand-lt);color:var(--brand-2);font-weight:800;font-size:.78rem;padding:6px var(--s4);border-radius:999px;margin-bottom:var(--s5);border:1px solid var(--line)}
.hero.home h1{font-size:2.7rem;font-weight:800;letter-spacing:-.03em;margin:0;line-height:1.04;justify-content:center}
.hero.home .lead{color:var(--muted);font-size:1.1rem;margin:var(--s5) auto 0;max-width:600px;line-height:1.55}
.hero.home .cta{display:flex;gap:var(--s3);justify-content:center;margin-top:var(--s8);flex-wrap:wrap}

/* ===== Home sections ==================================================  */
.sh{text-align:center;margin:var(--s16) 0 var(--s5)}
.sh h2{font-size:1.6rem;font-weight:800;margin:0;letter-spacing:-.01em}
.sh p{color:var(--muted);margin:var(--s2) 0 0}
.cardh{padding:var(--s4) var(--s5);border-bottom:1px solid var(--line-2);font-weight:800;font-size:var(--fs-3);display:flex;justify-content:space-between;align-items:center;gap:var(--s3);flex-wrap:wrap}
.cardh .sub{font-weight:500;font-size:.82rem;color:var(--muted);margin-top:3px}
.mt{margin-top:var(--s6)}
.fcards{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--s4)}
/* Модификаторы сетки главной. Базовый `.fcards` — три колонки и используется
   другими блоками, поэтому число колонок меняет модификатор, а не он сам.
   `auto-fit` + `minmax` сами уходят в 2 и 1 колонку, когда 4 уже не помещаются. */
.fcards-4{grid-template-columns:repeat(auto-fit,minmax(232px,1fr))}
.fcards-2{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
/* Слайд с матчем: табло и хронология живут внутри карточки слайдера, поэтому
   собственной рамки не получают — вложенная карточка запрещена (DESIGN.md). */
.slide-match{padding:var(--s5)}
.slide-match .ms-tl{margin-top:var(--s5)}
.fcard{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:var(--s6);box-shadow:var(--sh);text-align:center}
.fcard .ic{width:48px;height:48px;border-radius:var(--r-sm);background:var(--brand-lt);color:var(--brand-2);display:flex;align-items:center;justify-content:center;margin:0 auto var(--s4)}
.fcard h2,.fcard h3{font-size:1.05rem;font-weight:800;margin:0 0 var(--s2)}
.fcard p{margin:0;color:var(--muted);font-size:.92rem;line-height:1.5}
.fcard .lnk{display:inline-block;margin-top:var(--s3);color:var(--brand-2);font-weight:700;font-size:var(--fs-2)}
.fcard .step{width:48px;height:48px;border-radius:50%;background:var(--brand-lt);color:var(--brand-2);display:flex;align-items:center;justify-content:center;margin:0 auto var(--s4);font-weight:800;font-size:1.2rem}
.example{display:flex;justify-content:space-between;align-items:center;gap:var(--s6);flex-wrap:wrap;padding:var(--s6)}
.example .l{display:flex;align-items:center;gap:var(--s4);min-width:0}
.example .logo{width:54px;height:54px;border-radius:var(--r-sm);font-size:1.05rem}
.example .k{color:var(--muted);font-size:var(--fs-2)}
.example .t{font-size:var(--fs-5);font-weight:800;margin:2px 0}
.example .s{color:var(--muted);font-size:var(--fs-2)}
/* CTA action zone (standings funnel): a long button wraps to 2 lines instead of
   overflowing the card — scoped here so the global .btn{white-space:nowrap} is
   untouched. Height grows with content but keeps the base button min-height. */
.example-actions{display:flex;gap:var(--s2);flex-wrap:wrap}
.example-actions .btn{white-space:normal;text-align:center;height:auto;min-height:38px;line-height:1.25;padding-top:var(--s2);padding-bottom:var(--s2)}

/* ===== Format pill bar + slider =======================================  */
.fmtbar{display:flex;gap:var(--s1);padding:var(--s3) var(--s5);border-bottom:1px solid var(--line-2);flex-wrap:wrap;overflow-x:auto;scrollbar-width:none}
.fmtbar::-webkit-scrollbar{display:none}
.fmtpill{font-size:.86rem;font-weight:700;color:var(--muted);padding:var(--s2) var(--s4);border-radius:var(--r-sm);cursor:pointer;border:none;background:none;white-space:nowrap;font-family:inherit}
.fmtpill:hover{background:var(--surface-2)}
.fmtpill.on{background:var(--brand-lt);color:var(--brand)}
/* Grid-stack the slides in one cell so the slider height stays fixed at the
   tallest slide — otherwise switching table/bracket/groups (different heights)
   makes everything below, incl. the footer, jump vertically on auto-rotation. */
.slider{position:relative}
.slide{display:none}
.slide.on{display:block}

/* ===== Standings table (shared: home slider + tournament pages) =======  */
/* .st-wrap scrolls the table sideways on narrow screens; min-width keeps the
   table from collapsing its team column (width:100% still wins on wide cards). */
.st-wrap{overflow-x:auto}
table.st{width:100%;min-width:460px;border-collapse:separate;border-spacing:0;table-layout:fixed;font-size:.9rem}
.st{padding:0 var(--s3) var(--s3)}
.st th{white-space:nowrap;font-size:var(--fs-1);text-transform:uppercase;letter-spacing:.03em;color:var(--faint);font-weight:700;text-align:center;padding:var(--s3) var(--s2)}
.st th.l{text-align:left;padding-left:var(--s3)}
.st td{text-align:center;padding:var(--s3) var(--s2);border-top:1px solid var(--line-2);font-weight:400;overflow:hidden;font-variant-numeric:tabular-nums}
.st td.l{text-align:left}
.st tbody tr:first-child td{border-top:none}
.st tbody tr:hover td{background:var(--surface-2)}
/* Sticky #/Команда (mirrors .stx): pinned while stats scroll; opaque background. */
.st th.l:first-child{padding-left:var(--s3);width:34px;white-space:nowrap;position:sticky;left:0;z-index:3;background:var(--surface)}
.st td.l:first-child{width:34px;white-space:nowrap;position:sticky;left:0;z-index:3;background:var(--surface)}
.st th.l:nth-child(2),.st td.l:nth-child(2){width:auto;padding-left:var(--s3);position:sticky;left:34px;z-index:2;background:var(--surface)}
/* :first-child/:nth-child bump the sticky cells' specificity above the row-hover
   rule, so restate hover here to keep the pinned cells in step with the row. */
.st tbody tr:hover td.l:first-child,.st tbody tr:hover td.l:nth-child(2){background:var(--surface-2)}
.st th:nth-child(n+3),.st td:nth-child(n+3){width:44px}
.st th:nth-child(7),.st td:nth-child(7){width:56px}
.st .pos{position:relative;font-weight:800;color:var(--brand)}
.st .pos::before{content:"";position:absolute;left:0;top:6px;bottom:6px;width:3px;border-radius:2px;background:transparent}
.st .qual .pos{color:var(--win)}
.st .qual .pos::before{background:var(--win)}
.st .pts{font-weight:800;color:var(--ink);font-size:var(--fs-3)}
.teamcell{display:flex;align-items:center;gap:var(--s3);font-weight:400;min-width:0}
.teamcell .tlogo,.teamcell .tmono{width:26px;height:26px;font-size:.62rem;border-radius:7px}
.teamcell .tn{font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.teamcell .tn a{color:var(--ink)}
.teamcell .tn a:hover{color:var(--brand-2)}

/* ===== Group tables ===================================================  */
.groups2{display:grid;grid-template-columns:1fr 1fr;gap:var(--s5);padding:var(--s5)}
.gpanel{border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden}
.gpanel .gh{padding:var(--s3) var(--s4);border-bottom:1px solid var(--line-2);display:flex;align-items:center;gap:var(--s2);font-weight:700;font-size:.86rem;color:var(--muted);text-transform:uppercase;letter-spacing:.03em}
.gpanel .gh .gmono{width:19px;height:19px;border-radius:5px;font-size:.55rem;background:var(--brand-2)}
.gpanel .st th:nth-child(n+3),.gpanel .st td:nth-child(n+3){width:28px}
.gpanel .st th:nth-child(7),.gpanel .st td:nth-child(7){width:44px}
.gnote{padding:0 var(--s5) var(--s5);color:var(--muted);font-size:.82rem;display:flex;gap:var(--s2);align-items:center}
.gnote .dot2{width:11px;height:11px;border-radius:3px;background:var(--win);flex-shrink:0}

/* ===== Bracket ========================================================  */
.champ{display:flex;align-items:center;gap:var(--s2);padding:var(--s3) var(--s5);background:var(--brand-lt);color:var(--brand);font-weight:700;font-size:.92rem;border-bottom:1px solid var(--line-2)}
.champ svg{color:var(--win)}
.bkt-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;padding:var(--s5)}
.bkt{display:flex;min-width:max-content;min-height:460px}
.bkt .rnd{display:flex;flex-direction:column;flex:0 0 244px;min-width:0}
.rlabel{text-align:center;font-size:var(--fs-1);font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--faint);padding-bottom:var(--s3)}
.cells{flex:1;display:flex;flex-direction:column}
.cell{flex:1;display:flex;align-items:center;justify-content:center;position:relative;padding:var(--s2) var(--s5)}
.rnd:not(:last-child) .cell:nth-child(odd)::after{content:"";position:absolute;right:0;top:50%;width:var(--s5);height:50%;border-top:2px solid var(--line);border-right:2px solid var(--line)}
.rnd:not(:last-child) .cell:nth-child(even)::after{content:"";position:absolute;right:0;bottom:50%;width:var(--s5);height:50%;border-bottom:2px solid var(--line);border-right:2px solid var(--line)}
.rnd:not(:first-child) .cell::before{content:"";position:absolute;left:0;top:50%;width:var(--s5);height:2px;background:var(--line)}
.bm{width:100%;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden;box-shadow:var(--sh)}
.bm .bh{display:flex;justify-content:space-between;align-items:center;gap:var(--s2);padding:var(--s2) var(--s3);border-bottom:1px solid var(--line-2);background:var(--surface-2);font-size:var(--fs-1);color:var(--muted);font-weight:600}
.bm .bh .stt{text-transform:uppercase;letter-spacing:.03em;font-size:var(--fs-1);color:var(--muted)}
.bs{display:flex;align-items:center;gap:var(--s2);padding:var(--s2) var(--s3)}
.bs+.bs{border-top:1px solid var(--line-2)}
.bs .seed{width:12px;text-align:center;color:var(--faint);font-size:var(--fs-1);font-variant-numeric:tabular-nums;flex-shrink:0}
.bs .tlogo,.bs .tmono{width:22px;height:22px;font-size:.56rem;border-radius:var(--r-xs)}
.bs .nm{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:var(--fs-2);font-weight:400;color:var(--ink)}
.bs .sc{font-variant-numeric:tabular-nums;font-weight:600;color:var(--muted);min-width:16px;text-align:right}
.bs.win{box-shadow:inset 3px 0 0 var(--win)}.bs.win .nm{font-weight:600}.bs.win .sc{color:var(--ink);font-weight:600}
.bs.tbd .nm{color:var(--faint);font-style:italic}
.third{padding:0 var(--s5) var(--s5)}
.third .rlabel{text-align:left;padding:var(--s3) 0}
/* Same footprint as a standard bracket match (column 244 − cell padding 2×s5). */
.third .bm{width:204px;max-width:none}

/* ===== League page (ADR 0016) ==========================================
   Локальные классы страницы лиги: отвечают только за её раскладку и общими
   компонентами не становятся. Карточки, чипы, площадки и строки матчей берутся
   из каталога DESIGN.md. CSS `order` для перестановки содержательных блоков
   здесь не используется — DOM-порядок и есть mobile-порядок. */
.league-page>.card+.card{margin-top:var(--s5)}
.league-title{display:flex;align-items:center;flex-wrap:wrap;gap:var(--s2)}
.league-title h1{margin:0}
.league-kpis{display:flex;flex-wrap:wrap;gap:var(--s2);margin-top:var(--s2)}
.league-cta .btn{height:44px}
.card .ch .ch-count{color:var(--muted);font-size:var(--fs-2);font-weight:700}
.league-empty{margin:0;padding:var(--s5);color:var(--muted)}

/* Строка турнира: имя + метаданные слева, состояние и шеврон справа. */
.league-tour{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:var(--s4);padding:var(--s4) var(--s5);border-top:1px solid var(--line-2);color:var(--ink)}
.league-tour:first-of-type{border-top:none}
.league-tour:hover{background:var(--surface-2);text-decoration:none}
.lt-main{display:flex;align-items:center;gap:var(--s3);min-width:0}
.lt-logo{width:44px;height:44px;border-radius:var(--r-sm);font-size:.8rem;flex-shrink:0}
.lt-body{min-width:0}
/* Перенос, а не обрезка: на мобильном длинное название турнира — это две-три
   естественные строки (ТЗ §6.2), а `text-overflow` там просто прячет данные. */
.lt-name{display:block;font-size:var(--fs-3);font-weight:700;line-height:1.3;overflow-wrap:anywhere}
.league-tour:hover .lt-name{color:var(--brand-2)}
.lt-sub{margin-top:var(--s05);display:flex;flex-wrap:wrap;align-items:center;gap:var(--s2);color:var(--muted);font-size:var(--fs-2)}
.lt-dot{color:var(--faint)}
.lt-right{display:flex;align-items:center;gap:var(--s3);flex-shrink:0}
.lt-state{text-align:right}
.lt-state-main{display:block;font-size:var(--fs-2);font-weight:700}
.lt-state-sub{display:block;margin-top:var(--s05);color:var(--muted);font-size:var(--fs-1)}
.lt-chev{width:20px;height:20px;color:var(--faint);flex-shrink:0}

/* Match-center: две равные колонки; одна половина растягивается на всю ширину,
   пустая колонка не рендерится вовсе (ТЗ §8). */
.league-matches{display:grid;grid-template-columns:1fr 1fr}
.league-matches.one{grid-template-columns:minmax(0,1fr)}
.league-mcol{min-width:0;padding:var(--s4) var(--s5) var(--s5)}
.league-mcol+.league-mcol{border-left:1px solid var(--line-2)}
.league-mcol h3{margin:0 0 var(--s2);font-size:var(--fs-1);font-weight:800;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}

/* Команды: плитка целиком — одна ссылка, имя переносится свободно. */
.league-teams{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--s2);padding:var(--s4) var(--s5) var(--s5)}
.league-team{display:flex;align-items:center;gap:var(--s2);min-width:0;min-height:64px;padding:var(--s2) var(--s3);border:1px solid var(--line);border-radius:var(--r-sm);color:var(--ink)}
.league-team:hover{border-color:var(--brand-2);background:var(--surface-2);text-decoration:none}
.lteam-logo{width:36px;height:36px;border-radius:var(--r-sm);font-size:.7rem;flex-shrink:0}
/* Имя переносится свободно, без line-clamp: на мобильном под текст остаётся
   ~77px, и обрезка по двум строкам съедала половину обычного «ФК Команда 01».
   Плитки одной строки грида и так выравниваются по высоте. */
.lteam-name{min-width:0;font-size:var(--fs-2);font-weight:700;line-height:1.3;overflow-wrap:anywhere}

/* Нативный `details`: остаток уже в HTML, JavaScript и второй запрос не нужны. */
.league-more{border-top:1px solid var(--line-2)}
.league-more>summary{display:flex;align-items:center;gap:var(--s2);min-height:44px;padding:var(--s3) var(--s5);font-size:var(--fs-2);font-weight:700;color:var(--brand-2);cursor:pointer}
.league-more>summary:hover{background:var(--surface-2)}

/* Справочная часть: описание слева, организатор и площадки справа. */
.league-info{margin-top:var(--s5);display:grid;grid-template-columns:minmax(0,1.55fr) minmax(280px,.8fr);gap:var(--s6);align-items:start}
.league-info.solo{grid-template-columns:minmax(0,1fr)}
.league-info-main,.league-info-side{min-width:0}
.league-info-side>.card+.card{margin-top:var(--s5)}

@media(max-width:820px){
  .league-teams{grid-template-columns:repeat(3,minmax(0,1fr))}
  .league-info{grid-template-columns:minmax(0,1fr)}
}
@media(max-width:620px){
  .league-tour{grid-template-columns:minmax(0,1fr);gap:var(--s3)}
  /* Состояние уходит под название и выравнивается по нему: 44px логотип + s3. */
  .lt-right{padding-left:56px;justify-content:space-between}
  .lt-state{text-align:left}
  .league-matches{grid-template-columns:minmax(0,1fr)}
  .league-mcol+.league-mcol{border-left:0;border-top:1px solid var(--line-2)}
  .league-teams{grid-template-columns:repeat(2,minmax(0,1fr));padding:var(--s3) var(--s4) var(--s4)}
  .league-team{padding:var(--s2)}
  .lteam-logo{width:32px;height:32px}
  .league-mcol{padding:var(--s3) var(--s4) var(--s4)}
  .league-tour{padding:var(--s4)}
  .league-more>summary{padding:var(--s3) var(--s4)}
  .league-empty{padding:var(--s4)}
}
@media(max-width:359px){
  .league-teams{grid-template-columns:minmax(0,1fr)}
  .lt-right{padding-left:0}
  /* Колонка match-center отдаёт свои поля ряду матча — на 320px эти 16px идут
     прямо в названия команд. */
  .league-mcol{padding:var(--s3) var(--s2) var(--s3)}
}

/* ===== Responsive ======================================================  */
@media(max-width:880px){
  .nav,.hd .r{display:none}
  .burger{display:flex}
  .features{grid-template-columns:1fr 1fr}
  .t-main-side{grid-template-columns:minmax(0,1fr)}
  .stx th.col-h,.stx td.col-h{display:none}
  .tool-layout{grid-template-columns:minmax(0,1fr)}
}
@media(max-width:760px){
  .t-2col{grid-template-columns:1fr}
  .rounds2{grid-template-columns:1fr}
  .teams-grid{grid-template-columns:1fr 1fr}
}
@media(max-width:480px){.teams-grid{grid-template-columns:1fr}}
@media(max-width:820px){
  .features{grid-template-columns:1fr 1fr}
  .catalog{grid-template-columns:minmax(0,1fr)}
  .filters{position:static}
  .lay{grid-template-columns:minmax(0,1fr)}
  .fcards{grid-template-columns:1fr}
  /* Модификаторы главной переживают этот breakpoint: базовое правило идёт в файле
     позже и при равной специфичности выигрывало, из-за чего 4 колонки падали
     сразу в 1, минуя 2. auto-fit сам находит следующую посадку. */
  .fcards-4,.fcards-2{grid-template-columns:repeat(auto-fit,minmax(232px,1fr))}
}
@media(max-width:700px){.groups2{grid-template-columns:1fr}}
@media(max-width:600px){.tgrid{grid-template-columns:1fr 1fr}}
@media(max-width:560px){
  .hero h1{font-size:var(--fs-6)}.hero .lead{font-size:var(--fs-3)}
  .sec>h2{font-size:1.15rem}
  .features{grid-template-columns:1fr}
  .ctacard{padding:var(--s8) var(--s5)}.ctacard h2{font-size:1.35rem}
  .askmore .btn{margin-left:0;width:100%}
  .frow{grid-template-columns:1fr}
  .lcard{gap:var(--s3)}
  .lcard .logo,img.lcard-logo{width:44px;height:44px}
  .lcard .nm{font-size:var(--fs-3)}
  .lcard .top{flex-direction:column;align-items:flex-start;gap:var(--s2)}
  .lbadge{margin-top:0}
  .band h1{font-size:var(--fs-6)}
  .band .blogo{width:52px;height:52px;font-size:1.1rem}
  .band .cta{margin-left:0;width:100%;margin-top:var(--s2)}
  .band .cta .btn{flex:1;justify-content:center}
  .tgrid{grid-template-columns:1fr}
  .hero.home .in{padding:var(--s12) var(--s5)}
  .hero.home h1{font-size:1.9rem}
  .hero.home .lead{font-size:var(--fs-3)}
  .hero.home .cta{width:100%}
  .hero.home .cta .btn{flex:1}
  .sh h2{font-size:1.35rem}
  .example{flex-direction:column;align-items:flex-start}
  .example-actions,.example-actions .btn{width:100%}
  .thead h1{font-size:1.35rem}
  .thead .tlogo,.thead .tmono{width:46px;height:46px;font-size:1rem}
  .thead .acts{width:100%}
  .thead .acts .btn{flex:1}
  .bkt .rnd{flex:0 0 210px}.cell{padding:var(--s2) var(--s4)}
  .rnd:not(:last-child) .cell::after{width:var(--s4)}
  .rnd:not(:first-child) .cell::before{width:var(--s4)}
  .third .bm{width:178px}
}

/* ==========================================================================
   Публичная страница матча (ADR 0012 §1, ТЗ §8.3–§8.4) — узкий scope .ms-*.
   Шапка и хронология делят одну трёхколоночную геометрию; шапка остаётся одним
   рядом на всех ширинах, центр не сжимается и обязан вмещать 12:11. Никаких
   новых компонентов, вложенных карточек, градиентов, blur, sticky и анимации.
   ========================================================================== */
/* Глобальный .crumb несёт padding-top:var(--s6) для страниц без .body-отступа.
   Страница матча внутри .body уже получила var(--s8) — вместе выходил двойной
   верхний отступ. Снимаем только здесь; глобальный .crumb не трогаем. */
.ms-crumb{padding-top:0;margin-bottom:var(--s4)}
.ms{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:var(--s6)}
.ms-meta{color:var(--muted);font-size:var(--fs-2);text-align:center;margin:0 0 var(--s5)}

.ms-head{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:start;gap:16px}
.ms-team{min-width:0;display:flex;justify-content:flex-end}
.ms-team-away{justify-content:flex-start}
/* width:100% + max-width — иначе длинное односложное название расталкивает
   колонку и вылезает за её край (min-width:0 один этого не даёт). */
.ms-team-link{min-width:0;max-width:100%;width:100%;display:flex;flex-direction:column;align-items:center;gap:var(--s2);color:inherit;text-decoration:none;text-align:center}
a.ms-team-link:hover .ms-name{color:var(--brand-2)}
.ms-head .ms-logo{width:64px;height:64px;border-radius:var(--r-sm);font-size:1.1rem;flex-shrink:0}
/* Две визуальные строки; кегль ради длины не уменьшается, полный текст — в DOM. */
.ms-name{min-width:0;font-size:20px;line-height:1.2;font-weight:800;overflow-wrap:anywhere;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.ms-center{min-width:160px;display:flex;flex-direction:column;align-items:center;gap:2px}
.ms-score{display:flex;align-items:baseline;justify-content:center;font-size:32px;line-height:1.1;
  font-weight:800;font-variant-numeric:tabular-nums;margin:0;letter-spacing:-.01em}
.ms-colon{padding:0 3px;color:var(--muted)}
.ms-pen{font-size:var(--fs-2);color:var(--muted);font-variant-numeric:tabular-nums;margin:2px 0 0}
.ms-status{font-size:var(--fs-2);color:var(--muted);margin:var(--s1) 0 0;text-align:center}
.ms-actions{display:flex;justify-content:center;margin-top:var(--s5)}

/* Хронология: один DOM на обе ширины — сторону задаёт grid-placement. */
.ms-tl{list-style:none;margin:var(--s6) 0 0;padding:var(--s5) 0 0;border-top:1px solid var(--line-2)}
.ms-ev{display:grid;grid-template-columns:minmax(0,1fr) 44px minmax(0,1fr);align-items:start;
  column-gap:var(--s3);padding:var(--s2) 0}
/* grid-row:1 обязателен: минута идёт в DOM первой и занимает колонку 2, а
   auto-placement не возвращается назад — без него событие хозяев уезжало во
   вторую строку сетки и переставало быть на одной линии со своей минутой. */
.ms-ev-min{grid-row:1;grid-column:2;text-align:center;font-size:var(--fs-2);font-weight:800;
  color:var(--muted);font-variant-numeric:tabular-nums}
.ms-ev-body{grid-row:1;min-width:0;display:flex;flex-direction:column;gap:2px;overflow-wrap:anywhere}
.ms-ev-home .ms-ev-body{grid-column:1;align-items:flex-end;text-align:right}
.ms-ev-away .ms-ev-body{grid-column:3;align-items:flex-start;text-align:left}
.ms-ev-who{display:inline-flex;align-items:center;gap:6px;font-size:var(--fs-2)}
.ms-ev-away .ms-ev-who{flex-direction:row-reverse}
.ms-ev-sub{font-size:var(--fs-2);color:var(--muted)}
.ms-ic{width:16px;height:16px;flex-shrink:0}
.ms-ic-yellow{color:var(--amber-ic,#D9A21B)}
.ms-ic-red{color:var(--neg)}
/* На десктопе сторону несёт колонка — логотип там был бы шумом. */
.ms-tl .ms-ev-logo{display:none;width:16px;height:16px;border-radius:4px;font-size:.5rem;flex-shrink:0}
.ms-empty{margin:var(--s6) 0 0;padding-top:var(--s5);border-top:1px solid var(--line-2);
  color:var(--muted);text-align:center}

@media(max-width:559px){
  /* Жёлоб 34px | 1fr. Сторона несёт ТРИ независимых признака: выравнивание,
     3px боковой маркер и 16px логотип/монограмма рядом с игроком — цвет ни один
     из них не заменяет (узкое исключение из запрета односторонней границы). */
  .ms-ev{grid-template-columns:34px minmax(0,1fr);column-gap:var(--s2)}
  .ms-ev-min{grid-column:1;text-align:left}
  .ms-ev-home .ms-ev-body,.ms-ev-away .ms-ev-body{grid-column:2}
  .ms-ev-home .ms-ev-body{align-items:flex-start;text-align:left;border-left:3px solid var(--brand-2);padding-left:var(--s2)}
  .ms-ev-away .ms-ev-body{align-items:flex-end;text-align:right;border-right:3px solid var(--muted);padding-right:var(--s2)}
  .ms-tl .ms-ev-logo{display:inline-flex}
}
@media(max-width:759px){
  .ms{padding:var(--s4)}
  .ms-head{gap:10px}
  .ms-head .ms-logo{width:48px;height:48px;font-size:.9rem}
  .ms-name{font-size:16px}
  .ms-score{font-size:28px}
  .ms-center{min-width:88px}
}
@media(max-width:389px){
  .ms-head{gap:10px}
  .ms-head .ms-logo{width:40px;height:40px;font-size:.8rem}
  .ms-name{font-size:14px}
  .ms-score{font-size:24px}
  .ms-center{min-width:76px}
}
@media(max-width:349px){
  .ms-head{gap:8px}
  .ms-head .ms-logo{width:36px;height:36px}
  .ms-center{min-width:68px}
}
/* WCAG reflow: при text-only zoom строка названия перестаёт обрезаться, а счёт
   опускается на одну существующую ступень. Шапка остаётся одним рядом. */
@media(max-height:400px) and (max-width:389px){
  .ms-name{-webkit-line-clamp:none;display:block;overflow:visible}
  .ms-score{font-size:var(--fs-5)}
}
