/* ============================================================
   loboscores :: sistema visual
   ============================================================ */
* { box-sizing: border-box; margin: 0; padding: 0; }
html { -webkit-text-size-adjust: 100%; }
button { font: inherit; color: inherit; background: none; border: none; cursor: pointer; }
a { color: inherit; }
img { display: block; }
.num { font-variant-numeric: tabular-nums; }
/* ============================================================
   layout
   ============================================================ */
.app { display: block; }
.centro { min-width: 0; padding: 0 var(--s4) var(--s7); }
/* limite util do conteudo principal */
#conteudo, .rodape { max-width: 1180px; }
/* ============================================================
   sidebar
   ============================================================ */
.marca { display: grid; line-height: .82; text-align: left; font-family: var(--display); font-style: italic; font-weight: 700; padding: 0 var(--s3) var(--s6); width: 100%; }
/* Conta separada da navegacao */
/* Sem content: dentro de um grid com place-items:center, um ::before
   vazio vira um segundo item e empurra o icone para baixo. */
#btn-conta::before { content: none; }
/* ============================================================
   header
   ============================================================ */
.busca input::placeholder { color: var(--text-muted); }
/* ---------- busca global ---------- */
.busca-item:hover { background: var(--surface-hover); }
/* ============================================================
   tipografia e blocos de secao
   ============================================================ */
.secao:first-child { margin-top: var(--s2); }
/* `pulso` foi aposentado: todos os pontos de ao vivo usam `bater`,
   la na camada de movimento. Fica aqui so o comentario para
   ninguem procurar o keyframe que sumiu. */
/* ============================================================
   faixa de competicoes e datas
   ============================================================ */ .datas::-webkit-scrollbar { display: none; }
.comp-bola { width: 16px; height: 16px; border-radius: 50%; border: 2px solid currentColor; }
.data:disabled { opacity: .35; }
.data-seta:disabled { opacity: .3; }
.data-seta:hover:not(:disabled) { background: var(--surface-hover); color: var(--text-primary); }
/* ============================================================
   linha de jogo
   ============================================================ */
.row-jogo.ao-vivo::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: var(--live); }
.rj-gols span { display: flex; align-items: center; gap: var(--s1); }
.rj-gols i { display: inline-grid; place-items: center; width: 13px; height: 13px;
  flex: none; color: var(--text-muted); }
.rj-gols i svg { width: 12px; height: 12px; display: block; }
/* ============================================================
   tabs
   ============================================================ */
.chips.abas::-webkit-scrollbar { display: none; }
/* filtros continuam como pill discreta */
/* "Por competição / Por hora" eram as duas coisas mais brilhantes da
   tela, num azul cheio, acima de todos os jogos. Filtro não pode
   pesar mais que o conteúdo que ele filtra. */
.chips:not(.abas) { display: flex; gap: 6px; margin-bottom: 12px; flex-wrap: wrap; }
.chips:not(.abas) .chip { height: 30px; padding: 0 13px; background: var(--surface-1); color: var(--text-secondary); font-size: 14px; }
.chips:not(.abas) .chip.ativo { font-weight: 600; }
/* ============================================================
   cabecalho da partida
   ============================================================ */
.duelo-time:hover { background: rgba(255, 255, 255, .03); }
.duelo-meio { display: grid; gap: var(--s2); justify-items: center; }
/* ============================================================
   estatisticas comparadas
   ============================================================ */
.stat-linha { display: flex; justify-content: space-between; align-items: baseline; gap: var(--s4); margin-bottom: var(--s2); }
.stat-linha strong { font-family: var(--ui); min-width: 48px; font-variant-numeric: tabular-nums; }
.stat-linha strong:last-child { text-align: right; }
/* ============================================================
   classificacao
   ============================================================ */
/* `flex: none` porque a zona mora dentro de um flex de 32px no
   celular: sem isso ela encolhia para largura ZERO e a faixa de
   cor que diz Libertadores / Sula / rebaixamento simplesmente nao
   existia na tela mais estreita, que e onde a tabela mais e lida. */
.zona { width: 3px; height: 20px; border-radius: 2px; background: transparent;
  display: block; flex: none; }
.c-time { display: flex; align-items: center; gap: var(--s3); text-align: left; min-width: 0; }
.c-time img { width: 22px; height: 22px; object-fit: contain; flex-shrink: 0; }
.c-time .pulso { width: 6px; height: 6px; border-radius: 50%; background: var(--live); flex-shrink: 0; }
.tab-linha.meu { background: rgba(18, 168, 255, .05); }
.legenda { display: flex; flex-wrap: wrap; gap: var(--s5); margin-top: var(--s4); font-size: 13px; color: var(--text-muted); }
.legenda span { display: flex; align-items: center; gap: var(--s2); }
.legenda i { width: 3px; height: 14px; border-radius: 2px; display: block; }
/* ============================================================
   cabecalho de time, jogador e competicao
   ============================================================ */
.time-txt { min-width: 0; }
.btn-seguir:hover { background: var(--surface-hover); }
.btn-seguir i { display: grid; place-items: center; color: var(--text-muted); }
.btn-seguir i svg { width: 15px; height: 15px; fill: none; stroke: currentColor; stroke-width: 2; }
.btn-seguir.segue i { color: var(--accent); }
.btn-seguir.segue i svg { fill: currentColor; }
/* ---------- faixa de numeros ---------- */
.faixa-resumo::-webkit-scrollbar { display: none; }
.faixa-resumo strong em { font-style: normal; font-size: 15px; color: var(--text-muted); margin: 0 5px 0 1px; }
.faixa-resumo strong.vit { color: var(--success); }
.faixa-resumo strong.der { color: var(--danger); }
.par-casa-fora { display: flex; gap: var(--s10); margin: var(--s4) 0; }
.par-casa-fora span { display: block; font-size: 13px; color: var(--text-secondary); }
.par-casa-fora strong { font-family: var(--semi); font-size: 17px; font-weight: 600; }
/* ---------- forma ---------- */
.forma-linha { display: flex; gap: var(--s2); align-items: center; }
/* A CAIXA fica; as CORES de V/E/D sairam.
   `.forma` era o segundo desenho de selo V/E/D do site -- fundo
   lavado e letra colorida -- enquanto a tabela, o confronto direto e
   a lista da home usam o `.seq-p`, de fundo cheio e letra escura.
   Dois desenhos para a mesma informacao, e o dono do produto
   preferiu o da tabela: "icones de vitoria, derrota ou empate
   antigos ainda; na aba de formas e ligas ta outro, bem melhor".
   Quem desenha o selo agora e sempre o `.seq-p`. A caixa neutra
   continua porque ela ainda serve de pastilha de numero na ficha do
   jogador e de espacador na lista de partidas do time. */
.forma { width: 24px; height: 24px; border-radius: 5px; display: grid; place-items: center; font-family: var(--semi); font-size: 13px; font-weight: 700; background: var(--surface-2); color: var(--text-secondary); }
.forma-nota { font-size: 14px; color: var(--text-secondary); margin-left: var(--s3); }
/* ---------- lista de partidas do time ---------- */
.jogo-time { display: grid; grid-template-columns: 80px 70px 32px minmax(180px, 1fr) 90px 32px; align-items: center; gap: var(--s2); height: 54px; padding: 0 var(--s3); border-bottom: 1px solid var(--border-subtle); cursor: pointer; transition: background 140ms ease; }
.jogo-time:hover { background: rgba(255, 255, 255, .025); }
.jt-data { font-size: 14px; color: var(--text-secondary); font-variant-numeric: tabular-nums; }
.jt-local { font-size: 13px; color: var(--text-muted); }
.jogo-time img { width: 24px; height: 24px; object-fit: contain; }
.jt-adv { font-family: var(--semi); font-size: 16px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.jt-placar { font-family: var(--display); font-size: 19px; font-weight: 700; text-align: right; font-variant-numeric: tabular-nums; }
/* O placar do jogo em andamento na pagina do time nao muda de cor:
   ver "PLACAR NAO E ESTADO" mais abaixo. Quem diz que esta
   rolando e o estado ao lado, nao o numero. */
.jt-placar.vivo { color: var(--text-primary); }
.jt-placar .hora { font-size: 16px; color: var(--text-muted); font-weight: 500; }

/* AS COMPETICOES DA FICHA DO JOGADOR, COM GRADE PROPRIA.
   Reusavam `.jogo-time`, que e a linha de JOGO de um time: no
   celular ela e `44px 22px 1fr 52px 20px` e o nome da competicao
   caia na coluna de 22px do escudo. Dai "C...", "F...", "L...".
   Aqui o nome fica com 1fr e as tres contagens tem 34px cada.

   O prefixo e `cpt-` e nao `cmp-` porque `.cmp-linha` JA EXISTE: e a
   linha da tela de comparar, com `1fr auto 1fr`. Colidi com ela na
   primeira tentativa e a lista saiu com tres colunas de 96px e os
   numeros por cima do nome. */
.cpt-lista { display: grid; }
.cpt-cab, .cpt-linha { display: grid;
  grid-template-columns: 24px minmax(0, 1fr) 34px 34px 34px;
  align-items: center; gap: 10px; padding: 0 4px; }
.cpt-cab { height: 28px; font-size: 12px; font-weight: 700; letter-spacing: .05em;
  text-transform: uppercase; color: var(--text-muted);
  border-bottom: 1px solid var(--border-subtle); }
.cpt-cab span:nth-child(n+3) { text-align: right; }
.cpt-linha { min-height: 46px; padding-top: 6px; padding-bottom: 6px;
  width: 100%; border: 0; background: transparent;
  border-bottom: 1px solid var(--border-subtle); color: inherit; font: inherit;
  text-align: left; cursor: pointer; }
.cpt-linha:last-child { border-bottom: 0; }
.cpt-linha:hover { background: rgba(255, 255, 255, .03); }
.cpt-linha img { width: 24px; height: 24px; object-fit: contain; }
/* QUEBRA EM DUAS LINHAS EM VEZ DE CORTAR.
   "Brasileirao Serie A" nao cabe numa linha de 390px depois de tirar
   escudo e tres contagens, e reticencia num nome de competicao e
   exatamente a queixa do relato. A linha cresce; nome cortado, nao. */
.cpt-nome { font-family: var(--semi); font-size: 15px; font-weight: 600;
  color: var(--text-primary); min-width: 0; line-height: 1.2;
  overflow-wrap: anywhere; }
.cpt-n { text-align: right; font-size: 15px; color: var(--text-secondary);
  font-variant-numeric: tabular-nums; }
/* `cpt-forte` e nao `destaque`: `.destaque` e generica e ja carrega
   fundo proprio em outros blocos -- ela desenhava uma pastilha atras
   da coluna de gols. */
.cpt-n.cpt-forte { color: var(--text-primary); font-weight: 700; }
/* ---------- ficha ---------- */
.ficha { max-width: 700px; }
.ficha div { display: flex; justify-content: space-between; gap: var(--s5); align-items: center; border-bottom: 1px solid var(--border-subtle); }
.ficha span { color: var(--text-secondary); }
.ficha strong { font-weight: 600; text-align: right; font-family: var(--semi); font-size: 16px; }
.confronto { display: flex; align-items: center; gap: var(--s4); border-bottom: 1px solid var(--border-subtle); font-family: var(--semi); }
.confronto-data { color: var(--text-muted); min-width: 46px; font-variant-numeric: tabular-nums; }
.confronto b { font-variant-numeric: tabular-nums; }
/* ---------- estadio ---------- */
/* ============================================================
   elenco e jogadores
   ============================================================ */
/* `.grade` e o quadradinho de escudo (escolher times): cabe muito
   por fileira. `.elenco` e uma FICHA -- foto, nome, posicao, idade e
   camisa lado a lado -- e nunca coube em 210px: "Emerson Royal"
   virava "Emerson ..." e "Zagueiro . 26 anos" virava "Zagueiro . 2...".
   As duas dividiam a mesma regra so porque as duas sao grades. */
.grade { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: var(--s2); }
.elenco { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: var(--s2); }
.jogador:hover { background: var(--surface-hover); }
.jogador img { width: 44px; height: 44px; border-radius: 50%; object-fit: cover; background: var(--surface-2); flex-shrink: 0; }
.jogador-txt { min-width: 0; display: grid; }
/* A altura vinha numa linha solta quatro mil linhas abaixo, na secao
   de densidade. Duas declaracoes do mesmo seletor a essa distancia e
   o que a auditoria aponta: quem editasse esta aqui nao veria efeito. */
/* `height: 76px` fixo estourava com nome de duas linhas: o texto
   saia por baixo do cartao e atropelava a linha de baixo da grade.
   Agora a altura e minima, e o nome tem teto de duas linhas -- a
   mesma regra que o mobile ja tinha. */
/* O CARTAO ERA DA COR DO BLOCO QUE O CONTEM.
   `.grade` mora dentro de um `.bloco`, que e `--surface-1`, e o
   cartao tambem era `--surface-1`: so o nome aparecia, sem cartao
   nenhum em volta. Sobe um degrau. */
.escudo { display: grid; place-items: center; gap: var(--s2); padding: var(--s3) var(--s2); background: var(--surface-2); border-radius: 8px; transition: background 140ms ease; min-height: 76px; border: 0; cursor: pointer; }
.escudo img { width: 34px; height: 34px; object-fit: contain; }
.escudo span { font-family: var(--semi); font-size: 14px; color: var(--text-secondary);
  text-align: center; line-height: 1.2; display: -webkit-box; -webkit-line-clamp: 3;
  -webkit-box-orient: vertical; overflow: hidden; overflow-wrap: anywhere; }
.escudo:hover { background: var(--surface-hover); }
.escudo.segue { background: var(--accent-soft); }
.escudo.segue span { color: var(--accent); font-weight: 600; }
/* ============================================================
   artilheiros
   ============================================================ */
.podio { display: grid; gap: var(--s2); }
.podio-item { display: flex; align-items: center; gap: var(--s4); height: 72px; padding: 0 var(--s4); background: var(--surface-1); border-radius: var(--radius-md); cursor: pointer; transition: background 140ms ease; }
.podio-item:hover { background: var(--surface-hover); }
.podio-pos { font-family: var(--display); font-size: 21px; font-weight: 700; color: var(--text-muted); width: 16px; }
.podio-item img { border-radius: 50%; object-fit: cover; background: var(--surface-2); flex-shrink: 0; }
.podio-txt { min-width: 0; display: grid; }
.podio-txt strong { font-family: var(--semi); font-size: 17px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.podio-txt span { font-size: 13px; color: var(--text-secondary); }
.podio-num { margin-left: auto; text-align: right; }
.podio-num b { display: block; font-family: var(--display); font-weight: 700; line-height: 1; }
.podio-num span { font-size: 12px; color: var(--text-muted); text-transform: uppercase; letter-spacing: .04em; }
.lista-rank { margin-top: var(--s3); }
.rank-linha { display: grid; grid-template-columns: 28px 24px minmax(0, 1fr) auto 44px; align-items: center; gap: var(--s3); padding: 0 var(--s3); border-bottom: 1px solid var(--border-subtle); cursor: pointer; transition: background 140ms ease; }
.rank-linha:hover { background: rgba(255, 255, 255, .025); }
.rank-pos { color: var(--text-muted); font-variant-numeric: tabular-nums; }
.rank-linha img { width: 22px; height: 22px; object-fit: contain; }
.rank-nome { font-family: var(--semi); font-size: 16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.rank-time { font-size: 13px; color: var(--text-secondary); }
.rank-num { text-align: right; font-family: var(--display); font-size: 18px; font-weight: 700; }
/* ============================================================
   jogo compacto da competicao
   ============================================================ */
.jogo-liga { display: grid; grid-template-columns: 60px minmax(0,1fr) 70px minmax(0,1fr); align-items: center; gap: var(--s3); height: 56px; padding: 0 var(--s3); border-bottom: 1px solid var(--border-subtle); cursor: pointer; transition: background 140ms ease; }
.jogo-liga:hover { background: rgba(255, 255, 255, .025); }
.jl-hora { font-family: var(--display); font-size: 16px; color: var(--text-muted); font-variant-numeric: tabular-nums; }
.jl-hora.vivo { color: var(--live); font-weight: 700; }
.jl-time { display: flex; align-items: center; gap: var(--s2); min-width: 0; }
.jl-time.casa { justify-content: flex-end; }
.jl-time img { width: 22px; height: 22px; object-fit: contain; flex-shrink: 0; }
.jl-time span { font-family: var(--semi); font-size: 16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.jl-placar { font-family: var(--display); font-size: 19px; font-weight: 700; text-align: center; font-variant-numeric: tabular-nums; }
/* ============================================================
   lances e escalacao
   ============================================================ */
.lances { max-width: 760px; }
.lance { display: grid; grid-template-columns: 44px 24px minmax(0, 1fr); align-items: center; gap: var(--s3); border-bottom: 1px solid var(--border-subtle); }
.lance.fora { grid-template-columns: minmax(0, 1fr) 24px 44px; text-align: right; }
.lance.fora .lance-min { order: 3; }
.lance.fora .lance-icone { order: 2; }
.lance.fora .lance-txt { order: 1; }
.lance-min { font-family: var(--display); font-size: 16px; font-weight: 700; color: var(--text-secondary); font-variant-numeric: tabular-nums; }
.lance-icone { display: grid; place-items: center; }
.lance-txt { display: grid; gap: 1px; min-width: 0; }
.lance-txt strong { font-family: var(--semi); font-size: 16px; font-weight: 600; }
.ev-sub { font-size: 13px; color: var(--text-secondary); }
.ev-gol { color: var(--accent); display: grid; place-items: center; }
.ev-troca { color: var(--success); display: grid; place-items: center; }
.ev-outro { color: var(--text-muted); font-style: normal; }
.punicao { display: inline-block; width: 10px; height: 14px; border-radius: 2px; }
.punicao.amarelo { background: var(--warning); }
.punicao.vermelho { background: var(--danger); }
.meio-campo { position: relative; }
.lado-campo.fora { transform: scaleY(-1); }
.lado-campo.fora .campo-jog { transform: scaleY(-1); }
.campo-foto img { width: 100%; height: 100%; object-fit: cover; }
.reserva-foto img { width: 100%; height: 100%; object-fit: cover; }
.reserva-txt { min-width: 0; display: grid; }
/* A troca, no banco, e texto e nao selo: aqui ha largura, e o retrato
   de 44px nao aguenta uma pastilha de 84. Seta verde entrou, seta
   vermelha saiu, e a posicao continua do lado. */
.reserva-sub { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 8px;
  min-width: 0; }
.rs-troca { display: inline-flex; align-items: center; gap: 3px; font-style: normal;
  font-size: 13px; font-weight: 700; font-variant-numeric: tabular-nums; }
.rs-troca svg { flex: none; }
.rs-troca.entrou { color: var(--success); }
.rs-troca.saiu { color: #ef6d6d; }
.reserva-sub em { font-style: normal; }
/* ============================================================
   trilho da direita
   ============================================================ */
.caixa-pe:hover { color: var(--accent-hover); }
/* ============================================================
   formularios, avisos, vazio, skeleton
   ============================================================ */
.painel.largo { max-width: none; }
.campo label { font-size: 14px; color: var(--text-secondary); }
/* `:not([type=checkbox])` nao e preciosismo: sem ele a regra pega as
   chaves de liga-desliga do Painel, que sao `<input type=checkbox>`
   dentro de `.campo`. Medido a 390px: a chave saia com 270px de
   largura e 44 de altura em vez de 40 por 23, virando uma barra azul
   atravessando a tela com o rotulo espremido em tres linhas. */
.campo input:not([type="checkbox"]):not([type="radio"]), .campo select { height: 42px; padding: 0 var(--s3); background: var(--surface-1); border: 0; border-radius: 8px; color: var(--text-primary); font-size: 15px; font-family: inherit; }
.campo input:focus { border-color: var(--accent); outline: none; }
.campo small { font-size: 13px; color: var(--text-muted); }
.btn:hover { background: var(--accent-hover); }
.btn.secundario { background: var(--surface-1); color: var(--text-primary); border: 0; }
.btn.secundario:hover { background: var(--surface-hover); }
.btn:disabled { opacity: .5; cursor: default; }
.aviso { padding: var(--s3) var(--s4); border-radius: 8px; background: var(--surface-1); border-left: 3px solid var(--accent); font-size: 15px; }
.aviso.erro { border-left-color: var(--danger); }
.troca { text-align: center; font-size: 15px; color: var(--text-secondary); }
.troca button { color: var(--accent); font-weight: 600; }
.vazio strong { font-size: 17px; font-weight: 600; }
.vazio span { font-size: 14px; color: var(--text-secondary); line-height: 1.5; }
.esqueleto { display: grid; gap: 1px; }
@keyframes respirar { 0%, 100% { opacity: .6 } 50% { opacity: .3 }}
.voltar { height: 40px; color: var(--text-secondary); font-size: 15px; display: inline-flex; align-items: center; gap: var(--s1); }
.voltar:hover { color: var(--text-primary); }
/* ============================================================
   painel de administracao
   ============================================================ */
.numeros { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: var(--s2); }
.numeros .num { background: var(--surface-1); border-radius: 8px; padding: var(--s3) var(--s4); display: grid; gap: 2px; }
.numeros .num strong { font-family: var(--display); font-size: 27px; font-weight: 700; line-height: 1; }
.numeros .num span { font-size: 13px; color: var(--text-secondary); }
.form-admin { display: grid; gap: var(--s4); max-width: 620px; }
/* ============================================================
   As escolhas de aviso: chave, e nao caixinha do navegador
   ============================================================
   "A aba de times ta muito feia, parece ate outro site."
   O que fazia ela parecer outro site era isto: sete `input
   type=checkbox` nativos, empilhados soltos sobre o fundo, com o
   quadradinho e o tique que o sistema operacional desenha. E a unica
   tela do Lobo Scores com controle de formulario cru -- o resto do
   site inteiro e pastilha, cartao e chave.
   Cada aviso vira uma linha com fundo proprio, o nome a esquerda e
   uma chave a direita, que e o desenho que qualquer tela de avisos
   tem. O HTML nao muda: continua `label` + `input`, que e o que faz
   o clique na linha inteira funcionar e o leitor de tela anunciar
   "caixa de selecao". */
.switches { display: grid; gap: 6px; }
.switches label {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s3); font-size: 15px; cursor: pointer;
  padding: 10px 12px; border-radius: var(--radius-md);
  background: var(--surface-2);
  transition: background var(--mola);
}
.switches label:hover { background: var(--n70); }
/* `order: 2` poe a chave depois do texto sem mexer no HTML: o texto e
   um no solto dentro do label e vem depois do input na marcacao. */
.switches input {
  appearance: none; -webkit-appearance: none;
  order: 2; flex: none; position: relative; cursor: pointer;
  width: 40px; height: 23px; border-radius: 999px;
  background: var(--n60); border: 0;
  transition: background var(--mv-curto) var(--mv-entra);
}
.switches input::after {
  content: ''; position: absolute; top: 3px; left: 3px;
  width: 17px; height: 17px; border-radius: 50%; background: var(--n0);
  transition: transform var(--mv-curto) var(--mv-entra);
}
.switches input:checked { background: var(--accent); }
.switches input:checked::after { transform: translateX(17px); }
.switches input:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
/* O Painel zera o padding de TODO label dentro de `.campo`
   (`.painel .campo label { padding: 0 }`), e essa regra tem
   especificidade maior que `.switches label`. Resultado medido a
   390px: a linha da chave ficava com 23px de altura, sem respiro e
   sem a faixa de fundo que separa uma da outra. Aqui ela volta, com
   especificidade suficiente para nao ser engolida de novo. */
.painel .campo .switches label {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--s3); padding: 10px 12px; border-radius: var(--radius-md);
  background: var(--surface-2); font-size: 15px; color: var(--text-primary);
  cursor: pointer; }
.painel .campo .switches label:hover { background: var(--n70); }
.nomes-lista { display: grid; max-width: 760px; }
.nome-linha { display: grid; grid-template-columns: 24px 1fr 1fr; align-items: center; gap: var(--s3); border-bottom: 1px solid var(--border-subtle); }
.nome-linha img { width: 22px; height: 22px; object-fit: contain; }
.nome-api { font-size: 14px; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.nome-linha input { height: 34px; padding: 0 var(--s2); background: var(--surface-1); border: 0; border-radius: var(--radius-sm); color: var(--text-primary); font-size: 15px; width: 100%; }
.cota { background: var(--surface-1); border-radius: 8px; padding: var(--s3) var(--s4); display: grid; gap: var(--s2); }
.cota-topo { display: flex; justify-content: space-between; align-items: baseline; font-size: 14px; color: var(--text-secondary); }
.cota-topo strong { font-family: var(--display); font-size: 19px; color: var(--text-primary); }
.barra { height: 5px; background: var(--bg); border-radius: 3px; overflow: hidden; }
.barra-cheia { height: 100%; background: var(--success); transition: width 300ms ease; }
.barra-cheia.atencao { background: var(--warning); }
.barra-cheia.perigo { background: var(--danger); }
.cota-pe { font-size: 13px; color: var(--text-muted); }
.diag { background: var(--surface-1); border-left: 3px solid var(--success); border-radius: 8px; padding: var(--s3) var(--s4); display: grid; gap: var(--s1); }
.diag.ruim { border-left-color: var(--danger); }
.diag-topo { display: flex; justify-content: space-between; font-size: 14px; color: var(--text-secondary); }
.diag-corpo { font-size: 14px; }
.vivo-erro { color: var(--danger); font-size: 14px; }
.sonda { display: grid; }
.sonda-linha { display: grid; grid-template-columns: 44px minmax(0,1fr) auto; align-items: center; gap: var(--s3); height: 44px; border-bottom: 1px solid var(--border-subtle); font-size: 14px; }
.sonda-marca { font-family: var(--display); font-size: 13px; font-weight: 700; text-align: center; border-radius: 4px; padding: 2px 0; }
.sonda-linha.sim .sonda-marca { background: rgba(32, 200, 117, .18); color: var(--success); }
.sonda-linha.nao .sonda-marca { background: rgba(239, 68, 68, .16); color: var(--danger); }
.sonda-det { font-size: 13px; color: var(--text-muted); text-align: right; }
.nota-9 { color: var(--accent); }
.nota-8 { color: var(--success); }
.nota-7 { color: var(--accent); }
.nota-6 { color: var(--text-primary); }
.nota-5 { color: var(--danger); }
/* ============================================================
   celular
   ============================================================ */
.barra-baixo { display: none; }
/* ============================================================
   LOBO SCORES V22 — DESKTOP ART DIRECTION
   Redesign visual only. No application logic is changed here.
   ============================================================ */
/* subtle structure rather than decorative effects */
/* ---------- sidebar: stronger product identity ---------- */
.menu > .marca { position: relative; padding: 2px 14px 30px; transform: skew(-4deg); }
.menu > .marca::after { content: ''; position: absolute; left: 15px; bottom: 18px; width: 58px; height: 3px; background: var(--accent); transform: skew(-22deg); }
#btn-conta::after { content: none; }
.mascote::before { content: 'LOBO SCORES'; font-family: var(--display); font-size: 12px; font-weight: 700; letter-spacing: .16em; color: var(--accent); }
/* ---------- top bar ---------- */
.busca:focus-within { border-color: var(--accent); }
/* ---------- top navigation: competition + dates becomes a sports strip ---------- */
.data.ativo b { color: var(--text-primary); }
.data-seta { border-radius: 7px; background: transparent; color: var(--text-secondary); flex-shrink: 0; }
/* ---------- section hierarchy ---------- */
/* ---------- match lists: editorial, readable, not admin-table ---------- */
.row-jogo:last-child { border-bottom: 0; }
.rj-placar em { font-style: normal; }
/* Live fixtures are visibly a different information tier *//* ---------- page title / generic heading ---------- */

h1 { font-family: var(--display); font-size: 32px; font-weight: 700; line-height: 1.2; letter-spacing: -.025em; }
.rodada-sep { font-size: 12px; font-weight: 500; color: var(--text-muted); text-transform: uppercase; letter-spacing: .12em; margin: 28px 0 11px; }
/* ---------- tabs become a calm navigation rail ---------- */
.chips.abas { display: flex; gap: 30px; border-bottom: 1px solid var(--border-subtle); margin-bottom: var(--s6); overflow-x: auto; scrollbar-width: none; margin: 0 0 26px; padding: 0 2px; }
/* Aba e navegacao: caixa baixa, tamanho de leitura, e a diferenca
   entre ativa e inativa vem de COR e do indicador, nao de peso. Todas
   com o mesmo peso 500 evita o pulo de largura ao trocar de aba. */
.chips.abas .chip {
  padding: 0 0 10px;
  border: none;
  border-radius: 0;
  background: none;
  color: var(--text-muted);
  font-size: var(--font-body);
  font-weight: var(--peso-medio);
  letter-spacing: .01em;
  white-space: nowrap;
  border-bottom: 2px solid transparent;
  transition: color 140ms ease, border-color 140ms ease;
}
.chips.abas .chip:hover { color: var(--text-secondary); }
.chips.abas .chip.ativo {
  color: var(--text-primary);
  font-weight: var(--peso-titulo);
  border-bottom-color: var(--brand);
}
/* ---------- match detail: a real match centre ---------- */
/* O selo decorativo 'CENTRAL DA PARTIDA' saiu daqui. Era texto
   injetado por CSS, em ciano fixo, no canto mais nobre do cabecalho,
   e nao dizia nada que a pessoa ja nao soubesse. */
.duelo { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
  align-items: center; width: 100%; max-width: 820px; column-gap: var(--s5); }
.duelo-time { display: grid; justify-items: center; gap: 14px; padding: var(--s2); border-radius: var(--radius-md); transition: background 140ms ease; }
.duelo-time img { width: 78px; height: 78px; object-fit: contain; }
.duelo-time span { font-family: var(--semi); font-size: var(--font-body); font-weight: var(--peso-titulo); text-align: center; line-height: 1.25; }
/* O placar e o unico numero que pode ser enorme na tela. */
.duelo-placar { font-family: var(--display); font-size: 56px; font-weight: var(--peso-forte); line-height: 1; letter-spacing: -.02em; display: flex; align-items: center; gap: var(--s3); font-variant-numeric: tabular-nums; }
.duelo-placar em { font-style: normal; font-weight: 400; color: var(--text-muted); font-size: 30px; }
.duelo-hora { font-family: var(--display); font-size: 44px; font-weight: var(--peso-forte); line-height: 1; letter-spacing: -.01em; color: var(--text-muted); }
.duelo-estado { font-size: 12px; font-weight: 700; color: var(--text-secondary); text-transform: uppercase; letter-spacing: .08em; padding: 4px 9px; border-radius: 5px; background: rgba(255,255,255,.035); }
/* match-body readability */
#aba-corpo > .stats, #aba-corpo > .lances, #aba-corpo > .ficha { margin-left: auto; margin-right: auto; }
.stats { max-width: 820px; }
.stat { margin-bottom: 24px; }
.stat-linha span { font-weight: 600; letter-spacing: .01em; }
.stat-barra { display: flex; gap: 2px; }
.stat-casa, .stat-fora { border-radius: 3px; }
/* A cor das barras mora na camada de baixo, junto com as variaveis do
   duelo. Aqui havia um `.stat-casa.maior { background: var(--accent) }`
   que, por ter especificidade 0,2,0 contra 0,1,0, vencia a regra nova
   independente da ordem no arquivo: a barra do mandante ficava azul
   mesmo com a cor do time definida. Terceira vez que uma regra mais
   especifica engole uma correcao neste arquivo. */
/* ---------- team/player/league identity headers ---------- */
/* ---------- a capa do time e a do jogador ----------
   "Parecem sites diferentes." Eram tres coisas, e nenhuma delas
   existia em nenhuma outra tela: uma barra de acento INCLINADA
   grudada no canto superior esquerdo, uma marca d'agua escrita
   LOBO SCORES no canto de baixo, e o nome em 34px display ITALICO.
   Nenhum outro titulo do site e italico, e nenhum outro cartao tem
   marca d'agua.
   As tres sairam. A capa agora e o mesmo cartao do resto: superficie,
   raio de 16 e a mesma escala de titulo do cabecalho da partida. */
.time-capa { display: flex; align-items: center; gap: 20px; min-height: 0;
  padding: 22px 24px; border-bottom: 1px solid var(--border-subtle);
  position: relative; margin: 6px 0 0; border: 0; border-radius: 16px 16px 0 0;
  background: var(--surface-1); overflow: hidden; }
.time-capa::before, .time-capa::after { content: none; display: none; }
.time-capa > img { width: 72px; height: 72px; object-fit: contain; flex-shrink: 0; }
/* Sem italico: e o unico titulo italico do site inteiro. O tamanho
   desce de 34 para 28, que e a escala de titulo de tela que o resto
   usa. */
.time-txt h1 { font-size: 28px; font-weight: 700; font-family: var(--display);
  font-style: normal; letter-spacing: -.02em; line-height: 1.1; }
.time-txt span { font-size: 15px; color: var(--text-muted); display: block; margin-top: 4px; }
/* A fileira de abas embaixo da capa passa a ser a MESMA da partida:
   mesmo tamanho de rotulo, mesma altura de alvo, mesmo sublinhado.
   Era 15px num fundo translucido proprio, e a da partida e 16 sobre
   a superficie do cartao. */
.time-capa + .chips.abas { padding: 0 24px; border: 0; border-top: 0;
  border-radius: 0 0 14px 14px; background: var(--surface-1);
  border-bottom: 1px solid var(--border-subtle); gap: 26px; }
.time-capa + .chips.abas .chip { height: 46px; font-size: 17px; padding-bottom: 0; }
.jogador-capa .retrato { width: 100px; height: 100px; border-radius: 50%; object-fit: cover; background: var(--surface-2); border: 2px solid var(--border-strong); }
/* O BOTAO ERA DA MESMA COR DA CAPA.
   `.time-capa` e `--surface-1` e `.btn-seguir` tambem era: os dois
   botoes da ficha do jogador ficavam texto solto sobre o cartao.
   "Blocos de comparar e ver clube nao tem destaque pro bloco e nem
   contraste nenhum." Sobe um degrau de superficie e ganha aresta --
   o mesmo desenho dos outros botoes secundarios do site. */
.btn-seguir { display: flex; align-items: center; gap: var(--s2); height: 38px;
  padding: 0 var(--s4); border-radius: 8px; background: var(--surface-2);
  border: 1px solid var(--aresta); font-size: 15px; font-weight: 600;
  color: var(--text-primary); cursor: pointer;
  transition: background 140ms ease, border-color 140ms ease;
  flex-shrink: 0; z-index: 2; }
.btn-seguir img { width: 20px; height: 20px; object-fit: contain; flex: none; }
/* As acoes da capa num grupo so. Eram dois botoes com `margin-left:
   auto` cada um, o que empurra o primeiro e cola o segundo nele sem
   nunca poder quebrar linha direito. */
.capa-acoes { margin-left: auto; display: flex; align-items: center;
  flex-wrap: wrap; justify-content: flex-end; gap: 8px; }
/* Selecao nao vira botao: nao existe pagina de selecao no site, e
   botao que abre "Time nao encontrado" e pior do que nao ter botao. */
.capa-selo { display: inline-flex; align-items: center; gap: 7px; height: 38px;
  padding: 0 12px; border-radius: 8px; background: var(--surface-2);
  border: 1px dashed var(--aresta); font-size: 14px; font-weight: 600;
  color: var(--text-secondary); }
.capa-selo img { width: 18px; height: 18px; object-fit: contain; }
/* O filtro da ficha, entre as abas e o corpo. */
.jg-filtro { margin: 12px 0 4px; }
.btn-seguir.segue { background: var(--accent-soft); border-color: var(--accent); color: var(--accent); }
/* ---------- stats strip: one coherent band ---------- */
.faixa-resumo { display: flex; align-items: center; height: auto; background: transparent; border-radius: 0; margin: 22px 0 30px; overflow-x: auto; scrollbar-width: none; min-height: 92px; border-top: 1px solid var(--border-subtle); border-bottom: 1px solid var(--border-subtle); }
.faixa-resumo > div { display: grid; gap: 2px; padding: 18px 28px; flex: 1; border-right: 1px solid var(--border-subtle); white-space: nowrap; }
.faixa-resumo > div:first-child { padding-left: 0; }
.faixa-resumo > div:last-child { border-right: 0; }
.faixa-resumo strong { font-family: var(--display); font-size: 31px; font-weight: 700; line-height: 1.1; font-variant-numeric: tabular-nums; letter-spacing: -.02em; }
.faixa-resumo span { font-size: 12px; font-weight: 500; color: var(--text-secondary); letter-spacing: .05em; text-transform: uppercase; }
/* ---------- standings: crisp broadcast-style table ---------- */
.tabela { max-width: none; width: 100%; border: 0; border-radius: 12px; overflow: hidden; background: rgba(9,21,34,.42); }
.tab-cab, .tab-linha { display: grid; grid-template-columns: 48px minmax(200px, 1fr) 52px 40px 40px 40px 40px 52px 108px; align-items: center; gap: var(--s2); padding: 0 var(--s3); text-align: center; font-variant-numeric: tabular-nums; padding-left: 16px; padding-right: 16px; }
.tab-cab { height: 42px; font-size: 12px; font-weight: 500; color: var(--text-muted); border-bottom: 1px solid var(--border-strong); background: var(--surface-1); border-bottom-color: var(--border-subtle); letter-spacing: .01em; }
.tab-linha { height: 50px; font-size: 15px; border-bottom: 1px solid var(--border-subtle); width: 100%; transition: background 140ms ease; }
.tab-linha:last-child { border-bottom: 0; }
.c-pos { display: flex; align-items: center; gap: var(--s3); color: var(--text-secondary); font-family: var(--display); font-size: 16px; font-weight: 700; }
.c-time b { font-family: var(--semi); font-size: 16px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.c-pts { font-weight: 700; font-family: var(--display); font-size: 18px; color: var(--text-primary); }
/* ---------- right rail: contextual and visually quieter ---------- */
.caixa, .banner { border: 0; background: var(--bg); border-radius: 12px; }
.banner { background: var(--surface-1); border-radius: 12px; padding: 22px; display: grid; gap: var(--s4); position: relative; min-height: 170px; align-content: end; overflow: hidden; }
.banner::before { content: ''; position: absolute; width: 80px; height: 3px; left: 0; top: 0; background: var(--accent); transform: skewX(-25deg) translateX(-8px); }
/* ---------- lineups ---------- */
/* ---------- forms/cards polish without changing flow ---------- */
.btn { height: 42px; padding: 0 var(--s5); border-radius: 9px; background: var(--accent); color: var(--bg); font-weight: 700; font-size: 15px; transition: background 140ms ease; }
/* A terceira regra que pegava a caixa de marcar. Esta empata em
   especificidade com `.switches input:checked` e vem depois, entao
   ela ganhava: a chave ligada aparecia CINZA, com o botao ja do lado
   direito. Parecia desligada e nao estava. */
.painel .campo input:not([type="checkbox"]):not([type="radio"]),
.painel .campo select { background: var(--surface-1); }
.vazio { max-width: 420px; margin: var(--s10) auto; text-align: center; display: grid; gap: var(--s2); justify-items: center; margin-top: 78px; margin-bottom: 78px; }
/* ---------- desktop density / width tuning ---------- */
/* Preserve the existing compact/mobile behavior */
/* ============================================================
   LOBO SCORES V23 — MATCH THE APPROVED MOCKUP
   Visual-only override requested by the user.
   ============================================================ */
:root {
  /* ============================================================
     SISTEMA VISUAL DO LOBOSCORES
     ============================================================
     Regra da casa: MENOS EFEITO, MAIS INFORMACAO.

     Quando algo precisar ganhar destaque, a ordem e posicao,
     tamanho, peso, contraste, espaco, e so no fim cor. Nenhum
     componente importante pode depender de glow, neon ou sombra
     forte para ser notado: quem chama atencao e o conteudo.

     Os nomes antigos continuam todos aqui. O que mudou foram os
     VALORES, para a tela inteira se mover junto sem nenhuma regra
     de CSS precisar ser reescrita. Nomes novos foram acrescentados
     ao lado dos antigos, nunca no lugar deles.
     ============================================================ */

  /* ------------------------------------------------------------
     NEUTROS
     ------------------------------------------------------------
     Eram cinzas quentes (#151515, #262625) debaixo de um azul frio
     de neon. Os dois brigavam. Agora a escala inteira tem uma
     leve inclinacao fria, da familia do azul do Lobao, e o fundo
     ficou mais escuro para a superficie do cartao ter degrau
     visivel sem precisar de sombra. */
  /* ------------------------------------------------------------
     A escala saiu do navy e virou CINZA NEUTRO
     ------------------------------------------------------------
     Ela tinha inclinacao azul de proposito, para o escuro "parecer
     futebol". Na pratica isso poe uma cor no fundo inteiro da tela, e
     azul e a unica cor que o site tem para destacar alguma coisa. Com
     o fundo tambem azulado, o botao azul, o link azul e o selo azul
     passam a competir com o proprio fundo: tudo puxa para o mesmo
     lado e nada se destaca.

     Cinza neutro nao disputa. Ele e o silencio onde o azul aparece --
     e por isso o FotMob, que e a referencia, e cinza do comeco ao
     fim, com uma cor so em cima.

     Os degraus de luminancia sao os mesmos de antes, entao nenhuma
     separacao de superficie se perde na troca; o que sai e o matiz.
     Mais degraus no meio (n85) porque bloco dentro de bloco ficou
     comum: sem ele, dois cartoes aninhados tinham o mesmo tom. */
  /* Largura maxima do duelo na linha de jogo. Ver o comentario em
     .jc-duelo: e o que impede o vazio de 200px entre o estado e o nome
     do time nas telas largas. */
  --duelo-max: 460px;

  --n100: #0B0B0D;   /* fundo da pagina */
  --n95:  #121215;   /* fundo de barras e areas recuadas */
  --n90:  #17171A;   /* cartao */
  --n85:  #1C1C20;   /* cartao dentro de cartao */
  --n80:  #212126;   /* celula destacada, campo de formulario */
  --n70:  #2B2B31;   /* estado hover */
  --n60:  #3C3C44;
  /* Os quatro degraus de texto subiram. O nivel de "metadata" estava
     sendo usado em nome de time, e nome de time e conteudo principal:
     Getafe, Celtic e Plzen pareciam botao desabilitado. */
  --n40:  #9A9AA3;
  --n20:  #D7D7DC;
  --n0:   #F6F6F8;

  --bg: var(--n100); --bg-sidebar: var(--n95);
  --bg-primary: var(--n100); --bg-secondary: var(--n95);
  --surface-1: var(--n90); --surface-2: var(--n80); --surface-hover: var(--n70);

  /* ------------------------------------------------------------
     TEXTO :: quatro degraus, e o corpo SUBIU de contraste
     ------------------------------------------------------------
     O corpo de texto usava #A3A29D. Dado e o produto: ele nao pode
     ficar apagado para a tela parecer sofisticada. Agora e #C3CCD8,
     e o degrau abaixo dele tambem clareou. Os numeros de cada par
     estao em scripts/contraste.mjs, que roda e reprova. */
  --text-primary: var(--n0);      /* titulo, placar, numero que importa */
  --text-secondary: var(--n20);   /* corpo de texto */
  --text-muted: var(--n40);       /* apoio: hora, competicao, rotulo */
  --text-disabled: #66717F;       /* desligado, placeholder */

  /* ------------------------------------------------------------
     MARCA :: o azul do Lobao, e ele e escasso
     ------------------------------------------------------------
     Era #16AEFF, um ciano de neon. O azul do personagem e mais
     fechado, de terno, e aguenta ser usado com parcimonia sem
     virar decoracao. Quanto menos elemento azul houver na tela,
     mais peso tem o que for azul.

     Dois tons com funcoes diferentes: `brand` e para preenchimento
     (botao, barra, indicador) e `brand-text` e para texto e link,
     porque o primeiro nao alcanca 4.5:1 como texto sobre o fundo. */
  --brand: #2E6FE0;
  --brand-hover: #4886EE;
  --brand-text: #7FAEF8;
  --brand-subtle: rgba(46, 111, 224, .16);

  /* Nomes antigos, apontando para o novo azul. */
  --accent: var(--brand);
  --accent-hover: var(--brand-hover);
  --accent-soft: var(--brand-subtle);

  /* ------------------------------------------------------------
     SEMANTICAS :: toda cor tem funcao, nenhuma e enfeite
     ------------------------------------------------------------ */
  --live: #E8495F;                       /* acontecendo agora */
  --live-soft: rgba(232, 73, 95, .15);
  /* `--live-txt` SAIU DAQUI, e o nome some junto com o problema.
     Eram dois vermelhos: este #E8495F, da lista da home, e um
     #FF8095 "de texto" que o resto do site usava. Eu ja tentei
     unificar uma vez e unifiquei para o lado errado -- puxei a home
     para o rosado e o site inteiro ficou rosa.
     Agora e UM. Dois tokens com a mesma funcao sao duas chances de
     divergir de novo, entao o segundo nao existe mais: quem escrevia
     `--live-txt` escreve `--live`.
     A conta fecha onde importa: 4,73:1 sobre o cartao e 5,20:1 sobre
     o fundo, os dois acima dos 4,5:1 que texto pede. O que ele NAO
     aguenta e pastilha colorida por baixo -- qualquer fundo tingido
     derruba para a faixa dos 4,0. Por isso as duas pastilhas que
     existiam ("N ao vivo" e o estado do cabecalho) perderam o fundo,
     e nao a cor. E coerente com o que o resto do site ja fazia: quem
     diz "ao vivo" e a bolinha com o minuto do lado, que e texto, nao
     tinta. */
  --success: #27A56F;                    /* positivo, ganho */
  --danger: #E8495F;
  --warning: #D9A441;
  /* PRO: champanhe fosco. Nao e dourado de cassino, nao brilha, e
     aparece em pouca coisa: a etiqueta, o icone e o botao. */
  --pro: #D9A441;
  --pro-soft: rgba(217, 164, 65, .13);
  --ambar: var(--warning);
  --verde: var(--success);
  --roxo: #8B6CFF;

  /* ------------------------------------------------------------
     BORDAS :: o cartao se define pela borda, nao pela sombra
     ------------------------------------------------------------ */
  --border-subtle: rgba(255, 255, 255, .06);
  --border-default: rgba(255, 255, 255, .10);
  --border-strong: rgba(255, 255, 255, .16);
  --aresta: var(--border-subtle);
  --aresta-forte: var(--border-default);
  --aresta-cartao: var(--border-default);
  --brilho-topo: none;

  /* ------------------------------------------------------------
     ELEVACAO :: quase nada
     ------------------------------------------------------------
     Um cartao comum nao pode parecer selecionado. A sombra ficou
     para o que realmente flutua: menu, painel, modal. */
  --e1: 0 1px 2px rgba(0, 0, 0, .30);
  --e2: 0 4px 16px rgba(0, 0, 0, .36);
  --e3: 0 14px 36px rgba(0, 0, 0, .46);
  --e-baixo: 0 -2px 16px rgba(0, 0, 0, .34);
  --e-topo: 0 2px 14px rgba(0, 0, 0, .30);

  /* ------------------------------------------------------------
     ESPACO :: base 4, com degraus que significam alguma coisa
     ------------------------------------------------------------ */
  --space-1: 4px;  --space-2: 8px;  --space-3: 12px; --space-4: 16px;
  --space-5: 24px; --space-6: 32px; --space-7: 48px; --space-8: 64px;
  --s1: 4px; --s2: 8px; --s3: 12px; --s4: 16px; --s5: 20px;
  --s6: 24px; --s7: 32px; --s8: 40px; --s9: 48px; --s10: 64px;

  /* ------------------------------------------------------------
     RAIO :: quatro, e so quatro
     ------------------------------------------------------------ */
  --radius-sm: 6px; --radius-md: 10px; --radius-lg: 14px; --radius-pill: 999px;

  /* ------------------------------------------------------------
     TIPOGRAFIA :: a escala, com nome de funcao
     ------------------------------------------------------------
     A auditoria achou 41 tamanhos diferentes em uso, com meio
     pixel no meio (11.5px, 12.5px). Dai vem a sensacao de que
     tudo tem o mesmo peso. Estes sete degraus sao o alvo. */
  --font-display: 34px;    /* placar */
  --font-title: 21px;      /* nome da tela ou da secao */
  --font-headline: 18px;   /* a frase principal de um insight */
  --font-body: 16px;       /* leitura */
  --font-secondary: 14px;  /* apoio */
  --font-meta: 13px;       /* hora, competicao, atualizado ha */
  --font-micro: 12px;      /* etiqueta, eyebrow */

  /* Nomes antigos, apontando para a escala nova. */
  --t-display: var(--font-display); --t-h1: 29px; --t-h2: 25px;
  --t-b1: var(--font-title); --t-b2: var(--font-headline);
  --t-b3: var(--font-body); --t-cap: var(--font-meta);

  /* Peso: 400 corpo, 500 apoio com enfase, 600 titulo, 700 so para
     numero grande. Negrito tem que significar alguma coisa. */
  --peso-corpo: 400; --peso-medio: 500; --peso-titulo: 600; --peso-forte: 700;

  --display: 'Satoshi', system-ui, sans-serif;
  --ui: 'Satoshi', system-ui, sans-serif;
  --semi: 'Satoshi', system-ui, sans-serif;

  /* ------------------------------------------------------------
     MOVIMENTO :: curto, e so quando comunica alguma coisa
     ------------------------------------------------------------
     A regra e uma so: toda animacao daqui pertence a uma destas
     categorias, e a categoria fica escrita em cima dela.

       FEEDBACK    recebi seu toque
       NAVEGACAO   voce saiu de um lugar e chegou em outro
       ESTADO      isto esta carregando, vazio, ou pronto
       TEMPO REAL  isto mudou agora, sozinho, sem voce pedir
       HIERARQUIA  olhe para isto primeiro
       ATMOSFERA   isto e uma noite de futebol

     Se nao pertence a nenhuma, sai. Movimento sem funcao e o que
     faz uma interface parecer brinquedo.

     Duracao por distancia percorrida, nao por gosto: quanto menor
     o deslocamento, mais curta a animacao. */
  --mv-toque: 90ms;    /* resposta ao dedo, tem que ser imperceptivel */
  --mv-curto: 160ms;   /* hover, cor, estado de um controle */
  --mv-medio: 260ms;   /* entrada de bloco, troca de aba */
  --mv-longo: 420ms;   /* troca de dia, abertura de painel */
  --mv-lento: 900ms;   /* gol, e so gol */

  /* Uma curva para entrar (sai rapido, chega macio) e uma para sair
     (comeca macio, vai embora rapido). Duas, nao oito. */
  --mv-entra: cubic-bezier(.16, 1, .3, 1);
  --mv-sai: cubic-bezier(.4, 0, 1, 1);

  --mola: 160ms cubic-bezier(.22, .9, .28, 1);

  /* ------------------------------------------------------------
     ESTRUTURA
     ------------------------------------------------------------ */
  --sidebar-w: 240px; --rail-w: 340px; --painel-w: 420px;
  --header-h: 58px; --pad: 32px; --app-max: 1720px;

  /* Cores do duelo. O JavaScript reescreve as quatro na pagina da
     partida com a cor do uniforme de cada time, ja com contraste
     garantido. Estes sao so o padrao. */
  --cor-casa: var(--brand);
  --cor-fora: #8B6CFF;
  --txt-casa: #FFFFFF;
  --txt-fora: #FFFFFF;
  --ganhou: var(--text-primary);
  --perdeu: var(--text-muted);
}

html, body { background: var(--bg); }
/* ------------------------------------------------------------
   A luz da pagina
   ------------------------------------------------------------
   Uma unica iluminacao ambiental, vindo de cima, muito fraca. O
   teste e este: se alguem olhar e pensar "tem um degrade aqui",
   esta forte demais. O que a pessoa tem que perceber e so que o
   escuro nao e chapado.

   `fixed` de proposito: a luz e do ambiente, nao do conteudo. Se
   rolasse junto, a pagina inteira teria um halo passeando.
   Pseudo-elemento em vez de background no body porque o body ja
   carrega o cache de pintura do scroll, e um gradiente enorme ali
   custa repaint a cada rolagem. */
body { background: var(--bg); color: var(--text-primary); font-family: var(--ui); font-size: 15px; line-height: 1.4; min-height: 100vh; -webkit-font-smoothing: antialiased; letter-spacing: -.005em; background-image: none; }
body::after {
  content: '';
  position: fixed;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  /* Um sopro de luz no topo, e so. Forte o bastante para o escuro nao
     ser chapado, fraco o bastante para ninguem conseguir apontar que
     ha um degrade ali. */
  background:
    radial-gradient(120% 60% at 50% -14%, rgba(255, 255, 255, .028), transparent 60%);
}
body::before { content: ''; position: fixed; inset: 0 0 auto var(--sidebar-w); height: 2px; background: var(--accent); opacity: .9; z-index: 60; pointer-events: none; display: none !important; }
/* Sidebar */
.menu .marca { justify-content: flex-start; padding: 0 0 22px; transform: none; }
.menu .marca::after, .menu .marca::before { display: none !important; }
.brand-logo { width: 228px; max-width: 100%; height: auto; display: block; }
.mi { display: flex; align-items: center; gap: var(--s3); padding: 0 16px; font-weight: 500; color: var(--text-primary); text-align: left; transition: background 140ms ease, color 140ms ease; position: relative; background: transparent; }
.mi:hover { background: rgba(255,255,255,.04); color: var(--text-primary); }
.mi.ativo { background: var(--surface-2); color: var(--text-primary); font-weight: 600; position: relative; }
.mi.ativo::before { content: ''; position: absolute; left: 0; width: 3px; height: 22px; border-radius: 2px; background: var(--accent); display: none; }
#btn-conta { margin-top: 4px; border-top: 0; padding-top: 0; }
.mascote { margin-top: auto; display: grid; gap: var(--s3); padding: 18px 12px 0; position: relative; min-height: 0; border-top: 0; }
.mascote::before { display: none !important; }
.mascote-vaga { height: auto; width: 100%; max-width: 170px; margin: 0 auto; object-fit: contain; border-radius: 14px; opacity: .92; }
/* Top */
.busca { position: relative; display: flex; align-items: center; gap: var(--s2); width: min(720px, 100%); height: 44px; padding: 0 16px; background: var(--surface-1); border: 0; border-radius: 14px; color: var(--text-muted); border-color: var(--border-subtle); }
.busca input { flex: 1; background: none; border: none; outline: none; color: var(--text-primary); font-size: 17px; font-family: inherit; }
.ic-topo { border-radius: 50%; display: grid; place-items: center; color: var(--text-primary); transition: background 140ms ease, color 140ms ease; }
.ic-topo svg { width: 20px; height: 20px; fill: currentColor; }
.ic-topo:hover { border-color: var(--border-subtle); }
/* Home controls */ .datas { display: flex; gap: 10px; overflow-x: auto; scrollbar-width: none; align-items: stretch; padding-bottom: 4px; }
.datas { margin-bottom: 18px; gap: 2px; align-items: stretch; padding: 6px 0; border-bottom: 0; }
.data, .data-seta, .data-atalho { flex: 0 0 auto; min-width: 84px; height: 60px; border-radius: 14px; background: transparent; border: 0; }
.data { display: grid; gap: 2px; justify-items: center; border-radius: 7px; background: transparent; align-content: center; white-space: nowrap; transition: background 140ms ease; }
.data b { font-family: var(--semi); text-transform: capitalize; }
.data.ativo { border-color: var(--accent); }
.data-seta, .data-atalho { display: grid; place-items: center; font-size: 30px; }
.data-seta:hover:not(:disabled), .data-atalho:hover { background: var(--surface-1); }
.data-atalho svg { width: 20px; height: 20px; }
/* Sections */
.secao { display: flex; align-items: center; gap: 12px; font-family: var(--ui); font-size: 21px; font-weight: 700; line-height: 1.2; margin: 22px 0 14px; position: relative; min-height: 30px; font-style: normal; letter-spacing: -.02em; text-transform: none; }
.secao::after { content: ''; flex: 1; height: 1px; margin-left: 10px; background: var(--border-strong); display: none; }
.secao em { font-style: normal; order: 3; font-family: var(--ui); padding: 0; border-radius: 999px; background: none; }
.secao-titulo { display: inline-flex; align-items: baseline; gap: 6px; }
/* Match lists */
.linhas { display: grid; border: 0; border-radius: 12px; overflow: visible; background: transparent; gap: 12px; }
.row-jogo::before { display: none !important; }
.row-jogo:hover { border-color: var(--border-subtle); }
.row-jogo.ao-vivo { border-color: var(--border-subtle); }
.row-jogo.compacta { opacity: 1; }
.rj-placar { font-family: var(--ui); font-weight: 700; color: var(--text-primary); }
.rj-placar { font-family: var(--display); text-align: center; font-variant-numeric: tabular-nums; color: var(--text-primary); }
.rj-placar em { color: var(--text-primary); }
.rj-gols { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: var(--s1) var(--s5); color: var(--text-secondary); }
/* Right rail */
.trilho { display: grid; gap: 18px; align-content: start; padding-top: 0; }
.caixa { border: 0; }
.caixa-topo { display: flex; justify-content: space-between; align-items: center; gap: 12px; font-family: var(--ui); font-style: normal; text-transform: none; letter-spacing: -.02em; }
.caixa-topo span { color: var(--text-primary); font-weight: 400; margin-left: auto; background: var(--n80); border: 0; }
.mini-cab, .mini-linha { display: grid; grid-template-columns: 28px minmax(0,1fr) 34px 34px 38px; align-items: center; gap: 8px; text-align: center; font-variant-numeric: tabular-nums; }
.mini-cab { height: 38px; font-size: 13px; color: var(--text-muted); padding: 0 6px; }
.mini-linha { border-top: 1px solid var(--border-subtle); padding: 0 6px; }
.mini-linha.meu { background: rgba(15, 98, 167, .12); }
.mini-pos { color: var(--text-primary); }
.mini-time { display: flex; align-items: center; gap: 8px; text-align: left; font-family: var(--semi); font-size: 15px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--text-primary); }
.mini-time img { width: 19px; height: 19px; object-fit: contain; flex-shrink: 0; }
.caixa-pe { width: 100%; height: auto; color: var(--accent); font-weight: 600; text-align: left; padding: 8px 4px 0; }
.banner.banner-imagem { padding: 0; background: transparent; border: 0; min-height: auto; }
.banner.banner-imagem::before { display: none; }
.banner.banner-imagem img { display: block; width: 100%; height: auto; border-radius: 18px; border: 0; }
/* Footer */
.rodape { margin-top: 28px; padding: var(--s6) 0 var(--s8); border-top: 0; color: var(--text-muted); font-size: 14px; display: grid; gap: var(--s1); }
/* ============================================================
   LOBO SCORES V24 — polish pass based on the latest feedback
   - fixes top gradient/header overlap on desktop and mobile
   - improves mobile hero and search treatment
   - rebuilds lineup pitch, coach cards, bench organization
   - upgrades match fiche and team details / roster layout
   ============================================================ */
.topo::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 1px; background: var(--surface-1); }
.topo-fim { margin-left: auto; display: flex; align-items: center; min-width: 0; }
.conteudo-grade, #conteudo, .trilho { position: relative; z-index: 1; }
/* Team page / match page cards feel less flat */
/* O DESFOQUE DE FUNDO SO ONDE ELE APARECE.
   `.row-jogo` estava nesta lista, e numa home de sabado sao quarenta
   linhas. Cada `backdrop-filter` obriga o navegador a criar uma
   camada propria e a reler o que esta atras dela A CADA QUADRO da
   rolagem -- e as linhas da lista sao transparentes sobre um fundo
   chapado, entao nao havia nada para desfocar.
   Medido: desligando o desfoque destas tres, a imagem da home muda no
   maximo 6 de 255 num canal (invisivel a olho), e o pior quadro da
   rolagem cai de 20,3ms para 18,9ms ja num computador -- no celular,
   que e onde a reclamacao nasceu, a conta e bem pior que essa.
   Fica onde ele de fato desfoca alguma coisa: o topo grudado, que
   passa por cima do conteudo rolando, e as pecas que tem a atmosfera
   colorida da competicao atras. */
.cabeca, .time-capa, .banner, .data, .data-seta, .data-atalho { backdrop-filter: blur(10px); }
.confrontos-lista { display: grid; gap: 10px; }
/* ---------- lineup ---------- */
.esc-cabs { display: flex; justify-content: space-between; margin-bottom: var(--s3); max-width: 960px; margin: 0 auto 16px; gap: 16px; padding: 0 4px; }
.esc-cab { display: flex; align-items: center; gap: var(--s2); flex: 1 1 0; min-width: 0; padding: 14px 16px; border-radius: 16px; border: 0; background: var(--surface-1); }
.esc-cab.dir { flex-direction: row-reverse; text-align: right; justify-content: flex-end; }
.esc-cab img { width: 32px; height: 32px; object-fit: contain; }
.esc-cab strong { display: block; font-family: var(--semi); font-size: 19px; font-weight: 600; line-height: 1.05; color: var(--text-primary); }
.esc-cab span { font-size: 12px; color: var(--text-secondary); display: inline-flex; align-items: center; margin-top: 5px; padding: 3px 8px; border-radius: 999px; background: rgba(15, 43, 67, .76); border: 0; letter-spacing: .08em; text-transform: uppercase; }
.gramado { position: relative; max-width: 960px; display: grid; grid-template-rows: 1fr 2px 1fr; gap: var(--s3); background: #0B2119; border: 0; border-radius: 20px; overflow: hidden; border-color: var(--border-subtle); isolation: isolate; margin: 0 auto; }
.gramado::before { content: ''; position: absolute; inset: 0; background-color: #0B2119; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='104' viewBox='0 0 8 104'%3E%3Crect width='8' height='52' fill='%23ffffff' fill-opacity='.018'/%3E%3Crect y='52' width='8' height='52' fill='%23000000' fill-opacity='.035'/%3E%3C/svg%3E"); background-repeat: repeat; pointer-events: none; }
.gramado::after { content: ''; position: absolute; inset: 12px; border: 2px solid var(--border-strong); pointer-events: none; }
.meio-campo span { border: 2px solid var(--border-strong); }
.lado-campo { display: grid; gap: var(--s1); align-content: space-between; position: relative; min-height: 306px; padding: 18px 10px; }
.lado-campo::before, .lado-campo::after { content: ''; position: absolute; left: 50%; transform: translateX(-50%); pointer-events: none; }
.lado-campo::before { top: 14px; width: 42%; height: 18%; border: 2px solid var(--border-strong); border-top: 0; border-radius: 0 0 12px 12px; }
.lado-campo::after { top: 14px; width: 16%; height: 8%; border: 2px solid var(--border-strong); border-top: 0; border-radius: 0 0 8px 8px; }
.lado-campo.fora::before { top: auto; bottom: 14px; border-top: 2px solid var(--border-strong); border-bottom: 0; border-radius: 12px 12px 0 0; }
.campo-linha { display: flex; justify-content: space-evenly; gap: 16px; min-height: 72px; }
/* Viraram <button>: clicar no jogador abre o que ele fez na partida.
   Como botao, o navegador traz fundo, borda, fonte e alinhamento
   proprios -- todos zerados aqui para o desenho nao mudar. */
.campo-jog { display: grid; justify-items: center; gap: 8px;
  padding: 0; border: 0; background: transparent; font: inherit;
  color: inherit; cursor: pointer; }
.campo-jog:hover .campo-foto { box-shadow: 0 0 0 2px var(--brand-text); }
.campo-foto, .reserva-foto, .jogador-foto { position: relative; overflow: hidden; border-radius: 50%; border: 0; background: var(--surface-2); }
.campo-foto { position: relative; border-radius: 50%; background: var(--surface-2); display: grid; place-items: center; overflow: hidden; border-color: var(--border-subtle); border-width: 2px; }
.avatar-fallback { position: absolute; inset: 0; display: grid; place-items: center; font-family: var(--display); font-size: 16px; font-weight: 700; letter-spacing: .03em; color: var(--text-primary); background: var(--surface-2); }
.campo-foto img, .reserva-foto img, .jogador-foto img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
/* Mesma regra do `.campo-nome` logo abaixo: sem nowrap, sem reticencias. */
.campo-jog > span { font-family: var(--semi); font-size: 13px; color: var(--text-primary); text-align: center; text-shadow: 0 1px 3px rgba(0, 0, 0, .9); white-space: normal; overflow-wrap: anywhere; max-width: 92px; font-weight: 600; line-height: 1.12; }
.tecnicos-grid { max-width: 960px; margin: 16px auto 0; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
.tecnico-card { display: flex; align-items: center; gap: 14px; min-height: 86px; padding: 16px; border-radius: 16px; border: 0; background: var(--surface-1); }
.tecnico-avatar { flex: 0 0 auto; width: 54px; height: 54px; overflow: hidden; position: relative; display: grid; place-items: center; border-radius: 50%; background: var(--surface-2); border: 0; font-family: var(--display); font-size: 22px; font-weight: 700; color: var(--text-primary); }
.tecnico-avatar img { position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; border-radius: 50%; display: block; }
.tecnico-meta span { display: block; font-size: 12px; letter-spacing: .08em; text-transform: uppercase; color: var(--text-muted); }
.tecnico-meta strong { display: block; margin-top: 3px; font-size: 18px; line-height: 1.1; color: var(--text-primary); }
.tecnico-meta small { display: block; margin-top: 3px; font-size: 14px; color: var(--text-secondary); }
/* ============================================================
   OS DOIS BANCOS, UM DE CADA VEZ
   ============================================================
   Eram dois blocos lado a lado no computador e empilhados no celular:
   vinte e quatro linhas de reserva seguidas. Agora sao duas abas com
   o escudo, e so um banco na tela -- quem abre o banco quer o banco
   de um time.
   ============================================================ */
.bancos { margin-top: 18px; background: var(--surface-1); border-radius: 18px;
  padding: 12px; }
/* A TRILHA RECUA E A ABA ATIVA SOBE.
   Antes: trilha rgba(255,255,255,.04) sobre --surface-1 (#17171A),
   que da #1D1D20, e aba ativa em --surface-2 (#212126). Quatro
   degraus de 255 de diferenca -- invisivel. O relato foi exato: "eu
   nem sei qual ta selecionado".
   Agora a trilha desce para o fundo da pagina e a ativa sobe para o
   tom de hover, com um fio de luz em cima. E o mesmo desenho de
   segmented control que todo mundo ja sabe ler. */
.bancos-abas { display: grid; grid-template-columns: 1fr 1fr; gap: 4px;
  padding: 4px; margin-bottom: 12px; border-radius: 12px;
  background: var(--n100); }
/* Medido a 412px: com gap 8 e padding 10 sobravam 69px para o nome e
   "Palmeiras" pede 78 -- as duas abas saiam com reticencias. Escudo,
   vao e recuo apertados devolvem os 10px que faltavam. */
.bancos-aba { display: flex; align-items: center; justify-content: center; gap: 6px;
  padding: 9px 7px; border: 0; border-radius: 10px; cursor: pointer;
  background: transparent; color: var(--text-muted); font-family: var(--ui);
  font-size: 14px; font-weight: 600; min-width: 0;
  transition: background var(--mv-curto) var(--mv-entra),
              color var(--mv-curto) var(--mv-entra); }
.bancos-aba img { width: 20px; height: 20px; object-fit: contain; flex: none; }
.bancos-aba span { min-width: 0; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; }
.bancos-aba em { font-style: normal; font-size: 12px; font-weight: 700;
  color: var(--text-muted); flex: none; }
.bancos-aba:hover { background: rgba(255, 255, 255, .05); color: var(--text-secondary); }
.bancos-aba.ativo { background: var(--n70); color: var(--text-primary);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .10), 0 1px 2px rgba(0, 0, 0, .35); }
.bancos-aba.ativo em { color: var(--brand-text); }
/* Um banco so: nao ha o que escolher, entao e cabecalho e nao aba. */
.bancos-cab { display: flex; align-items: center; gap: 9px; margin-bottom: 12px;
  font-size: 14px; }
.bancos-cab img { width: 22px; height: 22px; object-fit: contain; }
.bancos-cab strong { color: var(--text-primary); }
.bancos-cab span { font-size: 12px; text-transform: uppercase; letter-spacing: .08em;
  color: var(--text-muted); }
/* O cartao agora e o `.bancos`; a lista de dentro nao tem mais caixa
   propria, senao vira cartao dentro de cartao. */
.banco { margin-top: 0; border-radius: 0; border: 0; background: transparent; padding: 0; }
.banco-lista { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; }
.reserva { display: grid; align-items: center; gap: 12px; height: 56px; padding: 10px 12px; border-radius: 14px; background: var(--n85); border: 0; grid-template-columns: 44px minmax(0,1fr) auto;
  width: 100%; font: inherit; color: inherit; text-align: left; cursor: pointer; }
.reserva:hover { background: var(--n80); }
.reserva-foto { width: 44px; height: 44px; border-radius: 50%; overflow: hidden; background: var(--surface-2); flex-shrink: 0; }
.reserva-txt strong { font-family: var(--semi); font-size: 15px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block; line-height: 1.1; color: var(--text-primary); }
.reserva-txt span { font-size: 13px; color: var(--text-muted); display: block; margin-top: 3px; }
.reserva-num { min-width: 38px; height: 32px; padding: 0 8px; display: grid; place-items: center; border-radius: 10px; border: 0; background: var(--n80); font-size: 14px; font-weight: 700; color: var(--text-primary); }
/* ---------- team roster and details ---------- */
.elenco-bloco { margin-bottom: 4px; }
.elenco { gap: 12px; }
.jogador { display: flex; align-items: center; gap: 12px; height: 64px; padding: 12px 14px; border-radius: 16px; background: var(--surface-1); transition: background 140ms ease; grid-template-columns: 52px minmax(0,1fr) auto; min-height: 76px; border: 0; }
.jogador-foto { width: 52px; height: 52px; }
.jogador-txt strong { font-size: 15px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block; line-height: 1.1; color: var(--text-primary); }
.jogador-txt span { font-size: 13px; color: var(--text-muted); display: block; margin-top: 4px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* A PASTILHA DO NUMERO ERA UM BURACO, NAO UMA PASTILHA.
   `rgba(8,17,28,.95)` e mais escuro que o cartao onde ela mora: em
   vez de um selo, o que aparecia era um furo preto com um numero
   dentro. Pastilha se le por ser MAIS clara que o fundo, como todas
   as outras do site.
   E ela encolheu de 42 para 34: esses 8px voltam para o nome, que
   estava saindo como "Leo Pere..." e "Emerson..." em quatro dos doze
   defensores. */
.jogador-num { min-width: 34px; height: 30px; padding: 0 7px; display: grid;
  place-items: center; border-radius: 9px; border: 0; background: var(--surface-2);
  font-size: 13.5px; font-weight: 700; font-variant-numeric: tabular-nums;
  color: var(--text-primary); }
.detalhes-metricas { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; align-content: start; }
/* CARTAO DE NUMERO: ROTULO EM CIMA, NUMERO NO MEIO, UNIDADE EMBAIXO.
   "78.838 lugares" saia inteiro dentro do `strong` de 28px em
   italico: nao cabia na largura do cartao, quebrava em duas linhas e
   ficava encostado na esquerda ao lado de tres cartoes de uma linha.
   A unidade virou legenda propria (o JS separa os dois), o conteudo
   e centrado como nos outros cartoes de numero do site, e o italico
   saiu -- era a unica fonte inclinada da interface inteira. */
.detalhe-card { min-height: 110px; padding: 16px; border-radius: 16px; border: 0;
  background: var(--surface-1); display: grid; gap: 4px;
  align-content: space-between; justify-items: center; text-align: center; }
.detalhe-card span { font-size: 12px; letter-spacing: .08em; text-transform: uppercase; color: var(--text-muted); }
.detalhe-card strong { font-family: var(--display); font-size: 28px; line-height: 1;
  color: var(--text-primary); font-variant-numeric: tabular-nums; }
.detalhe-card em { font-style: normal; font-size: 12.5px; color: var(--text-secondary); }
.estadio-faixa { position: relative; height: 100%; max-width: 1100px; border-radius: 18px; overflow: hidden; margin-bottom: var(--s5); min-height: 248px; border: 0; background: var(--surface-1); }
.estadio-faixa img { width: 100%; height: 100%; object-fit: cover; }
.estadio-faixa::after { content: ''; position: absolute; inset: 0; background: rgba(5, 11, 19, .38); }
.estadio-txt { position: absolute; left: 22px; bottom: 20px; z-index: 1; right: 22px; }
.estadio-txt strong { display: block; font-family: var(--display); font-size: 28px; font-weight: 700; line-height: 1.04; color: var(--text-primary); }
.estadio-txt span { font-size: 15px; color: var(--text-primary); display: block; margin-top: 6px; }
/* ============================================================
   AVISO DE CONTAGEM DE VISITA
   ============================================================
   Faixa no rodape, e nao modal: o site e de placar ao vivo, e uma
   parede por cima do placar no intervalo de um jogo e a pior
   primeira impressao possivel.

   Os dois botoes tem o mesmo peso. Aceitar grande e colorido com um
   recusar apagado do lado e consentimento empurrado, nao
   consentimento. */
.cookies { position: fixed; left: 0; right: 0; bottom: 0; z-index: 80;
  display: flex; align-items: center; justify-content: center; gap: 14px;
  flex-wrap: wrap;
  padding: 10px 16px;
  padding-bottom: calc(10px + env(safe-area-inset-bottom, 0px));
  background: var(--surface-1); border-top: 1px solid var(--aresta);
  box-shadow: 0 -6px 18px rgba(0, 0, 0, .3); }
.cookies-txt { min-width: 0; font-size: 13px; line-height: 1.4;
  color: var(--text-secondary); }
.cookies-btns { display: flex; gap: 8px; flex: 0 0 auto; }
.cookies-btns button { height: 32px; padding: 0 14px; border-radius: 8px;
  border: 1px solid var(--aresta); background: var(--surface-2);
  color: var(--text-primary); font-family: var(--ui); font-size: 13px;
  font-weight: 600; cursor: pointer; }
.cookies-btns button:hover { background: var(--surface-hover); }

/* ============================================================
   consultas de midia
   Ficam no fim de proposito: regra base escrita depois de uma
   media query vence na cascata e quebra o celular.
   ============================================================ */
/* ============================================================
   ajustes finais de celular
   Escritos depois de todas as outras media queries de proposito.
   ============================================================ */
/* nenhuma tela pode rolar de lado */
/* ============================================================
   resumo, jogadores da partida e h2h
   ============================================================ */
.acontecendo { background: var(--surface-1); border-left: 3px solid var(--accent); border-radius: 10px; padding: 16px 20px; margin-bottom: 8px; max-width: 760px; }
.acontecendo-topo { font-size: 13px; font-weight: 500; color: var(--text-muted); letter-spacing: .01em; margin-bottom: 8px; }
.acontecendo p { font-size: 17px; line-height: 1.5; }
.acontecendo small { display: block; margin-top: 8px; font-size: 13px; color: var(--text-muted); }
.jogadores-partida { display: grid; grid-template-columns: 1fr 1fr; gap: 32px; max-width: 900px; }
.jog-col { min-width: 0; }
.jog-col .esc-cab { margin-bottom: 12px; }
.jog-linha { display: grid; grid-template-columns: 36px minmax(0, 1fr) auto; align-items: center; gap: 12px; height: 52px; padding: 0 8px; border-bottom: 1px solid var(--border-subtle); cursor: pointer; transition: background 140ms ease; }
.jog-linha:hover { background: rgba(255, 255, 255, .025); }
.jog-linha img { width: 36px; height: 36px; border-radius: 50%; object-fit: cover; background: var(--surface-2); }
.jog-txt { min-width: 0; display: grid; }
.jog-txt strong { font-family: var(--semi); font-size: 16px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.jog-txt span { font-size: 13px; color: var(--text-secondary); }
.jog-nota { font-family: var(--display); font-size: 18px; font-weight: 700; min-width: 36px; text-align: center; padding: 3px 0; border-radius: 5px; background: var(--surface-2); }
.melhor { display: flex; align-items: center; gap: 16px; background: var(--surface-1); border-radius: 12px; padding: 14px 18px; margin-bottom: 20px; max-width: 460px; }
.melhor img { width: 52px; height: 52px; border-radius: 50%; object-fit: cover; background: var(--surface-2); }
.melhor span { display: block; font-size: 13px; color: var(--text-muted); text-transform: uppercase; letter-spacing: .06em; }
.melhor strong { font-family: var(--semi); font-size: 19px; font-weight: 600; }
.melhor .jog-nota { margin-left: auto; font-size: 23px; min-width: 52px; padding: 6px 0; }
.h2h { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 24px; max-width: 620px; margin-bottom: 16px; }
.h2h-lado { display: grid; justify-items: center; gap: 4px; }
.h2h-lado img { width: 40px; height: 40px; object-fit: contain; }
.h2h-lado strong, .h2h-meio strong { font-family: var(--display); font-size: 34px; font-weight: 800; line-height: 1; }
.h2h-lado span, .h2h-meio span { font-size: 13px; color: var(--text-secondary); }
.h2h-meio { display: grid; justify-items: center; gap: 4px; }
.h2h-barra { display: flex; height: 6px; border-radius: 3px; overflow: hidden; gap: 2px; max-width: 620px; }
.h2h-a { border-radius: 3px; }
.h2h-e { background: var(--surface-2); border-radius: 3px; }
.h2h-b { border-radius: 3px; }
.h2h-gols { margin-top: 12px; font-size: 15px; color: var(--text-secondary); }
/* Eram 19px em fonte display no meio de um texto de 15px: os dois
   numeros ficavam maiores que o titulo da linha. "Do nada os numeros
   13 e 14 tao berrando." Herdam o tamanho do texto; o peso e a cor
   ja separam o numero do nome. */
.h2h-gols b { color: var(--text-primary); font-weight: 700;
  font-variant-numeric: tabular-nums; }
/* contagem de jogos por competicao na faixa do topo */
/* ============================================================
   correcoes: dia sem jogo, topo e celular
   ============================================================ */

/* dia sem jogo continua clicavel, so mais apagado */
.data.vazio { opacity: .45; }
.data.vazio:hover { opacity: .8; }
.data.ativo.vazio { opacity: 1; }
.topo { display: flex; align-items: center; gap: 20px; height: var(--header-h); border-bottom: 0; position: sticky; top: 0; z-index: 25; background: var(--bg); margin-bottom: 24px; border-bottom-color: var(--border-subtle); padding-top: 14px; backdrop-filter: blur(8px); overflow: hidden; padding-bottom: 12px; }
/* ============================================================
   celular: linha de jogo empilhada
   Com os dois times lado a lado nao havia largura para o nome,
   e "Fortaleza" virava "Fort...". Empilhado, o nome cabe inteiro.
   ============================================================ */
/* cabecalho do celular: a marca estava encostando nos botoes */
.versao-carimbo { font-size: 12px; color: var(--text-muted); opacity: .7; }
/* ---------- tabela ao vivo ---------- */
.c-pos b.sobe, .c-pos b.desce { font-size: 13px; line-height: 1; }
.c-pos b.sobe { color: var(--success); }
.c-pos b.desce { color: var(--danger); }
/* ---------- momentum ----------
   As regras que estavam AQUI foram apagadas, nao movidas.
   `.momentum-topo`, `.momentum-grafico` e `.momentum-pe` nao existem
   mais na marcacao: montarMomentum emite `.mm-caixa`, `.mm-grafico` e
   `.mm-regua`. E `.mm-col`, `.mm-casa` e `.mm-fora` eram redeclarados
   mil e quinhentas linhas abaixo, com cores diferentes -- quem
   editasse aqui nao veria efeito nenhum.
   A definicao viva e uma so, junto do resto do Fluxo da partida. */
/* ---------- resumo por IA ---------- */
.resumo-ia { background: var(--surface-1); border-left: 3px solid var(--success); border-radius: 10px; padding: 16px 20px; margin-bottom: 16px; max-width: 760px; }
.resumo-ia .rotulo { color: var(--text-muted); text-transform: uppercase; margin-bottom: 8px; }
.resumo-ia small { display: block; margin-top: 10px; color: var(--text-muted); }
/* ---------- destaques automaticos ---------- */
/* Tinha `max-width: 760px`, pelo mesmo motivo e com o mesmo efeito
   que o `.leitura` la embaixo: numa coluna de 900 os tres blocos
   paravam 140px antes do fim e ficavam desalinhados de tudo que vem
   depois deles na mesma pilha. Medida de leitura confortavel ja vem
   do tamanho do texto, nao de um teto de largura no cartao. */
.insights { display: grid; gap: 8px; margin-bottom: 8px; }
.insight { display: flex; align-items: center; gap: 12px; background: var(--surface-1); border-radius: 10px; padding: 12px 16px; font-size: 15.5px; }
.insight i { width: 6px; height: 6px; border-radius: 50%; background: var(--accent); flex-shrink: 0; }
/* ---------- comparar jogadores ---------- */
.cmp-cabs { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; max-width: 760px; margin-bottom: 24px; }
.cmp-cab { display: grid; justify-items: center; gap: 8px; background: var(--surface-1); border-radius: 12px; padding: 20px 16px; }
.cmp-cab img { width: 72px; height: 72px; border-radius: 50%; object-fit: cover; background: var(--surface-2); }
.cmp-cab strong { font-family: var(--semi); font-size: 18px; font-weight: 600; text-align: center; }
.cmp-cab span { font-size: 13px; color: var(--text-secondary); text-align: center; }
.cmp-cab.vazio { min-height: 180px; align-content: center; color: var(--text-muted); }
.cmp-cab .btn { height: 32px; padding: 0 14px; font-size: 14px; margin-top: 4px; }
.cmp-linhas { max-width: 760px; }
.cmp-linha { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 16px; height: 48px; border-bottom: 1px solid var(--border-subtle); }
.cmp-linha strong { font-family: var(--display); font-size: 21px; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--text-secondary); }
.cmp-linha strong:first-child { text-align: right; }
.cmp-linha strong.melhor { color: var(--text-primary); }
.cmp-linha span { font-size: 14px; color: var(--text-secondary); min-width: 130px; text-align: center; }
/* ============================================================
   correcoes de diagramacao
   ============================================================ */

/* ---------- 1. faixa de competicoes: um bloco nao entra no outro ---------- */ .comp-bola { width: 24px; height: 24px; margin: 0 auto; }
/* ---------- 2. grupos por competicao na lista ---------- */
/* sem a competicao repetida em cada linha, a coluna encolhe */
.row-jogo { display: grid; grid-template-columns: 74px minmax(140px, 1fr) 90px minmax(140px, 1fr) 40px; align-items: center; min-height: 74px; padding: 12px 18px; border-bottom: 1px solid var(--border-subtle); cursor: pointer; position: relative; transition: background 140ms ease; border-bottom-color: var(--border-subtle); background: var(--surface-2); border: 0; border-radius: 18px; }
.rj-status { font-family: var(--ui); }
/* ---------- 3. destaques no trilho ---------- */
.destaques { display: grid; gap: 8px; }
.destaque { display: grid; gap: 6px; width: 100%; text-align: left; }
.dq-liga { font-size: 12px; color: var(--text-muted); }
.dq-times { display: flex; align-items: center; gap: 6px; min-width: 0; }
.dq-times img { width: 18px; height: 18px; object-fit: contain; flex-shrink: 0; }
.dq-times b { font-family: var(--semi); font-size: 14px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 1; }
.dq-times b:last-of-type { text-align: right; }
.dq-times em { font-style: normal; font-family: var(--display); font-size: 16px; font-weight: 700; padding: 0 4px; white-space: nowrap; }
.dq-vivo { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; }
/* ---------- 6. foto do jogador na aba Jogadores ---------- */
.jog-foto { width: 36px; height: 36px; border-radius: 50%; overflow: hidden; background: var(--surface-2); flex-shrink: 0; }
.jog-foto img { width: 100%; height: 100%; object-fit: cover; }
/* ---------- 9. cabecalho da partida sem corte ---------- */
.cabeca { max-width: 980px; margin: 10px auto 28px; display: grid; gap: var(--s4); justify-items: center; position: relative; min-height: 246px; padding: 30px 54px 28px; justify-content: center; align-content: center; background: var(--surface-1); border: 0; border-radius: 14px; overflow: visible; padding-top: 8px; }
.cabeca::before { content: ''; position: absolute; left: 0; top: 0; width: 138px; height: 3px; background: var(--accent); transform: skewX(-32deg) translateX(-12px); display: none; }
/* ---------- 12. tela de entrar ---------- */
.painel h1 { font-size: 28px; margin-bottom: 0; }
.painel p { margin-bottom: 4px; }
/* ---------- celular ---------- */

/* ============================================================
   consultas de midia
   Ficam no fim de proposito: regra base escrita depois de uma
   media query vence na cascata e quebra o celular.
   ============================================================ */
/* ============================================================
   classes que faltavam estilo
   ============================================================ */
.c-sg { font-variant-numeric: tabular-nums; }
.estrela { display: inline-grid; place-items: center; }
.estrela svg { fill: currentColor; }
.faixa-resumo.grande strong { font-size: 32px; }
.mini-tab { display: grid; }
.ic-topo.perfil { background: var(--surface-1); border: 0; color: var(--text-primary); }
.sonda-nome { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
/* ============================================================
   correcoes desta rodada
   ============================================================ */

/* 1. topo da barra lateral estava cortando a marca */
.menu { display: none; position: fixed; left: 0; top: 0; bottom: 0; width: var(--sidebar-w); background: var(--bg-sidebar); border-right: 1px solid var(--border-subtle); padding: 24px 22px 18px; flex-direction: column; z-index: 30; overflow: visible; padding-top: 16px; }
.menu .marca, .menu > a:first-child { flex-shrink: 0; }
.menu img[src*="brand_logo"] { width: 100%; max-width: 168px; height: auto; display: block; }
/* 2. grupos por competicao */
.grupo-liga { margin-bottom: 20px; }
.grupo-topo { display: flex; align-items: center; width: 100%; text-align: left; }
.grupo-topo img { object-fit: contain; flex-shrink: 0; }
.grupo-topo strong { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.grupo-topo > span { margin-left: auto; font-size: 13px; color: var(--text-muted); font-variant-numeric: tabular-nums; }
/* 3. destaques */
.dq-times em.com-placar { color: var(--text-primary); font-size: 18px; }
.dq-fim { font-size: 12px; color: var(--text-muted); text-transform: uppercase; letter-spacing: .06em; }
/* 4. seletor de liga na tabela do trilho */
.trilho-liga { background: var(--surface-2); border: 0; border-radius: 8px; color: var(--text-primary); font-family: inherit; font-size: 13.5px; padding: 5px 8px; max-width: 165px; }
/* 5. o bloco "Seguindo" precisa respirar antes das competicoes */
.grade + .chips { margin-top: 8px; padding-top: 20px; border-top: 1px solid var(--border-subtle); }
.chips + .grade { margin-top: 4px; }
/* 9. formulario: rotulo em cima, campo inteiro */
.painel { max-width: 400px; display: grid; gap: 16px; margin: 32px 0; }
/* `margin-bottom` zero deixava rotulo de um campo colado no texto de
   apoio do campo anterior: a 390px, "Minutos antes do jogo" nascia
   grudado em "71 = Brasileirao Serie A". Um campo por vez precisa
   parecer um campo por vez. */
.painel .campo { display: grid; gap: 6px; width: 100%; min-height: 0; padding: 0; position: static;
  margin-bottom: 16px; }
.painel .campo:last-child { margin-bottom: 0; }
.painel .campo > small { color: var(--text-muted); font-size: 12.5px; line-height: 1.45; }
.painel .campo::before, .painel .campo::after { content: none; }
.painel .campo label { position: static; font-size: 14px; color: var(--text-secondary); background: none; padding: 0; transform: none; }
.painel .campo input:not([type="checkbox"]):not([type="radio"]) { width: 100%; height: 44px; padding: 0 14px; background: var(--surface-1); border: 0; border-radius: 8px; color: var(--text-primary); font-size: 16px; }
.painel .btn { width: 100%; }
/* ============================================================
   consultas de midia
   Ficam no fim de proposito: regra base escrita depois de uma
   media query vence na cascata e quebra o celular.
   ============================================================ */
.lado-campo-marcas { position: absolute; inset: 12px; border: 0; border-radius: 6px; pointer-events: none; }
/* ============================================================
   busca: sugestoes, grupos e teclado
   ============================================================ */
.busca-caixa { position: absolute; top: calc(100% + 8px); left: 0; right: 0; z-index: 40; background: var(--surface-2); border: 0; border-radius: var(--radius-md); padding: 6px; max-height: 68vh; overflow-y: auto; box-shadow: 0 8px 24px rgba(0, 0, 0, .16); }
.busca-titulo { font-size: 12.5px; font-weight: 600; color: var(--text-muted); letter-spacing: .01em; padding: 12px 12px 6px; }
.busca-titulo:first-child { padding-top: 8px; }
.busca-item { display: flex; align-items: center; gap: 12px; width: 100%; height: 46px; padding: 0 12px; border-radius: 8px; text-align: left; transition: background 120ms ease; }
.busca-item:hover, .busca-item.marcado { background: var(--surface-hover); }
.busca-item.marcado { outline: 1px solid var(--accent); outline-offset: -1px; }
.busca-item img { width: 26px; height: 26px; object-fit: contain; flex-shrink: 0; border-radius: 50%; background: var(--surface-2); }
.busca-item img.dq { border-radius: 6px; background: none; }
.busca-item span { font-family: var(--semi); font-size: 16px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; flex: 1; }
.busca-item em { margin-left: auto; font-style: normal; font-size: 13px; color: var(--text-muted); white-space: nowrap; flex-shrink: 0; }
.busca-vazio { padding: 28px 12px; color: var(--text-secondary); text-align: center; font-size: 15px; }

/* ============================================================
   consultas de midia
   Ficam no fim de proposito: regra base escrita depois de uma
   media query vence na cascata e quebra o celular.
   ============================================================ */

/* ============================================================
   camada ScoreSpot :: proporcao e hierarquia da lista de jogos
   (escrita depois das regras base e ANTES das consultas de midia)
   ============================================================ */

/* titulo de secao: 16 Bold, nao 20 */
.secao { font-size: var(--t-b2); font-weight: 700; margin: var(--s6) 0 var(--s3); letter-spacing: -.01em; }
.secao em { font-size: var(--t-b3); font-weight: 500; color: var(--text-muted); }

/* faixa de competicoes: pilula de 36, nao cartao de 78 */

/* faixa de datas */
.datas { gap: var(--s1); margin-bottom: var(--s5); }
/* O rotulo aqui e "Hoje" / "Amanha" / "sab" com "13 de set" embaixo.
   Largura fixa cortava e sobrepunha os botoes: a largura sai do texto. */
.data { width: auto; min-width: 78px; height: 58px; padding: 0 var(--s3);
  border-radius: var(--radius-md); gap: 2px; white-space: nowrap; }
.data b { font-size: var(--t-b3); font-weight: 600; color: var(--text-primary); line-height: 1.2; }
.data span { font-size: var(--t-cap); font-weight: 500; color: var(--text-muted); line-height: 1.2; }
.data.vazio { opacity: .45; }
.data:hover:not(:disabled) { background: var(--surface-1); }
.data.ativo { background: var(--accent); }
.data.ativo b, .data.ativo span { color: var(--n100); }
.data-seta, .data-atalho { width: 40px; min-width: 40px; height: 58px; border-radius: var(--radius-md); color: var(--text-muted); }

/* lista e cabecalho de competicao :: 56 de altura, escudo 28, sem risco embaixo */
.linhas { gap: var(--s2); }
.grupo-liga { margin-bottom: var(--s5); }
/* A linha de jogo com 1140px espalha o conteudo e deixa dois vazios
   enormes nas pontas. A proporcao do kit so funciona em coluna estreita. */
#conteudo, .rodape { max-width: 860px; }
.grupo-topo { gap: var(--s3); border-bottom: 0; }
.grupo-txt { display: grid; gap: 2px; min-width: 0; text-align: left; }
.grupo-topo strong { font-family: var(--ui); font-weight: 700; line-height: 1.4; color: var(--text-primary); }
.grupo-topo small { font-size: var(--t-cap); font-weight: 500; }
.grupo-topo > span:last-child { font-size: var(--t-cap); font-weight: 500; }
.grupo-topo > .grupo-txt { margin-left: 0; }

/* linha de jogo :: 56 no desktop */
.row-jogo { min-height: 56px; padding: 0 var(--s4); border-radius: var(--radius-md);
  background: var(--surface-2); border: 0;
  grid-template-columns: 56px minmax(120px, 1fr) 86px minmax(120px, 1fr) 36px; }
.row-jogo:has(.rj-gols) { padding-top: var(--s3); padding-bottom: var(--s3); }
.rj-status {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0;
}
.rj-status.vivo { background: var(--live); color: #FFFFFF; }
.row-jogo.futuro .rj-status { background: transparent; color: var(--text-secondary); padding: 0; }/* placar: 20 Bold */

.rj-placar { font-family: var(--ui); font-variant-numeric: tabular-nums; }
.rj-placar { font-weight: 700; letter-spacing: .01em; }
.rj-placar em { font-size: var(--t-b1); color: var(--text-muted); margin: 0 3px; }
.rj-gols { font-family: var(--ui); font-size: var(--t-cap); }

/* destaque do jogo ao vivo sem inflar a linha */

/* analise da IA :: a cor da tarja diz de que momento e o texto */
.resumo-ia { border-radius: var(--radius-lg); border-left: 3px solid var(--accent); padding: var(--s4) var(--s5); }
.resumo-ia.previa { border-left-color: var(--accent); }
.resumo-ia.ao_vivo { border-left-color: var(--live); }
.resumo-ia.full_time { border-left-color: var(--success); }
.resumo-ia .rotulo { font-size: var(--t-cap); font-weight: 700; letter-spacing: .06em; }
.resumo-ia.ao_vivo .rotulo { color: var(--live); }
.resumo-ia p { font-size: var(--t-b2); line-height: 1.55; }
.resumo-ia small { font-size: 12px; line-height: 1.5; }

/* estatistica agrupada e metrica derivada */
.stat-grupo { margin-bottom: var(--s6); }
.stat-grupo:last-child { margin-bottom: 0; }
.stat-formula { margin-top: 6px; font-size: 12px; line-height: 1.4; color: var(--text-muted); text-align: center; }
.derivadas .stat-linha strong { color: var(--accent); }

.proximo { background: var(--surface-1); border-radius: var(--radius-lg); padding: var(--s5); margin-bottom: var(--s6); width: 100%; text-align: left; display: block; }
.proximo-topo {
  display: flex;
  align-items: center;
  gap: var(--s2);
  margin-bottom: var(--s4);
  font-size: var(--t-cap);
  font-weight: 600;
  letter-spacing: .05em;
  white-space: nowrap;
}
.proximo-topo > span:first-of-type { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.proximo-topo .marca-jogo { flex: none; color: var(--accent); }
.proximo-topo img { width: 18px; height: 18px; object-fit: contain; }
.proximo-duelo { display: grid; grid-template-columns: minmax(0,1fr) auto minmax(0,1fr); align-items: center; gap: var(--s3); }
.proximo-time { display: grid; justify-items: center; gap: var(--s2); min-width: 0; }
.proximo-time img { width: 48px; height: 48px; object-fit: contain; }
.proximo-time span { font-size: var(--t-b3); font-weight: 600; color: var(--text-primary);
  text-align: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
.proximo-hora { display: grid; justify-items: center; gap: 2px; }
.proximo-hora strong { font-weight: 700; color: var(--text-primary); font-variant-numeric: tabular-nums; }
.proximo-hora small { font-size: var(--t-cap); color: var(--text-muted); }
.proximo-pe { margin-top: var(--s4); font-size: var(--t-cap); text-align: center; }

/* ---------- estados: tudo que se clica responde ---------- */
.row-jogo, .ml, .data, .mi, .ic-topo, .grupo-topo, .proximo,
.bb, .chip, .btn, .caixa-pe, .data-seta, .data-atalho{
  transition: background var(--mola), color var(--mola),
              box-shadow var(--mola), transform var(--mola), opacity var(--mola);
}
.row-jogo:active, .proximo:active, .ml:active, .data:active {
  transform: scale(.994);
}
.ic-topo:active, .data-seta:active { transform: scale(.92); }

:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
  border-radius: var(--radius-md);
}

/* ---------- elevacao onde ela significa alguma coisa ---------- */
.row-jogo { box-shadow: var(--e1); }
.row-jogo:hover { box-shadow: var(--e2); }
.proximo { box-shadow: var(--e2); }
.proximo:hover { box-shadow: var(--e3); }
.caixa, .detalhe-card, .tecnico-card, .bancos { box-shadow: var(--e1); }
.busca-caixa { box-shadow: var(--e3); }
.barra-baixo { box-shadow: var(--e-baixo); }

/* ---------- vidro nas barras fixas ---------- */
/* O ScoreSpot poe desfoque de fundo na Navbar 20 vezes. E o que faz
   a lista passar por baixo da barra em vez de sumir atras dela.     */
.topo.descolou { box-shadow: var(--e-topo); }

/* ---------- o jogo ao vivo tem que saltar ---------- */
.row-jogo.ao-vivo { position: relative; box-shadow: var(--e2); }
.row-jogo.ao-vivo::after {
  content: ''; position: absolute; left: 0; top: 10px; bottom: 10px; width: 3px;
  border-radius: 0 3px 3px 0; background: var(--live);
}
.rj-status.vivo { position: relative; }
.rj-status.vivo::before {
  inset: -3px;
  border: 2px solid var(--live);
  opacity: .5;
}
@keyframes aura {
  0%   { transform: scale(.9);  opacity: .55; }
  70%  { transform: scale(1.35); opacity: 0; }
  100% { transform: scale(1.35); opacity: 0; }}

/* placar acende quando muda, para o gol nao passar batido */
@keyframes acendeu {
  0%   { color: var(--accent); transform: scale(1.18); }
  100% { color: var(--text-primary); transform: scale(1); }
}
.rj-placar.mudou span, .dest .placar.mudou { animation: acendeu 1.1s ease-out; }

/* ---------- esqueleto com a altura da linha de verdade ---------- */
/* Antes eram blocos de 76px, e a lista pulava quando os dados
   chegavam. Agora o esqueleto tem a mesma altura e o mesmo respiro. */
.esqueleto { display: grid; gap: var(--s2); }
.esqueleto div {
  height: 56px; border-bottom: 0; border-radius: var(--radius-md);
  background: linear-gradient(90deg, var(--surface-1) 25%, var(--n70) 50%, var(--surface-1) 75%);
  background-size: 400% 100%; animation: passando 1.4s linear infinite;
}
@keyframes passando { from { background-position: 100% 0; } to { background-position: -100% 0; }}

/* ---------- grupo de competicao recolhivel ---------- */
.grupo-topo .caret { margin-left: var(--s2); color: var(--text-muted); transition: transform var(--mola); }
.grupo-topo .caret svg { width: 16px; height: 16px; display: block; }
.grupo-liga.fechado .caret { transform: rotate(-90deg); }
.grupo-liga.fechado .linhas { display: none; }

/* ---------- modo "por hora": lista sem agrupamento ---------- */
.modos-lista { display: flex; gap: var(--s2); margin-bottom: var(--s5); }
.modo-lista { height: 34px; padding: 0 var(--s4); border-radius: var(--radius-pill);
  background: var(--surface-1); color: var(--text-secondary);
  font-size: var(--t-b3); font-weight: 600; }
.modo-lista:hover { background: var(--surface-2); color: var(--text-primary); }
.modo-lista.ativo { background: var(--accent); color: #04121C; }
.modo-lista.so-vivo.ativo { background: var(--live); color: #fff; }
.hora-sep { display: flex; align-items: center; gap: var(--s3); margin: var(--s5) 0 var(--s2);
  font-size: var(--t-cap); font-weight: 700; color: var(--text-muted); letter-spacing: .06em; }
.hora-sep::after { content: ''; flex: 1; height: 1px; background: var(--n70); }

/* ============================================================
   estrutura Mabol :: barra de topo + lateral de competicoes
   ============================================================ */

/* barra de topo */
.topo { gap: var(--s4); padding: 0 var(--s5); background: var(--bg); }
.topo-marca { display: flex; align-items: center; flex: none; }
.topo-marca .brand-logo { width: 132px; height: auto; }
.topo-nav { display: none; gap: var(--s1); flex: none; }
.topo-nav .mi {
  height: 36px;
  padding: 0 var(--s3);
  border-radius: var(--radius-pill);
  font-size: var(--t-b3);
  background: transparent;
  display: inline-flex;
  align-items: center;
  gap: 0;
}
.topo-nav .mi.ativo { font-weight: 600; }
/* O botao do Painel nasce com `hidden` e so aparece para admin/mod.
   `display: inline-flex` logo acima vencia o atributo, e o Painel
   aparecia no topo para QUALQUER visitante. O atributo tem que ganhar. */
.mi[hidden], .topo-nav .mi[hidden] { display: none; }
.topo .busca { flex: 1 1 auto; max-width: 420px; }
.topo-fim { gap: var(--s2); }
.ic-topo.perfil { padding: 0 var(--s4); border-radius: var(--radius-pill); font-size: var(--t-b3); font-weight: 600; }
.so-celular { display: inline-grid; }

/* lateral de competicoes */
.menu-titulo { padding: 0 var(--s3) var(--s2); margin-top: var(--s4); }
/* A lateral nao rola mais uma lista de competicoes inteira: em cima
   fica o menu suspenso e embaixo so as que a pessoa segue. Ver
   `montarMenuLigas`. `flex: 1 1 auto` saiu junto -- com a lista
   curta, ele esticava o bloco e empurrava os atalhos para o rodape. */
.menu-ligas { display: flex; flex-direction: column; gap: 8px; min-height: 0; }
.ml-atalhos { display: flex; flex-direction: column; overflow-y: auto;
  min-height: 0; max-height: 34vh; }
.ml-atalhos::-webkit-scrollbar { width: 6px; }
.ml-atalhos::-webkit-scrollbar-thumb { background: var(--n70); border-radius: 3px; }
.menu-ligas::-webkit-scrollbar { width: 6px; }
.menu-ligas::-webkit-scrollbar-thumb { background: var(--n70); border-radius: 3px; }
/* A lista de competições da lateral tinha o mesmo peso do conteúdo.
   É navegação: recua um degrau e só sobe quando é a ativa. */
.ml {
  display: flex;
  align-items: center;
  gap: var(--s3);
  width: 100%;
  font-size: 14.5px;
  font-weight: 500;
  color: var(--text-secondary);
  text-align: left;
}
.ml:hover { color: var(--text-primary); }
.ml.ativo { font-weight: 600; color: var(--text-primary); }
/* Liga sem jogo hoje some de verdade, e a que tem jogo fica com o
   escudo cheio. Antes as duas tinham o mesmo escudo aceso e a lista
   inteira lia igual. */
.ml.apagada { color: var(--text-muted); }
.ml.apagada img { opacity: .38; filter: grayscale(.7); }
.ml img { width: 22px; height: 22px; object-fit: contain; flex: none; }
.ml .comp-bola { width: 18px; height: 18px; flex: none; }
/* Nome longo quebra em ate duas linhas, em vez de ser cortado pela
   borda da lateral ("Copa de la División Profesio"). */
.ml-nome { flex: 1 1 auto; min-width: 0; white-space: normal; line-height: 1.25; overflow: hidden;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow-wrap: anywhere; }
.ml-qtd { font-style: normal; font-size: var(--t-cap); font-weight: 700; }
.menu .mascote { margin-top: var(--s4); flex: none; }/* painel e cartoes: raio 12, sem borda */

.caixa, .detalhe-card, .tecnico-card, .banco, .esc-cab { border-radius: var(--radius-lg); border: 0; }
.mi { border-radius: var(--radius-md); font-size: var(--t-b3); height: 44px; }
.chips:not(.abas) .chip { border-radius: var(--radius-pill); }

/* ============================================================
   acabamento v42 :: hierarquia, resposta e densidade
   ============================================================ */

button,
[role="button"],
.busca-item,
.caixa-pe {
  transition: background-color 140ms ease, color 140ms ease,
    box-shadow 140ms ease, opacity 140ms ease;
}
button:disabled {
  cursor: not-allowed;
  opacity: .38;
}
button:active:not(:disabled) { opacity: .88; }
.bb:hover { color: var(--n0); }
.bb:active { background: var(--n90); }
button:focus-visible,
[role="button"]:focus-visible,
.busca-item:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}

#conteudo { width: 100%; max-width: 860px; }

/* Primeiro nivel: proximo jogo. E o unico card da home com elevacao. */
.proximo {
  position: relative;
  background: var(--n90);
  border-radius: var(--radius-lg);
  padding: var(--s5);
  box-shadow: 0 10px 24px rgba(0, 0, 0, .18);
}
.proximo:hover { background: var(--n80); }
.proximo:active { background: var(--n70); }
.proximo:focus-visible { outline-offset: 3px; }
.proximo-topo { color: var(--n20); }
.proximo-hora strong { font-size: var(--t-h2); }
.proximo-pe { color: var(--n40); }

/* Secoes: ao vivo primeiro, proximos segundo, encerrados terceiro. */
.secao {
  margin: var(--s7) 0 var(--s3);
  min-height: 24px;
  color: var(--n0);
}
.secao.compacta { color: var(--n20); }
.secao.compacta em { color: var(--n40); }
@keyframes pulso-live {
  0%, 100% { opacity: 1; box-shadow: 0 0 0 4px var(--live-soft); }
  50% { opacity: .76; box-shadow: 0 0 0 2px var(--live-soft); }}

/* Cabecalho de competicao e linhas viram um bloco unico. */
/* A competicao e um cartao so: barra de titulo mais clara em cima,
   jogos embaixo, borda em volta. No computador o cabecalho estava
   solto sobre o fundo e a lista parecia continuar a pagina. */
.grupo-liga {
  margin-bottom: var(--s6);
  overflow: hidden;
  border-radius: var(--radius-lg);
  background: var(--surface-1);
  border: 1px solid var(--border-subtle);
}
.grupo-topo {
  height: 56px;
  padding: 0 var(--s4);
  background: var(--surface-2);
  border: 0;
  border-bottom: 1px solid var(--border-subtle);
  border-radius: 0;
}
.grupo-topo:hover { background: var(--n80); }
.grupo-topo:active { background: var(--n70); }
.grupo-topo:hover strong { color: var(--n0); }
.grupo-topo img { width: 28px; height: 28px; }
.grupo-topo strong { font-size: var(--t-b3); }
.grupo-topo small { color: var(--n40); }
.grupo-topo > span:last-child {
  min-width: 28px;
  height: 24px;
  display: grid;
  place-items: center;
  margin-left: auto;
  border-radius: var(--radius-pill);
  background: var(--n80);
  color: var(--n20);
}
/* ---------- me explica ----------
   O "?" ao lado do titulo do bloco. Discreto por padrao e so ganha
   cor quando esta aberto: ele precisa existir em varios blocos sem
   virar poluicao em nenhum. */
.explica { display: inline-grid; place-items: center; width: 20px; height: 20px;
  margin-left: 7px; padding: 0; border: 0; border-radius: 50%; vertical-align: -3px;
  background: transparent; color: var(--text-muted); cursor: pointer;
  transition: color .15s, background .15s; }
.explica svg { width: 15px; height: 15px; display: block; }
.explica:hover { color: var(--text-primary); background: var(--surface-2); }
.explica.aberto { color: var(--accent); background: rgba(255, 255, 255, .06); }
.explica:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

.explicacao { margin: -2px 0 14px; padding: 11px 13px; border-radius: 10px;
  background: var(--surface-2); border-left: 3px solid var(--accent); }
.explicacao p { margin: 0; font-size: 14.5px; line-height: 1.55;
  color: var(--text-secondary); }
.explicacao p + p { margin-top: 7px; }
.explicacao .ex-leitura { color: var(--text-primary); }
/* A definicao da metrica agora vem DEPOIS da leitura do jogo, e em
   corpo de nota de rodape: e apoio para quem nao conhece o numero,
   nao a resposta de quem clicou. */
.explicacao .ex-definicao { font-size: 13.5px; color: var(--text-muted);
  padding-top: 7px; border-top: 1px solid var(--border-subtle); }
.explicacao .ex-carregando { color: var(--text-muted); }

/* ---------- sobre a partida ----------
   O paragrafo do rodape. Ele nao e para quem esta na pagina, e para
   quem ainda vai chegar pela busca, entao fica visualmente abaixo de
   tudo: texto menor, cor secundaria e sem disputar atencao com o
   conteudo de verdade. */
.sobre { margin-top: var(--s6); }
.sobre .bloco-tit {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 0;
  padding: 14px var(--s4);
  border-bottom: 1px solid var(--border-subtle);
  background: none;
  font-family: var(--display);
  font-size: var(--font-headline);
  font-weight: var(--peso-titulo);
  letter-spacing: .01em;
  color: var(--text-primary);
}
/* ============================================================
   Sobre a partida: dado virou interface, nao redacao
   ============================================================
   Aqui era `.sobre p` e mais nada, porque o bloco era literalmente
   cinco paragrafos. Um deles despejava vinte e dois nomes de
   jogadores separados por virgula. Para descobrir quem fez o 2 a 1
   voce lia o texto inteiro, e a aba Escalacao ao lado ja desenhava os
   mesmos onze no campo, com foto.

   Agora e resultado, metadata, e secoes separadas por espaco e uma
   linha -- nao por mais cartoes. Cartao dentro de cartao e o que
   achata a hierarquia, e este bloco JA e um cartao.

   A frase corrida ficou, de proposito: "onde assistir X x Y" e busca
   de texto e quem responde em prosa aparece nela. O que mudou foi o
   peso dela, de peca inteira para uma linha de apoio. */
.sobre .sb-topo { padding: 16px var(--s4) 10px; display: grid; gap: 5px;
  justify-items: center; text-align: center; }
.sb-placar { font-family: var(--display); font-size: 18px; font-weight: 700;
  line-height: 1.25; color: var(--text-primary); text-wrap: balance; }
.sb-meta { font-size: 13.5px; color: var(--text-secondary);
  font-variant-numeric: tabular-nums; }
/* A frase corrida foi para o RODAPE do bloco.
   No topo ela eram cinco linhas de texto cinza entre o resultado e o
   primeiro dado -- exatamente a parede que esta rodada veio desfazer.
   No fim ela continua indexavel e legivel por quem quiser, e nao
   atrasa mais ninguem. */
.sobre .sb-frase { margin: 0; padding: 12px var(--s4) 14px;
  border-top: 1px solid var(--border-subtle);
  font-size: 13.5px; line-height: 1.55; color: var(--text-muted); max-width: 78ch; }

/* ============================================================
   AS SEIS SECOES DO SOBRE
   ============================================================
   Eram seis rotulos de 11px em cinza de apoio, separados por um fio
   que mal aparece, e o veredito do dono do produto foi "sem icones e
   divisoes, bagunca". Ele tem razao: num cartao com gols, confronto,
   escalacao, transmissao e estadio um embaixo do outro, o unico jeito
   de achar "onde assistir" era LER os seis rotulos, porque nada
   distinguia um do outro a nao ser o texto.

   Duas mudancas, nenhuma nova no produto -- as duas copiam o que o
   resto do site ja faz:
   . icone no rotulo, na cor de acento, como todo titulo de bloco;
   . o fio da divisao sobe de --border-subtle (6% de branco) para
     --border-default (10%), e o espaco entre secoes cresce. Fio que
     ninguem ve nao divide nada.
   ============================================================ */
.sb-secao { padding: 16px var(--s4) 18px; border-top: 1px solid var(--border-default); }
/* Rotulo de secao, nao titulo de cartao: pequeno, em caixa alta, sem
   fundo proprio. Ele agrupa; quem tem peso e o conteudo abaixo. */
.sb-rot { margin: 0 0 12px; display: flex; align-items: center; gap: 7px;
  font-size: 12px; font-weight: 700;
  letter-spacing: .09em; text-transform: uppercase; color: var(--text-secondary); }
.sb-rot .bt-ico { width: 15px; height: 15px; color: var(--accent); flex: none; }
.sb-rot .bt-ico svg { width: 15px; height: 15px; }

/* Gols em ordem cronologica: e assim que a partida aconteceu, e a
   separacao por time destruia exatamente essa leitura. */
.sb-gols { list-style: none; margin: 0; padding: 0; display: grid; gap: 7px; }
/* A coluna do time ENCOLHE. Com `auto` ela reservava a largura de
   "Vasco da Gama" inteira e "Bruno Duarte" quebrava em duas linhas na
   coluna do meio -- num bloco onde o nome de quem fez o gol e o
   conteudo e o nome do time e a etiqueta. */
.sb-gols li { display: grid; grid-template-columns: 40px minmax(0, 1fr) minmax(0, auto);
  gap: 10px; align-items: baseline; font-size: 14.5px; }
.sb-gols b { font-family: var(--display); font-weight: 700;
  color: var(--text-primary); font-variant-numeric: tabular-nums; }
.sb-gols span { color: var(--text-primary); }
.sb-gols i { font-style: normal; font-size: 13px; color: var(--text-muted);
  text-align: right; min-width: 0; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; }

/* Os tres numeros tem que ficar na MESMA linha de base. "Vasco da
   Gama" quebra em duas linhas no celular e "Empates" nao, e com as
   colunas crescendo de cima para baixo o 2 do Vasco descia um andar
   em relacao ao 3 dos empates -- num retrospecto, que existe para ser
   lido de uma olhada como "2 a 3 a 2". A linha de cima estica, a de
   baixo nao: o nome cresce para cima e os numeros ficam parados. */
.sb-h2h { margin: 0; display: grid; grid-template-columns: repeat(3, 1fr);
  gap: 8px; text-align: center; align-items: stretch; }
.sb-h2h div { display: grid; grid-template-rows: 1fr auto; gap: 3px; }
.sb-h2h dt { align-self: end; }
.sb-h2h dt { font-size: 13px; color: var(--text-muted); overflow-wrap: anywhere; }
.sb-h2h dd { margin: 0; font-family: var(--display); font-size: 22px;
  font-weight: 700; color: var(--text-primary); font-variant-numeric: tabular-nums; }

.sb-form { list-style: none; margin: 0 0 10px; padding: 0; display: grid; gap: 6px; }
.sb-form li { display: flex; align-items: baseline; justify-content: space-between;
  gap: 12px; font-size: 14.5px; }
.sb-form b { font-weight: 600; color: var(--text-primary); }
.sb-form span { font-family: var(--display); font-size: 13.5px; font-weight: 700;
  color: var(--text-secondary); font-variant-numeric: tabular-nums; }
/* Caminho para a aba que tem o desenho, nao um botao de acao. */
.sb-ir { padding: 0; background: none; font-size: 14px; font-weight: 600;
  color: var(--accent); }
.sb-ir::after { content: ' →'; }
.sb-ir:hover { text-decoration: underline; }
/* O clique nas abas marca `.ativo` em tudo que tem data-aba. Aqui
   isso nao pode virar estado visual: e um link, nao uma aba. */
.sb-ir.ativo { color: var(--accent); }

.sb-lista { margin: 0; display: grid; gap: 8px; }
.sb-lista div { display: grid; gap: 2px; }
.sb-lista dt { font-size: 13px; color: var(--text-muted); }
.sb-lista dd { margin: 0; font-size: 14.5px; color: var(--text-primary); line-height: 1.45; }

.sb-canais { font-size: 14.5px; color: var(--text-primary); line-height: 1.5; }
.sb-local { font-size: 14.5px; display: grid; gap: 2px; }
.sb-local b { font-weight: 600; color: var(--text-primary); }
.sb-local span { font-size: 13.5px; color: var(--text-muted); }
.sb-nota { margin-top: 6px; font-size: 13px; color: var(--text-muted);
  font-variant-numeric: tabular-nums; }

/* ---------- a leitura da partida ----------
   Um bloco so, e ele tem que ter peso. Antes eram dois retangulos
   com uma barrinha fina na lateral, texto do tamanho de legenda e
   fundo igual ao de todo cartao da pagina: o diferencial do site era
   a coisa mais apagada da tela.

   O que da peso aqui: superficie propria com um veu da cor do
   momento, a marca do Lobao no rotulo e texto em tamanho de leitura,
   com medida de linha curta o bastante para ler de verdade.

   A cor diz o momento e nada mais: azul antes, vermelho ao vivo,
   verde no fim. Nao e decoracao, e o estado da partida. */
.leitura {
  --tom: var(--brand-text);
  position: relative;
  /* Tinha `max-width: 760px`. Numa coluna de 900 o bloco da leitura
     ficava 140px mais estreito que todos os outros e o alinhamento
     da direita quebrava justo no cartao mais importante da tela. A
     medida de leitura confortavel ja vem do tamanho do texto. */
  margin-bottom: var(--space-5);
  padding: var(--space-3) var(--space-4) var(--space-4);
  border-radius: var(--radius-lg);
  border: 1px solid var(--border-subtle);
  /* Uma tinta fria de 4% atrás do texto do Lobão. Não é gradiente
     decorativo: é o que separa o que NÓS escrevemos do que a API
     entregou, sem precisar de moldura. */
  background:
    linear-gradient(150deg, color-mix(in srgb, var(--tom) 7%, transparent), transparent 46%),
    var(--surface-1);
}
/* O rótulo volta a ser azul da marca. É o único lugar da home e da
   partida onde o texto é escrito pelo Lobão, e é exatamente o tipo de
   uso que justifica gastar a cor da marca: ela marca autoria. */
.leitura.previa { --tom: var(--brand-text); }
.leitura.ao_vivo { --tom: var(--live); }
.leitura.full_time { --tom: var(--success); }

/* A analise trancada. O degrade sobre o fim da isca e ENFEITE: o
   resto do texto nem chega neste navegador, porque `analise_trancada`
   corta no banco. Nao ha nada escondido embaixo para achar no
   inspetor, que e a diferenca entre paywall e cortina. */
.leitura.trancada .tr-isca { position: relative; margin-bottom: 0; }
.leitura.trancada .tr-isca::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 2.4em;
  background: linear-gradient(to bottom, transparent, var(--surface-1));
  pointer-events: none;
}
/* Os botoes de login social. Empilhados, largura cheia, altura igual:
   a Apple pede que o botao dela nao seja menor nem menos visivel que
   os outros, e e reprovacao de revisao se for. */
.entrar-social { display: grid; gap: 8px; margin-bottom: var(--s4); }
.entrar-social .btn { display: flex; align-items: center; justify-content: center;
  gap: 10px; }
.ic-login { width: 18px; height: 18px; flex: 0 0 auto; }

/* A fresta: o comeco do conteudo livre, cortado, com o cadeado logo
   abaixo. Mostrar a previa INTEIRA e depois cobrar faz a pessoa achar
   que ja viu o que tinha; cortada, ela vira comeco de alguma coisa.

   O degrade termina em --bg porque o corte cai no espaco entre dois
   cartoes com mais frequencia do que dentro de um. */
.tr-fresta { position: relative; max-height: 230px; overflow: hidden; }
.tr-fresta::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0;
  height: 130px; pointer-events: none;
  background: linear-gradient(to bottom, transparent, var(--bg) 82%); }

/* O painel da aba Analise trancada. Uma lista do que tem dentro, com
   o numero de cada coisa. O cadeado e pequeno de proposito: o que
   vende e a linha de texto ao lado dele, nao o icone. */
/* O envelope existe por causa de `.bloco > *:not(.bloco-tit)`, que da
   margem lateral a cada filho direto. Com o botao em `width: 100%`, a
   margem somava e ele estourava o bloco. Ver o comentario em
   `blocoAnaliseNoPro`. */
.tr-painel .tr-abre { margin: 0 0 var(--space-3); font-size: 13.5px;
  line-height: 1.5; color: var(--text-secondary); }
.tr-painel .tr-itens { list-style: none; margin: 0 0 var(--space-3); padding: 0;
  display: grid; gap: 2px; }
.tr-painel .tr-itens li { display: flex; gap: 12px; align-items: flex-start;
  padding: 12px; border-radius: 10px; background: var(--surface-2); }
.tr-cadeado { flex: 0 0 auto; width: 18px; height: 18px; margin-top: 1px;
  color: var(--text-muted); }
.tr-cadeado svg { width: 18px; height: 18px; display: block; }
.tr-painel .tr-itens span { display: grid; gap: 3px; min-width: 0; }
.tr-painel .tr-itens b { font-size: 14.5px; color: var(--text-primary); }
.tr-painel .tr-itens small { font-size: 13px; line-height: 1.45;
  color: var(--text-secondary); }

.tr-pe { display: flex; align-items: center; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; margin-top: var(--space-3); }
.tr-pe span { font-size: 13px; color: var(--text-secondary); }
.tr-pe .btn { flex: 0 0 auto; }
.tr-pe .btn:disabled { opacity: .7; cursor: default; }

.leitura-topo { display: flex; align-items: center; gap: 7px; margin-bottom: 9px; }
.leitura-topo span {
  font-family: var(--ui);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .07em;
  text-transform: uppercase;
  color: var(--tom);
}
.leitura-marca { display: grid; place-items: center; width: 17px; height: 17px;
  color: var(--tom); flex: none; }
.leitura-marca svg { width: 17px; height: 17px; display: block; }

/* Era `--font-headline`, 17px, encostado em titulos de bloco de 13px.
   A analise virava o maior texto do painel inteiro depois do placar, e
   o salto de 13 para 17 no mesmo cartao e o que fazia a escala parecer
   desigual. Isto aqui e PARAGRAFO, nao manchete: vai para o degrau de
   leitura. A entrelinha sobe um pouco para compensar o corpo menor. */
.leitura p {
  margin: 0;
  font-size: var(--font-body);
  line-height: 1.62;
  color: var(--text-primary);
}
/* "Escrita pela I.A do Lobão em 17/09, 16:12" é assinatura, não
   conteúdo. Estava no mesmo nível do texto. */
.leitura small {
  display: block;
  margin-top: 10px;
  font-size: var(--font-meta);
  color: var(--text-disabled);
}
.leitura p + p { margin-top: 8px; }
.leitura small { display: block; margin-top: 10px; font-size: 12.5px;
  color: var(--text-muted); }

/* ---------- ficha do estadio e do arbitro ----------
   Os dois primeiros cartoes da coluna da direita. Sao ficha do jogo
   que esta aberto, entao vem antes de tabela e de outros jogos, que
   sao contexto.

   Linha de rotulo a esquerda e valor a direita, com o valor em
   numero tabular: com varias linhas empilhadas, digito de largura
   variavel faz a coluna da direita tremer. */
.est { display: grid; gap: 2px; padding: 12px 14px 13px; }
.est-nome { display: grid; gap: 2px; padding-bottom: 10px; margin-bottom: 4px;
  border-bottom: 1px solid var(--border-subtle); }
.est-nome strong { font-family: var(--ui); font-size: 15px; font-weight: 700;
  line-height: 1.3; }
.est-nome small { font-size: 13px; color: var(--text-muted); }
.est-l { display: flex; align-items: baseline; justify-content: space-between;
  gap: 12px; padding: 5px 0; font-size: 13.5px; }
.est-l > span { color: var(--text-muted); }
.est-l > strong { font-weight: 600; text-align: right;
  font-variant-numeric: tabular-nums; }
.est-l > strong em { display: block; font-style: normal; font-weight: 400;
  font-size: 12.5px; color: var(--text-muted); }

.arb { display: grid; gap: 10px; padding: 12px 14px 13px; }
.arb-nome { font-family: var(--ui); font-size: 15px; font-weight: 700; }
.arb-ns { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
.arb-n { display: grid; gap: 1px; padding: 8px 6px; border-radius: 9px;
  background: var(--surface-2); text-align: center; min-width: 0; }
.arb-n strong { font-family: var(--ui); font-size: 18px; font-weight: 700;
  line-height: 1.1; font-variant-numeric: tabular-nums; }
.arb-n span { font-size: 12px; line-height: 1.25; color: var(--text-muted); }
.arb-pe { font-size: 12.5px; color: var(--text-muted); line-height: 1.4; }

/* Selo de partida sem atualizacao. Ambar, nunca vermelho: nao e erro,
   e dado velho, e a pessoa precisa entender a diferenca. */
.jc-selo.parado { color: var(--ambar); background: rgba(240, 180, 41, .12);
  font-size: 12px; letter-spacing: .01em; }

/* Aviso de fonte parada. Ambar e nao vermelho de proposito: nao e
   erro do site, e dado velho, e a diferenca importa para quem le. */
.fonte-parada { display: grid; gap: 3px; margin: 0 0 var(--s5);
  padding: 12px 15px; border-radius: var(--radius-lg);
  border: 1px solid rgba(240, 180, 41, .35);
  background: rgba(240, 180, 41, .10); }
.fonte-parada strong { font-family: var(--ui); font-size: 14.5px; font-weight: 700;
  color: var(--ambar); }
.fonte-parada span { font-size: 13.5px; line-height: 1.5; color: var(--text-secondary);
  max-width: 76ch; }

/* ---------- outras competicoes ----------
   O bloco recolhido do fim da lista. Ele existe porque o site liga
   dezenas de competicoes: sem um corte, a home de sabado teria
   trinta cabecalhos e o Brasileirao no meio deles.

   Visualmente ele e mais baixo que um grupo de liga de proposito.
   Nao tem escudo, nao tem o mesmo peso de titulo e o fundo e o da
   pagina, nao o do cartao: quem bate o olho entende que ali embaixo
   nao esta o conteudo principal. */
.outras-ligas { margin-bottom: var(--s6); }
.outras-topo {
  display: flex;
  align-items: center;
  gap: var(--s3);
  width: 100%;
  height: 48px;
  padding: 0 var(--s4);
  text-align: left;
  border: 1px dashed var(--border-subtle);
  border-radius: var(--radius-lg);
  background: transparent;
  color: var(--text-secondary);
}
.outras-topo:hover { background: var(--surface-1); border-style: solid; }
.outras-txt { display: grid; gap: 2px; min-width: 0; }
.outras-topo strong {
  font-family: var(--ui);
  font-size: var(--t-b3);
  font-weight: 600;
  color: var(--text-secondary);
}
.outras-topo:hover strong { color: var(--text-primary); }
.outras-topo small { font-size: var(--t-cap); font-weight: 500; color: var(--n40); }
.outras-topo .caret {
  margin-left: auto;
  color: var(--text-muted);
  transform: rotate(90deg);
  transition: transform var(--mola);
}
.outras-topo .caret svg { width: 16px; height: 16px; display: block; }
.outras-ligas.aberto .outras-topo .caret { transform: rotate(-90deg); }
.outras-ligas.aberto .outras-topo {
  border-bottom-left-radius: 0;
  border-bottom-right-radius: 0;
  margin-bottom: var(--s4);
}
.outras-corpo { display: none; }
.outras-ligas.aberto .outras-corpo { display: block; }
.outras-corpo .grupo-liga:last-child { margin-bottom: 0; }

.linhas {
  display: grid;
  gap: 0;
  background: var(--n80);
}

/* Linha: 56px desktop. n80 sobre n100 = 1.627:1. */
.row-jogo {
  min-height: 56px;
  padding: 0 var(--s4);
  grid-template-columns: 56px minmax(0, 1fr) 86px minmax(0, 1fr) 36px;
  gap: var(--s2);
  border-radius: 0;
  border-top: 1px solid rgba(46, 77, 112, .52);
  background: var(--n80);
  cursor: pointer;
}
.row-jogo:first-child { border-top: 0; }
.row-jogo:hover { background: var(--n70); }
.row-jogo:active { background: var(--n60); }
.row-jogo[role="button"]:focus-visible {
  position: relative;
  z-index: 2;
  outline-offset: -2px;
}
.row-jogo.compacta {
  min-height: 56px;
  background: var(--n80);
}
.row-jogo.compacta .rj-status { color: var(--n20); }
.row-jogo.compacta:hover { background: var(--n70); }

/* Ao vivo: mais contraste e peso; vermelho apenas sinaliza estado. */
.rj-status {
  min-width: 26px;
  height: 26px;
  padding: 0 6px;
  background: var(--n60);
  color: var(--n0);
  border-radius: var(--radius-pill);
  font-size: var(--t-cap);
  font-weight: 700;
}
.rj-gols {
  margin-top: var(--s2);
  padding-top: var(--s2);
  border-top: 1px solid rgba(46, 77, 112, .46);
}

/* Lateral: ritmo de lista e um unico sinal azul para a selecao. */
.menu {
  background: var(--n100);
  border-right: 1px solid rgba(46, 77, 112, .32);
}
.menu-ligas { gap: var(--s1); }
.menu-titulo {
  margin-top: var(--s5);
  padding: 0 var(--s3) var(--s2);
  color: var(--n40);
}
.menu-titulo:first-child { margin-top: 0; }
.ml {
  position: relative;
  min-height: 44px;
  padding: 6px var(--s3);
  color: var(--n20);
}
.ml:hover { color: var(--n0); }
.ml:active { background: var(--n80); }
.ml.ativo {
  box-shadow: inset 3px 0 0 var(--accent);
}
.ml.apagada { opacity: .52; }
.ml.apagada:hover { opacity: .82; }
.ml-qtd {
  min-width: 24px;
  height: 22px;
  display: grid;
  place-items: center;
  border-radius: var(--radius-pill);
  background: var(--n90);
  color: var(--n40);
}
.ml.ativo .ml-qtd { background: var(--n80); color: var(--accent); }

/* Trilho: segundo nivel, sem sombra. */
.trilho { gap: var(--s4); }
.caixa {
  padding: var(--s4);
  background: var(--n90);
  border-radius: var(--radius-lg);
}
.caixa-topo {
  font-weight: 700;
}
.destaques { gap: var(--s2); }
.destaque {
  min-height: 64px;
  padding: var(--s3);
  background: var(--n80);
  border-radius: var(--radius-md);
}
.destaque:hover { background: var(--n70); }
.destaque:active { background: var(--n60); }
.trilho-liga {
  height: 34px;
  background: var(--n80);
  color: var(--n0);
}
.trilho-liga:hover { background: var(--n70); }
.caixa-pe:hover { color: var(--accent-hover); }
.caixa-pe:active { color: var(--n0); }

/* Topo e filtros. */
.topo-nav .mi:hover { background: var(--n90); }
.topo-nav .mi:active { background: var(--n80); }
.ic-topo:active { background: var(--n70); }
.busca:focus-within { box-shadow: inset 0 0 0 2px var(--accent); }
.data:hover:not(:disabled),
.data-seta:hover:not(:disabled),
.data-atalho:hover:not(:disabled) { background: var(--n90); }
.data:active:not(:disabled),
.data-seta:active:not(:disabled),
.data-atalho:active:not(:disabled) { background: var(--n80); }

/* Diagnostico de deploy. */
/* ============================================================
   rodape
   ============================================================
   Fecha a pagina e serve de mapa: colunas de competicao, jogos da
   semana e navegacao. Quem cai numa pagina de jogo pela busca do
   Google tem por onde continuar. */

.rodape {
  display: grid;
  gap: var(--s6);
  margin-top: var(--s8);
  padding: var(--s7) 0 var(--s9);
  border-top: 1px solid var(--border-subtle);
  color: var(--text-muted);
  font-size: 14px;
}
.rodape-grade {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
  gap: var(--s6) var(--s5);
  align-items: start;
}
.rodape-sobre { max-width: 560px; }
.rodape-sobre h2 {
  margin: 0 0 var(--s3);
  font-family: var(--display);
  font-size: 16px;
  font-weight: 700;
  letter-spacing: .05em;
  color: var(--text-primary);
}
.rodape-sobre p { margin: 0 0 var(--s3); line-height: 1.6; color: var(--text-secondary); }
.rodape-sobre p:last-child { margin-bottom: 0; }
.rodape-fonte { color: var(--text-muted); font-size: 13px; }

.rodape-col { display: grid; justify-items: start; gap: 2px; min-width: 0; }
.rodape-col h3 {
  margin: 0 0 var(--s2);
  font-family: var(--display);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: .01em;
  color: var(--text-primary);
}
/* <a> e <button> lado a lado: o rodape virou link de verdade para o
   robo de busca conseguir seguir, e o desenho nao pode mudar. */
.rodape-col button,
.rodape-col a {
  display: block;
  text-decoration: none;
  width: 100%;
  padding: 5px 0;
  border: 0;
  background: none;
  color: var(--text-secondary);
  font-family: inherit;
  font-size: 13.5px;
  line-height: 1.35;
  text-align: left;
  cursor: pointer;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  transition: color var(--mola);
}
.rodape-col button:hover,
.rodape-col a:hover { color: var(--accent); }
.rodape-col button:focus-visible,
.rodape-col a:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 3px; }

.rodape-fim {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s2) var(--s4);
  padding-top: var(--s4);
  border-top: 1px solid var(--border-subtle);
  font-size: 13px;
}
.rodape-logo { height: 26px; width: auto; }
.versao-carimbo { margin-left: auto; }

/* ============================================================
   ajustes finais (consultas de recurso por ultimo, regra 5)
   ============================================================ */

/* o botao de conta voltou a ser redondo: agora e icone, nao palavra */
.ic-topo.perfil { width: 44px; padding: 0; border-radius: 50%; }
.ic-topo.perfil.logado { color: var(--accent); box-shadow: inset 0 0 0 2px var(--accent); }

/* trilho: os blocos estavam encavalando porque cada um tinha margem
   propria e o container nao tinha espacamento. Agora quem espaca e o
   container, uma vez so. */
.trilho { display: flex; flex-direction: column; gap: var(--s5); align-content: start; }
.trilho > * { margin: 0; flex: none; }
.trilho .caixa, .trilho .banner { width: 100%; box-shadow: var(--e1); }
.trilho .banner-imagem img { display: block; width: 100%; height: auto; border-radius: var(--radius-lg); }

/* ============================================================
   pagina da partida :: blocos
   ============================================================
   A reclamacao era "tudo azul, pobre visualmente, sem contraste".
   A causa: o conteudo das abas ficava solto sobre o fundo, sem
   superficie propria. O kit ScoreSpot separa cartao de fundo em
   1,65:1; e essa a razao de --n90 existir. Agora todo bloco da
   partida assenta numa superficie com titulo, borda superior de
   acento e sombra do kit. */

.bloco {
  background: var(--surface-1);
  border-radius: var(--radius-lg);
  padding: var(--s4) var(--s4) var(--s3);
  margin-bottom: var(--s4);
  box-shadow: var(--e1);
  position: relative;
  overflow: hidden;
}
/* Idem no cartao: o cartao se define pela borda e pelo espaco. */
.bloco-pe {
  line-height: 1.5;
}
.aviso-aba {
  margin-bottom: var(--s4);
  padding: var(--s3) var(--s4);
  border-radius: var(--radius-lg);
  background: var(--accent-soft);
  box-shadow: inset 3px 0 0 var(--accent);
  font-size: 14px;
  color: var(--text-secondary);
}

/* data, hora, competicao, estadio e arbitro */
.info-jogo {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(212px, 1fr));
  gap: var(--s3);
  margin-bottom: var(--s4);
}
.info-item {
  display: flex;
  align-items: center;
  box-shadow: var(--e1);
}
.info-ico {
  display: grid;
  place-items: center;
  flex: none;
  border-radius: var(--radius-md);
  color: var(--accent);
}
.info-txt { min-width: 0; }
.info-txt span {
  display: block;
  font-size: 12px;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--text-muted);
}
.info-txt strong {
  display: block;
  margin-top: 3px;
  font-family: var(--semi);
  font-weight: 600;
  line-height: 1.3;
  color: var(--text-primary);
}

/* enquete "quem vence?" */
.votos { display: grid; gap: var(--s2); }
.votos.enviando { opacity: .55; pointer-events: none; }
.voto {
  position: relative;
  display: flex;
  align-items: center;
  gap: var(--s3);
  padding: 0 var(--s3);
  border: 0;
  border-radius: var(--radius-md);
  background: var(--surface-2);
  color: var(--text-secondary);
  font-family: inherit;
  font-size: 15px;
  cursor: pointer;
  overflow: hidden;
  transition: background var(--mola), color var(--mola);
}
.voto-barra {
  position: absolute;
  inset: 0 auto 0 0;
  background: rgba(46, 111, 224, .22);
  transition: width var(--mola);
}
.voto-rotulo,
.voto-pct { position: relative; }
.voto-rotulo {
  flex: 1;
  text-align: left;
  font-family: var(--semi);
  font-weight: 600;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.voto-pct { font-variant-numeric: tabular-nums; font-weight: 700; color: var(--text-primary); }
.voto.meu { color: var(--text-primary); box-shadow: inset 0 0 0 2px var(--accent); }
.voto.meu .voto-barra { background: rgba(46, 111, 224, .34); }

/* os dois times na tabela, antes do jogo */
.classif-duelo { display: grid; gap: var(--s2); }
.cd-time {
  display: flex;
  align-items: center;
  gap: var(--s3);
  padding: 0 var(--s3);
  border-radius: var(--radius-md);
  background: var(--surface-2);
  font-size: 15px;
}
.cd-time img { width: 22px; height: 22px; object-fit: contain; }
.cd-pos {
  min-width: 30px;
  font-family: var(--display);
  font-size: 17px;
  font-weight: 800;
  color: var(--accent);
  font-variant-numeric: tabular-nums;
}
.cd-nome {
  flex: 1;
  font-family: var(--semi);
  font-weight: 600;
  color: var(--text-primary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.cd-num { color: var(--text-secondary); font-variant-numeric: tabular-nums; font-size: 14px; }
.cd-num b { color: var(--text-primary); font-family: var(--display); font-size: 16px; }
.cd-vazio { color: var(--text-muted); font-size: 14px; }

/* como chegam: duas colunas. Os elencos inscritos sairam daqui: agora
   e um time de cada vez, com aba, igual ao banco de reservas. */
.como-chegam {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: var(--s4);
}
.cc-col, .el-col { min-width: 0; }
/* O cartao do elenco ja e o `.bancos`; o `.elencos` so o segura. */
.elencos .bancos { margin-top: 0; }
.cc-cab {
  display: flex;
  align-items: center;
  gap: var(--s2);
  padding-bottom: var(--s2);
  margin-bottom: var(--s2);
  border-bottom: 1px solid var(--border-subtle);
}
.cc-cab img { width: 22px; height: 22px; object-fit: contain; }
.cc-cab strong { font-family: var(--semi); font-size: 15px; }
.el-tec { font-size: 13px; color: var(--text-muted); margin-bottom: var(--s3); }
.cc-jogo {
  display: flex;
  align-items: center;
  gap: var(--s3);
  border-bottom: 1px solid var(--border-subtle);
}
.cc-adv { flex: 1; color: var(--text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cc-placar { font-family: var(--display); font-variant-numeric: tabular-nums; color: var(--text-primary); }

/* selo de resultado, usado no H2H e em "como chegam" */
.cc-res,
.seq-p {
  display: grid;
  place-items: center;
  flex: none;
  width: 22px;
  height: 22px;
  border-radius: var(--radius-sm);
  font-family: var(--display);
  font-size: 12px;
  font-weight: 800;
  color: var(--n100);
}
.r-V, .s-V { background: var(--success); }
.r-E, .s-E { background: var(--n40); }
.r-D, .s-D { background: var(--danger); color: var(--n0); }

/* ---------- elenco por posicao ----------
   Trinta e cinco linhas de nome, sem foto, sem fio entre uma e outra,
   com o numero e a idade no mesmo cinza do nome. Lado a lado com o
   outro time e sem nada separando as duas colunas, os dois elencos
   liam como uma lista so. Os consertos: uma foto por linha (o dado ja
   vinha da API e nao estava sendo usado), um fio entre as linhas, e
   -- o que resolveu de vez -- so um time na tela por vez. A divisoria
   entre colunas saiu junto com as colunas. */
.el-grupo { margin-bottom: var(--s4); }
.el-rot {
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--text-secondary);
  margin-bottom: var(--s1);
  padding: 0 var(--s2) 5px;
  border-bottom: 1px solid var(--border-subtle);
}
.el-jog {
  display: flex;
  align-items: center;
  gap: var(--s3);
  width: 100%;
  padding: 5px var(--s2);
  border: 0;
  border-bottom: 1px solid rgba(255, 255, 255, .045);
  border-radius: 0;
  background: transparent;
  color: var(--text-primary);
  font-family: inherit;
  cursor: pointer;
  text-align: left;
  transition: background var(--mola);
}
.el-grupo .el-jog:last-child { border-bottom: 0; }
/* O numero da camisa e identidade, entao ganha caixa propria e peso.
   Antes era um cinza igual ao da idade, no comeco da linha: lia como
   ruido antes do nome. */
.el-num {
  flex: none;
  display: grid;
  place-items: center;
  min-width: 24px;
  height: 20px;
  border-radius: 5px;
  background: rgba(255, 255, 255, .05);
  color: var(--text-secondary);
  font-variant-numeric: tabular-nums;
  font-size: 12.5px;
  font-weight: 700;
}
.el-foto, .el-jog .avatar-fallback {
  flex: none;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  object-fit: cover;
  background: var(--surface-2);
}
.el-jog .avatar-fallback { display: grid; place-items: center; font-size: 12px; }
.el-nome { flex: 1; min-width: 0; font-size: 14.5px; font-weight: 500;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.el-idade { flex: none; color: var(--text-muted); font-size: 12.5px;
  font-variant-numeric: tabular-nums; }

/* grafico de gols por faixa de 15 minutos */
.faixas {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: var(--s2);
  align-items: end;
  min-height: 132px;
}
.fx { display: grid; gap: var(--s1); justify-items: center; }
.fx-barras {
  display: flex;
  align-items: flex-end;
  justify-content: center;
  gap: 3px;
  width: 100%;
  height: 88px;
}
.fx-barras span {
  width: 12px;
  min-height: 3px;
  border-radius: 3px 3px 0 0;
}
.fx-a { background: var(--accent); }
.fx-b { background: var(--roxo); }
.fx-num {
  display: flex;
  gap: 6px;
  font-size: 12px;
  font-variant-numeric: tabular-nums;
  color: var(--text-secondary);
}
.fx-num b:first-child { color: var(--accent); }
.fx-rot { font-size: 12px; color: var(--text-muted); }
.legenda i.pt-a { background: var(--accent); width: 10px; height: 10px; border-radius: 50%; }
.legenda i.pt-b { background: var(--roxo); width: 10px; height: 10px; border-radius: 50%; }

/* formacao mais usada */
.temp-form {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: var(--s3);
  margin-bottom: var(--s4);
  padding: var(--s3);
  border-radius: var(--radius-md);
  background: var(--surface-2);
}
.temp-form span { font-family: var(--display); font-size: 21px; font-weight: 800; text-align: center; }
.temp-form em { font-style: normal; font-size: 12px; letter-spacing: .06em; text-transform: uppercase; color: var(--text-muted); }

/* jogadores em destaque, com grafico */
.dest-lista {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: var(--s3);
}
.dest {
  border-radius: var(--radius-lg);
  background: var(--surface-2);
}
.dest-topo { display: flex; align-items: center; gap: var(--s3); margin-bottom: var(--s3); }
.dest-foto,
.dest .avatar-fallback {
  border-radius: 50%;
  object-fit: cover;
  background: var(--surface-1);
  flex: none;
}
.dest-id { min-width: 0; flex: 1; }
.dest-nome {
  display: block;
  padding: 0;
  border: 0;
  background: none;
  color: var(--text-primary);
  font-family: var(--semi);
  font-size: 15px;
  font-weight: 600;
  cursor: pointer;
  text-align: left;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.dest-sub { display: block; font-size: 12.5px; color: var(--text-muted); }
.dest-grafico { display: grid; }
.dg-linha { display: grid; align-items: center; gap: var(--s2); }
.dg-rot { font-size: 12px; color: var(--text-secondary); }
.dg-trilho { height: 6px; border-radius: 3px; background: var(--n100); overflow: hidden; }
.dg-barra { display: block; height: 100%; border-radius: 3px; background: var(--accent); }
.dg-val { font-size: 13px; text-align: right; font-variant-numeric: tabular-nums; }
.dest-pe { margin-top: var(--s3); font-size: 12px; color: var(--text-muted); }

/* H2H: padrao do confronto */
/* Duas colunas fixas, nao `auto-fit`.
   Com `auto-fit` o numero de colunas dependia da largura e, a 390px,
   davam duas -- e os cartoes eram sete. O setimo ficava sozinho na
   ultima fileira, com metade da largura, encostado na esquerda. Agora
   sao seis cartoes e a grade e declarada: 2x3 no celular, 3x2 no
   computador (na media la embaixo). Nenhum numero impar fecha torto. */
.h2h-cards {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--s2);
}
.h2h-card {
  display: grid;
  grid-template-rows: auto auto auto;
  gap: 2px;
}
/* Duas linhas reservadas para o rotulo.
   "AMBOS MARCARAM" quebra em duas e "MEDIA DE GOLS" nao, e ai o 40%
   de um cartao ficava 16px abaixo do 4,00 do vizinho. Sao numeros que
   existem para ser comparados de relance: eles tem que estar na mesma
   altura. */
.hc-rot { font-size: 12px; letter-spacing: .06em; text-transform: uppercase;
  color: var(--text-muted); line-height: 1.3; min-height: 2.6em; }
.hc-val { font-family: var(--display); font-weight: 800; line-height: 1.1; }
.hc-pe { font-size: 12.5px; color: var(--text-secondary); }

/* OS SELOS DAS DUAS LINHAS NO MESMO x.
   Eram duas linhas flex independentes: os selos comecavam onde o nome
   do time terminasse, e "Bournemouth" e 13px mais largo que
   "Liverpool". As duas sequencias existem para ser lidas UMA EMBAIXO
   DA OUTRA, jogo a jogo, e sairam desencontradas. Uma grade so para
   as quatro celulas resolve: a coluna do nome tem a largura do maior
   dos dois, e os dois blocos de selos comecam no mesmo ponto. */
.seq-duplo { display: grid; grid-template-columns: minmax(0, max-content) 1fr;
  align-items: center; gap: var(--s2) var(--s3); }
.seq-quem { font-family: var(--semi); font-size: 15px; font-weight: 600;
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.seq-selos { display: flex; gap: var(--s1); }

.mando { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--s3); }
.mando-lado {
  display: grid;
  justify-items: center;
  gap: var(--s1);
  padding: var(--s3);
  border-radius: var(--radius-md);
  background: var(--surface-2);
  text-align: center;
}
.mando-lado img { width: 32px; height: 32px; object-fit: contain; }
.mando-lado strong { font-family: var(--display); font-weight: 800; line-height: 1; }
.mando-lado span { font-size: 12.5px; color: var(--text-secondary); line-height: 1.4; }

.confronto-jogo { flex: 1; min-width: 0; }
/* O MESMO ARRANJO DA OUTRA LISTA: nome, placar, nome, em tres faixas,
   com a data por cima e o resultado e a seta nas pontas.
   Era tudo numa linha so, e num celular "Bournemouth 3-2 Liverpool"
   nao cabia: quebrava no meio da frase e deixava o placar perdido no
   fim da primeira linha. Em tres faixas numa linha so ele nao quebra,
   mas os dois nomes ficam com 90px cada e viram "Bourn..." e
   "Liver...". A data sobe, o meio fica com a faixa inteira, e os dois
   nomes cabem inteiros com o placar no centro de toda linha.
   A regra e presa a `.confrontos-lista` porque `.confronto` tambem e
   a linha generica das listas do painel do admin, que nao tem duelo
   nenhum dentro. */
.confrontos-lista .confronto {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  column-gap: 10px;
  row-gap: 1px;
  padding: 7px 0;
}
/* Cada peca no seu lugar DECLARADO. Sem `grid-column`, a seta caia na
   coluna do meio e ficava por cima da data. */
.confrontos-lista .confronto > .seq-p { grid-area: 1 / 1; }
.confrontos-lista .confronto-seta { grid-area: 1 / 3; margin-left: 0; }
.confrontos-lista .confronto-data { grid-area: 1 / 2; min-width: 0;
  text-align: center; font-size: 12px; }
/* O duelo ocupa a fileira inteira, das duas pontas.
   Preso a coluna do meio ele tinha 220px dos 262 da linha, e sobravam
   88px por nome: "Bournemouth" pede 102 e virava "Bournemou...". Na
   largura toda cabem 109 de cada lado. */
.confrontos-lista .confronto-jogo { grid-area: 2 / 1 / 3 / 4; display: grid;
  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
  align-items: baseline; gap: 7px; text-align: center; }
.confrontos-lista .confronto-jogo i { font-style: normal; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.confrontos-lista .confronto-jogo i:first-of-type { text-align: right; }
.confrontos-lista .confronto-jogo i:last-of-type { text-align: left; }

/* ============================================================
   classificacao :: grupos e mata-mata
   ============================================================ */

/* ============================================================
   Politica de privacidade
   ============================================================
   Coluna estreita e texto grande. E a unica pagina do site feita
   para ser LIDA de cima a baixo, e nao consultada de relance: as
   medidas aqui vem da leitura confortavel (cerca de 70 caracteres
   por linha), nao da grade do resto do site. */
.pv { max-width: 720px; margin: 0 auto; padding: var(--s5) 0 var(--s7); }
.pv-topo { margin-bottom: var(--s6); }
.pv h1 { font-size: 30px; margin: 0 0 var(--s3); }
.pv-sub { font-size: 16px; line-height: 1.6; color: var(--text-secondary);
  margin: 0 0 var(--s3); }
.pv-data { font-size: 13px; color: var(--text-muted); margin: 0; }
.pv-secao { margin-bottom: var(--s6); }
.pv-secao h2 { font-size: 19px; margin: 0 0 var(--s3);
  padding-bottom: var(--s2); border-bottom: 1px solid var(--aresta); }
.pv p { font-size: 15px; line-height: 1.65; color: var(--text-secondary);
  margin: 0 0 var(--s3); }
.pv b { color: var(--text-primary); }
.pv a { color: var(--brand-text); }
.pv-lista { margin: 0 0 var(--s3); padding-left: 20px; }
.pv-lista li { font-size: 15px; line-height: 1.65; color: var(--text-secondary);
  margin-bottom: var(--s2); }
/* A ressalva sobre logs de IP. Recuada e com barra: e a unica parte
   da pagina que diz "isto foge do nosso controle", e misturada ao
   resto ela passaria batida. */
.pv-nota { border-left: 3px solid var(--aresta); padding-left: var(--s3);
  font-size: 14px; }
.pv-tabela { width: 100%; border-collapse: collapse; margin: 0 0 var(--s3);
  font-size: 14.5px; }
.pv-tabela th { text-align: left; padding: var(--s2) var(--s3);
  font-size: 12px; text-transform: uppercase; letter-spacing: .05em;
  color: var(--text-muted); border-bottom: 1px solid var(--aresta); }
.pv-tabela td { padding: var(--s3); vertical-align: top;
  color: var(--text-secondary); border-bottom: 1px solid var(--aresta); }
.pv-tabela td:first-child { color: var(--text-primary); font-weight: 600; }
.pv-pe { margin-top: var(--s6); padding-top: var(--s4);
  border-top: 1px solid var(--aresta); }

.tab-nota { margin: 0 0 var(--s4); font-size: 14px; color: var(--text-secondary); }
/* O selo de tabela ao vivo. Mesma cor do minuto no placar, de
   proposito: e a mesma informacao ("isto esta mexendo agora") e usar
   duas cores para ela faria a pessoa procurar uma diferenca que nao
   existe. */
.tab-vivo { display: inline-flex; align-items: center; gap: 5px;
  margin-right: 6px; padding: 2px 7px; border-radius: 999px;
  background: color-mix(in srgb, var(--live) 16%, transparent);
  color: var(--live); font-family: var(--ui); font-size: 12px;
  font-weight: 700; text-transform: uppercase; letter-spacing: .04em;
  vertical-align: middle; }
.tab-vivo i { width: 6px; height: 6px; border-radius: 50%;
  background: currentColor; animation: pulso-live 1.6s ease-in-out infinite; }
.grupos, .chaves { display: grid; gap: var(--s5); }
.grupo-bloco, .chave-fase {
  background: var(--surface-1);
  border-radius: var(--radius-lg);
  box-shadow: var(--e1);
}
.grupo-tit {
  margin: 0 0 var(--s3);
  font-family: var(--display);
  font-size: 16px;
  font-weight: 700;
  letter-spacing: .01em;
  color: var(--accent);
}
.tab-linha.no-jogo,
.mini-linha.no-jogo { background: var(--accent-soft); }
/* As duas regras que estavam aqui estilizavam a forma recente DENTRO
   da celula do nome. Essa combinacao nao existe mais na marcacao
   desde que a forma virou coluna: ali dentro ela roubava a largura e
   o time virava "F...". Ficaram orfas e sairam. */

.chave-jogo {
  display: grid;
  gap: var(--s1);
  width: 100%;
  border: 0;
  border-radius: var(--radius-md);
  background: var(--surface-2);
  color: var(--text-primary);
  font-family: inherit;
  cursor: pointer;
  text-align: left;
  transition: background var(--mola);
}
.chave-jogo.meu { box-shadow: inset 0 0 0 2px var(--accent); }
.ch-quando { font-size: 12.5px; color: var(--text-muted); font-variant-numeric: tabular-nums; }
.ch-lado { display: flex; align-items: center; gap: var(--s2); font-size: 15px; color: var(--text-secondary); }
.ch-lado img { width: 20px; height: 20px; object-fit: contain; }
.ch-lado b { flex: 1; font-family: var(--semi); font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ch-lado em { font-style: normal; font-family: var(--display); font-size: 18px; font-weight: 800; font-variant-numeric: tabular-nums; }
/* quem passou fica cheio; o outro recua. Sem isso as duas linhas do
   confronto tem o mesmo peso e nao se le quem avancou. */
.chave-jogo .ch-lado { opacity: .62; }
.chave-jogo .ch-lado:only-of-type,
.ch-lado.passou { opacity: 1; color: var(--text-primary); }
.ch-lado.passou b { color: var(--n0); }
.ch-lado.passou em { color: var(--accent); }
.chave-jogo:not(:has(.passou)) .ch-lado { opacity: 1; }

/* lateral sem competicoes nao mostra o titulo sozinho */
.menu.vazia .menu-titulo { display: none; }

/* faixas: barras mais largas quando ha espaco */
.fx-barras span { flex: 1 1 auto; max-width: 22px; }

/* a ficha deixou de ser lista corrida e virou blocos por assunto */
.ficha { max-width: none; }
.ficha div:last-child { border-bottom: 0; }/* ============================================================
   o espaco morto da linha de jogo
   ============================================================
   No desktop a linha tem quase 800px e os dois nomes ficavam
   grudados no placar, no meio, com um vazio de cada lado. Em vez de
   apertar a linha, o vazio recebe informacao que ja existe na base:
   data e hora a esquerda, estadio a direita. No celular os dois
   somem, porque la nao sobra espaco nenhum. */

/* ============================================================
   o espaco morto da linha de jogo
   ============================================================
   No desktop a linha tem quase 800px e os dois nomes ficavam
   grudados no placar, no meio, com um vazio de cada lado. Em vez de
   apertar a linha, o vazio recebe informacao que ja existe na base:
   data e hora a esquerda, estadio a direita. No celular os dois
   somem { display: none; font-size: 12px; color: var(--text-muted); font-variant-numeric: tabular-nums; }

/* ============================================================
   nome do time: curto no celular, inteiro no desktop
   ============================================================
   A linha de jogo mostrava "FLA x PAL" tambem no desktop, e sobrava
   um vazio enorme dos dois lados do placar. O nome inteiro ocupa o
   espaco que ja existia e diz mais. */

.n-longo { display: none; }
.n-curto { font-weight: inherit; }

/* ============================================================
   home :: recortes da semana
   ============================================================ */

.caixa-nota { margin: 9px 0 0; font-size: 12px; line-height: 1.45; color: var(--text-muted); }

/* jogador da semana */
.jds {
  display: flex;
  align-items: center;
  gap: var(--s3);
  width: 100%;
  padding: 10px;
  border: 0;
  border-radius: var(--radius-lg);
  background: var(--surface-2);
  color: var(--text-primary);
  font-family: inherit;
  cursor: pointer;
  text-align: left;
  transition: background var(--mola);
}
.jds-foto {
  width: 46px;
  height: 46px;
  border-radius: 50%;
  object-fit: cover;
  background: var(--surface-1);
  flex: none;
}
.jds-txt { display: grid; gap: 1px; min-width: 0; flex: 1; }
.jds-txt b {
  font-family: var(--semi);
  font-size: 15px;
  font-weight: 700;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* O cartao leva a PARTIDA e o nome leva a ficha do jogador: dois
   destinos no mesmo cartao, entao o nome precisa dizer que e
   clicavel por conta propria. Sublinhado so no hover, para nao
   virar um link azul no meio de um cartao que ja e um botao. */
.jds-nome-lnk { cursor: pointer; }
.jds-nome-lnk:hover { text-decoration: underline; text-underline-offset: 2px; }
.jds-nome-lnk:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px;
  border-radius: 3px; }
.jds-txt em { font-style: normal; font-size: 12.5px; color: var(--text-secondary); }
.jds-txt i { font-style: normal; font-size: 12px; color: var(--text-muted); }
.jds .nota,
.jds-linha .nota {
  font-family: var(--display);
  font-size: 20px;
  font-weight: 800;
  font-variant-numeric: tabular-nums;
  flex: none;
}
.jds-resto { display: grid; margin-top: var(--s2); }
.jds-linha {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto 34px;
  align-items: center;
  gap: var(--s2);
  height: 32px;
  padding: 0 10px;
  border: 0;
  border-top: 1px solid var(--border-subtle);
  background: transparent;
  color: var(--text-primary);
  font-family: inherit;
  font-size: 14px;
  cursor: pointer;
  text-align: left;
  transition: background var(--mola);
}
.jds-linha .nota { font-size: 15px; text-align: right; }
.jds-nome { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.jds-time { font-size: 12.5px; color: var(--text-muted); }

/* melhores jogos e grandes jogos */
.mjs { display: grid; gap: 6px; }
.mjs-jogo {
  display: grid;
  gap: 3px;
  width: 100%;
  padding: 9px 10px;
  border: 0;
  border-radius: var(--radius-md);
  background: var(--surface-2);
  color: var(--text-primary);
  font-family: inherit;
  cursor: pointer;
  text-align: left;
  transition: background var(--mola);
}
.mjs-liga { font-size: 12px; letter-spacing: .04em; text-transform: uppercase; color: var(--text-muted); }
.mjs-duelo {
  display: grid;
  grid-template-columns: 18px minmax(0, 1fr) auto minmax(0, 1fr) 18px;
  align-items: center;
  gap: 6px;
  font-size: 14px;
}
.mjs-duelo img { width: 18px; height: 18px; object-fit: contain; }
.mjs-duelo b {
  font-family: var(--semi);
  font-weight: 600;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.mjs-duelo b:last-of-type { text-align: right; }
.mjs-duelo em {
  font-style: normal;
  font-family: var(--display);
  font-size: 16px;
  font-weight: 800;
  font-variant-numeric: tabular-nums;
  padding: 0 4px;
}
.mjs-pos { font-size: 13px; font-weight: 700; color: var(--text-muted); }
.mjs-porque { font-size: 12px; color: var(--accent); }

/* ============================================================
   busca
   ============================================================
   A barra de topo tinha overflow: hidden. A caixa de sugestoes e
   filha dela e fica posicionada ABAIXO da barra, entao era cortada
   fora e nunca aparecia na tela. Era esse o motivo de digitar
   "flamengo" nao mostrar sugestao nenhuma.

   O overflow existia para o logo nao vazar. Agora quem segura o
   logo e o proprio logo, e a barra deixa a caixa passar. */

.topo { overflow: visible; }
.topo-marca { overflow: hidden; }
.busca-caixa { z-index: 60; }

/* historico de busca */
.busca-hist { display: flex; align-items: center; gap: var(--s2); padding: 8px 12px 4px; }
.busca-hist span {
  flex: 1;
  font-size: 12.5px;
  font-weight: 600;
  letter-spacing: .07em;
  text-transform: uppercase;
  color: var(--text-muted);
}
.busca-limpar {
  border: 0;
  background: none;
  color: var(--accent);
  font-family: inherit;
  font-size: 12.5px;
  cursor: pointer;
  padding: 2px 4px;
}
.busca-item .hist-ic { color: var(--text-muted); display: grid; place-items: center; width: 26px; flex: none; }
.busca-item .hist-ic svg { width: 15px; height: 15px; }

/* A linha de "perguntar ao Lobão" dentro da caixa de busca. Ela e a
   unica linha da caixa que nao leva a uma pagina: leva a uma
   consulta que custa. Por isso e a unica com cor de destaque. */
.busca-ia { border-bottom: 1px solid var(--border-subtle); }
.busca-ia .hist-ic { color: var(--accent); }
.busca-ia span b { font-weight: 600; color: var(--text-primary); }
.busca-ia em { color: var(--accent); font-style: normal; font-size: 12px;
  font-weight: 600; letter-spacing: .03em; }

/* ============================================================
   linguagem de cor
   ============================================================
   Antes o site inteiro era azul: ao vivo, encerrado e futuro
   tinham o mesmo peso e a mesma cor, e o olho nao separava um do
   outro. O SofaScore resolve isso com tres estados de cor, e e
   isso que esta aqui.

     ao vivo    minuto e placar em VERMELHO, ponto pulsando
     encerrado  quem perdeu recua, quem ganhou fica branco
     futuro     hora em cinza claro, nomes normais

   Detalhe medido: o vermelho da marca (#EB2444) sobre a linha
   (#213A56) da 2,70:1. Isso e pouco para texto. Por isso existe
   um vermelho SO PARA TEXTO, #FF5C78, que da 3,91:1 na linha e
   6,63:1 no fundo. O #EB2444 continua sendo a cor da marca em
   tarja, disco e barra, onde o texto e branco por cima. */

/* --- ao vivo --- */
.rj-status.vivo {
  background: transparent;
  color: var(--live);
  padding: 0 0 0 12px;
  min-width: 0;
  font-size: 14px;
  font-weight: 800;
  position: relative;
}
.rj-status.vivo::before {
  content: '';
  position: absolute;
  left: 0;
  top: 50%;
  width: 6px;
  height: 6px;
  margin-top: -3px;
  border-radius: 50%;
  background: var(--live);
}
.row-jogo.ao-vivo .rj-placar,
.row-jogo.ao-vivo .rj-placar span { color: var(--live); font-weight: 800; }
.row-jogo.ao-vivo .rj-placar em { color: var(--live); opacity: .5; }
.row-jogo.ao-vivo::before { display: block !important; background: var(--live); }
.rj-placar .perdeu { color: var(--perdeu); }
.row-jogo.compacta .rj-placar { color: var(--ganhou); }
.rj-status:not(.vivo) { background: transparent; color: var(--perdeu); padding: 0; min-width: 0; font-size: 13px; font-weight: 600; }

/* --- cabecalho da secao ao vivo --- */

/* --- estados nas outras telas --- */
/* ------------------------------------------------------------
   PLACAR NAO E ESTADO.
   ------------------------------------------------------------
   O placar do cabecalho vinha vermelho enquanto o jogo rolava, e
   o dono do produto disse o obvio: "placar vermelho
   desnecessario". Esta certo. O numero e o mesmo numero antes,
   durante e depois -- 2 a 0 no intervalo e 2 a 0 no fim. O que
   muda com o jogo em andamento nao e o placar, e o ESTADO, e
   quem diz isso ja e a bolinha vermelha com o minuto do lado.
   Pintar o numero de vermelho repete a mesma informacao no
   elemento mais importante da tela e tira dele o contraste de
   texto principal, que e o que ele precisa ter.

   Mesma regra da lista da home (secao 4472): vermelho e ponto e
   legenda, nunca tinta em cima do conteudo. */
.jl-hora.vivo { color: var(--live); }
.jt-placar.vivo { color: var(--text-primary); }
.duelo-placar,
.cabeca.ao-vivo .duelo-placar { color: var(--text-primary); }

/* O estado ao vivo perde a pastilha vermelha e vira o que ja e em
   todo o resto do site: ponto que pulsa + palavra. A caixinha
   neutra continua, porque "Fim" e "Adiado" tambem a tem e o
   estado precisa ocupar o mesmo lugar nos tres casos -- se so o
   ao vivo perdesse a caixa, o cabecalho pularia de altura quando
   o jogo acabasse. */
/* O fundo cinza da caixinha derruba o vermelho para 4,34:1. A
   GEOMETRIA continua (o padding e que segura a altura entre "17'",
   "Fim" e "Adiado"); o que sai e so a tinta, e o ao vivo passa a ser
   o unico estado sem caixa, que e o destaque que ele merece. O
   celular ja fazia exatamente isto. */
.duelo-estado.vivo { color: var(--live); font-weight: 700;
  background: none; }
.duelo-estado.vivo::before {
  content: '';
  display: inline-block;
  width: 6px; height: 6px;
  margin-right: 6px;
  border-radius: 50%;
  background: var(--live);
  vertical-align: middle;
  position: relative;
  top: -1px;
}
.dq-vivo { color: var(--live); }
.mini-linha.no-jogo, .tab-linha.no-jogo { box-shadow: inset 3px 0 0 var(--accent); }

/* --- a cor diz o resultado tambem nas listas --- */
.seq-p.s-V, .cc-res.r-V { background: var(--success); color: #06210F; }
.seq-p.s-E, .cc-res.r-E { background: var(--n60); color: var(--n0); }
.seq-p.s-D, .cc-res.r-D { background: var(--live); color: #FFFFFF; }
.zona.liber { background: var(--accent); }
.zona.liber-pre { background: var(--success); }
.zona.sula { background: var(--warning); }
.zona.z4 { background: var(--live); }
.legenda i.liber { background: var(--accent); }
.legenda i.liber-pre { background: var(--success); }
.legenda i.sula { background: var(--warning); }
.legenda i.z4 { background: var(--live); }

/* ============================================================
   onde assistir
   ============================================================ */

.oa-lista { display: grid; gap: var(--s2); }
.oa-canal {
  display: flex;
  align-items: center;
  gap: var(--s3);
  flex-wrap: wrap;
  padding: 10px var(--s3);
  border-radius: var(--radius-md);
  background: var(--surface-2);
}
.oa-canal img,
.oa-inicial {
  width: 30px;
  height: 30px;
  flex: none;
  border-radius: var(--radius-sm);
  object-fit: contain;
  background: var(--n100);
}
.oa-inicial {
  display: grid;
  place-items: center;
  font-family: var(--display);
  font-weight: 800;
  color: var(--accent);
}
.oa-txt { flex: 1; min-width: 120px; }
.oa-txt strong { display: block; font-family: var(--semi); font-size: 15px; font-weight: 600; }
.oa-txt span { display: block; font-size: 12.5px; color: var(--text-muted); }
.oa-selo {
  font-size: 12px;
  letter-spacing: .04em;
  text-transform: uppercase;
  padding: 3px 8px;
  border-radius: var(--radius-pill);
}
.oa-selo.fixo { background: var(--accent-soft); color: var(--accent); }
.oa-selo.votado { background: rgba(71, 188, 132, .16); color: var(--success); }
.oa-votos { display: flex; gap: 6px; }
.oa-v {
  min-width: 42px;
  height: 30px;
  padding: 0 8px;
  border: 0;
  border-radius: var(--radius-md);
  background: var(--n100);
  color: var(--text-secondary);
  font-family: inherit;
  font-size: 13px;
  font-weight: 700;
  cursor: pointer;
  font-variant-numeric: tabular-nums;
  transition: background var(--mola), color var(--mola);
}
.oa-v:first-child.meu { background: rgba(71, 188, 132, .22); color: var(--success); }
.oa-v:last-child.meu { background: var(--live-soft); color: var(--live); }
.oa-v:disabled { opacity: .5; cursor: default; }
.oa-nada { margin: 0; font-size: 14px; color: var(--text-secondary); }
/* As emissoras da COMPETICAO, quando a grade do dia ainda nao chegou.
   Uma linha de contexto, sem selo e sem botao de confirmar: sao sete
   nomes que descrevem o campeonato, nao uma resposta sobre este jogo.
   Como cartao com voto, viravam sete promessas falsas. */
.oa-liga { margin: 8px 0 0; font-size: 13px; line-height: 1.5;
  color: var(--text-muted); }
.oa-sugerir {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s2);
  margin-top: var(--s3);
  padding-top: var(--s3);
  border-top: 1px solid var(--border-subtle);
}
.oa-sugerir label { font-size: 13px; color: var(--text-muted); }
.oa-sugerir select {
  flex: 1;
  min-width: 140px;
  height: 34px;
  padding: 0 8px;
  border: 0;
  border-radius: var(--radius-md);
  background: var(--surface-2);
  color: var(--text-primary);
  font-family: inherit;
  font-size: 14px;
}
.oa-add {
  height: 34px;
  padding: 0 14px;
  border: 0;
  border-radius: var(--radius-md);
  background: var(--accent);
  color: var(--n100);
  font-family: inherit;
  font-size: 14px;
  font-weight: 700;
  cursor: pointer;
}
.oa-add:disabled { opacity: .5; cursor: default; }

/* nota calculada pelo site: cor propria, para nao se passar pela da fonte */
.jog-nota.calculada, .nota.calculada { color: #B98CFF; }
.jog-nota.calculada::after, .nota.calculada::after { content: '*'; font-size: .7em; vertical-align: super; opacity: .8; }

/* redes sociais no rodape */
.rodape-redes { display: flex; align-items: center; gap: var(--s2); }
.rede {
  display: grid;
  place-items: center;
  width: 30px;
  height: 30px;
  border-radius: 50%;
  background: var(--surface-1);
  color: var(--text-secondary);
  transition: background var(--mola), color var(--mola);
}
.rede svg { width: 16px; height: 16px; }
a.rede:hover { background: var(--accent); color: var(--n100); }
.rede.apagada { opacity: .32; cursor: default; }
.rodape-redes-nota { font-size: 12px; color: var(--text-muted); letter-spacing: .04em; text-transform: uppercase; }

/* ============================================================
   aviso por time, painel e telas internas
   ============================================================ */

.pt-lista { display: grid; gap: var(--s2); margin-top: var(--s3); }
.pt-time { border-radius: var(--radius-md); background: var(--surface-2); overflow: hidden; }
.pt-topo {
  display: flex;
  align-items: center;
  gap: var(--s3);
  width: 100%;
  min-height: 44px;
  padding: 0 var(--s3);
  border: 0;
  background: transparent;
  color: var(--text-primary);
  font-family: inherit;
  font-size: 15px;
  cursor: pointer;
  text-align: left;
}
.pt-topo img { width: 22px; height: 22px; object-fit: contain; flex: none; }
.pt-nome { flex: 1; font-family: var(--semi); font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pt-estado { font-size: 12.5px; color: var(--text-muted); }
.pt-estado.proprio { color: var(--accent); }
.pt-seta { display: grid; place-items: center; width: 16px; height: 16px; color: var(--text-muted); transition: transform var(--mola); }
.pt-seta svg { width: 14px; height: 14px; }
.pt-time.aberto .pt-seta { transform: rotate(180deg); }
.pt-switches { padding: var(--s3); border-top: 1px solid var(--border-subtle); }
.pt-limpar {
  width: 100%;
  padding: 10px;
  border: 0;
  border-top: 1px solid var(--border-subtle);
  background: transparent;
  color: var(--accent);
  font-family: inherit;
  font-size: 13.5px;
  cursor: pointer;
  text-align: left;
  padding-left: var(--s3);
}

/* painel: campos em linha */
.campo-linha {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s2);
  align-items: center;
  margin-top: var(--s3);
}
.campo-linha input,
.campo-linha select {
  flex: 1;
  min-width: 130px;
  height: 36px;
  padding: 0 10px;
  border: 0;
  border-radius: var(--radius-md);
  background: var(--surface-2);
  color: var(--text-primary);
  font-family: inherit;
  font-size: 14px;
}
.campo-linha .btn {
  height: 36px;
  padding: 0 14px;
  border: 0;
  border-radius: var(--radius-md);
  background: var(--accent);
  color: var(--n100);
  font-family: inherit;
  font-size: 14px;
  font-weight: 700;
  cursor: pointer;
}
.lig-x {
  margin-left: var(--s2);
  border: 0;
  background: transparent;
  color: var(--live);
  font-size: 17px;
  line-height: 1;
  cursor: pointer;
}
/* Ordem editorial das competicoes, no Painel. Uma linha por liga com
   o campo de peso na frente: com duzentas ligas, o que precisa ser
   rapido e mudar um numero e salvar, nao arrastar item por item. */
/* ---------- comparacao de odds ----------
   Uma linha por casa: nome a esquerda, os tres precos a direita em
   colunas iguais, para o olho comparar na vertical sem procurar. */
.od-legenda { margin: 0 0 12px; font-size: 14px; color: var(--text-secondary); }
.od-legenda b { color: var(--text-primary); font-weight: 600; }
.od-lista { display: grid; gap: 8px; }
.od-linha { display: flex; align-items: center; gap: 12px; min-width: 0;
  padding: 8px 10px; border-radius: 9px; background: var(--surface-2); }
.od-linha.parceira { box-shadow: inset 2px 0 0 var(--accent); }
.od-casa { display: flex; align-items: center; gap: 8px; min-width: 0; flex: 1;
  font-size: 14.5px; font-weight: 600; }
.od-casa > span { min-width: 0; white-space: nowrap; overflow: hidden;
  text-overflow: ellipsis; }
.od-casa img { width: 22px; height: 22px; object-fit: contain; flex: none;
  border-radius: 5px; }
/* Com logo cadastrado a marca fala sozinha, e o nome escrito vira
   ruido: ele fica so para quem usa leitor de tela e para a dica. */
.od-casa.com-logo img { width: auto; height: 20px; max-width: 74px; }
.od-casa.com-logo > span { position: absolute; width: 1px; height: 1px;
  overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
.od-selo { flex: none; font-style: normal; font-size: 12px; font-weight: 700;
  letter-spacing: .04em; text-transform: uppercase; color: var(--accent);
  background: rgba(46, 111, 224, .14); border-radius: 999px; padding: 2px 7px; }

.od-precos { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px;
  flex: none; width: 57%; max-width: 330px; }
.od-preco { display: flex; align-items: center; justify-content: center; gap: 6px;
  padding: 7px 4px; border-radius: 7px; background: var(--surface-1);
  color: var(--text-primary); text-decoration: none;
  font-variant-numeric: tabular-nums; transition: background var(--mola); }
a.od-preco:hover { background: var(--surface-hover); }
.od-preco.sem-link { cursor: default; }
.od-rot { font-size: 12px; font-weight: 600; color: var(--text-muted); }
.od-preco b { font-size: 15px; font-weight: 700; }
.od-sobe, .od-desce { font-style: normal; font-size: 12px; line-height: 1; }
.od-sobe { color: var(--success); }
.od-desce { color: var(--live); }

/* O aviso do Ministerio da Fazenda e obrigatorio e nao pode ser
   letrinha escondida: fica no mesmo corpo do resto do bloco. */
.od-aviso { margin: 12px 0 0; padding-top: 10px; font-size: 13px; line-height: 1.5;
  color: var(--text-secondary); border-top: 1px solid var(--border-subtle); }

/* ---------- gols no cabecalho ----------
   A curiosidade de cinco segundos: "2 a 1, quem fez?". Autor e minuto
   ficam colados no placar, um lado para cada time, com a bola no meio
   servindo de eixo. */
.cb-gols { display: grid; grid-template-columns: 1fr 26px 1fr; align-items: start;
  gap: 8px; width: 100%; max-width: 620px; margin: 2px auto 0;
  padding-top: 12px; border-top: 1px solid var(--border-subtle); }
.cbg-lado { display: grid; gap: 3px; min-width: 0; font-size: 14px;
  color: var(--text-secondary); }
.cbg-lado.casa { text-align: right; }
.cbg-lado.fora { text-align: left; }
.cbg-lado span { min-width: 0; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; }
/* O minuto precisa de ar. Sem isso saia "F. Colidio24'", com o nome
   e o numero colados como se fossem uma palavra so -- e o `<i>` esta
   dentro do mesmo `<span>` do nome, entao nao ha espaco de marcacao
   nenhum entre os dois. */
.cbg-lado i { font-style: normal; color: var(--text-muted);
  font-variant-numeric: tabular-nums; margin-left: 7px; }
/* Gol sem autor conhecido: so o minuto, e ele fica com o mesmo peso
   do minuto dos outros para a linha nao parecer quebrada. */
.cbg-anonimo { color: var(--text-muted); }
.cbg-bola { display: grid; place-items: center; padding-top: 1px; color: var(--text-muted); }
.cbg-bola svg { width: 15px; height: 15px; }

.melhor-porque { display: block; margin-top: 2px; font-style: normal; font-size: 13.5px;
  color: var(--text-muted); }

/* Placar contra desempenho: e achado, nao estatistica de rotina, e
   por isso ganha destaque proprio em vez de virar mais uma linha. */
.anomalia { border-left: 3px solid var(--warning); }
.an-texto { margin: 10px 0 0; font-size: 16px; line-height: 1.55; color: var(--text-primary); }

/* ---------- painel lateral da partida ----------
   E a MESMA tela da partida, em coluna estreita. Por isso quase tudo
   aqui e ajuste de escala do que ja existe, e nao um desenho novo:
   duas implementacoes do mesmo jogo iam divergir para sempre.

   A diferenca de comportamento e uma so: aqui as secoes ficam em
   abas, uma por vez. Na tela cheia do computador todas ficam
   visiveis e o menu leva ate elas. */
/* O painel precisa rolar por dentro. Sem isto ele empurrava a pagina
   inteira: a coluna do meio acabava e a direita continuava descendo,
   e quem estava lendo a lista era arrastado junto. */
/* Continua grid de proposito. Com display:block o gap do trilho
   morre, e se a classe escapar por qualquer caminho os blocos da
   coluna da direita colam um no outro. Ja aconteceu. O painel tem um
   filho so, entao ser grid nao custa nada. */
.trilho.painel-jogo { display: grid; align-content: start; width: var(--painel-w);
  position: sticky; top: calc(var(--header-h) + 16px);
  max-height: calc(100vh - var(--header-h) - 32px);
  overflow-y: auto; overscroll-behavior: contain;
  scrollbar-width: thin; scrollbar-color: var(--n60) transparent; }
.trilho.painel-jogo::-webkit-scrollbar { width: 8px; }
.trilho.painel-jogo::-webkit-scrollbar-thumb { background: var(--n60); border-radius: 999px; }
.trilho.painel-jogo::-webkit-scrollbar-track { background: transparent; }

/* O cabecalho do painel gruda no topo da propria rolagem: com dez
   abas, perder o placar de vista logo no primeiro rolar seria perder
   a referencia do que se esta lendo. */
.painel-jogo .pj-topo { position: sticky; top: 0; z-index: 3; }
.painel-jogo .chips.abas { position: sticky; top: 49px; z-index: 2;
  background: var(--surface-1); }
.painel-jogo .pj { background: var(--bg); border: 1px solid var(--aresta-cartao);
  border-radius: 14px; overflow: hidden; }

.pj-topo { display: flex; align-items: center; gap: 8px; padding: 10px 12px;
  border-bottom: 1px solid var(--border-subtle); background: var(--surface-2); }
.pj-liga { flex: 1; min-width: 0; font-family: var(--ui); font-size: 12.5px;
  font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
  color: var(--accent); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pj-x { flex: none; display: grid; place-items: center; width: 28px; height: 28px;
  border: 0; border-radius: 7px; background: none; cursor: pointer; color: var(--text-muted); }
.pj-x:hover { background: var(--surface-hover); color: var(--text-primary); }

.pj-duelo { display: grid; grid-template-columns: 1fr auto 1fr; align-items: start;
  gap: 16px; padding: 18px 14px 12px; }
.pj-time { display: grid; justify-items: center; gap: 8px; min-width: 0;
  border: 0; background: none; cursor: pointer; color: var(--text-primary); padding: 0; }
.pj-time img { width: 44px; height: 44px; object-fit: contain; }
.pj-time span { font-size: var(--font-body); font-weight: 600; text-align: center; max-width: 100%;
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pj-time:hover span { color: var(--accent); }
.pj-meio { display: grid; justify-items: center; gap: 4px; padding-top: 4px; }
.pj-placar, .pj-hora { font-family: var(--display); font-size: 27px; font-weight: 700;
  line-height: 1; font-variant-numeric: tabular-nums; }
.pj-placar i { font-style: normal; color: var(--text-muted); margin: 0 3px; }
.pj-hora { font-size: 22px; color: var(--text-muted); }
.pj-estado { font-size: 12.5px; font-weight: 600; color: var(--text-muted); }
.pj-estado.vivo { color: var(--live); }

.pj-cheia { display: block; width: calc(100% - 28px); margin: 12px 14px 14px;
  padding: 11px 12px; border: 0; border-radius: 9px; cursor: pointer;
  background: var(--accent); color: #04121C; font-family: var(--ui); font-size: 14px;
  font-weight: 700; letter-spacing: .03em; text-transform: uppercase;
  transition: filter var(--mola); }
.pj-cheia:hover { filter: brightness(1.08); }

/* O cabecalho de gols do painel usa a mesma peca da pagina, so que
   sem a borda de cima, que aqui encostaria no placar. */
/* O autor do gol nascia colado na borda de baixo do cabeçalho, sem
   um respiro entre a atmosfera e o texto. Ele é a segunda pergunta
   de quem abre a partida ("quem fez?"), então merece o ar. */
.painel-jogo .cb-gols { max-width: none; margin: 0; padding: 14px 14px 4px;
  border-top: 0; }

/* Menu de abas: rola de lado dentro da coluna, com o titulo da secao
   escondido, porque a aba ativa ja diz onde a pessoa esta. */
.painel-jogo .chips.abas { position: static; margin: 0; padding: 0 12px;
  border-bottom: 1px solid var(--border-subtle); gap: 14px;
  overflow-x: auto; scrollbar-width: none; flex-wrap: nowrap; }
.painel-jogo .chips.abas::-webkit-scrollbar { display: none; }
/* As abas do painel estavam em 13px com o padding do chip pequeno:
   cinco alvos de toque apertados numa coluna estreita. Sobem para o
   corpo de leitura e ganham area, que e o que faz diferenca no dedo. */
.painel-jogo .chips.abas .chip { flex: none; font-size: var(--font-body);
  padding: 9px 13px; letter-spacing: -.005em; }
.painel-jogo #aba-corpo { padding: 14px; display: grid; gap: 12px; }
.painel-jogo .aba-secao { display: grid; gap: 14px; min-width: 0; }
.aba-secao[hidden] { display: none; }

/* Tudo que dentro da pagina e bloco largo aqui precisa caber em 420px.
   Sao ajustes de escala, nao um desenho paralelo. */
/* O espaço entre blocos era a SOMA de duas coisas: o `gap: 14px` da
   grade mais o `margin-bottom: 16px` que todo `.bloco` carrega. Trinta
   pixels entre cada cartão numa coluna estreita. Agora quem manda é o
   gap, e só ele. */
.painel-jogo .bloco { padding: 12px; margin-bottom: 0; }
.painel-jogo .bloco-tit { font-size: 13px; }
.painel-jogo .df-lados, .painel-jogo .sq-lados,
.painel-jogo .jogadores-partida, .painel-jogo .escalacoes,
.painel-jogo .banco-lista, .painel-jogo .par-casa-fora { grid-template-columns: 1fr; gap: 16px; }
.painel-jogo .qv { gap: 8px; }
.painel-jogo .qv-lado { width: 44px; }
.painel-jogo .prob-miudos, .painel-jogo .rv-grade { grid-template-columns: 1fr 1fr; }
.painel-jogo .mk-lista { grid-template-columns: 1fr 1fr; }
.painel-jogo .cm-item { grid-template-columns: 28px minmax(0, 1fr) auto; gap: 9px; padding: 9px 10px; }
.painel-jogo .cm-txt strong { font-size: 14px; }
.painel-jogo .cm-txt p { font-size: 12.5px; }
.painel-jogo .cm-item .lc-foto { width: 28px; height: 28px; }
.painel-jogo .rosca { width: 34px; height: 34px; }
.painel-jogo .rz { gap: 8px; }
.painel-jogo .rz-rot { font-size: 12.5px; }
.painel-jogo .od-linha { flex-direction: column; align-items: stretch; gap: 7px; padding: 9px 10px; }
.painel-jogo .od-precos { width: 100%; max-width: none; }
.painel-jogo .gramado { min-height: 0; }
.painel-jogo .mm-grafico { height: 120px; }
.painel-jogo .tab-cab, .painel-jogo .tab-linha {
  grid-template-columns: 26px minmax(0, 1fr) 28px 26px 26px 26px 26px 30px 0;
  gap: 3px; font-size: 12.5px; padding: 0 6px; }
/* No painel de 520px nao cabe a forma: a coluna existe, com largura zero. */
.painel-jogo .c-forma { display: none; }
.painel-jogo .h2h-lado strong, .painel-jogo .h2h-meio strong { font-size: 21px; }
.painel-jogo .faixa-resumo strong { font-size: 21px; }
.painel-jogo .jogador-capa .retrato { width: 64px; height: 64px; }

/* O cartao aberto fica marcado na lista: sem isso, com o painel do
   lado, a pessoa perde de vista qual dos dez ela clicou. */
.row-jogo.jc.aberto { box-shadow: inset 0 0 0 1px var(--accent); background: var(--surface-hover); }
.tc.aberto { box-shadow: inset 0 0 0 1px var(--accent); }

/* ---------- placar de palpites ---------- */
.pl-meu { display: grid; grid-template-columns: repeat(auto-fit, minmax(128px, 1fr));
  gap: 8px; margin-top: 14px; }
.pl-lista { background: var(--surface-1); border: 1px solid var(--border-subtle);
  border-radius: 12px; overflow: hidden; margin-top: 14px; }
.pl-cab, .pl-linha { display: grid; grid-template-columns: 42px minmax(0, 1fr) 78px 70px 62px;
  align-items: center; gap: 8px; padding: 0 14px; }
.pl-cab { height: 38px; font-size: 12px; font-weight: 700; letter-spacing: .05em; color: var(--text-muted);
  border-bottom: 1px solid var(--border-subtle); background: var(--surface-2); }
.pl-cab span:not(:nth-child(2)), .pl-linha span:not(.pl-nome) { text-align: right;
  font-variant-numeric: tabular-nums; }
.pl-cab span:first-child, .pl-linha .pl-pos { text-align: left; }
.pl-linha { height: 46px; font-size: 15px;
  border-bottom: 1px solid var(--border-subtle); }
.pl-linha:last-child { border-bottom: 0; }
.pl-linha.eu { background: rgba(46, 111, 224, .08);
  box-shadow: inset 3px 0 0 var(--accent); }
.pl-linha.podio .pl-pos { color: var(--warning); font-weight: 700; }
.pl-pos { font-variant-numeric: tabular-nums; color: var(--text-muted); }
.pl-nome { min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  font-weight: 500; }
.pl-nome em { font-style: normal; font-size: 12px; font-weight: 700; color: var(--accent);
  background: rgba(46, 111, 224, .14); border-radius: 999px; padding: 2px 7px;
  margin-left: 6px; }
.pl-linha b { font-weight: 700; }

.stat-barra.nula > div { background: var(--surface-2); }

/* ---------- comentario: principais eventos ----------
   Uma linha por lance, com icone e minuto na esquerda, a frase no
   meio e a foto de quem fez na direita. E a versao curta da linha do
   tempo, que continua inteira na aba Lances. */
.cm { display: grid; gap: 8px; margin-top: 14px; }
.cm-item { display: grid; grid-template-columns: 34px minmax(0, 1fr) auto;
  align-items: center; gap: 12px; padding: 11px 13px; border-radius: 10px;
  background: var(--surface-2); }
.cm-item.goal { box-shadow: inset 3px 0 0 var(--success); }
.cm-item.card { box-shadow: inset 3px 0 0 var(--warning); }
.cm-item.card.vermelho { box-shadow: inset 3px 0 0 var(--live); }
.cm-item.var { box-shadow: inset 3px 0 0 var(--roxo); }

.cm-ico { display: grid; justify-items: center; gap: 3px; flex: none; }
.cm-ico svg { width: 17px; height: 17px; }
.cm-ico i { font-style: normal; font-size: 12px; font-weight: 700;
  color: var(--text-muted); font-variant-numeric: tabular-nums; }

.cm-txt { min-width: 0; display: grid; gap: 2px; }
.cm-txt strong { font-size: 15px; font-weight: 700; }
.cm-txt p { margin: 0; font-size: 13.5px; line-height: 1.45;
  color: var(--text-secondary); }

/* O retrato reaproveita a peca da linha do tempo, so que menor. */
.cm-item .lc-foto { width: 34px; height: 34px; flex: none; }
.cm-item .lc-foto .lc-escudo { width: 15px; height: 15px; }

/* ---------- razao com anel ----------
   Para o que e fracao e nao contagem: "12 de 15 bolas longas" nao cabe
   numa barra comparativa, porque os dois lados tem denominadores
   diferentes. O anel mostra o aproveitamento de cada um. */
.rz { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center;
  gap: 12px; padding: 10px 0; }
.rz + .rz { border-top: 1px solid var(--border-subtle); }
.rz-rot { font-size: 13.5px; color: var(--text-secondary); text-align: center;
  min-width: 0; }
.rz-lado { display: flex; align-items: center; gap: 10px; font-size: 14.5px;
  font-weight: 700; font-variant-numeric: tabular-nums; }
.rz-lado:last-child { flex-direction: row-reverse; }
.rosca { width: 40px; height: 40px; flex: none; }
.rosca circle { fill: none; stroke-width: 4; }
.rosca-fundo { stroke: var(--surface-2); }
.rosca-frente { stroke: var(--accent); stroke-linecap: round;
  transform: rotate(-90deg); transform-origin: 50% 50%; }
.rosca.fora .rosca-frente { stroke: var(--roxo); }
.rosca-txt { fill: var(--text-primary); font-size: 12px; font-weight: 700;
  text-anchor: middle; dominant-baseline: central;
  font-family: var(--ui); }

/* ---------- outros mercados ---------- */
/* ---------- outros mercados ----------
   Era uma grade de cartões idênticos, sem hierarquia dentro de cada
   um e sem nada que separasse uma casa da outra: três linhas de
   texto cinza empilhadas, oito vezes. Planilha.

   Agora cada cartão tem uma ordem de leitura: a OPÇÃO em cima, a
   ODD grande à direita porque é o que a pessoa compara, e a casa
   embaixo com uma marca de letra que ancora o olho. */
.mk-grupo { margin-top: var(--space-5); }
.mk-grupo h4 { margin: 0 0 9px; font-family: var(--ui); font-size: var(--font-micro);
  font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
  color: var(--text-muted); }
/* auto-FILL, e nao auto-fit: com auto-fit as trilhas vazias colapsam,
   entao "Ambas marcam", que tem so Sim e Nao, esticava os dois
   cartoes por toda a largura do monitor e jogava a odd a 700px do
   rotulo dela. Com auto-fill as trilhas continuam la e os dois
   cartoes ficam do mesmo tamanho dos outros. */
.mk-lista { display: grid; grid-template-columns: repeat(auto-fill, minmax(164px, 1fr));
  gap: var(--space-2); }

/* Duas colunas dentro do cartão: texto à esquerda, odd à direita.
   A odd deixou de ser a terceira linha de uma pilha e virou o que
   ela é: o número que a pessoa está comparando. */
.mk-item { display: grid; grid-template-columns: minmax(0, 1fr) auto;
  align-items: center; align-content: center; gap: 2px var(--space-3);
  padding: 10px 12px; border-radius: var(--radius-md);
  background: var(--surface-2); color: var(--text-primary); text-decoration: none;
  border: 1px solid transparent; min-width: 0;
  transition: background var(--mv-curto) var(--mv-entra),
              border-color var(--mv-curto) var(--mv-entra),
              transform var(--mv-toque) var(--mv-sai); }
a.mk-item:hover { background: var(--surface-hover); border-color: var(--border-default); }
a.mk-item:active { transform: scale(.985); }
.mk-item.sem-link { cursor: default; }

/* O ROTULO QUEBRA, NAO CORTA.
   Com dois cartoes por linha num celular de 412px sobram 78px para o
   texto, e "Menos de 2,5" pede 95. O que aparecia na tela era "Menos
   de..." e "Menos de O..." -- num bloco de total de gols, esconder
   justamente o numero da linha e esconder a unica informacao que
   distingue um cartao do outro. Duas linhas de altura custam 18px;
   nao dizer qual e a linha nao custa nada e nao serve para nada. */
.mk-op { grid-column: 1; font-size: var(--font-secondary); font-weight: var(--peso-titulo);
  line-height: 1.25; overflow-wrap: anywhere; }
.mk-casa { grid-column: 1; display: flex; align-items: baseline; gap: 5px;
  margin-top: 2px; font-size: var(--font-micro); color: var(--text-muted);
  min-width: 0; }
.mk-casa > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mk-casa i { font-style: normal; color: var(--success); font-weight: 700;
  flex: none; }

/* A marca de uma letra da casa saiu daqui.
   Eram oito quadradinhos coloridos com a inicial da casa numa grade
   de oito cartoes, e a cor nao queria dizer nada: era um hash do
   nome. O nome da casa esta escrito do lado, em texto, que e o que a
   pessoa le de qualquer jeito -- o selo so competia com a odd, que e
   o numero que o cartao existe para mostrar. Sem ele o nome da casa
   ganha 21px e para de virar "Marathon...". */

/* A odd. Tabular para as colunas alinharem verticalmente numa grade
   onde todo número tem quatro ou cinco caracteres. */
.mk-item b { grid-column: 2; grid-row: 1 / span 2;
  font-size: var(--font-headline); font-weight: 700;
  font-variant-numeric: tabular-nums; letter-spacing: -.02em; }

/* ---------- placar agregado ----------
   Em ida e volta o placar de um jogo sozinho engana: da para estar
   perdendo e classificado. Quem avanca ganha seta e cor. */
.ag-total { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center;
  gap: 12px; margin: 14px 0 16px; }
.ag-t { display: flex; align-items: center; gap: 8px; min-width: 0; font-size: 15px;
  color: var(--text-secondary); }
.ag-t.dir { justify-content: flex-end; }
.ag-t img { width: 26px; height: 26px; object-fit: contain; flex: none; }
.ag-t b { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  font-weight: 600; }
.ag-t.passa { color: var(--success); }
.ag-t.passa b { font-weight: 700; }
.ag-t em { flex: none; font-style: normal; font-size: 12px; font-weight: 700;
  letter-spacing: .05em; text-transform: uppercase; color: var(--success);
  background: rgba(25, 171, 101, .14); border-radius: 999px; padding: 2px 8px; }
.ag-num { font-family: var(--display); font-size: 27px; font-weight: 700; line-height: 1;
  font-variant-numeric: tabular-nums; white-space: nowrap; }
.ag-num i { font-style: normal; color: var(--text-muted); margin: 0 4px; }

.ag-pernas { display: grid; gap: 6px; }
.ag-perna { display: grid; grid-template-columns: 46px minmax(0, 1fr) auto minmax(0, 1fr);
  align-items: center; gap: 10px; width: 100%; padding: 9px 11px; border: 0;
  border-radius: 9px; background: var(--surface-2); cursor: pointer;
  color: var(--text-primary); font-size: 14px; text-align: left;
  transition: background var(--mola); }
.ag-perna:hover { background: var(--surface-hover); }
.ag-perna.atual { box-shadow: inset 2px 0 0 var(--accent); }
.ag-n { font-size: 12px; font-weight: 700; letter-spacing: .05em;
  text-transform: uppercase; color: var(--text-muted); }
.ag-lado { display: flex; align-items: center; gap: 7px; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ag-lado.dir { justify-content: flex-end; }
.ag-lado img { width: 18px; height: 18px; object-fit: contain; flex: none; }
.ag-placar { font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; }

.painel-jogo .ag-perna { grid-template-columns: 38px minmax(0,1fr) auto minmax(0,1fr);
  gap: 7px; font-size: 13px; padding: 8px 9px; }
.painel-jogo .ag-num { font-size: 23px; }

/* ---------- quem esta passando de fase ----------
   Era uma seta para cima colada no nome. Icone de 13px nao diz
   "classificado" e ainda competia com o placar. Agora sao duas
   marcas que combinam entre si: o nome do time e a faixa do
   agregado, na mesma cor. Verde quando a vaga esta definida, ambar
   enquanto a volta rola e ainda pode virar. */
.jc-lado.avanca .jc-nome { font-weight: 700; }
.ag-t.parcial em { color: var(--warning); background: rgba(242, 183, 5, .14); }
.ag-t.passa.parcial { color: var(--warning); }
/* A soma do confronto virou linha embaixo do duelo, no lugar da
   pilula no canto. Ali cabe a conta por extenso, com os nomes na
   mesma ordem da linha de cima, e nao precisa competir por espaco
   com a rodada. Retangulo de canto curto: pilula arredondada parecia
   selo de status, e isto e um placar. */
/* Era a frase inteira pintada de verde dentro de uma tarja verde.
   Agora quem carrega a cor é a etiqueta "IDA", de 4 letras, e o
   resultado fica em texto legível. Verde com função, e não verde
   como decoração de trinta caracteres. */
.jc-agr { justify-self: center; display: inline-flex;
  align-items: center; gap: 7px; font-size: 12px;
  font-weight: 500; color: var(--text-secondary); background: none;
  border-radius: 0; padding: 1px 0; white-space: nowrap;
  font-variant-numeric: tabular-nums; }
.jc-agr b { font-weight: 700; color: var(--text-muted); text-transform: uppercase;
  font-size: 12px; letter-spacing: .07em; margin: 0;
  background: rgba(255, 255, 255, .06); border-radius: 3px; padding: 2px 5px; }
/* "Vale" é quando o agregado decide quem avança: aí a cor entra, mas
   só na etiqueta. */
.jc-agr.vale { color: var(--text-secondary); background: none; }
.jc-agr.vale b { color: var(--success); background: rgba(39, 165, 111, .16); }
.jc-agr.vale strong { color: var(--success); }
.jc-agr strong { font-weight: 700; }
/* "nos penaltis 4 x 2" e "empate no agregado": a explicacao de quem
   avancou quando a soma dos dois jogos nao decide. Sem ela, um
   agregado 3 x 3 terminava com um nome em negrito e nenhum motivo. */
/* O veredito por extenso: "Palmeiras avanca nos penaltis, 4 a 2".
   Negrito sozinho nao bastava, porque na linha de cima o vencedor da
   PARTIDA ja esta em destaque e os dois competiam. */
.jc-agr-passa {
  margin-left: 6px; padding-left: 6px;
  border-left: 1px solid var(--aresta-forte);
  color: var(--success); font-weight: 700; text-transform: none;
}
.jc-agr-pen {
  margin-left: 6px; padding-left: 6px;
  border-left: 1px solid var(--aresta-forte);
  color: var(--text-muted); font-weight: 600; text-transform: none;
}
.jc-agr.vale b { color: var(--success); opacity: .8; }


/* ---------- rivalidade ----------
   Uma barra so, dividida em tres: o olho le "quem manda no confronto"
   em meio segundo, o que tres numeros soltos nao entregam. */
.rv-barra { display: flex; height: 30px; border-radius: 8px; overflow: hidden;
  margin: 16px 0 10px; background: var(--surface-2); }
.rv-barra span { display: grid; place-items: center; font-size: 14px; font-weight: 700;
  color: #06121B; min-width: 0; overflow: hidden; }
.rv-a { background: var(--accent); }
.rv-e { background: var(--n40); }
.rv-b { background: var(--roxo); }
.rv-legenda { display: flex; flex-wrap: wrap; gap: 6px 18px; font-size: 13.5px;
  color: var(--text-secondary); }
.rv-legenda span { display: inline-flex; align-items: center; gap: 6px; }
.rv-p { width: 10px; height: 10px; border-radius: 3px; flex: none; }
.rv-grade { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  gap: 8px; margin-top: 16px; }
.rv-item { display: grid; gap: 3px; padding: 10px 12px; border-radius: 9px;
  background: var(--surface-2); min-width: 0; }
.rv-item.destaque { box-shadow: inset 2px 0 0 var(--warning); }
.rv-item span { font-size: 12.5px; color: var(--text-muted); }
.rv-item strong { font-size: 16px; font-weight: 700; }
.rv-item em { font-style: normal; font-size: 12.5px; color: var(--text-muted); }

/* ============================================================
   Escolha de competicao: um botao, nao uma parede de fichas
   ============================================================
   Doze competicoes em fichas que quebram linha davam TRES fileiras
   num celular de 390px, e elas ficavam ACIMA da tabela: a primeira
   tela era o menu inteiro e a classificacao comecava fora dela.

   Ficha e boa para um punhado de opcoes que cabem numa linha. Para
   doze, o certo e mostrar a escolha atual e abrir a lista quando
   alguem pedir. */
.escolha-linha { margin-bottom: 12px; }
.escolha { display: flex; align-items: center; gap: 10px; width: 100%;
  min-height: 46px; padding: 8px 12px;
  background: var(--surface-1); border: 1px solid var(--aresta);
  border-radius: var(--radius-md); color: var(--text-primary);
  font-family: var(--semi); font-size: 15.5px; font-weight: 600; text-align: left; }
.escolha:hover { border-color: var(--aresta-forte); }
.escolha img { width: 22px; height: 22px; object-fit: contain; flex: none; }
.escolha span { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; }
.escolha-seta { display: flex; color: var(--text-muted); flex: none; }

/* ---------- a folha que sobe do rodape ----------
   Precisa passar por cima de tudo que ja existe empilhado. */
/* z-index 90: a barra de baixo e 30, o `body::before` do topo e 60 e o aviso de cookies e 80. Com 70 o aviso ficava POR CIMA da folha e roubava o toque nos ultimos itens. */
.folha-fundo { position: fixed; inset: 0; z-index: 90;
  display: flex; align-items: flex-end; justify-content: center;
  background: rgba(3, 8, 15, .62); }
.folha { width: 100%; max-width: 560px; max-height: 78vh;
  display: flex; flex-direction: column;
  background: var(--surface-1);
  border: 1px solid var(--aresta); border-bottom: 0;
  border-radius: 16px 16px 0 0;
  /* A area segura entra no padding da propria folha, e nao como
     margem: assim a folha continua encostada no rodape do aparelho e
     o ultimo item da lista nao fica embaixo da faixa do sistema. */
  padding-bottom: env(safe-area-inset-bottom, 0px); }
.folha-topo { display: flex; align-items: center; gap: 12px;
  padding: 14px 16px 12px; border-bottom: 1px solid var(--aresta); }
.folha-topo h2 { flex: 1; margin: 0; font-family: var(--display);
  font-size: 17px; font-weight: 700; color: var(--text-primary); }
.folha-x { display: flex; padding: 6px; margin: -6px; border-radius: var(--radius-sm);
  color: var(--text-secondary); }
.folha-x:hover { color: var(--text-primary); background: rgba(255, 255, 255, .06); }
.folha-campo { padding: 10px 16px 4px; }
.folha-busca { width: 100%; height: 40px; padding: 0 12px;
  background: var(--surface-2); border: 1px solid var(--aresta);
  border-radius: var(--radius-sm); color: var(--text-primary); font-size: 15.5px; }
.folha-lista { list-style: none; margin: 0; padding: 8px 8px 12px;
  overflow-y: auto; -webkit-overflow-scrolling: touch; }
.folha-item { display: flex; align-items: center; gap: 12px; width: 100%;
  min-height: 48px; padding: 8px 10px; border-radius: var(--radius-sm);
  color: var(--text-secondary); font-size: 15.5px; text-align: left; }
.folha-item:hover { background: rgba(255, 255, 255, .05); }
.folha-item img { width: 24px; height: 24px; object-fit: contain; flex: none; }
.folha-vazio { width: 24px; flex: none; }
.folha-item span { flex: 1; min-width: 0; }
/* Marcado por COR E por simbolo. Quem nao distingue as duas coisas
   ainda ve o visto. */
.folha-item[aria-selected="true"] { color: var(--text-primary); font-weight: 600;
  background: rgba(46, 111, 224, .12); }
.folha-check { display: none; color: var(--accent); flex: none; }
.folha-item[aria-selected="true"] .folha-check { display: flex; }
.folha-nada { padding: 4px 18px 18px; font-size: 14.5px; color: var(--text-muted); }

/* ============================================================
   FICHA DO JOGADOR NA PARTIDA
   Mesma folha, conteudo livre. Abre ao clicar no jogador do campinho
   ou do banco e mostra o que ele fez NAQUELE jogo -- que era o que
   faltava: o clique levava para a ficha de temporada, que responde
   outra pergunta.
   ============================================================ */
.folha-corpo { padding: 14px 16px 18px; overflow-y: auto;
  -webkit-overflow-scrolling: touch; }
.fj-capa { display: grid; grid-template-columns: 56px minmax(0, 1fr) auto;
  align-items: center; gap: 12px; padding-bottom: 14px;
  border-bottom: 1px solid var(--aresta); }
.fj-foto { position: relative; width: 56px; height: 56px; border-radius: 50%;
  overflow: hidden; background: var(--surface-2); }
.fj-foto img { width: 100%; height: 100%; object-fit: cover; }
.fj-quem { min-width: 0; display: grid; gap: 3px; }
.fj-quem strong { font-family: var(--semi); font-size: 16px; font-weight: 600;
  color: var(--text-primary); }
.fj-time { display: flex; align-items: center; gap: 6px; font-size: 13px;
  color: var(--text-secondary); }
.fj-time img { width: 16px; height: 16px; object-fit: contain; }
.fj-meta { font-size: 12.5px; color: var(--text-muted); }
.fj-capa .nota-jog { position: static; }
.fj-grupo { margin-top: 16px; }
.fj-grupo h4 { margin: 0 0 8px; font-family: var(--ui); font-size: 12px;
  font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
  color: var(--text-muted); }
.fj-linha { display: flex; align-items: baseline; justify-content: space-between;
  gap: 12px; padding: 7px 0; border-bottom: 1px solid var(--border-subtle); }
.fj-linha:last-child { border-bottom: 0; }
.fj-linha span { font-size: 14px; color: var(--text-secondary); }
.fj-linha strong { font-size: 15px; font-weight: 700; color: var(--text-primary);
  font-variant-numeric: tabular-nums; }
.fj-sem { margin: 18px 0 0; font-size: 14px; color: var(--text-muted); }
.fj-ir { width: 100%; margin-top: 18px; padding: 12px; border-radius: 12px;
  border: 1px solid var(--aresta); background: var(--surface-2);
  color: var(--text-primary); font-family: var(--ui); font-size: 14.5px;
  font-weight: 600; cursor: pointer; }
.fj-ir:hover { background: var(--surface-hover); }

/* Recortes da tabela ficam mais discretos que a troca de competicao:
   sao um filtro dentro da mesma tabela, nao outra tabela. */
.chips.recortes { margin-top: -4px;
  /* Filtro nao quebra linha. Sao quatro botoes curtos e eles cabem em
     390px, mas em 360 com fonte grande do sistema eles passavam para
     a segunda fileira -- e ai o filtro ficava com a mesma altura da
     escolha de competicao, disputando o mesmo peso. Rolagem lateral
     resolve sem mudar a altura da peca. */
  flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none;
  -webkit-overflow-scrolling: touch; }
.chips.recortes::-webkit-scrollbar { display: none; }
.chips.recortes .chip { flex: 0 0 auto; }

/* ---------- probabilidade pelo modelo ----------
   UMA barra dividida em tres, com escudo nas pontas.

   Eram tres barras empilhadas, uma por resultado. Lidas de cima para
   baixo elas nao respondiam "quem vai vencer": era preciso comparar
   tres numeros. Dividida, o tamanho da fatia JA e a resposta.

   As cores nao mudam (.pb-casa, .pb-empate, .pb-fora continuam sendo
   as mesmas de antes): quem ja conhecia a tela nao precisa reaprender
   nada, so a forma ficou legivel. */
.qv { display: grid; grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center; gap: 12px; margin: 16px 0 12px; }
.qv-lado { display: grid; justify-items: center; gap: 5px; width: 54px; }
.qv-lado img { width: 26px; height: 26px; object-fit: contain; }
.qv-lado span { font-size: 12px; font-weight: 600; color: var(--text-secondary);
  text-align: center; line-height: 1.15; overflow-wrap: anywhere; }
.qv-barra { display: flex; height: 30px; border-radius: 8px; overflow: hidden;
  background: var(--surface-2); }
.qv-fatia { display: grid; place-items: center; min-width: 0; overflow: hidden;
  transition: flex-grow var(--mola); }
.qv-fatia b { font-family: var(--display); font-size: 13.5px; font-weight: 700;
  color: #0B0B0D; font-variant-numeric: tabular-nums; }
.qv-fatia.pb-fora b { color: #fff; }
/* A fatia vencedora ganha contraste; as outras recuam. Sem isso, tres
   pedacos da mesma forca visual voltam a exigir leitura de numero. */
.qv-fatia:not(.maior) { opacity: .62; }

.qv-legenda { display: flex; flex-wrap: wrap; gap: 6px 16px; margin: 0; padding: 0;
  list-style: none; }
.qv-legenda li { display: inline-flex; align-items: center; gap: 6px;
  font-size: 13px; color: var(--text-secondary); }
.qv-legenda li.maior { color: var(--text-primary); font-weight: 600; }
.qv-legenda i { width: 9px; height: 9px; border-radius: 3px; flex: none; }
.qv-legenda b { font-variant-numeric: tabular-nums; }

/* OS TRES PLACARES DA FRENTE.
   Substituem a pastilha "Placar mais provavel", que dizia um placar
   so e por isso era lida como palpite. Lado a lado eles se explicam:
   se o primeiro tem 14% e o terceiro tem 10%, ninguem sai daqui
   achando que o jogo vai terminar 1 a 0. */
.qv-placares { margin-top: 14px; }
.qv-pl-rot { display: block; font-size: 12.5px; color: var(--text-muted);
  margin-bottom: 7px; }
.qv-pl-itens { display: flex; flex-wrap: wrap; gap: 8px; }
.qv-pl { display: inline-flex; align-items: baseline; gap: 7px;
  padding: 7px 11px; border-radius: 9px; background: var(--surface-2); }
.qv-pl b { font-family: var(--display); font-size: 15px; font-weight: 700;
  color: var(--text-primary); font-variant-numeric: tabular-nums; }
.qv-pl i { font-style: normal; font-size: 12.5px; color: var(--text-muted);
  font-variant-numeric: tabular-nums; }

.pb-casa   { background: var(--accent); }
.pb-empate { background: var(--n40); }
.pb-fora   { background: var(--roxo); }

.prob-miudos { display: grid; grid-template-columns: repeat(auto-fit, minmax(128px, 1fr));
  gap: 8px; margin-top: 16px; }
.pm { display: grid; gap: 3px; padding: 10px 12px; border-radius: 9px;
  background: var(--surface-2); }
.pm span { font-size: 12.5px; color: var(--text-muted); }
.pm strong { font-size: 16px; font-weight: 700; font-variant-numeric: tabular-nums; }
/* Rodape da propria pastilha: "desde 2025" embaixo do numero de jogos
   do arbitro, no lugar do subtitulo que dizia "na base". */
.pm em { font-style: normal; font-size: 12px; color: var(--text-muted); }

/* ---------- desfalques ---------- */
.df-lados { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 14px; }
.df-lado { min-width: 0; }
.df-topo { display: flex; align-items: center; gap: 8px; margin-bottom: 10px;
  padding-bottom: 8px; border-bottom: 1px solid var(--border-subtle); }
.df-topo img { width: 22px; height: 22px; object-fit: contain; flex: none; }
.df-topo strong { font-size: 15px; min-width: 0; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; }
.df-topo em { margin-left: auto; flex: none; font-style: normal; font-size: 12px;
  font-weight: 700; color: var(--live); background: rgba(255, 77, 100, .14);
  border-radius: 999px; padding: 2px 8px; }
.df-item { display: flex; align-items: center; gap: 9px; padding: 6px 0; min-width: 0; }
.df-item img, .df-iniciais { width: 30px; height: 30px; border-radius: 50%; flex: none;
  object-fit: cover; background: var(--surface-2); }
.df-iniciais { display: grid; place-items: center; font-size: 12px; font-weight: 700;
  color: var(--text-muted); }
.df-nome { flex: 1; min-width: 0; font-size: 14.5px; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; }
.df-motivo { flex: none; font-style: normal; font-size: 12px; color: var(--text-muted); }
.df-nada { margin: 0; font-size: 14px; color: var(--text-muted); }
.df-sep { margin: 12px 0 4px; font-size: 12px; font-weight: 700; letter-spacing: .06em;
  text-transform: uppercase; color: var(--text-muted); }

/* ---------- como chegam ---------- */
.sq-lados { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 14px; }
.sq-lado { min-width: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 7px; }
.sq-topo { display: flex; align-items: center; gap: 8px; min-width: 0; width: 100%;
  padding-bottom: 8px; border-bottom: 1px solid var(--border-subtle); }
.sq-topo img { width: 22px; height: 22px; object-fit: contain; flex: none; }
.sq-topo strong { font-size: 15px; min-width: 0; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; }
/* A tira de forma: cinco selos, o mais recente na direita, cada um
   clicavel para a partida que ele representa. Os selos sao os MESMOS
   do confronto direto (.seq-p), entao V verde / E cinza / D vermelho
   quer dizer a mesma coisa nos dois blocos. */
.sq-forma { display: flex; gap: 5px; }
.sq-forma .seq-p { width: 24px; height: 24px; font-size: 13px; border: 0;
  cursor: pointer; padding: 0; font-family: var(--display); }
.sq-forma .seq-p:hover { filter: brightness(1.12); }
.sq-numeros { margin-top: 4px; }
.sq-numeros .stat { margin-bottom: 16px; }
.sq-numeros .stat:last-child { margin-bottom: 4px; }
.sq-perfil { margin: 0; font-size: 14.5px; line-height: 1.45; color: var(--text-secondary); }
.sq-perfil::first-letter { text-transform: uppercase; }
.sq-tag { display: inline-block; font-size: 13px; font-weight: 600; border-radius: 7px;
  padding: 4px 9px; background: var(--surface-2); color: var(--text-secondary); }
/* MESMO DESENHO DO V/E/D DA TABELA: fundo cheio, letra escura.
   Eram cor saturada sobre pastilha translucida, o que na tela escura
   le como neon -- "o '6 jogos invicto' ainda em NEON, sendo que a
   gente ja definiu que esses blocos tem que ficar igual ao V, D ou E
   da tabela". Os pares sao os mesmos de `.seq-p.s-V` e `.seq-p.s-D`,
   entao o contraste ja esta medido pelo `npm run contraste`. */
.sq-tag.bom  { background: var(--success); color: #06210F; }
.sq-tag.ruim { background: var(--live); color: #FFFFFF; }

/* ---------- raio-x da temporada ----------
   Dois lados, cada um com dois graficos de barra de seis colunas.
   As colunas sao desenhadas com altura em porcentagem e nao com SVG
   de proposito: sao seis valores, e um SVG aqui seria peso a toa.

   O grafico de sofrer usa a cor de perigo e o de marcar a de acerto.
   E a unica cor que o bloco gasta: o resto e numero. */
/* ============================================================
   raio-x: uma TABELA de comparacao, nao duas pilhas
   ============================================================
   Antes eram duas colunas independentes, cada uma montando a
   propria sequencia de pedacos conforme tivesse ou nao o dado. Um
   lado ganhava o grafico de "quando marca" e o outro nao; um tinha
   a frase do pico e o outro nao. Da terceira linha em diante nada
   se alinhava, e no meio do bloco a metrica da esquerda estava na
   altura de outra metrica da direita. O relato foi "uma LOUCURA de
   bagunca", e estava certo: nao da para comparar duas colunas que
   nao andam juntas.

   A peca agora e uma grade de tres colunas -- valor, rotulo, valor
   -- com uma linha por metrica. Os dois lados SEMPRE ocupam a mesma
   linha, e quando falta o numero de um deles a celula leva um
   travessao em vez de sumir. Quem leva vantagem na linha fica
   aceso; o resto fica em cinza de apoio, para o olho achar as
   diferencas em vez de ler quinze numeros. */
.rx { display: grid; }
.rx-cab, .rx-linha, .rx-forma-linha {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(104px, auto) minmax(0, 1fr);
  align-items: center;
  gap: 10px;
}
/* A coluna do rotulo tem um piso mais alto nas linhas de NUMERO do
   que no cabecalho e na tira de forma. Motivo: e a largura do rotulo
   que decide onde o numero cai, e os rotulos vao de "fora" (4 letras)
   a "gol dos dois lados" (18). Com piso baixo, o numero da linha
   curta escorregava 30px para fora em relacao ao da linha longa e a
   coluna deixava de ser coluna. O piso alto aperta essa variacao para
   poucos pixels sem forcar rotulo nenhum a quebrar.
   O cabecalho e a tira de forma ficam de fora: la o conteudo e escudo
   e cinco selos, que precisam da largura. */
.rx-linha {
  grid-template-columns: minmax(0, 1fr) minmax(124px, auto) minmax(0, 1fr);
}
.rx-cab { padding-bottom: 10px; }
.rx-linha, .rx-forma-linha {
  padding: 8px 0;
  border-top: 1px solid var(--border-subtle);
}
/* O escudo e o nome ficam sobre a coluna de numeros do proprio time,
   e nao grudados na borda do cartao: senao o cabecalho aponta para um
   lugar e os numeros que ele encabeca estao em outro. */
.rx-time { display: flex; align-items: center; justify-content: center;
  gap: 8px; min-width: 0; }
.rx-cab > .rx-time:last-child { flex-direction: row-reverse; }
.rx-time img { width: 24px; height: 24px; object-fit: contain; flex: none; }
/* Sem reticencias: "Everton" virava "Evert..." num celular de 390px,
   no cabecalho de um bloco cuja unica funcao e COMPARAR dois times.
   Nome cortado mata a comparacao logo na primeira linha. */
.rx-time strong { font-size: 15px; font-weight: 700; min-width: 0;
  line-height: 1.15; overflow-wrap: anywhere; }
.rx-time span { font-size: 12px; color: var(--text-muted); white-space: nowrap; }

/* O rotulo fica no MEIO, em caixa alta pequena: e eixo da tabela, e
   nao conteudo. Os valores e que sao o conteudo. */
.rx-rot {
  text-align: center;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--text-muted);
  white-space: nowrap;
}
.rx-v {
  font-size: 16px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--text-secondary);
  min-width: 0;
}
/* ------------------------------------------------------------
   CADA NUMERO NO CENTRO DA SUA METADE.
   ------------------------------------------------------------
   Os valores estavam encostados no rotulo do meio (direita na
   esquerda, esquerda na direita). Isso deixava 250px de vazio em
   cada ponta do cartao e, pior, fazia o numero mudar de lugar a
   cada linha: o "15" de gols feitos caia 20px mais para fora que
   o "11" de gols sofridos, so porque um rotulo tem duas letras a
   mais que o outro. Numa tabela cuja unica funcao e comparar dois
   lados, a coluna precisa ser coluna.

   Centrado na propria metade, o numero fica praticamente no mesmo
   x em todas as linhas e ocupa o espaco que estava sobrando. */
.rx-linha > .rx-v, .rx-forma-linha > .rx-v { text-align: center; }
/* Vantagem na linha: cor de texto cheia e um ponto antes. Sem cor
   sozinha decidindo nada -- o peso ja e 700 nos dois lados, entao
   quem le em escala de cinza ainda ve a diferenca de claridade. */
.rx-v.forte { color: var(--text-primary); }
.rx-v > i { font-style: normal; color: var(--text-disabled); font-weight: 400; }

.rx-forma-linha .rx-v { display: flex; gap: 4px; justify-content: center; }
.rx-forma-linha .sf {
  display: grid; place-items: center; width: 20px; height: 20px;
  border-radius: 5px; font-size: 12px; font-weight: 800; color: var(--n100);
}
.sf-v { background: var(--success); }
.sf-e { background: var(--n40); }
.sf-d { background: var(--danger); color: var(--n0); }

/* ---------- os grupos do Raio-X ----------
   Dez linhas de numero em sequencia sao dez coisas com o mesmo peso,
   e dez coisas com o mesmo peso nao tem hierarquia nenhuma -- o olho
   nao sabe onde comecar. Agora sao cinco assuntos: momento, producao,
   contexto, quando os gols saem, padroes.

   SECAO, NAO CARTAO. Cinco cartoes dentro do cartao do Raio-X
   achatariam exatamente a hierarquia que o agrupamento veio criar. O
   que separa aqui e espaco, um rotulo pequeno e uma linha -- os tres
   mais baratos que existem. */
.rx-grupo { grid-column: 1 / -1; margin: 14px 0 2px; padding-top: 10px;
  border-top: 1px solid var(--border-subtle);
  font-size: 12px; font-weight: 700; letter-spacing: .1em;
  text-transform: uppercase; color: var(--text-muted); }
.rx-grupo:first-of-type { margin-top: 8px; }
/* A conclusao do bloco, quando existe. Vem depois dos escudos e antes
   de tudo mais: e a unica frase da peca e ela e o resumo dela. */
/* Centralizada pela mesma razao da Analise: ela encabeca uma tabela
   de comparacao simetrica, com o rotulo no eixo do meio. */
.rx-leitura { grid-column: 1 / -1; margin: 12px auto 4px; max-width: 40ch;
  font-size: 14.5px; line-height: 1.4; color: var(--text-primary);
  font-weight: 600; text-wrap: balance; text-align: center; }

/* Os dois graficos de minuto dividem a linha, com a MESMA escala nos
   dois: barra de 2 gols de um time nao pode ter o tamanho de uma de
   5 do outro. */
.rx-graficos { padding: 12px 0 8px; border-top: 1px solid var(--border-subtle); }
.rx-par { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
.rx-metade { min-width: 0; }
/* Empilhados no celular, os dois graficos ficam um embaixo do outro
   sem nada dizendo de quem e cada um. O nome do dono resolve, e no
   computador ele confirma a ordem sem custar nada. */
.rx-dono { font-size: 12px; font-weight: 600; color: var(--text-muted);
  margin-bottom: 5px; white-space: nowrap; overflow: hidden;
  text-overflow: ellipsis; }
/* Um grafico por time: gol feito para cima em verde, gol sofrido para
   baixo em vermelho, no mesmo eixo. Eram quatro fileiras de seis
   barras (marca e sofre, um bloco por time): vinte e quatro numeros
   seguidos que ninguem le. Duas fileiras dizem a mesma coisa e ainda
   respondem de relance a pergunta que interessa -- este time faz gol
   no fim e toma gol no comeco? */
.rx-colunas { display: grid; grid-template-columns: repeat(6, 1fr); gap: 4px; }
.rx-col { display: grid; grid-template-rows: 1fr 1fr auto; gap: 2px;
  justify-items: center; min-width: 0; }
.rx-meia { display: flex; flex-direction: column; width: 100%; }
.rx-meia.cima { justify-content: flex-end; height: 34px; }
.rx-meia.baixo { justify-content: flex-start; height: 34px;
  border-top: 1px solid var(--border-subtle); }
.rx-meia i { display: block; width: 100%; }
.rx-meia.cima i { background: var(--success); border-radius: 4px 4px 0 0; }
.rx-meia.baixo i { background: var(--live); border-radius: 0 0 4px 4px; }
.rx-meia b { font-size: 12px; font-weight: 700; text-align: center;
  color: var(--text-primary); line-height: 1.1; }
.rx-col small { font-size: 12px; color: var(--text-muted);
  font-variant-numeric: tabular-nums; }
.rx-legenda { display: flex; justify-content: center; gap: 16px; margin-top: 10px;
  font-size: 12px; color: var(--text-muted); }
.rx-legenda span { display: inline-flex; align-items: center; gap: 5px; }
.rx-p { width: 9px; height: 9px; border-radius: 2px; display: block; }
.rx-p.feito { background: var(--success); }
.rx-p.sofrido { background: var(--live); }

/* ---------- fases de uma copa ----------
   Copa tem grupos E mata-mata, em momentos diferentes. A fase de
   agora abre; a outra fica recolhida, porque continua sendo consulta
   legitima e nao merece sumir da tela. */
.fase-dobra { border: 1px solid var(--border-subtle); border-radius: 10px;
  background: var(--surface-1); margin-bottom: 14px; overflow: hidden; }
.fase-dobra > summary { display: flex; align-items: center; gap: 10px;
  padding: 13px 16px; cursor: pointer; list-style: none;
  font-family: var(--ui); font-size: 15px; font-weight: 700;
  letter-spacing: .04em; text-transform: uppercase; color: var(--text-primary); }
.fase-dobra > summary::-webkit-details-marker { display: none; }
.fase-dobra > summary::after { content: '\203A'; margin-left: auto; font-size: 21px;
  line-height: 1; color: var(--text-muted); transform: rotate(90deg);
  transition: transform var(--mola); }
.fase-dobra[open] > summary::after { transform: rotate(-90deg); }
.fase-dobra > summary:hover { background: var(--surface-2); }
.fase-corpo { padding: 0 16px 16px; }

/* Usuarios e papeis. Mesma estrutura da tabela de ligas: rola dentro
   do proprio container, para a pagina nunca rolar de lado no celular. */
.usr-tabela { display: grid; gap: 4px; max-height: 460px; overflow: auto;
  overscroll-behavior-inline: contain; margin: 12px 0; padding-right: 4px; }
.usr-cab, .usr-linha { min-width: max-content; display: grid; align-items: center;
  gap: 10px; grid-template-columns: minmax(200px, 1fr) 190px 110px 100px 54px; }
.usr-cab { padding: 0 10px 4px; font-size: 12px; font-weight: 600;
  letter-spacing: .05em; color: var(--text-muted);
  position: sticky; top: 0; z-index: 1; background: var(--surface-1); }
.usr-cab span:last-child, .usr-linha span:last-child { text-align: right; }
.usr-linha { padding: 8px 10px; border-radius: 8px; background: var(--surface-2);
  border-left: 3px solid transparent; font-size: 13.5px; }
/* A propria conta, marcada: e a unica linha cujo papel nao muda aqui. */
.usr-linha.usr-eu { border-left-color: var(--accent); }
.usr-conta { display: grid; gap: 1px; min-width: 0; }
.usr-conta b { font-size: 13.5px; color: var(--text-primary); }
.usr-conta small { font-size: 12px; color: var(--text-muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.usr-linha select { height: 32px; padding: 0 8px; border-radius: 7px;
  border: 1px solid var(--aresta); background: var(--surface-1);
  color: var(--text-primary); font-family: var(--ui); font-size: 13px; }
.usr-linha select:disabled { opacity: .55; cursor: not-allowed; }
.usr-tag { margin-left: 6px; font-size: 12px; font-weight: 700;
  color: var(--success); }

.casas-lista { display: grid; gap: 6px; max-height: 440px; overflow-y: auto;
  margin: 12px 0; padding-right: 4px; }
.casa-item { display: grid;
  grid-template-columns: minmax(120px, 1.1fr) auto auto 70px minmax(0, 2fr) 54px minmax(0, 1.6fr);
  align-items: center; gap: 10px; padding: 7px 10px; border-radius: 8px;
  background: var(--surface-2); opacity: .55; }
.casa-item.ligada { opacity: 1; }
.casa-nome { display: flex; align-items: baseline; gap: 6px; min-width: 0;
  font-size: 14.5px; font-weight: 600; white-space: nowrap; overflow: hidden;
  text-overflow: ellipsis; }
.casa-nome small { font-size: 12px; color: var(--text-muted); font-weight: 500; }
.casa-chk { display: inline-flex; align-items: center; gap: 5px; flex: none;
  font-size: 13.5px; color: var(--text-secondary); cursor: pointer; }
.casa-ordem, .casa-link { background: var(--surface-1);
  border: 1px solid var(--border-subtle); border-radius: 6px;
  color: var(--text-primary); padding: 5px 8px; font-size: 13.5px; min-width: 0; }
.casa-ordem { text-align: center; font-variant-numeric: tabular-nums; }
.casa-ordem:focus, .casa-link:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
/* O logo cadastrado aparece do lado do campo: quem cola o endereco ve
   na hora se acertou o arquivo. */
.casa-logo { display: grid; place-items: center; height: 30px; border-radius: 6px;
  background: var(--surface-1); overflow: hidden; }
.casa-logo img { max-width: 46px; max-height: 24px; object-fit: contain; }
.casa-logo i { font-style: normal; font-size: 12px; color: var(--text-muted); }
/* O item de mercado tem tres campos, nao sete: colunas proprias para
   nao herdar a grade larga da casa de aposta e ficar cheio de vao. */
.casa-item.mercado { grid-template-columns: minmax(140px, 1.2fr) auto minmax(0, 1.4fr); }

/* Editor de oferta no Painel. */
.of-edit { border: 1px solid var(--aresta); border-radius: 10px; padding: 12px;
  margin-bottom: 10px; background: var(--surface-1); display: grid; gap: 10px; }
.of-edit.nova { border-style: dashed; }
.of-edit-grade { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
  gap: 8px; }
.of-campo { display: grid; gap: 3px; min-width: 0; }
.of-campo span { font-size: 12px; font-weight: 600; letter-spacing: .05em;
  text-transform: uppercase; color: var(--text-muted); }
.of-campo input { height: 34px; padding: 0 9px; font: inherit; font-size: 14px;
  color: var(--text-primary); background: var(--surface-2); border: 0;
  border-radius: 6px; min-width: 0; }
.of-campo input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
.of-locais { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 14px; }
.of-apagar { margin-left: auto; padding: 4px 12px; font-size: 13px; }

.conta-dica { margin: 8px 0 14px; font-size: 14px; color: var(--text-muted); }
.conta-dica code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  background: var(--surface-2); border-radius: 5px; padding: 1px 6px;
  color: var(--text-secondary); }

/* Competicoes no Painel. Grade de cinco colunas: peso, nome,
   na home, cobertura e quantos jogos aquela liga ja trouxe. A
   contagem esta ali para responder a unica pergunta que importa
   depois de ligar uma liga nova: veio alguma coisa? */
.lg-conta { display: flex; flex-wrap: wrap; gap: 8px 18px; margin: 12px 0 4px;
  font-size: 13.5px; color: var(--text-muted); }
.lg-conta strong { color: var(--text-primary); font-variant-numeric: tabular-nums; }
/* SEIS COLUNAS NAO CABEM EM 390 PIXELS, E A GRADE NAO AVISA.
   A soma das faixas fixas mais os vaos da 400px, e a tabela tinha
   238 disponiveis: o `1fr` do nome colapsava e os selects ficavam
   espremidos um no outro. Rolagem horizontal com `min-width:
   max-content` e a mesma solucao que a tabela de classificacao do
   site ja usa -- a tabela inteira continua legivel, so anda de lado.
   `overscroll-behavior-inline: contain` impede que o gesto de rolar
   a tabela vire "voltar pagina" no celular. */
.lg-tabela { display: grid; gap: 4px; max-height: 460px; overflow: auto;
  overscroll-behavior-inline: contain; margin: 12px 0; padding-right: 4px; }
.lg-cab, .lg-linha { min-width: max-content; }
.lg-cab, .lg-linha { display: grid; align-items: center; gap: 10px;
  grid-template-columns: 62px minmax(0, 1fr) 94px 118px 52px 54px; }
.lg-cab { padding: 0 10px 4px; font-size: 12px; font-weight: 600;
  letter-spacing: .05em; color: var(--text-muted);
  position: sticky; top: 0; z-index: 1; background: var(--surface-1); }
.lg-cab span:last-child, .lg-jogos { text-align: right; }
/* "Nos blocos": so leitura. Quem muda isto e o peso e a caixa "Na
   home" da mesma linha. Ver a 097 e a 098. */
.lg-edit { text-align: center; font-size: 12.5px; font-weight: 700;
  color: var(--text-disabled); }
.lg-edit.sim { color: var(--success); }
.lg-linha { padding: 6px 10px; border-radius: 8px; background: var(--surface-2);
  border-left: 3px solid transparent; }
.lg-linha.e-principal { border-left-color: var(--accent); }
.lg-linha input[type="number"], .lg-linha select { font: inherit; font-size: 14px;
  background: var(--surface-1); border: 1px solid var(--border-subtle);
  border-radius: 6px; color: var(--text-primary); padding: 5px 6px; min-width: 0; }
.lg-linha input[type="number"] { text-align: center; font-variant-numeric: tabular-nums; }
.lg-linha input:focus, .lg-linha select:focus { outline: 2px solid var(--accent);
  outline-offset: 1px; }
.lg-nome { display: flex; align-items: center; gap: 8px; min-width: 0; }
.lg-nome img { width: 20px; height: 20px; object-fit: contain; flex: none; }
.lg-nome b { font-size: 14.5px; font-weight: 500; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; }
.lg-nome small { flex: none; font-size: 13px; color: var(--text-muted); }
.lg-check { display: flex; align-items: center; gap: 6px; font-size: 13.5px;
  color: var(--text-secondary); cursor: pointer; }
.lg-check input { flex: none; }
.lg-jogos { font-size: 13.5px; color: var(--text-muted);
  font-variant-numeric: tabular-nums; }

/* Competicao que a API nao acompanha minuto a minuto. Aviso e nao
   erro: nao ha o que consertar, e uma limitacao da fonte, e quem
   decide o que fica na home precisa ver isso antes de decidir. */
.lg-alerta { grid-column: 2 / -1; justify-self: start; margin-top: 2px;
  padding: 2px 8px; border-radius: var(--radius-pill);
  font-size: 12px; font-weight: 600;
  background: rgba(240, 180, 41, .14); color: var(--ambar); }

/* Diagnostico. Verde, ambar e vermelho, e o vermelho vem primeiro
   na leitura: quando o site esta parado, a pessoa precisa saber o que
   fazer, nao ler um relatorio. */
.diag-topo { margin: 12px 0 10px; padding: 11px 14px; border-radius: 10px;
  font-size: 14.5px; font-weight: 600; border-left: 3px solid var(--text-muted);
  background: var(--surface-2); }
.diag-topo.ok { border-left-color: var(--success); }
.diag-topo.aviso { border-left-color: var(--ambar); }
.diag-topo.erro { border-left-color: var(--live); }
.diag-lista { display: grid; gap: 6px; }
.diag-item { display: grid; gap: 3px; padding: 10px 12px; border-radius: 9px;
  background: var(--surface-2); border-left: 3px solid var(--text-muted); }
.diag-item.ok { border-left-color: var(--success); }
.diag-item.aviso { border-left-color: var(--ambar); }
.diag-item.erro { border-left-color: var(--live); }
.diag-item strong { font-size: 14.5px; }
.diag-item span { font-size: 13.5px; line-height: 1.5; color: var(--text-secondary); }
.diag-item em { font-style: normal; font-size: 13.5px; font-weight: 600;
  color: var(--text-primary); }

/* A resposta crua da API. Monoespacada e rolavel: e para ler e
   copiar, nao para ficar bonita. */
.diag-cru-saida { max-height: 420px; overflow: auto; margin: 8px 0 0;
  padding: 12px 14px; border-radius: 9px; background: var(--n100);
  border: 1px solid var(--border-subtle);
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 12.5px; line-height: 1.5; color: var(--text-secondary);
  white-space: pre; -webkit-user-select: all; user-select: all; }
.diag-cru { margin-top: 8px; justify-self: start; }

/* Catalogo de competicoes da API. A lista e longa e o olho procura
   uma coisa so: os tres selos do fim dizem o que aquela liga cobre,
   e sao eles que decidem se vale ligar cobertura completa depois. */
.cat-lista { display: grid; gap: 4px; max-height: 420px; overflow-y: auto;
  margin: 12px 0; padding-right: 4px; }
.cat-item { display: flex; align-items: center; gap: 10px; min-width: 0;
  padding: 7px 10px; border-radius: 8px; background: var(--surface-2);
  cursor: pointer; }
.cat-item:hover { background: var(--n80); }
.cat-item.ja { opacity: .6; cursor: default; }
.cat-item > input { flex: none; }
.cat-item img { width: 20px; height: 20px; object-fit: contain; flex: none; }
.cat-txt { display: grid; gap: 1px; min-width: 0; flex: 1; }
.cat-txt b { font-size: 14.5px; font-weight: 500; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; }
.cat-txt small { font-size: 12.5px; color: var(--text-muted); }
.cat-selos { display: flex; gap: 4px; flex: none; }
.cat-selo { padding: 2px 7px; border-radius: var(--radius-pill);
  font-size: 12px; font-weight: 600; letter-spacing: .02em; }
.cat-selo.sim { background: rgba(60, 200, 120, .16); color: #6FE3A6; }
.cat-selo.nao { background: var(--n80); color: var(--n40);
  text-decoration: line-through; }

/* A lista agrupada por pais. Antes era uma fila unica cortada em 120
   itens: ela "acabava na Australia" sem dizer que havia mais 700
   embaixo. Agora cada pais e um grupo, com um botao que marca o pais
   inteiro, e o teto por regiao aparece escrito. */
.cat-regioes { margin: 12px 0 4px; }
.cat-conta { display: flex; flex-wrap: wrap; gap: 8px 18px; margin: 10px 0 4px;
  padding: 10px 12px; border-radius: 10px; background: var(--surface-2);
  font-size: 13px; color: var(--text-secondary); }
.cat-conta strong { color: var(--text-primary); font-variant-numeric: tabular-nums; }
.cat-pais { margin-top: 14px; }
.cat-pais-cab { display: flex; align-items: center; gap: 10px;
  padding-bottom: 6px; border-bottom: 1px solid var(--border-subtle); }
.cat-pais-cab b { font-size: 14px; font-weight: 700; }
.cat-pais-cab > span { font-size: 12px; color: var(--text-muted);
  font-variant-numeric: tabular-nums; }
.cat-pais-btn { margin-left: auto; padding: 4px 10px; border-radius: 7px;
  border: 1px solid var(--aresta); background: var(--surface-2);
  color: var(--text-secondary); font-family: var(--ui); font-size: 12.5px;
  font-weight: 600; cursor: pointer; }
.cat-pais-btn:hover { background: var(--surface-hover); color: var(--text-primary); }
/* A rolagem agora e da pagina, nao de cada grupo: com um grupo por
   pais, caixa rolavel dentro de caixa rolavel e armadilha no celular. */
.cat-pais .cat-lista { max-height: none; overflow: visible; margin: 8px 0 0; }

.uso-dias { grid-template-columns: repeat(auto-fit, minmax(14px, 1fr)); min-height: 92px; }
/* A variacao contra o periodo anterior, colada no rotulo do numero.
   Verde sobe, vermelho cai, cinza empata -- e a palavra "igual" por
   extenso, porque uma cor sozinha nao diz nada para quem nao
   distingue verde de vermelho. */
.num span em { font-style: normal; font-weight: 700; margin-left: 5px; }
.var-sobe { color: var(--success); }
.var-cai { color: var(--live); }
.var-igual { color: var(--text-muted); }
.uso-dias .fx-barras { height: 64px; }

/* telas internas ganham o mesmo bloco da pagina da partida */
.painel {
  background: var(--surface-1);
  border-radius: var(--radius-lg);
  padding: var(--s4);
  margin-bottom: var(--s4);
  box-shadow: var(--e1);
}
.painel h1 { margin: 0; }
.painel p { margin: 6px 0 0; font-size: 14px; color: var(--text-secondary); }
.time-capa {
  background: var(--surface-1);
  border-radius: var(--radius-lg);
  padding: var(--s4);
  box-shadow: var(--e1);
}
.jog-linha, .rank-linha, .jogo-time, .jogo-liga, .nome-linha {
  border-bottom-color: var(--border-subtle);
}
.jog-col {
  background: var(--surface-1);
  border-radius: var(--radius-lg);
  padding: var(--s3);
  box-shadow: var(--e1);
}

/* ============================================================
   MATERIAL  ::  o que estava faltando
   ============================================================
   Diagnostico do que deixava o site "cru e amador":

   1. Todo bloco era um retangulo arredondado de cor chapada, sem
      borda. Superficie escura sem borda nao tem aresta, entao o
      olho nao ve onde o cartao comeca. A correcao nao e mais
      sombra: e uma borda de 1px e um brilho de 1px no topo, que e
      como material real reage a luz.

   2. O fundo era uma cor lisa. Tela inteira de uma cor so parece
      papel de parede, nao produto.

   3. Tudo azul. Sem uma segunda e uma terceira cor com funcao, a
      pagina vira uma mancha.

   4. Nada se mexia. Sem resposta ao mouse o site parece imagem.
   ============================================================ */

/* ---------- o fundo e chapado, e isso e a escolha ----------

   Eram dois halos, um azul e um roxo, nos cantos da tela. Com a
   escala navy eles passavam despercebidos; sobre cinza neutro viram
   duas manchas coloridas, e manchas coloridas no fundo tiram do azul
   do produto o unico trabalho que ele tem, que e destacar.

   O que da profundidade agora e o degrau entre as superficies
   (n100 -> n90 -> n85 -> n80), que e o mesmo recurso que o FotMob
   usa: cinza sobre cinza, sem cor nenhuma embaixo. */
body {
  background: var(--n100);
  background-attachment: fixed;
}
/* trama fina por cima, para o degrade nao virar borrao de cor */
body::after {
  content: '';
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  opacity: .5;
  background-image:
    linear-gradient(rgba(255, 255, 255, .014) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255, 255, 255, .014) 1px, transparent 1px);
  background-size: 48px 48px;
}
.app { position: relative; z-index: 1; }

/* ---------- a aresta em tudo que e superficie ---------- */
.bloco,
.caixa,
.painel,
.time-capa,
.cabeca,
.grupo-bloco,
.chave-fase,
.row-jogo,
.info-item,
.jog-col,
.dest,
.h2h-card,
.oa-canal,
.mando-lado,
.pt-time,
.chave-jogo,
.mjs-jogo,
.jds,
.busca-caixa {
  border: 1px solid var(--aresta);
  box-shadow: var(--e1), var(--brilho-topo);
}

.bloco, .caixa, .painel, .grupo-bloco, .chave-fase { border-radius: 14px; }
.bloco { overflow: hidden; }

/* cabecalho do bloco: quadradinho de cor + titulo, no lugar da
   barrinha torta que nao dizia nada */
.bloco::before { display: none; }
.bloco-tit {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 0;
  padding: 13px var(--s4);
  border-bottom: 1px solid var(--aresta);
  background: rgba(255, 255, 255, .022);
  font-family: var(--display);
  font-weight: 700;
  letter-spacing: .01em;
  color: var(--n0);
}
/* A barra inclinada antes do titulo saiu: era decoracao. */
/* cada assunto ganha a sua cor, para a pagina nao ser um azul so */
.bloco:nth-of-type(3n+2) .bloco-tit::before { background: var(--roxo); }
.bloco:nth-of-type(3n) .bloco-tit::before { background: var(--verde); }

/* o corpo do bloco respira dentro, e nao encosta na borda */
.bloco > *:not(.bloco-tit) { margin-left: var(--s4); margin-right: var(--s4); }
.bloco > *:first-child:not(.bloco-tit) { margin-top: var(--s4); }
.bloco > *:last-child { margin-bottom: var(--s4); }
.bloco-pe {
  margin: var(--s3) 0 0;
  padding: var(--s3) var(--s4);
  border-top: 1px solid var(--aresta);
  background: rgba(0, 0, 0, .18);
  color: var(--text-muted);
}
.bloco > .bloco-pe { margin-left: 0; margin-right: 0; margin-bottom: 0; }

/* o mesmo para a caixa do trilho */
.caixa-topo {
  margin: calc(var(--s3) * -1) calc(var(--s3) * -1) var(--s3);
  padding: 12px var(--s3);
  border-bottom: 1px solid var(--aresta);
  background: rgba(255, 255, 255, .022);
  /* "DESTAQUES DE HOJE", "JOGADOR DA SEMANA", "TABELAS" em caixa alta
     e negrito, um embaixo do outro, davam o mesmo peso a tudo. Vira
     frase, e o peso passa a vir do tamanho. */
  font-size: 16px;
  font-weight: 600;
  letter-spacing: -.01em;
  border-radius: 13px 13px 0 0;
}
.caixa-nota {
  margin: var(--s3) calc(var(--s3) * -1) calc(var(--s3) * -1);
  padding: 10px var(--s3);
  border-top: 1px solid var(--aresta);
  background: rgba(0, 0, 0, .18);
}

/* ---------- contraste dentro dos blocos ---------- */
.rodada-sep {
  color: var(--n0);
  font-weight: 700;
  letter-spacing: .07em;
  text-transform: uppercase;
  font-size: 12.5px;
  padding-top: var(--s4);
}
.stat-linha strong { color: var(--n0); font-size: 16px; font-weight: 700; }
.stat-linha span { color: var(--text-secondary); font-size: 13.5px; }
.stat-barra { height: 7px; border-radius: 4px; background: rgba(0, 0, 0, .34); overflow: hidden; }
/* A barra usa a cor do uniforme dos times. As duas variaveis sao
   escritas no elemento raiz da pagina da partida pelo JavaScript, ja
   com contraste garantido entre si e com o fundo. A reserva no
   var() e o azul e o roxo de antes: se a pagina nao for de partida,
   ou se o time nao tiver cor na base, nada quebra.

   O lado que perdeu fica mais apagado, nao cinza: cinza tirava a
   informacao de quem e a barra justamente no lado que precisa dela,
   porque o lado maior ja se identifica pelo tamanho. */
.stat-casa, .stat-fora { height: 100%; transition: width 520ms cubic-bezier(.22, .9, .28, 1); }
.stat-casa {
  background: var(--cor-casa, var(--accent));
  border-radius: 4px 0 0 4px;
}
.stat-fora {
  background: var(--cor-fora, var(--roxo));
  border-radius: 0 4px 4px 0;
}
.stat-casa:not(.maior), .stat-fora:not(.maior) { opacity: .45; }

/* A bolinha da legenda, para a pessoa saber de quem e cada cor. */
.um-cor { width: 9px; height: 9px; border-radius: 50%; flex: none; display: inline-block; }
.um-cor.de-casa { background: var(--cor-casa, var(--accent)); }
.um-cor.de-fora { background: var(--cor-fora, var(--roxo)); }

.hc-val { color: var(--n0); }
.h2h-card { border-radius: 11px; background: rgba(255, 255, 255, .03); }
.h2h-card:nth-child(4n+2) .hc-val { color: var(--verde); }
.h2h-card:nth-child(4n+3) .hc-val { color: var(--ambar); }
.h2h-card:nth-child(4n) .hc-val { color: var(--roxo); }
.h2h-lado strong, .h2h-meio strong { color: var(--n0); }
.h2h-a { background: var(--cor-casa, var(--accent)); }
.h2h-b { background: var(--cor-fora, var(--roxo)); }

.info-item { border-radius: 11px; background: rgba(255, 255, 255, .03); }
.info-ico { background: rgba(46, 111, 224, .13); }
.info-item:nth-child(2) .info-ico { background: rgba(71, 188, 132, .13); color: var(--verde); }
.info-item:nth-child(3) .info-ico { background: rgba(255, 198, 43, .13); color: var(--ambar); }
.info-item:nth-child(4) .info-ico { background: rgba(139, 108, 255, .13); color: var(--roxo); }
.info-item:nth-child(5) .info-ico { background: rgba(235, 36, 68, .13); color: var(--live); }

.ficha div { border-bottom-color: var(--aresta); }
.ficha strong { color: var(--n0); }

/* ---------- MOVIMENTO ---------- */
@keyframes entrar {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: none; }
}
@keyframes brilhar {
  from { background-position: -160% 0; }
  to { background-position: 260% 0; }}

.bloco, .caixa, .grupo-bloco, .chave-fase {
  animation: entrar 340ms cubic-bezier(.22, .9, .28, 1) both;
}
.bloco:nth-of-type(2), .caixa:nth-of-type(2) { animation-delay: 50ms; }
.bloco:nth-of-type(3), .caixa:nth-of-type(3) { animation-delay: 100ms; }
.bloco:nth-of-type(4), .caixa:nth-of-type(4) { animation-delay: 150ms; }
.bloco:nth-of-type(n+5), .caixa:nth-of-type(n+5) { animation-delay: 190ms; }

.row-jogo { animation: entrar 300ms cubic-bezier(.22, .9, .28, 1) both; }
.linhas .row-jogo:nth-child(2) { animation-delay: 30ms; }
.linhas .row-jogo:nth-child(3) { animation-delay: 60ms; }
.linhas .row-jogo:nth-child(4) { animation-delay: 90ms; }
.linhas .row-jogo:nth-child(n+5) { animation-delay: 110ms; }

/* o mouse tem que ter resposta */
.row-jogo,
.mjs-jogo,
.jds,
.chave-jogo,
.destaque,
.dest,
.oa-canal,
.info-item {
  transition: transform var(--mola), box-shadow var(--mola),
              background var(--mola), border-color var(--mola);
}
.row-jogo:hover,
.mjs-jogo:hover,
.jds:hover,
.chave-jogo:hover,
.destaque:hover {
  transform: translateY(-2px);
  border-color: var(--aresta-forte);
  box-shadow: var(--e2), var(--brilho-topo);
}
.row-jogo:active, .mjs-jogo:active, .jds:active, .chave-jogo:active { transform: translateY(0); }

.tab-linha, .mini-linha { transition: background var(--mola), transform var(--mola); }
.tab-linha:hover { background: rgba(255, 255, 255, .05); transform: translateX(2px); }
.mini-linha:hover { background: rgba(255, 255, 255, .05); }

.chip, .data, .ml, .mi, .ic-topo, .caixa-pe, .el-jog, .voto, .oa-v, .rede, .rodape-col button, .rodape-col a {
  transition: background var(--mola), color var(--mola), transform var(--mola), box-shadow var(--mola);
}
.chip:hover, .ml:hover { transform: translateY(-1px); }
.ic-topo:hover { transform: translateY(-1px) scale(1.04); }
.voto:hover { background: var(--n70); }
.oa-v:hover { background: var(--n80); }
.el-jog:hover { background: rgba(255, 255, 255, .05); }

/* a barra do palpite enche em vez de aparecer pronta */
.voto-barra { transition: width 620ms cubic-bezier(.22, .9, .28, 1); }
.dg-barra { transition: width 560ms cubic-bezier(.22, .9, .28, 1); }
.fx-barras span { transition: height 520ms cubic-bezier(.22, .9, .28, 1); }

/* jogo ao vivo tem um brilho que atravessa a linha devagar */
.row-jogo.ao-vivo::after {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: inherit;
  pointer-events: none;
  background: linear-gradient(100deg,
    transparent 38%, rgba(235, 36, 68, .10) 50%, transparent 62%);
  background-size: 220% 100%;
  animation: brilhar 4.2s ease-in-out infinite;
}

/* esqueleto de carregamento pulsando, em vez de caixa parada */
.esqueleto > div {
  background: linear-gradient(90deg,
    var(--surface-1) 25%, var(--surface-2) 50%, var(--surface-1) 75%);
  background-size: 220% 100%;
  animation: brilhar 1.5s linear infinite;
}

/* ---------- aba ativa com ponto, como no kit ---------- */
.topo-nav .mi { position: relative; }
.topo-nav .mi.ativo::after {
  content: '';
  position: absolute;
  left: 50%;
  bottom: -9px;
  width: 5px;
  height: 5px;
  margin-left: -2.5px;
  border-radius: 50%;
  background: var(--accent);
  box-shadow: 0 0 10px var(--accent);
}
.bb.ativo { position: relative; }
.bb.ativo::before {
  content: '';
  position: absolute;
  top: -1px;
  left: 50%;
  width: 18px;
  height: 2px;
  margin-left: -9px;
  border-radius: 0 0 2px 2px;
  /* Terceiro sinal, e ele e o MENOS visivel dos tres de proposito.
     Icone azul + texto azul ja dizem qual aba esta aberta; a barra
     existe para quem nao distingue a cor, nao para reforcar uma
     coisa que ja esta dita duas vezes. Era 3px em azul cheio e
     somava um quarto grito na mesma esquina. */
  background: color-mix(in srgb, var(--accent) 65%, transparent);
}

/* ============================================================
   cabecalho da partida com a faixa de informacao
   ============================================================ */

/* O refletor azul fixo que estava aqui saiu: era o mesmo halo para
   um jogo do Brasileirao e um da Champions. Quem pinta a luz agora e
   a camada de atmosfera, que sabe qual e a competicao. */
/* A coluna do cabecalho ocupa a largura inteira do cartao.
   Sem isto, `justify-content: center` no grid dimensiona a faixa pelo
   MAIOR item e centraliza a coluna: quem tenta sair do padding com
   margem negativa (a barra da competicao, a faixa de data e estadio)
   sai da COLUNA, e nao do cartao, e para a oito pixels da borda. Era
   assim que a faixa de baixo aparecia: um retangulo escuro flutuando
   sem encostar em lado nenhum, que de longe lia como sombra torta. */
.cabeca {
  background: var(--surface-1);
  border-radius: 16px;
  padding: var(--s4) var(--s4) 0;
  overflow: hidden;
  grid-template-columns: minmax(0, 1fr);
}
.cabeca-faixa { justify-self: stretch; }
/* No cabecalho da partida a atmosfera pode ser um pouco mais forte:
   esta tela tem uma competicao so, e o placar e enorme. */
.cabeca.tem-atmosfera { --atm-forca: 1.18; }
.cabeca.tem-atmosfera::after { border-radius: 16px 16px 0 0; }

/* No painel lateral o duelo ganha a mesma noite, em dose menor:
   a coluna e estreita e o texto fica mais perto do fundo. */
.pj-duelo.tem-atmosfera { --atm-forca: .82; border-bottom: 1px solid var(--aresta); }
/* Eyebrow de verdade: pequeno, discreto e em cima. Era azul e
   negrito, competindo com o placar, que e a unica coisa que alguem
   abre esta tela para ver. */
/* A competicao vira uma BARRA no alto do cartao, e nao uma legenda
   solta boiando dentro dele.
   Isto veio do painel lateral: la o cabecalho comeca com uma faixa
   propria, com o nome da competicao aceso e um fio embaixo, e o
   duelo comeca depois dela. E o pedaco da tela que funcionou, entao
   ele passa a valer tambem na pagina inteira e no celular, que usam
   este mesmo componente. O ganho nao e enfeite: a barra fecha o topo
   do cartao e da uma primeira linha de leitura ("onde estou") antes
   do placar, em vez de deixar o placar comecar no vazio. */
.cabeca-liga {
  justify-self: stretch;
  margin: calc(var(--s4) * -1) calc(var(--s4) * -1) 0;
  padding: 11px var(--s4);
  border-bottom: 1px solid rgba(255, 255, 255, .07);
  background: rgba(6, 14, 24, .5);
  font-size: 12.5px;
  font-weight: 700;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--accent);
  text-align: center;
}
/* Compartilhar como imagem: no canto da faixa da competicao, que ja e
   a "barra de titulo" do cartao. O nome da competicao ganha folga dos
   DOIS lados para continuar centrado e nunca passar por baixo do botao.
   `.cabeca .cabeca-liga` (duas classes) de proposito: o ajuste do
   celular redefine o padding com uma classe so, e aqui so mexemos nas
   laterais. */
.cabeca .cabeca-liga { padding-left: 46px; padding-right: 46px; }
/* `.cabeca >` e nao so a classe: `.tem-atmosfera > *` (mais abaixo no
   arquivo) poe `position: relative` em todo filho do cartao, e com a
   mesma forca ganharia por vir depois -- o botao caia no meio do fluxo,
   centralizado em cima do nome da competicao. */
.cabeca > .btn-compartilhar {
  position: absolute; top: 2px; right: 6px; z-index: 2;
  display: grid; place-items: center; width: 34px; height: 34px;
  border: 0; border-radius: 9px; background: none; cursor: pointer;
  color: var(--text-muted);
}
.btn-compartilhar svg { width: 19px; height: 19px; }
.btn-compartilhar:hover, .btn-compartilhar:focus-visible { color: var(--text-primary); background: rgba(255, 255, 255, .07); }
.btn-compartilhar.gerando, .pj-x.gerando { opacity: .45; pointer-events: none; }
.pj-x svg { width: 17px; height: 17px; }
/* A faixa NAO leva fundo proprio.
   Levava `rgba(0,0,0,.22)` chapado, e por baixo dela a atmosfera ja
   escurece o pe do cartao com um degrade. Cor chapada sobre degrade
   da um retangulo de borda dura no meio de uma transicao macia: de
   longe parecia uma sombra torta colada ali, que foi exatamente como
   apareceu no relato. Agora quem escurece e so a atmosfera, e a
   faixa se separa do placar por um fio, que e o suficiente. */
.cabeca-faixa {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--s2) var(--s5);
  margin: var(--s4) calc(var(--s4) * -1) 0;
  padding: 12px var(--s4) 14px;
  border-top: 1px solid rgba(255, 255, 255, .07);
  background: none;
}
.cf-item {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-size: 13px;
  color: var(--text-secondary);
}
.cf-item i { display: grid; place-items: center; width: 14px; height: 14px; color: var(--accent); }
.cf-item i svg { width: 14px; height: 14px; }

/* botao de texto dentro de um aviso */
.lnk {
  border: 0;
  background: none;
  padding: 0;
  color: var(--accent);
  font-family: inherit;
  font-size: inherit;
  font-weight: 600;
  cursor: pointer;
  text-decoration: underline;
  text-underline-offset: 2px;
}
.formula { display: block; margin-top: 8px; color: var(--text-muted); }

/* ============================================================
   barra de topo: a leitura do kit Mabol no nosso azul
   ============================================================
   No kit a busca e so a lupa, o sino fica do lado, e a aba ativa
   tem uma cor viva com um ponto em cima. A barra fica escura e o
   conteudo e que tem cor. */

.topo {
  background: linear-gradient(180deg, rgba(5, 11, 20, .96), rgba(5, 11, 20, .88));
  border-bottom: 1px solid var(--aresta);
}
.topo.descolou { box-shadow: 0 6px 24px rgba(0, 0, 0, .46); }
.topo-nav .mi { color: var(--text-secondary); font-weight: 600; }
.topo-nav .mi:hover { color: var(--n0); background: rgba(255, 255, 255, .05); }
.topo-nav .mi.ativo { color: var(--accent); background: rgba(46, 111, 224, .12); }

.ic-topo { background: rgba(255, 255, 255, .05); border: 1px solid var(--aresta); }
.ic-topo:hover { background: rgba(46, 111, 224, .16); color: var(--accent); }
.ic-topo.perfil.logado { border-color: var(--accent); }

.busca { background: rgba(255, 255, 255, .045); border: 1px solid var(--aresta); }
.busca:focus-within { border-color: var(--accent); background: rgba(46, 111, 224, .07); }

/* lateral de competicoes */
.menu-titulo {
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--text-muted);
  padding-bottom: var(--s2);
  border-bottom: 1px solid var(--aresta);
  margin-bottom: var(--s2);
}
.ml {
  border-radius: 9px;
  border-left: 2px solid transparent;
}
.ml:hover { background: rgba(255, 255, 255, .05); border-left-color: var(--aresta-forte); }
.ml.ativo { background: rgba(46, 111, 224, .12); border-left-color: var(--accent); color: var(--accent); }

/* chips de filtro com aresta */
.chips:not(.abas) .chip {
  border: 1px solid var(--aresta);
  background: rgba(255, 255, 255, .035);
}
.chips:not(.abas) .chip:hover { border-color: var(--aresta-forte); }
.chips:not(.abas) .chip.ativo {
  background: rgba(46, 111, 224, .16);
  border-color: var(--accent);
  color: var(--accent);
}

/* abas da partida: sublinhado vivo em vez de linha apagada */
.chips.abas { border-bottom: 1px solid var(--aresta); gap: var(--s4); }
/* Esta linha existia aqui embaixo e reaplicava a caixa alta nas abas
   por cima da regra principal, que fica setecentas linhas acima. Duas
   regras com o mesmo seletor em pontos distantes do arquivo: quem
   vence e a de baixo, e quem edita a de cima nao entende por que nada
   mudou. Ver a lista de seletores repetidos em npm run auditoria. */
/* A aba ativa era azul, e cor sozinha nao pode carregar estado: em
   escala de cinza as cinco abas viravam a mesma coisa. Agora o sinal
   e contraste do texto mais peso mais o indicador embaixo, e o azul
   fica so no indicador. */
.chips.abas .chip:hover { color: var(--text-secondary); }
.chips.abas .chip.ativo {
  color: var(--text-primary);
  font-weight: var(--peso-titulo);
  border-bottom-color: var(--brand);
}

/* A faixa de dias tinha DUAS definicoes de "dia escolhido": esta, de
   contorno azul, e a de baixo, de pilula azul cheia. Dependendo de
   qual ganhava, o dia selecionado aparecia ora preenchido ora so com
   um anel, e no celular isso parecia defeito. Ficou uma so, a de
   baixo. */

/* ============================================================
   campinho da escalacao
   ============================================================
   Estava quebrado: o circulo do meio caia em cima de um jogador,
   a numeracao encostava na foto e as linhas do gramado nao tinham
   relacao com as posicoes. Agora o gramado e um fundo desenhado,
   e o jogador e um item de grade com a numeracao presa no canto. */

/* O gramado e o CONTAINER inteiro, nao a faixa do meio. Era esse o
   erro: o fundo e o circulo central estavam sendo desenhados numa
   tira fina entre as duas metades, entao o circulo caia em cima de
   um jogador e a grama nao cobria o campo. */
.gramado {
  position: relative;
  border-radius: 14px;
  overflow: hidden;
  background:
    repeating-linear-gradient(180deg,
      rgba(255, 255, 255, .016) 0 38px,
      rgba(255, 255, 255, .040) 38px 76px),
    linear-gradient(180deg, #0C2A1C, #07190F);
  border: 1px solid var(--aresta);
  box-shadow: var(--e1), inset 0 0 90px rgba(0, 0, 0, .45);
}
/* o gramado listrado ja vem do ::before antigo; aqui so a cor */
.gramado::before { background-color: transparent; }
.gramado::after { border-width: 1px; border-color: rgba(255, 255, 255, .14); border-radius: 8px; }

/* a faixa do meio e a linha de 2px da grade. Ela desenha a linha
   central e o circulo, e NAO desloca jogador nenhum. */
.meio-campo { position: relative; z-index: 0; }
.meio-campo::before {
  content: '';
  position: absolute;
  left: 12px;
  right: 12px;
  top: 0;
  height: 1px;
  background: rgba(255, 255, 255, .18);
  pointer-events: none;
}
.meio-campo::after {
  content: '';
  position: absolute;
  left: 50%;
  top: 0;
  width: 86px;
  height: 86px;
  margin: -43px 0 0 -43px;
  border: 1px solid rgba(255, 255, 255, .16);
  border-radius: 50%;
  pointer-events: none;
}
.meio-campo span {
  position: absolute;
  left: 50%;
  top: 0;
  width: 6px;
  height: 6px;
  margin: -3px 0 0 -3px;
  border-radius: 50%;
  background: rgba(255, 255, 255, .22);
}
.lado-campo { z-index: 1; }
.lado-campo::before, .lado-campo::after { border-color: rgba(255, 255, 255, .16); }
.campo-jog { position: relative; z-index: 2; }
.campo-foto {
  width: 42px;
  height: 42px;
  border: 2px solid rgba(255, 255, 255, .22);
  box-shadow: 0 2px 8px rgba(0, 0, 0, .5);
}
/* O NUMERO DA CAMISA SAIU DE CIMA DO ROSTO.
   Ele era um selo de 18px grudado no canto de baixo a direita de um
   retrato de 42px, e dividia esse retrato com a nota (canto de cima a
   esquerda) e com os gols e cartoes (canto de cima a direita). Tres
   selos em 42px: no Brobbey, com 9.6, tres gols e a camisa 9, o rosto
   praticamente sumia.
   A nota e as marcas ficam, porque sao o que aconteceu NAQUELA
   partida. O numero nao muda de jogo para jogo e faz o mesmo trabalho
   -- ajudar a achar o jogador -- na linha do nome, onde nao cobre
   nada. */
.campo-num {
  font-family: var(--display);
  font-size: 12px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--n20);
  opacity: .8;
  margin-right: 4px;
}
/* O nome do jogador e conteudo, e conteudo nao leva reticencias na
   terceira letra.
   No campo saiam "M. Dmitro...", "Roger Hin...", "Edu Exposi...",
   "Alex Calatr..." -- quatro dos onze. Num desenho cuja unica funcao
   e dizer QUEM esta em campo, isso e o desenho falhando.
   A ordem do conserto e: nome curto (nomeDeJogador ja corta em dois
   termos), depois duas linhas, depois fonte menor, e reticencias so
   em ultimo caso. Duas linhas cabem: o espaco entre as fileiras do
   campo e maior que a altura de uma linha de 11px. */
.campo-nome {
  font-size: 12px;
  font-weight: 600;
  color: var(--n0);
  text-shadow: 0 1px 3px rgba(0, 0, 0, .8);
  text-align: center;
  line-height: 1.15;
  white-space: normal;
  overflow-wrap: anywhere;
  /* Duas linhas e o teto. Na terceira o nome comeca a encostar no
     jogador de baixo, e ai o remedio vira o problema. */
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* correcoes do campinho, vistas no teste de tela
   ------------------------------------------------------------
   1. A grande area do time visitante aparecia colada no meio do
      campo. O lado ja e virado com scaleY(-1), e as regras .fora
      viravam a area DE NOVO trocando top por bottom: duas
      inversoes voltam ao lugar errado. Basta nao inverter.
   2. Nome cortado em "Marcos ..." com 84px. Cabe mais.
   3. O goleiro de baixo encostava na borda. */

.lado-campo.fora::before { top: 14px; bottom: auto; border-top: 0;
  border-bottom: 2px solid rgba(255, 255, 255, .16); border-radius: 0 0 12px 12px; }
.lado-campo.fora::after { top: 14px; bottom: auto; border-top: 0;
  border-bottom: 2px solid rgba(255, 255, 255, .16); border-radius: 0 0 8px 8px; }
.campo-nome { max-width: 108px; }
.campo-jog { max-width: 108px; }
.gramado { padding: 26px 14px 30px; }

/* ============================================================
   densidade
   ============================================================
   Reclamacao: "tudo parece muito grande, parece que tem poucas
   infos na tela". Estava certo. A linha de jogo ocupava 74px de
   altura mais 12 de respiro: 86px por partida, seis jogos por tela
   de celular. Um placar ao vivo tem que caber mais.

   Este bloco encolhe as alturas de linha, a tipografia de titulo e
   os respiros, e alarga o container. Nao mexe em cor nem em sombra:
   contraste e profundidade continuam iguais.

   Alvo de leitura: nada de texto abaixo de 12px, nada de alvo de
   toque abaixo de 36px. Densidade nao pode virar letra miuda. */

#conteudo, .rodape { max-width: 1320px; }

/* topo */
.mi { height: 38px; padding: 0 12px; border-radius: 10px; font-size: 15px; }
.busca { height: 38px; border-radius: 10px; }
.ic-topo { width: 38px; height: 38px; }
.ic-topo.perfil { width: 38px; }
.topo-marca img.brand-logo { max-height: 40px; }

/* faixa de dias */
.data, .data-seta, .data-atalho { height: 42px; }
.data { height: 42px; min-width: 72px; padding: 0 9px; }
.data-seta { width: 30px; height: 42px; font-size: 17px; }

/* cabecalho de secao.
   Estava em 15px, MENOR que o titulo do cartao do PRO (17px) que fica
   dentro de uma secao. Cabecalho tem que ser maior que o que ele
   encabeca, senao a hierarquia da tela esta invertida. */
.secao { font-size: var(--font-title); margin: 20px 0 10px; min-height: 26px; gap: 9px;
  letter-spacing: -.02em; }

/* a linha de jogo, que e o que mais aparece no site */
.linhas { gap: 6px; }
.row-jogo {
  grid-template-columns: 66px minmax(120px, 1fr) 74px minmax(120px, 1fr) 34px;
  min-height: 56px;
  padding: 7px 13px;
  border-radius: 12px;
}
.rj-placar { font-size: 20px; }
.rj-placar { font-size: 16px; }
.row-jogo.compacta .rj-placar { font-size: 17px; }

/* listas e tabelas */
.tab-linha { height: 38px; font-size: 14.5px; }
.mini-linha { height: 34px; font-size: 14px; }
.jogo-time { height: 42px; }
.jogo-liga { height: 44px; }
.rank-linha { height: 38px; font-size: 14.5px; }
.nome-linha { height: 40px; }
.lance { min-height: 42px; padding: var(--s1) var(--s3); }
.ficha div { min-height: 36px; font-size: 14.5px; }
.confronto { height: 36px; font-size: 15px; }
/* Duas linhas agora: a altura fixa cortava a de baixo. */
.confrontos-lista .confronto { height: auto; min-height: 36px; }
.podio-item img { width: 40px; height: 40px; }
.podio-item:first-child img { width: 46px; height: 46px; }
.podio-num b { font-size: 21px; }

/* trilho */
.caixa { padding: 12px 12px 9px; }
.caixa-topo { font-size: 16px; margin-bottom: 9px; }
.caixa-topo span { font-size: 13.5px; padding: 6px 9px; border-radius: 9px; }
.caixa-pe { font-size: 14px; margin-top: 8px; }
.trilho { gap: 12px; }

/* pagina da partida */
.painel h1 { font-size: 23px; }
.chips.abas .chip { height: 38px; font-size: var(--font-body); }
.duelo { gap: 28px; }
.duelo-time span { font-size: 17.5px; }
.bloco { padding: var(--s4) var(--s4) 14px; margin-bottom: var(--s4); }
.bloco-tit { font-size: 14px; margin-bottom: 10px; }
.bloco-pe { margin-top: 10px; font-size: 12.5px; }
.info-jogo { grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 10px; margin-bottom: var(--s3); }
.info-item { min-height: 56px; padding: 10px; gap: 10px; }
.info-ico { width: 30px; height: 30px; }
.info-ico svg { width: 16px; height: 16px; }
.info-txt strong { font-size: 14px; }
.voto { height: 40px; }
.cd-time { min-height: 40px; }
.h2h-card { padding: 10px; }
.hc-val { font-size: 20px; }
.dest { padding: 10px; }
.dest-foto, .dest .avatar-fallback { width: 34px; height: 34px; }
.dest-grafico { gap: 5px; }
.dg-linha { grid-template-columns: 86px 1fr 24px; }
.cc-jogo { height: 34px; font-size: 14px; }
.el-jog { font-size: 14px; }
.mando-lado strong { font-size: 23px; }
.grupo-bloco, .chave-fase { padding: var(--s3); }
.chave-jogo { padding: 10px; margin-bottom: 6px; }

/* Proporcao do estudo: 744 de conteudo para 364 de coluna da direita.
   Sem teto, numa tela de 1900 o meio ficava tres vezes maior que a
   direita e a pagina parecia torta. */
:root { --rail-w: 348px; --painel-w: 520px; }

/* ============================================================
   kit aplicado :: o desenho aprovado no estudo
   Cartao de jogo, lateral com conteudo, colunas que acompanham
   a rolagem. Esta camada e a ultima antes das media queries, entao
   e ela que vale quando briga com as regras antigas.
   ============================================================ */

/* ---------- lista de jogos ----------
   Era um cartao por jogo, em grade de tres colunas. A grade igualava a
   altura de todos os cartoes da fileira pela do mais alto, e como a
   maioria dos jogos nao tem gol para listar, sobrava um vazio grande
   embaixo dos nomes. Em lista cada jogo ocupa so a altura do que tem e
   o placar de todos cai na mesma coluna, que e o que o olho procura
   quando corre a pagina. O grupo da competicao vira um painel unico e
   as partidas se separam por fio, nao por espaco. */
.linhas { display: grid; gap: 0; background: var(--surface-1); padding: 0; border: 0;
  border-radius: 10px; overflow: hidden; }
/* Dentro do cartao da competicao quem desenha a caixa e o grupo. */
.grupo-liga .linhas { background: transparent; border-radius: 0; }
/* ============================================================
   A LINHA DA HOME, CENTRADA
   ============================================================
   UM DEGRAU DE CORPO EM TUDO.
   Com a linha centrada e a coluna do estado fora do caminho sobrou
   largura, e o pedido foi "aumenta um pouco a fonte, sem exagero, so
   para ficar mais legivel". Subiu um degrau em cada peca -- nome 14
   para 15, placar 18 para 20, gols e rodape 11,5 para 12,5 -- e os
   escudos subiram junto, senao o desenho fica pequeno ao lado de um
   texto maior. Nada aqui passa de 11%: e legibilidade, nao destaque.

   Terceira arrumacao desta linha, e as duas primeiras erraram pelo
   mesmo motivo: tentaram resolver o alinhamento mexendo nas faixas e
   deixando o conteudo encostado num canto.

   . A primeira punha o placar numa coluna fixa no meio e os nomes nas
     bordas: sobravam 200px de nada entre o estado e o nome.
   . A segunda empacotou tudo a esquerda, logo depois do estado: o
     vazio sumiu, mas o placar passou a cair num x diferente em cada
     linha, porque nome de time tem tamanhos diferentes. Numa lista de
     trinta jogos, trinta placares em trinta posicoes. O veredito do
     dono do produto: "cada time em um lugar sem padrao nenhum".

   A instrucao dele foi direta e esta certa: centraliza tudo, e o
   estado sobe para cima do placar. E o que faz o placar cair SEMPRE
   no mesmo x -- o centro -- sem precisar de faixa fixa nenhuma, e o
   que libera a coluna de 54px que existia so para segurar a palavra
   "Intervalo".

   Uma coluna so, tudo centrado, nesta ordem:
     estado (minuto, Fim, Intervalo)
     nome escudo  PLACAR  escudo nome
     gols, cada lado embaixo do seu time
     agregado, competicao, onde passa
   ============================================================ */
.row-jogo.jc {
  display: grid; grid-template-columns: minmax(0, 1fr);
  justify-items: center; row-gap: 4px;
  background: transparent; border: 0; border-radius: 0;
  padding: 10px 14px; margin: 0; min-height: 0; position: relative;
  box-shadow: none; transition: background var(--mola);
}
.row-jogo.jc + .row-jogo.jc { border-top: 1px solid var(--border-subtle); }
.row-jogo.jc:hover { background: var(--surface-hover); transform: none; }
.row-jogo.jc::before, .row-jogo.jc.ao-vivo::before { display: none; content: none; }
/* A linha ao vivo.
   ------------------------------------------------------------
   A versão anterior pintava a faixa INTEIRA de vermelho, de ponta a
   ponta. Com cinco jogos rolando ao mesmo tempo, a home virava cinco
   tarjas vermelhas empilhadas, e o dono do produto resumiu bem:
   "essa cor aqui é loucura".

   O vermelho agora nasce na borda esquerda, junto com a barra que já
   está lá, e MORRE em 40% da largura. O olho encontra a linha pelo
   canto, e o resto do cartão continua sendo o cartão. Quem diz "ao
   vivo" com todas as letras são o minuto e o ponto pulsando, que são
   informação, não tinta. */
/* O jogo ao vivo NAO pinta mais a linha.
   ------------------------------------------------------------
   Tinha barra vermelha na borda e um degrade vermelho atravessando o
   fundo. Com cinco jogos rolando, a home virava cinco tarjas. Quem
   diz "ao vivo" agora e so a bolinha vermelha com o minuto do lado, na
   coluna da esquerda -- que e texto, e nao tinta, e por isso pode se
   repetir cinco vezes sem cansar. */
.row-jogo.jc.ao-vivo { box-shadow: none; background: transparent; }
.row-jogo.jc.ao-vivo:hover { background: var(--surface-hover); }

/* O estado, agora em cima do placar e no centro. Era uma coluna de
   54px a esquerda, e era ela que obrigava "Intervalo" a encolher para
   11px e quebrar em duas linhas. Aqui ele tem a largura da linha. */
.jc-quando { display: flex; align-items: center; justify-content: center; gap: 6px;
  min-width: 0; max-width: 100%; }
.jc-quando:empty { display: none; }
.jc-selo { display: inline-flex; align-items: center; gap: 5px; font-size: 15px;
  font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap;
  background: none; padding: 0; border-radius: 0; letter-spacing: -.01em; }
/* A home sempre teve o vermelho certo; quem seguiu foi o resto. */
.jc-selo.vivo { color: var(--live); }
/* O ponto vermelho era pulsante. Piscar não acrescenta informação:
   quem está ao vivo já é o único vermelho da lista. */
.jc-selo.vivo s { width: 6px; height: 6px; border-radius: 50%; background: currentColor;
  text-decoration: none; }
.jc-selo.fim { color: var(--text-muted); font-weight: 600; font-size: 13.5px; }
.jc-selo.pre { color: var(--text-primary); font-weight: 700; }
/* A ESTRELA AO LADO DO TIME, E NAO EM CIMA DA LINHA.
   Ela morava na faixa de estado, centrada acima do duelo. Num jogo
   que ainda nao comecou essa faixa nao tem mais nada dentro, entao a
   estrela sozinha abria uma linha inteira e um vao de 4px que as
   outras partidas da lista nao tinham: a lista ficava com degraus.
   E, centrada, ela tambem nao dizia DE QUEM era -- marcada no
   Flamengo, aparecia no meio, equidistante dos dois times.
   Ao lado do nome ela custa zero de altura e responde a pergunta. */
.jc-fav { display: inline-grid; place-items: center; flex: none;
  color: var(--warning); }
.jc-fav svg { width: 13px; height: 13px; fill: currentColor; }

/* ------------------------------------------------------------
   Coluna 2: o duelo, tudo encostado na esquerda
   ------------------------------------------------------------
   Terceira tentativa, e as duas primeiras erraram do mesmo jeito.

   1. Tres faixas `1fr auto 1fr` com os nomes encostados no placar:
      abriu 200px de vazio entre o estado do jogo e o nome do
      mandante no desktop.
   2. O mandante com `space-between`, nome na esquerda e escudo
      colado no placar: fechou o vazio da ponta e abriu outro, de
      70px, ENTRE o nome e o proprio escudo.

   Os dois vinham da mesma ideia: manter o placar numa coluna fixa,
   igual em todas as linhas. Manter o placar alinhado custa um trilho
   de largura fixa para cada lado, e trilho de largura fixa sempre
   sobra para nome curto -- e nome de time e quase sempre curto.

   Entao o placar deixa de ser coluna. A linha e uma fila: nome,
   escudo, placar, escudo, nome, tudo grudado e encostado na
   esquerda, logo depois do minuto. O placar cai onde cair. E o que o
   FotMob faz, e e a resposta certa para "ta tudo pra direita demais":
   nao tem nada a direita porque nao tem nada empurrando.

   Os dois lados podem encolher (`0 1 auto` com `min-width: 0`), entao
   quem corta com reticencias e o nome comprido, e nao a linha. */
/* `1fr auto 1fr`: o placar e a faixa do meio, e ele fica no centro
   exato da linha em TODA linha, seja "Vasco x Coritiba" ou
   "Atlético-MG x Chapecoense-sc". Os dois nomes crescem para fora a
   partir do centro, cada um na sua metade.
   A faixa fixa que eu tinha tirado na versao anterior era de LARGURA
   fixa e no lugar errado; esta e proporcional e simetrica, entao nao
   existe o vazio que ela criava. */
.jc-duelo { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
  align-items: center; gap: 10px; width: 100%; max-width: var(--duelo-max); }

/* O visitante usa a mesma marcacao do mandante: quem espelha escudo e
   nome e o `row-reverse`. Duas marcacoes seriam duas chances de
   divergir na proxima mexida. */
/* Os dois lados encostam no PLACAR, e nao na borda da tela: e no meio
   que o olho esta. Os dois usam `flex-end` porque o visitante esta em
   `row-reverse` -- nele o fim do eixo e a esquerda, que e justamente o
   lado do placar. */
.jc-lado { display: flex; align-items: center; justify-content: flex-end;
  gap: 10px; min-width: 0; }
.jc-lado.fora { flex-direction: row-reverse; }
.jc-lado img { width: 28px; height: 28px; object-fit: contain; flex: none; }
.jc-nome { min-width: 0; font-size: 15px; font-weight: 600;
  color: var(--text-primary); letter-spacing: -.01em;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* O placar e a hora ocupam o MESMO lugar. Antes a hora ficava na
   coluna da esquerda e o meio ficava vazio nos jogos que ainda nao
   comecaram, que sao a maior parte da lista. */
/* UM TAMANHO SO PARA O MEIO DA LINHA.
   O placar tinha 20px e a hora 15px, no mesmo lugar da mesma lista:
   as linhas mudavam de altura conforme o jogo tivesse comecado ou
   nao, e a coluna do meio subia e descia ao longo da rolagem. A
   medida sai de uma variavel por causa das tres larguras de tela --
   eram tres pares de regras para manter iguais, e nao ficaram.
   O PESO continua diferente, que era o pedido anterior: a hora fica
   em cinza de apoio e o placar em branco. O que se iguala e o
   tamanho, nao a enfase. */
.row-jogo.jc { --jc-meio: 20px; }
.jc-placar { display: flex; align-items: center; justify-content: center;
  gap: 5px; white-space: nowrap; }
.jc-placar em { font-style: normal; font-size: var(--jc-meio); font-weight: 700;
  font-variant-numeric: tabular-nums; letter-spacing: -.02em;
  color: var(--text-primary); }
.jc-placar i { font-style: normal; color: var(--text-muted); font-size: 15px; }
/* ============================================================
   HORA DE JOGO QUE NAO COMECOU E APOIO, NAO INFORMACAO
   ============================================================
   O horario ocupa o mesmo lugar do placar -- de proposito, e isso
   nao muda. O que muda e o PESO: 2 a 1 e um fato da partida, "16:00"
   e uma promessa de agenda, e as duas coisas saiam na mesma
   claridade. Numa lista de trinta jogos em que a maioria ainda nao
   comecou, isso faz os poucos placares de verdade se perderem no
   meio de trinta horarios igualmente brilhantes.

   Desce um degrau na escala de cinza, de --text-secondary (#D7D7DC)
   para --text-muted (#9A9AA3), que e o tom do resto do apoio da tela
   e continua passando 4,5:1 sobre o cartao -- esse par ja e conferido
   pelo `npm run contraste`.
   ============================================================ */
.jc-placar.pre span { font-size: var(--jc-meio); font-weight: 600;
  font-variant-numeric: tabular-nums; letter-spacing: -.02em;
  color: var(--text-muted); }

/* O time derrotado apaga.
   ------------------------------------------------------------
   Eu tinha tirado isto numa passada de contraste, achando que nome de
   time apagado parecia botao desabilitado. O dono do produto reclamou
   da falta, e ele tem razao: num placar encerrado, saber quem perdeu
   SEM LER os numeros e metade da leitura de uma lista de trinta jogos.

   O placar do perdedor recua um degrau a mais que o nome, para os dois
   nao apagarem juntos e virarem uma linha inteira cinza. */
.jc-lado.perdeu .jc-nome { color: var(--text-muted); }
.jc-placar em.perdeu { color: var(--text-disabled); font-weight: 600; }

/* Nome por extenso quando cabe. A sigla de tres letras entra so na
   tela estreita, onde o nome inteiro nao caberia sem cortar. */
.jc-lado .n-curto { display: none; }
.jc-lado .n-longo { display: inline; }

/* Coluna 3: o resto. Rodada, competicao fora do agrupamento, agregado. */
/* O pe desceu para baixo do duelo e centrou junto com o resto. Ele e
   quase sempre vazio dentro do agrupamento por competicao (o nome da
   liga ja esta no cabecalho do grupo), entao some quando nao tem o
   que dizer em vez de reservar uma faixa. */
.jc-pe { display: flex; flex-wrap: wrap; align-items: center; justify-content: center;
  gap: 3px 10px; text-align: center; border: 0; padding: 0; margin: 0;
  max-width: 100%; }
.jc-pe:empty { display: none; }
.jc-liga { display: flex; align-items: center; gap: 6px; font-size: 12.5px;
  font-weight: 500; color: var(--text-muted); min-width: 0;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.jc-liga img { width: 15px; height: 15px; object-fit: contain; flex: none; }
.jc-onde { font-size: 12.5px; color: var(--text-muted); max-width: 100%;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.jc-onde:empty { display: none; }

/* Onde passa o jogo, na linha da lista.

   Verde de destaque, e nao cinza como o resto do pe do cartao: e a
   unica informacao ali que faz a pessoa decidir alguma coisa agora
   ("da para ver, e no Premiere"). So aparece com a grade do dia
   importada, entao quando aparece e porque vale a pena olhar. */
.jc-tv { display: inline-flex; align-items: center; gap: 4px; max-width: 100%;
  font-size: 12px; font-weight: 600; color: var(--accent);
  white-space: nowrap; overflow: hidden; }
.jc-tv svg { flex: none; }
.jc-tv b { font-weight: 600; overflow: hidden; text-overflow: ellipsis; }
.jc-tv i { font-style: normal; color: var(--text-muted); font-weight: 500; }

/* A caixa onde a grade do dia e colada, no painel. Monoespacada
   porque a grade vem alinhada por coluna e ler desalinhado atrapalha
   na hora de achar a linha que ficou de fora. */
.grade-texto { width: 100%; resize: vertical; min-height: 140px;
  padding: 10px 12px; border-radius: 10px;
  border: 1px solid var(--border-default); background: var(--n80);
  color: var(--text-primary); font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 13.5px; line-height: 1.5; }
.grade-texto:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
/* `.rj-gols` saiu: a linha `.jc` emite `.jc-gols`, e estas regras
   nao casavam com nada ha tempo. */

/* ---------- gols, embaixo do time que marcou ----------
   Eram os gols dos dois times numa linha so no pe do cartao,
   separados por um fio azul: dava para ver que teve gol, nao de
   quem. Agora cada gol nasce grudado no nome de quem marcou, com o
   recuo do escudo para a coluna bater. */
/* Os autores alinham com o NOME, e nao com o escudo: 32 do escudo
   mais 12 de respiro. E ganham dois pixels de ar em cima, no lugar
   dos dois negativos que tinham. */
/* A faixa de gols desce para baixo do duelo, em duas colunas: os gols
   do mandante encostados a direita (debaixo do nome dele) e os do
   visitante a esquerda. Dentro da linha do duelo eles espremeriam o
   nome do time, que e a informacao principal. */
/* Duas metades: gol do mandante na esquerda, do visitante na direita,
   as duas encostadas na esquerda da propria metade. Antes elas se
   alinhavam pelas faixas do duelo, mas o duelo deixou de ter faixas
   fixas -- o placar agora cai onde cair, e alinhar por ele voltaria a
   jogar o gol do mandante para o meio da linha. */
/* A faixa de gols usa a MESMA grade do duelo, entao o gol do mandante
   cai debaixo do mandante e o do visitante debaixo do visitante, e os
   dois se encontram na mesma linha vertical do placar. Antes ela era
   duas metades soltas alinhadas a esquerda, que so por acaso ficavam
   perto do time certo. */
.jc-gols { display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 4px 20px; width: 100%; max-width: var(--duelo-max); margin-top: 2px; }
.jg-lado.casa { grid-column: 1; }
.jg-lado.fora { grid-column: 2; }
.jg-lado { min-width: 0; }
/* Os gols acompanham o time: encostados no centro, como o nome e o
   escudo logo acima, com 20px de vao no meio. Encostar sem vao fazia
   "83' Marllon 78' Rony 87' Gabigol" sair como uma frase so, sem dar
   para ver onde acabavam os gols de um time e comecavam os do outro;
   centrar cada lado na propria metade soltava os gols para fora,
   longe do nome de quem marcou. */
/* TRES COLUNAS POR LADO: BOLINHA NO MEIO, MINUTO, NOME.
   ------------------------------------------------------------
   Duas coisas estavam erradas aqui ao mesmo tempo.
   1. Era `flex-wrap`, entao a quantidade de gols por linha dependia
      do comprimento dos nomes: o City saia com "9' Enzo Fernandez"
      numa linha e "29' R. Cherki  43' A. Semenyo" na seguinte,
      enquanto o Sunderland tinha um por linha. Os dois lados ficavam
      com numeros de linhas diferentes e nada alinhava.
   2. As pecas caiam onde o texto as deixasse. Agora sao tres colunas
      declaradas, espelhadas nos dois lados, e lidas do centro para
      fora: bolinha, minuto, nome. As bolinhas dos dois times se
      encontram no meio da linha, os minutos ficam logo ao lado e os
      nomes crescem para as bordas.
   Um gol por linha, sempre: a grade de uma coluna garante isso. */
.jc-gt { display: grid; gap: 2px;
  margin-top: 1px; font-size: 12.5px; color: var(--text-muted); }
.jc-gt span { display: grid; align-items: baseline; gap: 6px; }
/* Todas na MESMA fileira. Sem isto, a colocacao automatica anda so
   para a frente: a bolinha vem primeiro no HTML e vai para a coluna 3,
   e ai o minuto (coluna 2) e o nome (coluna 1) ja estao "atras" do
   cursor e cada um abre uma fileira nova. Um gol virava tres linhas. */
.jc-gt span > * { grid-row: 1; }
/* Coluna explicita, e nao `order`: gol sem autor tem duas pecas em vez
   de tres, e com `order` a bolinha escorregava para a coluna do nome. */
.jg-lado.casa .jc-gt span { grid-template-columns: minmax(0, 1fr) auto auto; }
.jg-lado.casa .jc-gt b    { grid-column: 1; text-align: right; }
.jg-lado.casa .jc-gt i    { grid-column: 2; }
.jg-lado.casa .jc-bola    { grid-column: 3; }
.jg-lado.fora .jc-gt span { grid-template-columns: auto auto minmax(0, 1fr); }
.jg-lado.fora .jc-bola    { grid-column: 1; }
.jg-lado.fora .jc-gt i    { grid-column: 2; }
.jg-lado.fora .jc-gt b    { grid-column: 3; text-align: left; }
.jc-gt i { font-style: normal; font-weight: 700; color: var(--text-secondary);
  font-variant-numeric: tabular-nums; }
/* O nome do autor: peso normal, e reticencias em vez de empurrar a
   coluna. `b` aqui e so o gancho da grade. */
.jc-gt b { font-weight: 400; min-width: 0; max-width: 100%;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Gol: a linha acende por um instante e o numero cresce. Antes o que
   avisava do gol era a pagina inteira redesenhando, que e o contrario
   de avisar: piscava tudo e a rolagem pulava. */
.jc-placar em.mudou { animation: acendeu 1.1s ease-out; }
@keyframes gol-na-linha {
  0%   { background: rgba(25, 171, 101, .30); }
  35%  { background: rgba(25, 171, 101, .22); }
  100% { background: transparent; }
}
.row-jogo.jc.gol { animation: gol-na-linha 2.4s ease-out; }

/* Dentro de um grupo de competicao o nome da liga ja esta no topo do
   grupo: repetir em cada linha e ruido. Na visao por hora, que
   atravessa competicoes, ele precisa aparecer. A rodada segue a mesma
   regra: quando e a mesma para o grupo inteiro, ela sobe para o
   cabecalho e sai das linhas. */
.grupo-liga .jc-liga { display: none; }
.grupo-liga.uma-rodada .jc-onde { display: none; }

/* ---------- abas com seta ----------
   A faixa de abas rola de lado. No painel, dez abas nao cabem e a
   ultima ficava cortada na borda, sem nada indicando que existia mais
   coisa ali. As setas so aparecem quando ha o que rolar: o JS poe
   .sem-setas quando tudo cabe. */
.abas-barra { display: flex; align-items: stretch; gap: 2px; min-width: 0;
  margin: 0 0 26px; }
.abas-barra .chips.abas { flex: 1; min-width: 0; margin: 0; }
.abas-seta { flex: none; width: 26px; padding: 0; border: 0; cursor: pointer;
  background: none; color: var(--text-muted); font-size: 21px; line-height: 1;
  border-bottom: 1px solid var(--aresta); transition: color 140ms ease; }
.abas-seta:hover { color: var(--text-primary); }
.abas-barra.sem-setas .abas-seta { visibility: hidden; width: 0; }
/* O menu de abas do painel gruda logo abaixo do cabecalho do proprio
   painel: `.pj-topo` tem 49px e e sticky no topo da rolagem, entao a
   fileira para em 49.
   ISTO QUEBROU UMA VEZ, e a licao vale a nota. A regra geral de
   >=1180px diz `.abas-barra { position: sticky; top: var(--header-h) }`
   para a pagina inteira. Aqui embaixo eu troquei so o `position` para
   `relative`, porque queria um elemento posicionado para pendurar o
   veu do fim da fileira. Em sticky, `top: 84px` quer dizer "gruda a 84
   do topo da rolagem". Em relative, a MESMA declaracao quer dizer
   "desce 84 pixels", e o menu foi parar dentro do cartao de baixo.
   Position e top andam juntos: quem mexe num mexe no outro. */
.painel-jogo .abas-barra { margin: 0; position: sticky; top: 49px; z-index: 2;
  padding-top: 0; background: var(--surface-1); }
/* A seta ficava transparente e deixava passar o fundo do painel, que
   é mais escuro que a barra de abas. O resultado era um degrau de cor
   no fim da fileira, e o corte da última aba parecia defeito em vez
   de rolagem. Mesma superfície, e um véu curto antes dela para o
   texto sumir em vez de ser cortado na faca. */
.painel-jogo .abas-seta { width: 26px; font-size: 18px;
  background: var(--surface-1);
  border-bottom: 1px solid var(--border-subtle); }
.painel-jogo .abas-barra:not(.sem-setas)::after {
  content: '';
  position: absolute;
  top: 0; bottom: 1px; right: 26px;
  width: 26px;
  pointer-events: none;
  background: linear-gradient(to right, transparent, var(--surface-1));
}

/* ---------- tabela do duelo e confronto direto ----------
   Duas linhas de tabela de verdade, com a forma recente no meio: da
   para comparar os dois times de relance em vez de ler ficha por
   ficha. */
.cd-tabela { display: grid; gap: 2px; }
.cd-cab, .cd-linha { display: grid; align-items: center;
  grid-template-columns: 26px minmax(0, 1fr) auto 40px; gap: 10px; }
.cd-cab { font-size: 12px; font-weight: 600; letter-spacing: .04em; color: var(--text-muted); padding: 0 4px 6px;
  border-bottom: 1px solid var(--border-subtle); }
.cd-cab span:last-child, .cd-linha .cd-pts { text-align: right; }
.cd-cab span:nth-child(3) { text-align: center; }
.cd-linha { padding: 9px 4px; }
.cd-linha + .cd-linha { border-top: 1px solid var(--border-subtle); }
.cd-tabela .cd-pos { font-size: 14px; font-weight: 700; color: var(--text-muted);
  font-variant-numeric: tabular-nums; text-align: center; background: none;
  width: auto; height: auto; min-height: 0; padding: 0; border-radius: 0; }
.cd-tabela .cd-time { display: flex; align-items: center; gap: 8px; min-width: 0;
  background: none; border: 0; padding: 0; min-height: 0; border-radius: 0; }
.cd-tabela .cd-time b { font-size: 15px; font-weight: 600; min-width: 0;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* .forma tambem e o nome do selo unico de 24px em outra tela: aqui
   ela e so o involucro dos cinco quadradinhos. */
.cd-forma { display: flex; justify-content: center; }
.cd-forma .forma { display: inline-flex; gap: 3px; width: auto; height: auto;
  background: none; padding: 0; border-radius: 0; }
.cd-forma .seq-p { width: 17px; height: 17px; font-size: 12px; }
.cd-pts { font-family: var(--display); font-size: 17px; font-weight: 700;
  font-variant-numeric: tabular-nums; }

.mh-placar { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center;
  gap: 14px; padding: 4px 0 14px; }
.mh-lado { display: flex; align-items: center; gap: 10px; }
.mh-lado.dir { justify-content: flex-end; }
.mh-lado img { width: 26px; height: 26px; object-fit: contain; }
.mh-lado b { font-family: var(--display); font-size: 25px; font-weight: 700; }
/* OS TRES NUMEROS NA MESMA ALTURA.
   A coluna do meio era numero + legenda empilhados, entao ela ficava
   mais alta que as duas laterais (escudo + numero) e, com
   `align-items: center`, o numero dos empates subia em relacao aos
   outros dois. Tres numeros que existem para ser lidos juntos, em
   tres alturas. A legenda sai do fluxo e passa a pendurar embaixo:
   a coluna do meio volta a ter a altura de um numero so. */
.mh-e { position: relative; display: grid; justify-items: center; }
.mh-e b { font-family: var(--display); font-size: 20px; font-weight: 700;
  color: var(--text-secondary); }
.mh-e small { position: absolute; top: 100%; left: 50%; transform: translateX(-50%);
  margin-top: 1px; font-size: 12px; color: var(--text-muted); white-space: nowrap; }
.mh-lista { display: grid; gap: 1px; }
/* A DATA EM CIMA, O DUELO CENTRADO.
   A data ocupava uma faixa de 74px a esquerda e o duelo dividia o que
   sobrava: num celular de 390px isso deixava 236px para dois nomes e
   um placar, e a lista inteira saia empurrada para a direita, com
   "Bournemouth" virando "Bourne...". O relato foi exatamente esse, e
   veio com a solucao: a data em cima do placar e tudo no meio.
   Duas linhas por confronto, e o placar no centro do cartao em todas
   elas -- que era o que as tres faixas de `.mh-duelo` prometiam e a
   faixa da data desmentia. */
.mh-jogo { display: grid; justify-items: center; gap: 1px; padding: 8px 0;
  border-top: 1px solid var(--border-subtle); font-size: 14px; text-align: center; }
.mh-data { font-size: 12px; color: var(--text-muted);
  font-variant-numeric: tabular-nums; }
/* O PLACAR NO MESMO x EM TODA LINHA.
   Era um span so, "Bragantino 3-0 Flamengo", com o texto centrado
   como um bloco: o placar caia onde os dois nomes o deixassem, e
   numa lista de cinco confrontos ele aparecia em cinco posicoes
   diferentes. Mesma historia da lista da home, e a mesma correcao:
   tres faixas, as laterais iguais, o placar no meio. */
.mh-duelo { min-width: 0; width: 100%; color: var(--text-secondary);
  display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
  align-items: baseline; gap: 8px; }
.mh-duelo i { font-style: normal; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mh-duelo i:first-of-type { text-align: right; }
.mh-duelo i:last-of-type { text-align: left; }
.mh-duelo b { color: var(--text-primary); font-variant-numeric: tabular-nums;
  white-space: nowrap; }

/* ---------- tabela que rola de lado ----------
   No celular a tabela inteira era espremida na largura da tela e o
   nome do time virava "F...". Agora as colunas mantem o tamanho, o
   bloco rola na horizontal e a posicao e o nome ficam presos a
   esquerda: da para arrastar ate o SG sem perder de quem e a linha. */
.tabela { background: var(--surface-1); overflow-x: auto; overflow-y: hidden;
  scrollbar-width: thin; min-width: 0; max-width: 100%; }
/* Item de grade tem largura minima automatica igual ao conteudo: sem
   este min-width o bloco do grupo crescia junto com a tabela e quem
   vazava era a pagina, nao a tabela. */
.grupos, .chaves, .grupo-bloco, .chave-fase { min-width: 0; }
.c-forma { display: flex; justify-content: center; }
.c-forma .forma { display: inline-flex; gap: 2px; width: auto; height: auto;
  background: none; padding: 0; border-radius: 0; }
.c-forma .seq-p { width: 16px; height: 16px; font-size: 12px; }
.tab-cab .c-forma { font-size: 12px; }

.stat-nota { font-size: 13.5px; color: var(--text-muted); text-align: center;
  padding: 12px 16px; border: 1px dashed var(--aresta-forte); border-radius: 10px;
  margin-top: 4px; }

/* ---------- probabilidade implicita nas odds ---------- */
.imp { display: grid; gap: 8px; margin-bottom: 14px; }
.imp-linha { display: grid; grid-template-columns: minmax(90px, 132px) minmax(0, 1fr) 56px;
  align-items: center; gap: 12px; }
.imp-rot { font-size: 14.5px; font-weight: 600; min-width: 0;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.imp-barra { height: 9px; border-radius: 5px; background: var(--surface-1); overflow: hidden; }
.imp-barra span { display: block; height: 100%; border-radius: 5px; }
.imp-barra .pb-casa { background: var(--accent); }
.imp-barra .pb-empate { background: var(--n60); }
.imp-barra .pb-fora { background: var(--roxo); }
.imp-linha strong { font-family: var(--display); font-size: 16px; font-weight: 700;
  text-align: right; font-variant-numeric: tabular-nums; }

/* ---------- banners do Lobao ----------
   O site nao anuncia produto: anuncia o Lobao e os grupos de
   WhatsApp. Superficie propria, nunca a do cartao de jogo, para quem
   bate o olho saber em meio segundo que aquilo nao e partida. Selo em
   todo espaco, porque publicidade precisa se identificar. */
.lb-faixa { display: grid; gap: 10px; margin: 20px 0; }
.painel-jogo .lb-faixa { margin: 0 14px 16px; }

.lb { position: relative; display: grid; gap: 10px; text-decoration: none;
  color: inherit; background: var(--surface-2); border: 1px solid var(--aresta-cartao);
  border-left: 3px solid #25D366; border-radius: 12px; overflow: hidden;
  transition: background var(--mola); }
.lb:hover { background: var(--surface-hover); }
.lb.sem-arte { grid-template-columns: 46px minmax(0, 1fr); align-items: center;
  padding: 13px 15px; }
.lb.com-arte { padding: 0; gap: 0; }

.lb-selo { position: absolute; top: 9px; right: 10px; z-index: 2;
  font-size: 12px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
  color: #0C1F13; background: rgba(75, 226, 138, .92); border-radius: 4px; padding: 2px 6px; }
.lb-arte { display: block; width: 100%; height: auto; }
.lb-zap { display: grid; place-items: center; width: 46px; height: 46px;
  border-radius: 12px; background: rgba(37, 211, 102, .14); color: #25D366; }
.lb-zap svg { width: 25px; height: 25px; }

.lb-txt { display: grid; gap: 3px; min-width: 0; }
.lb.com-arte .lb-txt { padding: 12px 15px 14px; }
.lb-txt b { font-size: 15.5px; font-weight: 600; line-height: 1.3; padding-right: 46px; }
.lb-txt em { font-style: normal; font-size: 13.5px; color: var(--text-muted); line-height: 1.35; }
.lb-cta { justify-self: start; margin-top: 7px; padding: 5px 12px; border-radius: 7px;
  background: rgba(37, 211, 102, .16); color: #4BE28A; font-size: 13px; font-weight: 700; }
.lb:hover .lb-cta { background: rgba(37, 211, 102, .26); }

/* O cartaz do carrossel: mesma caixa do jogo, fundo e cor outros. */
.banner-oferta { display: grid; gap: 10px; text-decoration: none; color: inherit;
  background: linear-gradient(112deg, #10281B 0%, #1A2320 58%, #18201C 100%); }
.banner-oferta::before { content: none; }
.banner-oferta .bn-tag.oferta { background: #25D366; color: #06210F; }
.of-duelo { display: flex; align-items: center; gap: 18px; }
.bn-of-img { width: 110px; height: 78px; object-fit: contain; border-radius: 8px;
  background: rgba(255, 255, 255, .04); flex: none; }
.bn-of-txt { display: grid; gap: 8px; min-width: 0; justify-items: start; }
.bn-of-txt em { font-style: normal; font-size: 15px; color: var(--text-secondary); }
.bn-of-cta { padding: 7px 16px; border-radius: 8px; background: #25D366; color: #06210F;
  font-family: var(--ui); font-size: 14px; font-weight: 700; }

/* ---------- blocos e superficies ----------
   Esta camada zerava a borda e a sombra de todo cartao. Enquanto o
   fundo era #151515 quase dava, mas com o fundo em #0F0F0F cada bloco
   passou a boiar: o titulo parecia solto no ar e o corpo parecia o
   proprio fundo da pagina. Agora todo cartao tem aresta e o titulo e
   uma barra mais clara em cima, o mesmo desenho do cartao de
   competicao da home. */
.caixa, .bloco, .mini-tab, .detalhe-card, .h2h-card, .dest, .cota, .diag,
.momentum, .insight, .tecnico-card, .jds, .mjs-jogo, .proximo, .stat-grupo,
.art-lista, .info-jogo, .acontecendo {
  background: var(--surface-1); border: 1px solid var(--aresta-cartao);
  border-radius: 12px;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .06), 0 2px 12px rgba(0, 0, 0, .55);
}
/* Cartao dentro de cartao nao leva aresta: duas bordas coladas viram
   um risco duplo. */
.bloco .bloco, .bloco .caixa, .caixa .bloco, .caixa .caixa,
.bloco .mini-tab, .caixa .mini-tab, .bloco .dest, .caixa .dest,
.bloco .h2h-card, .bloco .cota, .bloco .diag, .bloco .insight,
.bloco .tecnico-card, .bloco .mjs-jogo, .caixa .mjs-jogo, .caixa .proximo {
  border: 0; }
.trilho .caixa, .trilho .bloco { border: 1px solid var(--aresta-cartao); }
/* `.momentum-topo` saiu desta lista: a marcacao nao emite mais
   essa classe desde que o Fluxo da partida virou .mm-*. */
.caixa-topo, .bloco-tit, .cota-topo, .dest-topo, .proximo-topo {
  background: var(--surface-2);
  border-bottom: 1px solid var(--border-subtle);
  border-radius: 11px 11px 0 0;
}

/* A leitura da IA e o motivo de o site existir: ela nao pode ser mais
   um cartao igual aos outros. Superficie um tom acima, aresta de
   acento e o rotulo na cor do estado da partida. */
.resumo-ia { background: var(--surface-2); border: 1px solid var(--aresta-cartao);
  border-left: 3px solid var(--accent); border-radius: 12px;
  padding: 16px 20px;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .06), 0 2px 12px rgba(0, 0, 0, .55); }
.resumo-ia.ao_vivo { border-left-color: var(--live); }
.resumo-ia.full_time { border-left-color: var(--success); }
.resumo-ia .rotulo { color: var(--accent); }
.resumo-ia.ao_vivo .rotulo { color: var(--live); }
.resumo-ia.full_time .rotulo { color: var(--success); }
.resumo-ia p { color: var(--text-primary); }
.resumo-ia small { color: var(--text-muted); }
/* Mesma familia do resumo da IA: barra de acento a esquerda e
   superficie um tom acima. Era o unico bloco de secao que tinha
   ficado de fora da lista de cartoes, e por isso continuava chapado
   no fundo. */
.acontecendo { background: var(--surface-2); border-left: 3px solid var(--accent);
  padding: 16px 20px; }
.acontecendo-topo { color: var(--accent); font-weight: 700; }

/* ---------- titulo de secao ---------- */
.secao { display: flex; align-items: center; gap: 10px; margin: 24px 0 12px; }
.secao:first-child { margin-top: 4px; }
.secao-titulo { font-family: var(--display); font-size: 23px; font-weight: 700;
  letter-spacing: -.01em; color: var(--text-primary); text-transform: none; }
.secao-titulo em { font-style: normal; font-size: 14px; font-weight: 500;
  color: var(--text-muted); margin-left: 6px; }

/* ---------- lateral com conteudo, nao so competicoes ---------- */
.menu-titulo { padding: 0 12px 8px; font-size: 13px; font-weight: 600;
  letter-spacing: .1em; text-transform: uppercase; color: var(--text-muted); }
.menu-bloco { display: grid; gap: 2px; margin-bottom: 18px; }
.menu-seguidos { display: grid; gap: 2px; }
.ms { display: flex; align-items: center; gap: 10px; padding: 8px 12px; border-radius: 8px;
  font-size: 15px; font-weight: 500; color: var(--text-secondary); text-align: left;
  width: 100%; }
.ms:hover { background: rgba(255, 255, 255, .04); color: var(--text-primary); }
.ms img { width: 20px; height: 20px; object-fit: contain; flex: none; }
.ms span { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ms em { font-style: normal; font-size: 12px; font-weight: 700; color: var(--success);
  font-variant-numeric: tabular-nums; }
.ms em.parado { color: var(--text-muted); font-weight: 500; }
.ms-vazio { padding: 4px 12px 10px; font-size: 13.5px; color: var(--text-muted); line-height: 1.5; }
.menu-atalho { display: block; width: 100%; text-align: left; padding: 7px 12px;
  font-size: 14.5px; color: var(--text-secondary); border-radius: 8px; }
.menu-atalho:hover { color: var(--accent); }
.menu-pe { margin-top: 14px; padding: 12px 12px 0; border-top: 1px solid var(--border-subtle);
  font-size: 12.5px; line-height: 1.65; color: var(--text-muted); }
.menu-pe a { color: var(--text-muted); }
.menu-pe a:hover { color: var(--accent); }

/* ---------- faixa de jogos ao vivo ---------- */

/* ---------- faixa de dias: uma fila de pilulas iguais ---------- */
/* ---------- as duas faixas do topo da home, na MESMA medida ----------
   Em cima ficam os destaques (.tira) e logo abaixo os dias (.datas).
   Uma tinha caixa em volta com 10 de raio, a outra nao tinha caixa
   nenhuma; uma media 38,8 de altura, a outra 42; os cantos internos
   eram 8 de um lado e 7 do outro. Empilhadas, liam como dois
   componentes de sites diferentes coladas uma na outra.
   Agora as duas sao a mesma peca: caixa de 44 de altura, 5 de
   respiro, 10 de raio fora e 7 dentro. Quem muda e o conteudo. */
.datas { display: flex; align-items: stretch; gap: 6px; margin: 0 0 12px; padding: 5px;
  overflow-x: auto; scrollbar-width: none; border: 0; width: 100%;
  background: var(--surface-1); border-radius: 10px; }
.datas::-webkit-scrollbar { display: none; }
.data, .data-seta, .data-atalho { flex: 0 0 auto; height: 34px; border-radius: 7px;
  background: var(--surface-2); border: 0; min-width: 0; }
/* A FAIXA VAI ATE O FIM DA COLUNA.
   Os sete dias tem largura de conteudo, entao num monitor largo a
   faixa parava no meio da pagina e sobrava fundo vazio a direita --
   "nao faz sentido ele parar no meio da pagina".
   `1 0 auto` nos dias: eles CRESCEM para dividir o que sobra e nao
   encolhem abaixo do proprio texto, entao no celular a faixa
   continua rolando de lado como antes. As setas e o calendario
   ficam no tamanho, que e o que os mantem reconheciveis. */
.data { flex: 1 0 auto; }
/* ============================================================
   As ultimas atuacoes, na ficha do jogador
   ============================================================
   A ficha tinha media de temporada e mais nada sobre COMO ele vem
   jogando -- 6,75 cabe tanto em quatro jogos medianos quanto em dois
   otimos e dois pessimos. Cada linha aqui e uma partida, e e um
   botao: nota de 8,5 sem poder abrir o jogo em que ela aconteceu e
   meia informacao. */
.ja-lista { display: grid; }
.ja-linha {
  display: grid;
  grid-template-columns: 46px 36px 20px minmax(0, 1fr) auto 20px minmax(0, auto) 40px;
  align-items: center; gap: 10px;
  width: 100%; padding: 9px 4px;
  border: 0; border-top: 1px solid var(--border-subtle);
  background: none; color: var(--text-primary);
  font-family: inherit; font-size: 14px; text-align: left; cursor: pointer;
  transition: background var(--mola);
}
.ja-linha:first-child { border-top: 0; }
.ja-linha:hover { background: var(--surface-hover); }
.ja-data { font-size: 13px; color: var(--text-muted);
  font-variant-numeric: tabular-nums; }
.ja-onde { font-size: 12.5px; color: var(--text-muted); }
.ja-escudo { width: 20px; height: 20px; object-fit: contain; }
.ja-adv { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  color: var(--text-secondary); }
.ja-placar { font-variant-numeric: tabular-nums; font-weight: 600; white-space: nowrap; }
.ja-linha .seq-p { width: 20px; height: 20px; font-size: 12px; }
/* O que ele fez no jogo. Sem gol nem assistencia sai o minuto: "0
   gols" ocupando a coluna nao diz nada que a nota ja nao diga. */
.ja-fez { font-size: 13px; color: var(--text-muted); white-space: nowrap;
  min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.ja-linha .nota { justify-self: end; }
.ja-linha .nota.vazia { color: var(--text-disabled); font-weight: 600; }

/* A FAIXA DE RODADAS E A MESMA PECA DA FAIXA DE DIAS.
   Era um `<select>` nativo, o unico controle do site desenhado pelo
   sistema operacional e nao pelo site: trinta e oito linhas brancas
   abrindo por cima da pagina.
   Duas diferencas para a de dias, e so duas: a pastilha aqui tem uma
   linha de texto em vez de duas, e as rodadas NAO crescem para
   dividir a largura -- sao trinta e oito e a fileira ja transborda,
   entao esticar so faria a ultima ficar diferente das outras. */
.rodadas .data { flex: 0 0 auto; padding: 0 12px; }
.rodadas .data b { font-size: 13.5px; white-space: nowrap; }
.data { display: grid; gap: 0; align-content: center; justify-items: center; padding: 0 14px;
  min-width: 74px; color: var(--text-secondary); transition: background var(--mola), color var(--mola); }
.data b { font-size: 14.5px; font-weight: 600; text-transform: capitalize; color: inherit; line-height: 1.25; }
.data span { font-size: 12px; color: var(--text-muted); line-height: 1.2; }
.data:hover:not(:disabled) { background: var(--surface-hover); color: var(--text-primary); }
.data.ativo { background: var(--accent); color: #06202E; box-shadow: none; }
.data.ativo b, .data.ativo span { color: #06202E; }
/* Foco de teclado nao pode se parecer com selecao: fica por fora. */
.data:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.data.ativo:focus-visible { outline-color: var(--n0); }
/* .vazio tambem e a classe do bloco "nenhum jogo encontrado", que traz
   margem e largura maxima. Num botao de dia isso jogava a pilula para
   baixo, quebrando a fila inteira. */
.data.vazio { opacity: .5; margin: 0; max-width: none; text-align: center; }
.data.vazio:hover { opacity: .85; }
.data.ativo.vazio { opacity: 1; }
.data-seta, .data-atalho { width: 44px; display: grid; place-items: center; font-size: 23px;
  color: var(--text-secondary); }
.data-seta:hover:not(:disabled), .data-atalho:hover { background: var(--surface-hover);
  color: var(--text-primary); }
.data-atalho svg { width: 19px; height: 19px; }

/* ---------- grupo de competicao: um cartao por competicao ----------
   Era cabecalho solto sobre o fundo e lista logo abaixo, sem caixa.
   No computador isso fazia a competicao se misturar com o fundo da
   pagina: nao dava para ver onde uma acabava e a outra comecava.
   Agora e um cartao: barra de titulo mais clara em cima, jogos
   embaixo, borda em volta. */
/* Cada competição era um cartão com borda, raio de 12 e sombra forte,
   separado por 18px do próximo. Oito competições viravam oito caixas
   soltas. Agora a lista é UMA superfície: as competições se separam
   por cabeçalho e por um vão pequeno, e a sombra sai. */
.grupo-liga { background: var(--surface-1); border: 1px solid var(--border-subtle);
  border-radius: 10px; padding: 0; margin: 0 0 10px; overflow: hidden;
  box-shadow: none; }
/* Era uma barra de 12px de padding com o nome da liga em azul e uma
   barra azul de 3px na esquerda, repetida em toda competição da
   página. Doze barras azuis gastam o azul e não sobra peso para o que
   importa. Agora é um cabeçalho fino, e o azul volta a ser escasso. */
.grupo-topo { display: flex; align-items: center; gap: 10px; width: 100%;
  padding: 7px 14px; background: var(--surface-2); border: 0;
  border-bottom: 1px solid var(--border-subtle); text-align: left; }
.grupo-topo:hover { background: var(--surface-hover); }
.grupo-liga.fechado .grupo-topo { border-bottom: 0; }
.grupo-topo img { width: 24px; height: 24px; object-fit: contain; flex: none; }
/* Nome da liga em cima e "Internacional · Quartas de final" embaixo
   davam duas linhas e 52px de altura para cada competição. Lado a
   lado cabe na mesma linha e custa 34px. */
.grupo-txt { display: flex; align-items: baseline; flex-wrap: wrap; gap: 3px 9px;
  margin-right: auto; min-width: 0; }
.grupo-txt strong { font-size: 15px; font-weight: 600; color: var(--text-primary); letter-spacing: -.01em; }
.grupo-txt small { font-size: 13px; color: var(--text-muted); }
/* O contador de jogos. O :not() existe porque o bloco de texto do
   grupo tambem e um <span>. */
.grupo-topo > span:not(.grupo-txt) { font-size: 13px; font-weight: 600; color: var(--text-muted);
  background: var(--bg); border-radius: 999px; padding: 3px 9px; }
/* ---------- tira de destaques no topo ----------
   Barra fina antes de tudo, no espirito da do Sofascore: rola de lado,
   mostra placar de verdade na primeira linha e custa 48px de altura.
   O rotulo fica preso a esquerda enquanto os chips rolam por baixo. */
.tira { display: flex; align-items: stretch; gap: 6px; margin: 0 0 12px;
  background: var(--surface-1); border-radius: 10px; padding: 5px;
  min-width: 0; }
/* 34 dentro + 5 + 5 = 44, igual a faixa de dias logo abaixo. */
.tira-seta, .tira-tag, .tc { height: 34px; border-radius: 7px; }
/* As mesmas setas da faixa de datas: sem elas o ultimo chip ficava
   cortado na borda e nao havia como saber que havia mais ali. */
.tira-seta { flex: none; display: grid; place-items: center; width: 30px;
  border: 0; border-radius: 8px; background: var(--surface-2); cursor: pointer;
  color: var(--text-secondary); font-size: 20px; line-height: 1;
  transition: background var(--mola); }
.tira-seta:hover { background: var(--surface-hover); color: var(--text-primary); }
/* Jogo de outro dia entra apagado: nao pode ser confundido com jogo
   de hoje so porque esta na mesma tira. */
.tc.antigo { opacity: .78; }
.tc.antigo .tc-est { color: var(--text-muted); }
.tira-tag { display: inline-flex; align-items: center; gap: 6px; flex: none;
  padding: 0 12px; border-radius: 8px; background: var(--surface-2);
  font-size: 12px; font-weight: 700; letter-spacing: .06em;
  text-transform: uppercase; color: var(--text-secondary); white-space: nowrap; }
.tira-tag.vivo { color: var(--live); background: rgba(255, 77, 100, .14); }
.tira-tag s { width: 6px; height: 6px; border-radius: 50%; background: currentColor;
  text-decoration: none; }

.tira-rolo { display: flex; gap: 6px; overflow-x: auto; min-width: 0;
  scrollbar-width: none; scroll-snap-type: x proximate; }
.tira-rolo::-webkit-scrollbar { display: none; }

.tc { display: flex; align-items: center; gap: 7px; flex: none;
  scroll-snap-align: start; padding: 7px 11px; border: 0; cursor: pointer;
  border-radius: 8px; background: var(--surface-2); color: var(--text-primary);
  transition: background var(--mola); }
.tc:hover { background: var(--surface-hover); }
.tc img { width: 18px; height: 18px; object-fit: contain; flex: none; }
.tc-est { font-size: 12px; font-weight: 700; color: var(--text-muted);
  font-variant-numeric: tabular-nums; display: inline-flex; align-items: center;
  gap: 4px; min-width: 30px; }
.tc.vivo .tc-est { color: var(--live); }
.tc.vivo { box-shadow: inset 2px 0 0 var(--live); }
.tc.fim .tc-placar { color: var(--text-secondary); }
.tc-est s { width: 5px; height: 5px; border-radius: 50%; background: currentColor;
  text-decoration: none; }
.tc-placar { font-size: 14px; font-weight: 700; font-variant-numeric: tabular-nums;
  white-space: nowrap; }
.tc-placar i { font-style: normal; color: var(--text-muted); margin: 0 2px; }

/* Selo de "tem jogo rolando" no cabecalho da competicao. Com a lista
   agrupada so por liga, e ele que substitui a antiga secao "Ao vivo":
   diz onde esta a bola rolando sem tirar a competicao do lugar. */
.grupo-sub { display: flex; align-items: center; gap: 8px; min-width: 0; }
.grupo-vivo { display: inline-flex; align-items: center; gap: 5px; flex: none;
  font-style: normal; font-size: 12px; font-weight: 700; letter-spacing: .02em;
  /* Sem fundo: vermelho sobre vermelho-claro da 4,28:1, e o mesmo
     vermelho sobre o cartao limpo da 4,73:1. A bolinha e a palavra
     ja dizem o que a pastilha dizia, e agora batem com as linhas da
     lista logo abaixo, que nunca tiveram pastilha. */
  color: var(--live); background: none;
  border-radius: 999px; padding: 2px 0; }
.grupo-vivo s { width: 5px; height: 5px; border-radius: 50%; background: currentColor;
  text-decoration: none; }
.grupo-topo.tem-vivo strong { color: var(--text-primary); }

.grupo-topo .caret { display: grid; place-items: center; width: 20px; height: 20px;
  color: var(--text-muted); transition: transform var(--mola); }
.grupo-topo .caret svg { width: 16px; height: 16px; }
.grupo-liga.fechado .caret { transform: rotate(-90deg); }
.grupo-liga .linhas { border: 0; background: transparent; padding: 0; }

/* Separadores verticais entre cartoes nao existem mais: cada cartao ja
   tem a propria superficie. */
.linhas > .row-jogo + .row-jogo { border-left: 0; }

/* ---------- caixa de entrar e formularios ---------- */
.painel { max-width: 460px; margin: 24px auto; display: grid; gap: 14px;
  background: var(--surface-1); border-radius: 12px; padding: 26px; }
.painel h1 { font-family: var(--display); font-size: 23px; font-weight: 700; }
.painel > p { font-size: 14.5px; color: var(--text-secondary); line-height: 1.55; margin-bottom: 4px; }
.campo { display: grid; gap: 6px; }
.campo label { font-size: 13px; font-weight: 600; color: var(--text-muted); }
.campo input:not([type="checkbox"]):not([type="radio"]), .campo select,
.painel .campo input:not([type="checkbox"]):not([type="radio"]), .painel .campo select {
  height: 44px; padding: 0 14px; background: var(--bg); border: 1px solid var(--border-subtle);
  border-radius: 8px; color: var(--text-primary); font-size: 16px; font-family: inherit; width: 100%; }
.campo input:focus, .campo select:focus { border-color: var(--accent); outline: none; }
.btn { height: 46px; padding: 0 20px; border-radius: 9px; background: var(--accent); color: #06202E;
  font-weight: 700; font-size: 16px; width: 100%; }
.btn.secundario { background: var(--surface-2); color: var(--text-primary); }
.btn.secundario:hover { background: var(--surface-hover); }
.troca { text-align: center; font-size: 14.5px; color: var(--text-muted); }

/* ---------- ajustes da rodada de revisao ---------- */

/* Cartao sem altura minima: sobrava um vazio embaixo dos nomes quando
   o jogo nao tinha gol para listar. */
.row-jogo.jc { min-height: 0; }

/* A coluna da direita cabe em 348px: a tabela mini estourava e as
   colunas de P, J e SG ficavam cortadas. */
/* Colunas estreitas e fixas: com largura automatica, em rail de 280px
   (telas de 1180 a 1360) o P, o J e o SG saiam para fora e a borda do
   bloco cortava. Quem encolhe e o nome do time. */
.mini-cab, .mini-linha { grid-template-columns: 18px minmax(0, 1fr) 24px 20px 30px; gap: 6px;
  padding: 0 10px; font-size: 13px; }
.mini-cab > *, .mini-linha > * { min-width: 0; overflow: hidden; }
.mini-cab > :nth-child(n+3), .mini-linha > :nth-child(n+3) { text-align: right; }
.mini-time img { width: 16px; height: 16px; }
.mini-tab { min-width: 0; overflow: hidden; }
.trilho .caixa { overflow: hidden; }
.mini-time { font-size: 14px; gap: 7px; justify-content: flex-start; }
.mini-time img { width: 17px; height: 17px; }
.trilho .caixa-topo { gap: 8px; }
/* 130px cortava "Brasileirao Serie A" no meio. O trilho tem 348px e o
   rotulo da secao ocupa pouco: o seletor pode usar o que sobra. */
.trilho-liga { max-width: 210px; min-width: 0; flex: 0 1 auto; }

/* Blocos da direita e do meio com respiro entre eles. Encostados, a
   pagina parecia um bloco so. */
.trilho { gap: 20px; }
/* Sem aresta, dois blocos do mesmo cinza encostados viram um so. */
.trilho .caixa, .trilho .banner { border: 1px solid var(--border-subtle); }
.bloco, .caixa, .resumo-ia, .stat-grupo, .art-lista { margin-bottom: 20px; }
.bloco:last-child, .caixa:last-child { margin-bottom: 0; }
.trilho > * { margin-bottom: 0; }
/* Cinto e suspensorio: se alguma regra voltar a por display:block na
   coluna, a margem segura a separacao. */
@supports not (gap: 1px) { .trilho > * + * { margin-top: 20px; } }

/* O resumo tinha teto proprio de 760px e ficava mais estreito que os
   blocos vizinhos. */
.resumo-ia { max-width: none; }

/* Cabecalho com os escudos: sem ele nao da para saber qual lado e de
   quem numa barra comparativa. */
.lados { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 12px;
  padding: 0 0 12px; margin-bottom: 14px; border-bottom: 1px solid var(--border-subtle); }
.lados .um { display: flex; align-items: center; gap: 9px; min-width: 0; font-size: 15px;
  font-weight: 600; }
.lados .um.dir { flex-direction: row-reverse; text-align: right; }
.lados .um img { width: 26px; height: 26px; object-fit: contain; flex: none; }
/* O nome do time e conteudo, nao enfeite, e por isso ele NAO leva
   ellipsis aqui. Com `nowrap` + reticencias, "Vila Nova" virava
   "Vila ..." e "America-MG" virava "Amer..." num celular de 390px:
   dois times diferentes, o mesmo texto na tela, bem em cima das
   barras que comparam os dois. Duas linhas custam 17px e resolvem. */
/* `overflow-wrap: anywhere` cumpria o de cima quebrando NO MEIO DA
   PALAVRA: "Bournemouth" saiu da legenda como "Bournem" / "outh", em
   cima das barras que comparam os dois times. Quebra so onde existe
   espaco; o que nao couber numa palavra so ganha reticencias, que ao
   menos deixa o nome legivel ate onde vai. */
.lados .um span { white-space: normal; line-height: 1.2; overflow-wrap: normal; }
.lados .vs { font-size: 12px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
  color: var(--text-muted); }

/* Bloco "depois deste jogo" na coluna da direita. */
.prox-lista { display: grid; }
.prox-l { display: grid; grid-template-columns: 54px minmax(0, 1fr) auto; gap: 10px;
  align-items: center; padding: 10px 14px; text-align: left; width: 100%;
  border-top: 1px solid var(--border-subtle); transition: background var(--mola); }
.prox-l:first-child { border-top: 0; }
.prox-l:hover { background: var(--surface-hover); }
.prox-d { font-size: 12.5px; color: var(--text-muted); }
.prox-j { display: flex; align-items: center; gap: 6px; min-width: 0; font-size: 14px; }
.prox-j img, .prox-sem { width: 18px; height: 18px; object-fit: contain; flex: none; }
.prox-sem { border-radius: 50%; background: var(--surface-2); }
.prox-j span { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }
.prox-j i { flex: none; font-style: normal; color: var(--text-muted); font-size: 12.5px; }
.prox-h { font-size: 13.5px; font-weight: 600; color: var(--text-secondary);
  font-variant-numeric: tabular-nums; }

/* Blocos da partida com teto proprio: cada um parava numa largura
   diferente e a coluna virava uma escada. Todos passam a ocupar a
   largura da coluna; o que e desenho (campo, grafico) continua com
   teto, mas centrado. */
.acontecendo, .melhor, .lances, .ficha, .duelo, .jogadores-partida,
.h2h, .h2h-barra, .momentum, .resumo-ia, .stats { max-width: none; }
.gramado, .esc-cabs, .tecnicos-grid, .estadio-faixa { margin-inline: auto; }

/* Melhor da partida: ocupava meia coluna e ficava jogado no canto. */
.melhor { justify-content: center; gap: 18px; padding: 16px 20px; }
.melhor .jog-nota, .melhor .nota { margin-left: auto; }

/* Cada bloco do resumo com titulo e respiro, para a coluna nao virar
   uma parede de conteudo sem hierarquia. */
.rodada-sep { display: flex; align-items: center; gap: 10px; margin: 24px 0 12px;
  font-size: 13px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
  color: var(--text-muted); }
.rodada-sep::after { content: ''; flex: 1; height: 1px; background: var(--border-subtle); }
.acontecendo { margin-bottom: 16px; }
.momentum { margin-bottom: 16px; }

/* ============================================================
   Os ultimos N minutos: conclusao primeiro, numero depois
   ============================================================
   A peca lia de tras para frente. O titulo vinha, e logo abaixo dele
   quatro barras; clicando no "?", um paragrafo de IA se enfiava ENTRE
   o titulo e as barras, empurrando para baixo justamente a evidencia
   que ele comentava. O relato foi "extremamente confusas e
   desorganizadas", e a bagunca era de ordem, nao de conteudo: nenhum
   numero estava errado, eles so estavam depois da opiniao.

   A ordem agora e periodo, conclusao, numero que sustenta,
   evidencia desenhada, contexto, aprofundamento. Quem olha dois
   segundos le a conclusao; quem olha dez confere ela nas barras.

   Nada disto e cartao: sao secoes dentro do mesmo bloco, separadas
   por espaco e uma linha. Cartao dentro de cartao achata hierarquia,
   que e o problema que esta rodada existe para resolver. */
/* Centralizado, e com mais ar.
   A conclusao fica em cima de uma peca SIMETRICA: a faixa de times e
   as barras tem os dois lados espelhados com o rotulo no meio. Texto
   encostado na esquerda em cima disso parecia de outro bloco. E o
   respiro era pouco: a frase nascia colada no titulo. */
.ag-corpo { padding: 18px var(--s4) 10px; display: grid; gap: 6px;
  justify-items: center; text-align: center; }
/* A conclusao e o maior texto do bloco, e e a unica coisa em corpo
   grande: se duas coisas gritam, nenhuma grita. */
.ag-titulo { font-family: var(--display); font-size: 17.5px; font-weight: 700;
  line-height: 1.3; color: var(--text-primary); text-wrap: balance; max-width: 34ch; }
.ag-resumo { font-size: 14.5px; line-height: 1.45; color: var(--text-secondary);
  font-variant-numeric: tabular-nums; text-wrap: balance; max-width: 42ch; }
/* Contexto e metadata: fica embaixo das barras, em corpo pequeno, e
   separado por uma linha em vez de por outra caixa. */
.ag-contexto { margin: 0 var(--s4); padding-top: 10px;
  border-top: 1px solid var(--border-subtle); text-align: center;
  font-size: 13px; color: var(--text-muted); font-variant-numeric: tabular-nums; }
/* O rodape do aprofundamento. O botao "?" vive aqui agora, com
   rotulo, em vez de solto no titulo: la em cima ele parecia uma nota
   de rodape do titulo, e o que ele abre e a leitura do jogo inteira. */
.ag-fundo { display: flex; align-items: center; justify-content: center; gap: 8px;
  margin: 12px var(--s4) 0; padding: 10px 0 2px;
  border-top: 1px solid var(--border-subtle); }
.ag-fundo span { font-size: 13.5px; font-weight: 600; color: var(--text-secondary); }
.agora .explicacao { margin: 0 var(--s4) 4px; }

/* `.bloco-sub` era emitido por tres blocos e nao tinha regra nenhuma
   no arquivo: saia como paragrafo cru, do tamanho do corpo, disputando
   atencao com o titulo logo acima. */
.bloco-sub { margin: 0 var(--s4); font-size: 13.5px; line-height: 1.45;
  color: var(--text-muted); }

/* Fluxo da partida, no formato do placar ao vivo: uma barra por faixa
   de cinco minutos, mandante para cima, visitante para baixo, e a
   linha do intervalo cortando o grafico. */
/* ============================================================
   FLUXO DA PARTIDA
   ============================================================
   A primeira versao era um retangulo com lavagem verde em cima e
   roxa embaixo, barras verdes e roxas gordas, e uma regua que
   mentia. Verde e roxo nao sao cores deste produto -- sao as cores
   que sobraram de quando cada bloco escolhia a sua --, e a lavagem
   de fundo pintava metade do cartao para dizer algo que a direcao
   da barra ja diz sozinha.

   Agora:
   . a cor dos dois lados e a MESMA do resto da pagina (--cor-casa
     e --cor-fora, que saem do time e ja pintam as barras de
     estatistica e as bolinhas da legenda). Um grafico que usa cor
     propria obriga a pessoa a reaprender a legenda a cada bloco.
   . sem lavagem de fundo: sobra o eixo, que e a unica linha que
     precisa existir.
   . as barras tem largura maxima e ficam centradas na fatia de
     cinco minutos, entao o grafico nao vira uma parede de blocos
     quando o jogo tem poucas fotografias.
   ============================================================ */
.momentum { background: var(--surface-1); border-radius: 10px; padding: 16px 18px; }
/* O grafico tem largura maxima porque a geometria dele depende da
   razao entre a fatia de cinco minutos e a largura da barra. Esticado
   para 830px num monitor, cada fatia vira 80px e as barras viram
   pontinhos espalhados com 60px de vazio entre eles: o desenho deixa
   de ser um fluxo e vira um punhado de marcas soltas. */
.mm-caixa { position: relative; display: grid;
  grid-template-columns: 24px minmax(0, 1fr); grid-template-rows: 1fr 1fr;
  column-gap: 10px; align-items: center; max-width: 620px; }
/* Os escudos saem de uma coluna propria e passam a ser dois itens da
   mesma grade do grafico: assim o do mandante fica na altura da
   metade de cima e o do visitante na de baixo, sem altura fixa
   repetida em tres lugares que precisavam combinar na mao. */
.mm-lado { grid-column: 1; justify-self: center; display: flex; align-items: center; }
.mm-lado.casa { grid-row: 1; align-self: center; }
.mm-lado.fora { grid-row: 2; align-self: center; }
.mm-lado img { width: 20px; height: 20px; object-fit: contain; }
.mm-lado.fora img { opacity: .8; }
.mm-grafico { grid-column: 2; grid-row: 1 / span 2; position: relative; height: 132px; }
.mm-eixo { position: absolute; left: 0; right: 0; top: 50%; height: 1px;
  background: var(--border-subtle); }
/* A marca do intervalo agora cai no minuto 45 do eixo, e nao na
   metade da largura por acidente. */
/* Tracejada de proposito: a linha do gol e inteira. Duas linhas
   verticais iguais no mesmo grafico, uma querendo dizer "intervalo" e
   a outra "gol", obrigam a pessoa a decorar qual e qual. */
.mm-corte { position: absolute; top: 0; bottom: 0; width: 1px;
  background: repeating-linear-gradient(to bottom,
    var(--border-strong) 0 3px, transparent 3px 6px); }
/* A palavra "intervalo" mora na REGUA, no lugar do marco de 45'. Ela
   ja tentou morar em cima da linha, e ali batia no ponto do gol de
   44' -- dois rotulos disputando os mesmos 40px. Na regua nada mais
   passa, e um divisor de tempo e exatamente uma marca de eixo. */
.mm-col { position: absolute; top: 0; bottom: 0; display: grid;
  grid-template-rows: 1fr 1fr; justify-items: center; }
/* 72% da fatia, e nao 100%: com o jogo inteiro na tela a fatia de
   cinco minutos tem 16px, e barras de 16px encostam umas nas outras e
   viram uma faixa continua -- que e o desenho de "o jogo foi assim o
   tempo todo", exatamente o contrario do que o grafico quer dizer. */
.mm-casa, .mm-fora { display: block; width: 80%; max-width: 40px; min-width: 4px;
  border-radius: 2px; }
.mm-casa { align-self: end; background: var(--cor-casa, var(--accent)); }
.mm-fora { align-self: start; background: var(--cor-fora, var(--roxo)); }
/* O gol no eixo. Um fio da altura do grafico marca o minuto e a
   bolinha diz de quem foi: fica na metade de cima se foi do
   mandante, na de baixo se foi do visitante -- a mesma convencao
   das barras, para nao precisar de outra legenda. */
.mm-gol { position: absolute; top: 0; bottom: 0; width: 1px;
  background: var(--n60); }
.mm-gol i { position: absolute; left: 50%; width: 7px; height: 7px; margin-left: -3.5px;
  border-radius: 50%; border: 2px solid var(--surface-1); box-sizing: content-box; }
.mm-gol.casa i { top: -2px; background: var(--cor-casa, var(--accent)); }
.mm-gol.fora i { bottom: -2px; background: var(--cor-fora, var(--roxo)); }
.mm-regua { position: relative; height: 14px; margin: 8px 0 0 34px; max-width: 586px;
  font-size: 12px; color: var(--text-muted); font-variant-numeric: tabular-nums; }
.mm-regua span { position: absolute; top: 0; transform: translateX(-50%); }
/* As duas pontas encostam na borda em vez de vazar meia palavra
   para fora do cartao. */
.mm-regua span:first-child { transform: none; }
.mm-regua span:last-child { transform: translateX(-100%); }

/* ---------- linha do tempo dos lances ---------- */
.linha-tempo { position: relative; display: grid; gap: 10px; padding: 6px 0 2px;
  margin-bottom: 20px; }
/* A linha vertical que sustenta a coluna do meio. */
.linha-tempo::before { content: ''; position: absolute; top: 0; bottom: 0; left: 50%;
  width: 2px; margin-left: -1px; background: var(--border-subtle); }
.lt-cab { display: grid; grid-template-columns: 1fr 92px 1fr; align-items: center;
  font-size: 12px; font-weight: 700; letter-spacing: .01em;
  color: var(--text-muted); padding-bottom: 10px; }
.lt-cab span:first-child { text-align: right; padding-right: 14px; }
.lt-cab span:last-child { grid-column: 3; padding-left: 14px; }

/* A marca do intervalo. Ela atravessa as tres colunas e fica em cima
   da linha vertical do meio, por isso o fundo solido no rotulo: sem
   ele a linha passa por tras do texto. */
.lt-ht { grid-column: 1 / -1; display: flex; align-items: center; justify-content: center;
  gap: 10px; margin: 4px 0; }
.lt-ht span, .lt-ht b { background: var(--bg); padding: 3px 10px; border-radius: 999px; }
.lt-ht span { font-size: 12px; font-weight: 600; letter-spacing: .06em;
  text-transform: uppercase; color: var(--text-muted); }
.lt-ht b { font-size: 13.5px; font-weight: 700; font-variant-numeric: tabular-nums;
  border: 1px solid var(--border-subtle); }

.lt-item { display: grid; grid-template-columns: 1fr 92px 1fr; align-items: center; }
/* Sem isto, o minuto vai para a linha de baixo: a grade nao volta uma
   coluna atras quando o item seguinte pede uma coluna anterior. */
.lt-item > * { grid-row: 1; }
.lt-lado { display: flex; align-items: center; gap: 12px; min-width: 0;
  background: var(--surface-1); border-radius: 10px; padding: 10px 14px; }
.lt-item.casa .lt-lado { grid-column: 1; flex-direction: row-reverse; text-align: right; }
.lt-item.fora .lt-lado { grid-column: 3; }
.lt-txt { min-width: 0; }
.lt-txt b { display: block; font-size: 15.5px; font-weight: 600; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; }
.lt-rot { display: block; font-size: 13.5px; color: var(--text-secondary); margin-top: 1px; }
.lt-apoio { display: block; font-size: 13px; color: var(--text-muted); margin-top: 2px; }
.lt-apoio.sai { color: var(--danger); }

.lt-meio { grid-column: 2; display: grid; justify-items: center; gap: 2px; position: relative;
  z-index: 1; }
.lt-ico { width: 28px; height: 28px; border-radius: 50%; background: var(--bg);
  border: 2px solid var(--border-subtle); display: grid; place-items: center; }
.lt-ico svg { width: 15px; height: 15px; fill: currentColor; }
.lt-ico .ev-gol { color: var(--success); display: grid; place-items: center; }
.lt-ico .ev-troca { color: var(--accent); display: grid; place-items: center; }
.lt-ico .ev-outro { color: var(--text-muted); }
.lt-item.goal .lt-ico { border-color: var(--success); }
.lt-item.card .lt-ico { border-color: var(--warning); }
.lt-item.subst .lt-ico { border-color: var(--accent); }
.lt-min { font-family: var(--display); font-size: 15px; font-weight: 700;
  font-variant-numeric: tabular-nums; }
.lt-tempo { font-size: 12px; font-weight: 600; color: var(--text-muted); letter-spacing: .04em; }

/* Retrato e escudo, usados pela linha do tempo. */
.lc-foto { position: relative; width: 38px; height: 38px; flex: none; }
.lc-foto img { width: 38px; height: 38px; border-radius: 50%; object-fit: cover;
  background: var(--surface-2); }
.lc-foto.so-escudo img { border-radius: 0; object-fit: contain; background: transparent; }
/* A foto fica POR CIMA das iniciais, no mesmo quadrado. Quando ela nao
   carrega, o listener global de comum.js a esconde e as iniciais, que
   sempre estiveram ali atras, aparecem. Substitui o onerror inline que
   a politica de seguranca do site ja bloqueava. */
.lc-foto > .lc-iniciais { position: absolute; inset: 0; }
.lc-foto > img { position: absolute; inset: 0; }
.lc-iniciais { width: 38px; height: 38px; border-radius: 50%; background: var(--surface-2);
  display: grid; place-items: center; font-size: 13px; font-weight: 700;
  color: var(--text-secondary); }
.lc-escudo { position: absolute; right: -3px; bottom: -3px; width: 18px; height: 18px;
  border-radius: 50%; background: var(--bg); display: grid; place-items: center;
  border: 2px solid var(--surface-1); }
.lc-escudo img { width: 14px; height: 14px; border-radius: 0; object-fit: contain;
  background: transparent; }
.lt-item.casa .lc-escudo { right: auto; left: -3px; }

/* ---------- regra de alinhamento ----------
   Bloco que nao tem motivo para ficar a esquerda fica centrado. Barras
   comparativas, graficos e fichas sao simetricos por natureza: encostar
   a esquerda com sobra do lado direito faz a pagina parecer torta. */
.stats, .stat, .stat-linha, .stat-barra { max-width: none; width: 100%; }
.bloco > .stats, .bloco > .stat-grupo { margin-inline: auto; }
.temp-form { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 16px;
  text-align: center; padding: 0 0 14px; margin-bottom: 16px;
  border-bottom: 1px solid var(--border-subtle); }
.temp-form span { font-family: var(--display); font-size: 20px; font-weight: 700; }
.temp-form em { font-style: normal; font-size: 12px; letter-spacing: .09em; text-transform: uppercase;
  color: var(--text-muted); }
.bloco-pe { text-align: center; }
/* Centralizado serve para o rodape curto de um grafico. No Painel o
   mesmo elemento carrega paragrafo de oito linhas explicando o que a
   tela faz, e texto corrido centralizado e cansativo de ler: o olho
   perde a margem esquerda a cada quebra. Medido a 390px: 277px de
   altura de texto centralizado. */
.painel .bloco-pe { text-align: left; }
.aviso-aba { text-align: center; }

/* ---------- carrossel do banner ----------
   A faixa mais valiosa da home mostrava um jogo so, o dia inteiro.
   Agora ela mostra ate cinco, um por vez. Quem faz o deslizamento e o
   proprio navegador, com scroll-snap: o JS so manda rolar. Assim o
   arrasto no celular funciona de graca e nada quebra se o relogio
   parar. */
.bn-carrossel { position: relative; margin-bottom: 24px; }
.bn-trilho { display: grid; grid-auto-flow: column; grid-auto-columns: 100%;
  overflow-x: auto; scroll-snap-type: x mandatory; scroll-behavior: smooth;
  scrollbar-width: none; border-radius: 14px; }
.bn-trilho::-webkit-scrollbar { display: none; }
.bn-trilho > .banner-rodada { scroll-snap-align: start; margin-bottom: 0;
  border-radius: 14px; }
.bn-trilho > .banner-rodada:hover { transform: none; }
.bn-pontos { display: flex; justify-content: center; gap: 7px; margin-top: 10px; }
.bn-ponto { width: 7px; height: 7px; padding: 0; border: 0; border-radius: 50%;
  background: var(--surface-hover); cursor: pointer;
  /* A transicao deste ponto fica na camada de movimento, junto com
     o resto. Duas declaracoes da mesma coisa em pontos distantes do
     arquivo e como nascem os 345 seletores repetidos da auditoria. */ }
.bn-ponto.ativo { width: 20px; border-radius: 4px; background: var(--accent); }
.bn-ponto:hover { background: var(--text-muted); }
.bn-ponto.ativo:hover { background: var(--accent); }

/* ---------- banner do jogo da rodada ---------- */
/* Tinha um degradê de três cores e um halo azul por cima. O brilho
   competia com os escudos, que são a cor de verdade desta área.
   Ficou uma superfície própria, um pouco mais clara que a página, com
   uma tinta fria muito leve para ainda dizer "este é o jogo". */
/* O cartão do jogo em destaque é tingido pela camisa do mandante,
   entregue no style pelo JavaScript como --tom-casa. Sem cor
   cadastrada, o padrão é o azul da marca e nada muda.
   Uma faixa de 3px na borda esquerda com a mesma cor, porque o
   degradê sozinho some em tela clara. */
/* O banner.
   ------------------------------------------------------------
   As duas camisas entram, uma de cada lado, em 16%. Dezesseis por
   cento e pouco de propósito: Flamengo x Palmeiras tem que dar uma
   NOTA de vermelho à esquerda e uma de verde à direita, e não meia
   tela de cada cor.

   O fallback dentro do var() não é firula. Se `--tom-casa` faltar,
   o `color-mix` vira inválido, e um valor inválido dentro de uma
   variável derruba a declaração `background` INTEIRA do
   pseudo-elemento. A atmosfera já sumiu uma vez por causa de uma
   variável que morava em outro arquivo. */
.banner-rodada { --tom-casa: var(--brand); --tom-fora: var(--brand);
  --atm-casa: color-mix(in srgb, var(--tom-casa, var(--brand)) 16%, transparent);
  --atm-fora: color-mix(in srgb, var(--tom-fora, var(--brand)) 16%, transparent);
  position: relative; overflow: hidden; width: 100%; text-align: left;
  display: grid; gap: 8px; padding: 20px 22px; border-radius: 12px; margin-bottom: 18px;
  /* Cor unica, sem campo de futebol atras. As camadas de atmosfera
     (o gramado, as luzes, o veu) faziam sentido quando o resto da tela
     tambem tinha cor. Num site cinza elas viram a unica coisa colorida
     e puxam o olho para o enfeite em vez do placar. */
  background: var(--surface-1);
  border: 1px solid var(--border-subtle);
  transition: background var(--mv-curto) var(--mv-entra),
              border-color var(--mv-curto) var(--mv-entra); }

/* AO VIVO. O vermelho entra como ACENTO, não como tinta: a faixa
   da esquerda, a etiqueta, e um foco baixo no canto. As camisas
   dos dois times continuam lá. A versão anterior fazia
   `--tom-casa: var(--live)`, o que apagava a cor do mandante e
   pintava o banner inteiro de vermelho. */
/* Ao vivo, intervalo e encerrado deixam de ser cor de borda: os tres
   ja estao escritos dentro do banner, com a bolinha e o minuto. */
.banner-rodada.rolando { --atm-luz2: transparent; }

/* INTERVALO e ENCERRADO têm estado próprio, discreto: um não é o
   outro, e nenhum dos dois é "ao vivo". */
.banner-rodada.fim { --atm-forca: .78; }

.banner-rodada:hover { background: var(--surface-2); }

/* A atmosfera fica DESLIGADA no banner da home. O sistema continua de
   pe para o cabecalho da partida, que e uma tela so e aguenta um
   respiro de cor; a home tem quinze deles empilhados. */
.banner-rodada.tem-atmosfera::before,
.banner-rodada.tem-atmosfera::after { content: none; }
.banner-rodada > * { position: relative; }
.bn-tag { justify-self: start; background: var(--accent); color: #06202E; font-size: 12px;
  font-weight: 700; letter-spacing: .1em; text-transform: uppercase; padding: 5px 11px;
  border-radius: 999px; }
.banner-rodada.rolando .bn-tag { background: var(--live); color: #2A0710; }
.bn-liga { font-size: 12px; font-weight: 600; letter-spacing: .07em; text-transform: uppercase;
  color: var(--text-muted); }
/* A manchete era maior que o placar. Ela explica o jogo; o jogo é o
   jogo. Trocaram de lugar na escala. */
.bn-titulo { font-family: var(--display); font-size: clamp(16px, 1.4vw, 19px); font-weight: 600;
  letter-spacing: -.01em; line-height: 1.25; color: var(--text-secondary); }
.bn-duelo { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 18px;
  margin-top: 6px; }
.bn-time { display: flex; align-items: center; gap: 12px; min-width: 0; }
.bn-time.dir { flex-direction: row-reverse; }
.bn-time img, .bn-time .comp-bola { width: 68px; height: 68px; object-fit: contain; flex: none; }
.bn-time b { font-size: 20px; font-weight: 700; letter-spacing: -.015em;
  color: var(--text-primary); white-space: nowrap; overflow: hidden;
  text-overflow: ellipsis; }
.bn-meio { display: grid; justify-items: center; gap: 4px; }
.bn-placar { font-family: var(--display); font-size: 46px; font-weight: 800; line-height: 1;
  letter-spacing: -.03em; color: #FFFFFF; font-variant-numeric: tabular-nums; }
.bn-placar i { font-style: normal; color: var(--text-muted); margin: 0 6px; }
/* No cartaz o placar e branco puro e enorme. A hora ficava no mesmo
   lugar, no mesmo tamanho e com o mesmo grito -- so que ela nao e
   resultado de nada. A data embaixo desce junto, senao ficaria mais
   clara que a hora que ela acompanha. */
.bn-placar.hora { font-size: 40px; color: var(--text-muted); }
.bn-estado { font-size: 13px; color: var(--text-secondary); }
.bn-placar.hora ~ .bn-estado { color: var(--text-muted); }
.bn-estado.vivo { color: var(--live); font-weight: 700; }
.bn-pe { font-size: 13px; color: var(--text-muted); margin-top: 4px; }

/* ---------- artilheiros ---------- */
.art-lista { background: var(--surface-1); border-radius: 10px; overflow: hidden; }
.art-linha { display: grid; grid-template-columns: 26px 30px 1fr auto; align-items: center;
  gap: 12px; width: 100%; padding: 11px 16px; text-align: left;
  border-bottom: 1px solid var(--border-subtle); transition: background var(--mola); }
.art-linha:last-child { border-bottom: 0; }
.art-linha:hover { background: var(--surface-hover); }
.art-pos { font-size: 14px; font-weight: 700; color: var(--text-muted);
  font-variant-numeric: tabular-nums; }
.art-linha img, .art-foto { width: 26px; height: 26px; object-fit: contain; }
.art-foto { border-radius: 50%; background: var(--surface-2); display: block; }
.art-nome { font-size: 15.5px; font-weight: 600; min-width: 0; }
.art-nome i { display: block; font-style: normal; font-size: 13px; color: var(--text-muted);
  margin-top: 1px; }
.art-gols { font-size: 19px; font-weight: 700; color: var(--accent);
  font-variant-numeric: tabular-nums; }

/* ---------- cartao do proximo jogo em destaque ---------- */
.proximo { background: var(--surface-1); border-radius: 10px; padding: 14px 18px;
  margin-bottom: 16px; display: grid; gap: 12px; width: 100%; text-align: left;
  transition: background var(--mola); }
.proximo:hover { background: var(--surface-hover); }
.proximo-topo { display: flex; align-items: center; gap: 8px; font-size: 12.5px; font-weight: 700;
  letter-spacing: .08em; text-transform: uppercase; color: var(--text-muted); }
.proximo-topo img { width: 16px; height: 16px; object-fit: contain; }
.proximo-topo .marca-jogo { color: var(--accent); letter-spacing: .06em; }
.proximo-duelo { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 16px; }
.proximo-time { display: flex; align-items: center; gap: 10px; min-width: 0; font-size: 17px;
  font-weight: 600; overflow: hidden; }
.proximo-topo { flex-wrap: wrap; }
.proximo-time:last-child { flex-direction: row-reverse; text-align: right; }
.proximo-time img { width: 32px; height: 32px; object-fit: contain; flex: none; }
.proximo-time span { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.proximo-hora { display: grid; justify-items: center; gap: 1px; }
.proximo-hora strong { font-family: var(--display); font-size: 23px; font-weight: 700;
  font-variant-numeric: tabular-nums; }
.proximo-hora small { font-size: 12px; color: var(--text-muted); }
.proximo-pe { font-size: 13px; color: var(--text-muted); text-align: center;
  padding-top: 10px; border-top: 1px solid var(--border-subtle); }

/* ---------- pagina da partida em uma rolagem so ---------- */
.sec-rot { display: none; align-items: baseline; gap: 12px; margin: 0 0 12px; }
.sec-rot h2 { font-family: var(--display); font-size: 21px; font-weight: 700;
  letter-spacing: -.01em; }
.sec-rot span { font-size: 13px; color: var(--text-muted); }
.sec-rot::after { content: ''; flex: 1; height: 1px; background: var(--border-subtle); }
.aba-secao + .aba-secao { margin-top: 28px; }

/* ============================================================
   Análise da partida
   ============================================================
   A área mais importante da tela da partida, e a que sustenta o
   plano pago. Regra da casa aqui: a categoria é metadado pequeno,
   o título é a frase protagonista e a evidência é legível mas
   secundária. Nada disso depende de cor: em escala de cinza a
   hierarquia continua de pé.

   O cadeado não esconde texto. O que está bloqueado não chega ao
   navegador; ele só diz quantas são e do que falam. */

.ds {
  max-width: 760px;
  margin-bottom: var(--space-5);
  border-radius: var(--radius-lg);
  border: 1px solid var(--border-default);
  background: var(--surface-1);
}

.ds-topo {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-4) var(--space-4) var(--space-3);
}
.ds-topo h3 {
  margin: 0;
  font-family: var(--display);
  font-size: var(--font-headline);
  font-weight: var(--peso-titulo);
  letter-spacing: .01em;
  color: var(--text-primary);
}
.ds-conta {
  margin-left: auto;
  font-size: var(--font-meta);
  color: var(--text-muted);
  font-variant-numeric: tabular-nums;
}
.ds-marca {
  display: grid;
  place-items: center;
  width: 18px;
  height: 18px;
  color: var(--text-muted);
  flex: none;
}
.ds-marca svg { width: 18px; height: 18px; display: block; }

/* Divisor entre descobertas, e não cartão dentro de cartão. */
.ds-lista { list-style: none; margin: 0; padding: 0; }
.ds-item {
  display: flex;
  gap: var(--space-3);
  padding: var(--space-4);
  border-top: 1px solid var(--border-subtle);
}
/* A ordem importa e é informação: a primeira é a mais relevante. */
.ds-ordem {
  flex: none;
  width: 20px;
  padding-top: 2px;
  font-size: var(--font-meta);
  font-weight: var(--peso-medio);
  color: var(--text-disabled);
  font-variant-numeric: tabular-nums;
}
.ds-corpo { min-width: 0; }
.ds-tag {
  display: inline-block;
  margin-bottom: var(--space-2);
  padding: 2px 7px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border-default);
  font-size: var(--font-micro);
  font-weight: var(--peso-medio);
  letter-spacing: .04em;
  color: var(--text-muted);
}
/* O nível aparece, mas discreto: a badge muda de cor, não a linha
   inteira. Relação é o que vale mais, então é a única que usa a cor
   da marca. */
.ds-tag.ds-relacao { color: var(--brand-text); border-color: rgba(127, 174, 248, .3); }
.ds-tag.ds-tendencia { color: var(--warning); border-color: rgba(217, 164, 65, .3); }

/* Novo e Mudou.
   ------------------------------------------------------------
   Estes dois selos são temporais, não de conteúdo: dizem o que
   aconteceu DESDE A SUA ÚLTIMA VISITA a esta partida. Por isso
   ficam ao lado da etiqueta de nível e não dentro dela, e por isso
   são preenchidos em vez de contornados: contorno é classificação,
   preenchimento é acontecimento.

   Não existe um terceiro selo. "Confirmou" e "não se confirmou"
   exigiriam comparar a descoberta com o que o jogo mostrou, e o
   produto ainda não escreve descoberta de tempo real nem de
   pós-jogo. Selo que afirma mais do que o dado sustenta é pior que
   selo nenhum. */
.ds-marco {
  display: inline-block;
  margin: 0 0 var(--space-2) var(--space-2);
  padding: 2px 7px;
  border-radius: var(--radius-sm);
  font-size: var(--font-micro);
  font-weight: var(--peso-forte);
  letter-spacing: .04em;
}
.ds-marco.novo { background: rgba(46, 111, 224, .18); color: var(--brand-text); }
.ds-marco.mudou { background: rgba(217, 164, 65, .16); color: var(--pro); }

.ds-item h4 {
  margin: 0 0 var(--space-1);
  font-family: var(--display);
  font-size: var(--font-headline);
  font-weight: var(--peso-titulo);
  line-height: 1.3;
  letter-spacing: 0;
  color: var(--text-primary);
}
.ds-item p {
  margin: 0;
  font-size: var(--font-body);
  line-height: 1.55;
  color: var(--text-secondary);
}

/* ---------- a barreira ---------- */
/* Vem depois do conteúdo, nunca antes. O tom quente do PRO aparece
   aqui e em quase nenhum outro lugar, que é o que lhe dá peso. */
.ds-trava {
  padding: var(--space-4);
  border-top: 1px solid var(--border-default);
  background: var(--pro-soft);
  border-radius: 0 0 var(--radius-lg) var(--radius-lg);
}
.ds-trava-topo {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  margin-bottom: var(--space-3);
}
.ds-trava-topo .ds-marca { color: var(--pro); }
.ds-trava-topo strong {
  font-family: var(--display);
  font-size: var(--font-headline);
  font-weight: var(--peso-titulo);
  color: var(--text-primary);
}
.ds-beneficios {
  margin: 0 0 var(--space-4);
  padding: 0;
  list-style: none;
  font-size: var(--font-body);
  line-height: 1.5;
  color: var(--text-secondary);
}
.ds-beneficios li { position: relative; padding-left: 20px; margin-bottom: 3px; }
.ds-beneficios li::before {
  content: '';
  position: absolute;
  left: 4px;
  top: .62em;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--pro);
}
.ds-cta {
  width: 100%;
  max-width: 320px;
  background: var(--pro);
  color: #1A1407;
  font-weight: var(--peso-titulo);
}
.ds-cta:hover { background: #E4B357; }
.ds-preco {
  display: block;
  margin-top: var(--space-2);
  font-size: var(--font-meta);
  color: var(--text-muted);
}
.ds-recado {
  display: block;
  margin-top: var(--space-2);
  font-size: var(--font-body);
  line-height: 1.5;
  color: var(--text-secondary);
}
/* ============================================================
   Entrada do PRO na home
   ============================================================
   Discreta de propósito: um bloco na coluna lateral, depois dos
   destaques. O dourado aparece no selo e no botão, e em mais nada
   da página, que é o que lhe dá peso. */
/* O dourado só existe aqui na home inteira. É isso que faz ele
   significar alguma coisa quando aparece. */
.pro-home {
  border-color: rgba(232, 180, 74, .24);
  background:
    linear-gradient(155deg, rgba(232, 180, 74, .09), transparent 58%),
    var(--surface-1);
}
.pro-home strong {
  display: block;
  margin: 9px 0 6px;
  font-family: var(--display);
  font-size: 18px;
  font-weight: 700;
  line-height: 1.24;
  letter-spacing: -.015em;
  color: var(--text-primary);
}
.pro-selo {
  flex: none;
  padding: 2px 6px;
  border-radius: var(--radius-sm);
  background: var(--pro);
  color: #14100A;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .07em;
}
.pro-home p { margin: 0 0 12px; font-size: 14px; line-height: 1.45; color: var(--text-muted); }
.pro-home-btn { display: flex; align-items: center; justify-content: center; gap: 7px;
  width: 100%; height: 36px; background: var(--pro); color: #14100A; font-weight: 700; }
.pro-home-btn span { font-size: 18px; line-height: 1; }
.pro-home-btn:hover { background: #E4B357; }

/* ============================================================
   MOVIMENTO :: a camada, categoria por categoria
   ============================================================
   Tudo aqui anima `transform` e `opacity`, e nada mais. São as
   duas propriedades que o navegador resolve na placa de vídeo;
   animar largura, altura, cor ou sombra obriga a recalcular o
   desenho da página a cada quadro e é de onde vem a travada em
   celular antigo.

   No fim da folha, `prefers-reduced-motion` desliga tudo isto de
   uma vez. Quem pediu menos movimento no sistema continua vendo
   a mesma informação, parada.
   ============================================================ */

/* ---------- FEEDBACK :: recebi seu toque ---------- */
/* O que mais faltava. No celular, tocar num jogo e esperar meio
   segundo sem nada acontecer é o que faz a pessoa tocar de novo.
   Isto responde antes de a tela trocar. */
.row-jogo, .banner-rodada, .chip, .data, .ml, .mi, .btn,
.jc, .dest, .destaque, .jds, .mjs-jogo, .chave-jogo, .pj-time,
.grupo-topo, .bn-ponto, .caixa-pe, .pro-home-btn, .duelo-time {
  -webkit-tap-highlight-color: transparent;
  transition: transform var(--mv-toque) var(--mv-sai),
              background var(--mv-curto) var(--mv-entra),
              border-color var(--mv-curto) var(--mv-entra),
              opacity var(--mv-curto) var(--mv-entra);
}
.row-jogo:active, .jc:active, .dest:active, .destaque:active,
.jds:active, .mjs-jogo:active, .chave-jogo:active,
.grupo-topo:active, .duelo-time:active, .pj-time:active {
  transform: scale(.988);
}
.banner-rodada:active { transform: scale(.994); }
.chip:active, .data:active, .ml:active, .mi:active,
.btn:active, .pro-home-btn:active, .caixa-pe:active { transform: scale(.96); }
.bn-ponto:active { transform: scale(.82); }

/* ---------- NAVEGAÇÃO :: você saiu de um lugar e chegou em outro ---------- */
/* O painel lateral entra pela direita, que é de onde ele vem: ele
   ocupa a coluna da direita e nasce do clique num jogo da lista. */
@keyframes painel-entra {
  from { opacity: 0; transform: translateX(22px); }
  to   { opacity: 1; transform: none; }
}
.painel-jogo .pj {
  animation: painel-entra var(--mv-longo) var(--mv-entra) both;
}
/* Trocar de jogo com o painel já aberto redesenha o `.pj` inteiro,
   então a mesma animação roda de novo sozinha. É o que separa
   "atualizou" de "é outro jogo". */

/* A aba que aparece sobe um pouco. O deslocamento é pequeno de
   propósito: a pessoa não mudou de tela, mudou de assunto. */
@keyframes aba-entra {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: none; }
}
.aba-secao.aba-entrou {
  animation: aba-entra var(--mv-medio) var(--mv-entra) both;
}

/* A troca de dia desliza do lado para onde a pessoa andou no tempo.
   Ir para amanhã traz a lista da direita; voltar para ontem, da
   esquerda. Uma lista que sempre entra igual não diz nada. */
@keyframes dia-frente {
  from { opacity: 0; transform: translateX(26px); }
  to   { opacity: 1; transform: none; }
}
@keyframes dia-tras {
  from { opacity: 0; transform: translateX(-26px); }
  to   { opacity: 1; transform: none; }
}
.lista-do-dia[data-sentido="frente"] { animation: dia-frente var(--mv-longo) var(--mv-entra) both; }
.lista-do-dia[data-sentido="tras"]   { animation: dia-tras var(--mv-longo) var(--mv-entra) both; }

/* ---------- ESTADO :: carregando, vazio, ou pronto ---------- */
/* O esqueleto já pulsa mais acima nesta folha. O que faltava era o
   caminho contrário: o conteúdo que CHEGA no lugar do esqueleto
   não pode aparecer de uma vez, senão a tela pisca. */
.grupo-liga { animation: entrar var(--mv-medio) var(--mv-entra) both; }
.grupo-liga:nth-of-type(2) { animation-delay: 40ms; }
.grupo-liga:nth-of-type(3) { animation-delay: 80ms; }
.grupo-liga:nth-of-type(n+4) { animation-delay: 110ms; }

/* O acordeão da competição já gira a seta em outro ponto desta
   folha. Não repito a regra aqui: a auditoria achou 345 seletores
   declarados duas vezes com centenas de linhas de distância, e é
   exatamente assim que eles nascem. */

/* ---------- TEMPO REAL :: mudou agora, sem você pedir ---------- */
/* O ponto do ao vivo. Antes era só opacidade indo e voltando, que
   de longe some. Agora ele bate: um pulso curto e uma pausa, que é
   o ritmo que o olho lê como "isto está acontecendo". */
@keyframes bater {
  0%   { transform: scale(1);    opacity: 1; }
  14%  { transform: scale(1.55); opacity: 1; }
  32%  { transform: scale(1);    opacity: .72; }
  100% { transform: scale(1);    opacity: 1; }
}
/* Todos os pontos de ao vivo do produto, no MESMO ritmo. Eram
   quatro declarações espalhadas por 4.000 linhas, com três durações
   diferentes: o ponto da lista batia num compasso, o da tira noutro
   e o do cabeçalho num terceiro. Para quem olha a tela, isso não é
   detalhe: são três coisas diferentes piscando, em vez de uma
   informação só repetida. */
.jc-selo.vivo s, .grupo-vivo s, .c-time .pulso, .tira-tag s, .tc-est s,
.rj-status.vivo::before, .bn-estado.vivo::before, .duelo-estado.vivo::before {
  animation: bater 1.9s var(--mv-entra) infinite;
}
/* O estado "ao vivo" do banner ganha o mesmo ponto, que ele não
   tinha: era a única bolha vermelha da página sem batimento. */
.bn-estado.vivo::before {
  content: '';
  display: inline-block;
  width: 6px; height: 6px;
  margin-right: 6px;
  border-radius: 50%;
  background: currentColor;
  vertical-align: baseline;
}

/* O gol. É o único momento do produto que merece uma animação
   longa, porque é o único que a pessoa abriu o site para ver.
   O número dá um salto e assenta. */
@keyframes gol-salta {
  0%   { transform: scale(1); }
  22%  { transform: scale(1.34); }
  55%  { transform: scale(.97); }
  100% { transform: scale(1); }
}
.jc-placar em.mudou, .bn-placar.mudou, .pj-placar.mudou, .duelo-placar.mudou {
  animation: gol-salta var(--mv-lento) var(--mv-entra),
             acendeu 1.1s ease-out;
  transform-origin: center;
  display: inline-block;
}

/* Lance que chegou agora na linha do tempo. Entra pelo lado do time
   que fez, o mesmo lado em que ele vive na linha: o movimento já
   diz de quem foi antes de a pessoa ler o nome. */
@keyframes lance-entra-esq {
  from { opacity: 0; transform: translateX(-18px); }
  to   { opacity: 1; transform: none; }
}
@keyframes lance-entra-dir {
  from { opacity: 0; transform: translateX(18px); }
  to   { opacity: 1; transform: none; }
}
.lt-item.lance-novo.casa { animation: lance-entra-esq var(--mv-longo) var(--mv-entra) both; }
.lt-item.lance-novo.fora { animation: lance-entra-dir var(--mv-longo) var(--mv-entra) both; }

/* ---------- HIERARQUIA :: olhe para isto primeiro ---------- */
/* O ponto ativo do carrossel cresce em vez de trocar de cor. O
   crescimento diz "de quantos, qual"; a troca de cor só diz "outro".
   `width` aqui é exceção consciente à regra de só animar transform e
   opacity: são 7px virando 20px num elemento sem irmãos ao lado, e o
   recálculo custa menos que o truque de scaleX, que deformaria a
   bolinha. É o único lugar da camada que faz isso. */
.bn-ponto { transition: width var(--mv-medio) var(--mv-entra),
                        background var(--mv-curto) var(--mv-entra); }

/* O PRO é a única coisa dourada da home e o único bloco com um
   movimento próprio: o chevron do botão anda quando o mouse chega.
   Uma seta que se move é um convite; uma seta parada é enfeite. */
.pro-home-btn span { display: inline-block; margin-left: 6px;
  transition: transform var(--mv-curto) var(--mv-entra); }
.pro-home-btn:hover span { transform: translateX(3px); }

/* ---------- ATMOSFERA :: isto é uma noite de futebol ---------- */
/* O refletor respira, e SÓ no jogo que está rolando. Num banner de
   jogo encerrado isso seria enfeite; no jogo ao vivo é a mesma
   informação que o ponto vermelho, dita pelo fundo inteiro.
   É opacidade num pseudo-elemento: não repinta nada da página. */
@keyframes refletor {
  0%, 100% { opacity: var(--atm-forca); }
  50%      { opacity: calc(var(--atm-forca) * .74); }
}
.banner-rodada.rolando.tem-atmosfera::before,
.cabeca.ao-vivo.tem-atmosfera::before {
  animation: refletor 6.5s var(--mv-entra) infinite;
}

/* ============================================================
   ATMOSFERA
   ============================================================
   A primeira versão errou a mão e o dono do produto disse na
   cara: "o fundo do banner ficou ruim demais, muito feio".
   Estava certo. O gramado entrava com 56% de verde saturado e as
   faixas do corte apareciam a olho nu. Virou um retângulo verde
   com listras, que é a definição de efeito que chama atenção
   para si mesmo em vez de servir o conteúdo.

   A regra que ficou, e que vale para tudo aqui: SE DÁ PARA
   APONTAR O EFEITO, ELE ESTÁ FORTE DEMAIS. A pessoa não deve
   olhar e ver um degradê, um refletor ou uma listra. Deve olhar
   e achar que aquilo ali é uma noite de futebol.

   Cinco camadas, de baixo para cima:

     1. base navy
     2. campo insinuado no rodapé, por LUMINÂNCIA e não por verde
     3. luz dos dois times, nas laterais, em opacidade mínima
     4. refletor azul do alto
     5. véu de leitura

   A ordem no `background` é a inversa: a primeira da lista é a
   de cima. O véu vem primeiro porque contraste ganha de
   atmosfera, sempre.
   ============================================================ */

:root {
  /* A luz alta. É o que dá a sensação de "jogo à noite". */
  --atm-luz: rgba(86, 140, 230, .22);
  --atm-luz2: rgba(48, 82, 164, .15);

  /* O campo. Repare que quase não há verde: é um azul-esverdeado
     muito escuro que só LEVANTA a luminância do rodapé. Verde de
     verdade, na intensidade que estava antes, lê como tinta. */
  --atm-campo: rgba(22, 52, 60, .30);

  /* As faixas do corte do gramado. Em .022 elas não são vistas,
     são sentidas: quebram a chapa lisa do rodapé e mais nada. */
  --atm-faixa: rgba(255, 255, 255, .022);

  --atm-forca: 1;

  /* A cor de identidade da família, cheia. Usada só para marcar
     coisa pequena: a faixa da competição na lista. É o que tira a
     home do cinza sem encher a tela de cor. */
  --atm-cor: var(--brand);

  /* A luz de cada time, nas duas laterais do banner. Transparente
     por padrão: sem cor cadastrada, o banner é só a noite azul. */
  --atm-casa: transparent;
  --atm-fora: transparent;
}

/* Noite de jogo no Brasil: luz branca quente, campo um pouco mais
   presente. É o estádio que o público conhece. */
[data-atm="brasil"] {
  --atm-luz: rgba(255, 244, 216, .20);
  --atm-luz2: rgba(255, 228, 172, .13);
  --atm-campo: rgba(26, 62, 52, .34);
  --atm-faixa: rgba(255, 255, 255, .026);
  --atm-cor: #3FA463;
}

/* Libertadores: mais escura que a brasileira, a luz fria de um
   lado e o calor do sinalizador do outro. */
[data-atm="conmebol"] {
  --atm-luz: rgba(140, 200, 255, .20);
  --atm-luz2: rgba(255, 162, 78, .13);
  --atm-campo: rgba(18, 58, 54, .32);
  --atm-faixa: rgba(255, 255, 255, .024);
  --atm-cor: #DE9A3C;
}

/* Champions: azul frio, limpo. A noite mais arrumada das cinco. */
[data-atm="uefa"] {
  --atm-luz: rgba(150, 190, 255, .23);
  --atm-luz2: rgba(184, 208, 255, .12);
  --atm-campo: rgba(20, 54, 58, .28);
  --atm-faixa: rgba(255, 255, 255, .022);
  --atm-cor: #4C7FE0;
}

/* Liga europeia de fim de semana: luz neutra, sóbria. É jogo de
   rodada, e a atmosfera não devia fingir que é final. */
[data-atm="europa"] {
  --atm-luz: rgba(226, 236, 250, .15);
  --atm-luz2: rgba(196, 214, 240, .09);
  --atm-campo: rgba(22, 56, 56, .26);
  --atm-faixa: rgba(255, 255, 255, .02);
  --atm-cor: #7E93C4;
}

/* Seleção: a única família que usa a cor da taça. */
[data-atm="selecao"] {
  --atm-luz: rgba(244, 212, 128, .20);
  --atm-luz2: rgba(110, 190, 255, .11);
  --atm-campo: rgba(24, 58, 52, .30);
  --atm-faixa: rgba(255, 255, 255, .024);
  --atm-cor: #E0B54A;
}

/* A faixa da competição na lista.
   ------------------------------------------------------------
   É a resposta ao "o site inteiro parece de uma cor só". Não
   adianta colorir o banner e deixar trinta grupos idênticos
   embaixo: o que a pessoa passa o tempo olhando é a lista.

   São 2px na borda esquerda, na cor da família. A cor aqui não é
   enfeite, é endereço: numa home de sábado com quinze
   competições, a pessoa acha a dela pela cor antes de ler o nome.

   Jogo rolando derruba a cor e assume o vermelho: "está
   acontecendo" ganha de "qual competição é". */
/* O trilho colorido da competicao saiu.
   ------------------------------------------------------------
   Ele fazia sentido sobre a escala navy, onde quase se confundia com
   a borda. Sobre cinza neutro virou um fio verde, um fio roxo e um
   fio azul empilhados na home, cada um de uma competicao, e o olho
   passa a procurar o que significa cada cor.

   Quem diz de que competicao e o bloco e o escudo dela no cabecalho,
   que e mais direto que uma cor que precisa ser decorada. */
.grupo-liga[data-atm] { border-left: 1px solid var(--border-subtle); }
/* O trilho NÃO vira vermelho quando há jogo rolando no grupo.
   Ele é o endereço da competição: trocar a cor dele tira a única
   pista que a pessoa usa para achar a competição dela, e soma mais
   uma tarja vermelha numa tela que já tem o suficiente. Quem avisa
   que tem jogo rolando é a etiqueta "1 ao vivo" no cabeçalho, que
   diz isso com palavra em vez de cor. */

/* A camada.
   ------------------------------------------------------------
   Usada pelo banner da home, pelo cabeçalho da partida e pelo
   topo do painel. Dois pseudo-elementos, e nenhum deles anima
   nada além de opacity. */
.tem-atmosfera { position: relative; overflow: hidden; }
.tem-atmosfera > * { position: relative; }
.tem-atmosfera::before,
.tem-atmosfera::after {
  content: '';
  position: absolute;
  inset: 0;
  pointer-events: none;
  border-radius: inherit;
}

/* Camadas 1 a 4, mais o véu. */
.tem-atmosfera::before {
  opacity: var(--atm-forca);
  background:
    /* VÉU. Primeiro da lista, logo em cima de tudo. Escurece o
       rodapé, onde fica o nome do estádio, e o topo, onde fica a
       etiqueta. Sem ele o texto miúdo cai em cima da parte mais
       clara do campo e reprova no contraste: são 3.47:1 contra
       4.97:1, e `npm run contraste` refaz essa conta. */
    linear-gradient(to top, rgba(0, 0, 0, .34), transparent 26%),
    linear-gradient(to bottom, rgba(0, 0, 0, .22), transparent 24%),
    /* LUZ DOS TIMES. Nas duas pontas, e param bem antes do centro:
       o meio do banner tem que continuar escuro e neutro, porque é
       onde mora o placar. Atmosfera, não camisa de futebol. */
    radial-gradient(42% 120% at 2% 50%, var(--atm-casa), transparent 62%),
    radial-gradient(42% 120% at 98% 50%, var(--atm-fora), transparent 62%),
    /* REFLETOR. Dois focos no alto, que é de onde vem a luz de um
       estádio. O centro fica na borda de cima, não acima dela:
       com o centro fora da caixa só aparecia a parte já apagada do
       degradê e a luz sumia. */
    radial-gradient(76% 116% at 12% 0%, var(--atm-luz), transparent 60%),
    radial-gradient(76% 116% at 88% 0%, var(--atm-luz2), transparent 60%),
    /* CAMPO. Sobe do rodapé e morre antes da metade. */
    linear-gradient(to top, var(--atm-campo) 0%, transparent 42%);
}

/* As faixas do corte do gramado, limitadas ao rodapé.
   A máscara é o que impede isto de virar papel de parede: acima
   de 22% da altura não existe mais nada. */
.tem-atmosfera::after {
  background: repeating-linear-gradient(101deg,
    var(--atm-faixa) 0 30px, transparent 30px 60px);
  -webkit-mask-image: linear-gradient(to top, #000, transparent 22%);
  mask-image: linear-gradient(to top, #000, transparent 22%);
}

/* ============================================================
   O FIM DA COLUNA
   ============================================================
   Numa sexta de Série B com três jogos, a coluna do meio acabava na
   metade da altura do trilho da direita e sobravam quatrocentos
   pixels de fundo vazio. O conserto é conteúdo, não enfeite: o que
   tem amanhã, que é justamente o que se pergunta num dia parado.

   Só aparece em dia magro, então não existe estado "vazio" para
   desenhar aqui: ou o bloco tem jogo, ou ele não existe. */
#fim-da-coluna:empty { display: none; }
#fim-da-coluna { animation: entrar var(--mv-medio) var(--mv-entra) both; }
#fim-da-coluna .secao { margin-top: var(--space-6); }
#fim-da-coluna .secao em {
  font-style: normal;
  font-size: var(--font-meta);
  font-weight: var(--peso-medio);
  color: var(--text-muted);
  letter-spacing: 0;
}

/* Botão de saída discreto: não compete com nada, e some no fundo
   até a pessoa chegar nele. */
.btn-fantasma {
  display: block;
  width: 100%;
  margin-top: var(--space-3);
  padding: 11px;
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-md);
  background: transparent;
  color: var(--text-secondary);
  font-family: inherit;
  font-size: var(--font-secondary);
  font-weight: var(--peso-titulo);
  cursor: pointer;
  transition: background var(--mv-curto) var(--mv-entra),
              color var(--mv-curto) var(--mv-entra),
              border-color var(--mv-curto) var(--mv-entra);
}
.btn-fantasma:hover {
  background: var(--surface-1);
  border-color: var(--border-default);
  color: var(--text-primary);
}
.btn-fantasma:active { transform: scale(.985); }

/* ============================================================
   piso tipografico: 11px, e ponto
   ============================================================
   Havia 54 declaracoes de fonte abaixo de 11px espalhadas pelo CSS:
   9, 9,5, 10 e 10,5. Todas subiram para 11 de uma vez. Onze e o
   menor tamanho que ainda se le num celular a distancia de braco, e
   e por isso que "tem umas fontes mt pequeninas" aparecia em todo
   relato de celular. Se algum rotulo precisar parecer menor, o que
   muda e o PESO e a COR, nunca o tamanho: caixa alta com
   letter-spacing em cinza ja le como etiqueta em 11px.

   Quem for baixar de 11 outra vez: o teste "nenhuma fonte abaixo de
   onze pixels" reprova a subida. */

/* ============================================================
   relevo: o que faz a tela parecer feita, e nao montada
   ============================================================
   O relato foi "sinto o site meio cru, falta algo foda, efeitos
   sutis". Traduzindo para o que da para medir: a tela e uma pilha de
   retangulos do mesmo cinza, um do lado do outro, todos na mesma
   altura. Nada esta na frente de nada.

   A regra da casa continua valendo: animacao tem que comunicar. Aqui
   nao ha animacao nova, ha HIERARQUIA. Sombra num fundo escuro nao e
   enfeite, e o unico jeito de dizer "este cartao esta na frente da
   pagina" sem gastar mais uma cor. Sao tres camadas, e so tres:

   --rel-1  o cartao comum, pousado na pagina
   --rel-2  o que reage ao mouse, no momento em que reage
   --rel-3  o que flutua de verdade: painel, busca, menu

   O fio claro de um pixel no topo (`inset 0 1px 0`) e o que faz a
   borda de cima do cartao pegar luz. E o detalhe mais barato e o que
   mais muda a sensacao: sem ele, o cartao escuro sobre fundo escuro
   nao tem aresta nenhuma. */
:root {
  --rel-1: 0 1px 2px rgba(0, 0, 0, .28), 0 10px 22px -16px rgba(0, 0, 0, .7);
  --rel-2: 0 2px 4px rgba(0, 0, 0, .3), 0 14px 28px -16px rgba(0, 0, 0, .75);
  --rel-3: 0 10px 40px -12px rgba(0, 0, 0, .8);
  --luz-topo: inset 0 1px 0 rgba(255, 255, 255, .045);
}

.bloco, .caixa, .tira, .datas, .leitura, .banner-rodada, .cabeca,
.art-lista, .proximo, .momentum, .ds, .time-capa {
  box-shadow: var(--luz-topo), var(--rel-1);
}
/* A capa e a fileira de abas sao UMA peca: a sombra fica so na de
   baixo, senao aparece um risco escuro entre as duas. */
.time-capa { box-shadow: var(--luz-topo); }
.time-capa + .chips.abas { box-shadow: var(--rel-1); }
/* "O bloco de abas ta claramente com bug no canto." A capa tinha os
   QUATRO cantos arredondados e borda dos quatro lados; a fileira de
   abas, colada embaixo, tinha cantos de cima retos e nenhuma borda
   lateral. No encontro das duas sobrava o arco da capa e um degrau de
   1px de cada lado. Agora a capa perde os cantos e a borda de baixo, e
   as abas ganham a mesma borda lateral: viram uma peca so. */
.time-capa:has(+ .chips.abas) { border-bottom-left-radius: 0; border-bottom-right-radius: 0;
  border-bottom-color: transparent; }
.time-capa + .chips.abas { border-left: 1px solid rgba(255, 255, 255, .06);
  border-right: 1px solid rgba(255, 255, 255, .06); }
.bloco:hover, .caixa:hover { box-shadow: var(--luz-topo), var(--rel-1); }

/* O que e clicavel sobe um degrau ENQUANTO o mouse esta nele. E
   resposta a uma acao, nao decoracao parada: por isso vive no hover
   e volta sozinho. */
.banner-rodada:hover, .proximo:hover, .tc:hover, .dest:hover {
  box-shadow: var(--luz-topo), var(--rel-2);
}
.painel-jogo .pj, .busca-caixa, .menu-flutuante {
  box-shadow: var(--luz-topo), var(--rel-3);
}

/* Afundar no clique. Um pixel e meio, 90ms: nao da para ver, da para
   SENTIR que o botao recebeu o toque. No celular, onde nao existe
   hover, e a unica confirmacao que a pessoa tem antes da tela
   mudar. */
.tc:active, .data:active, .chip:active, .menu-atalho:active,
.row-jogo.jc:active, .el-jog:active, .prox-l:active, .art-linha:active {
  transform: scale(.988);
}
.tc, .data, .chip, .menu-atalho, .el-jog, .prox-l, .art-linha {
  transition: background var(--mola), transform 90ms var(--mv-entra),
              box-shadow var(--mola);
}

/* A lista de jogos ganha um fio de luz na primeira linha e sombra
   embaixo: vira uma placa, e nao um retangulo pintado. */
.linhas { box-shadow: var(--luz-topo), var(--rel-1); }

/* ============================================================
   os icones dos titulos
   ============================================================
   Um icone aqui e endereco, nao enfeite. A pagina da partida tem
   quinze blocos empilhados, e ate agora so a faixa de data e estadio
   tinha desenho: "Outros mercados", "Arbitro", "Estadio",
   "Classificacao", "Depois deste jogo" eram todos a mesma tipografia
   na mesma posicao, e achar um deles exigia LER todos.
   Tamanho fixo e `flex: none` porque o titulo pode ser comprido
   ("O que as odds da Betano dizem") e o desenho nao pode encolher
   junto: um icone amassado e pior que nenhum. */
.bt-ico {
  flex: none;
  display: grid;
  place-items: center;
  width: 17px;
  height: 17px;
  color: var(--accent);
}
.bt-ico svg { width: 17px; height: 17px; display: block; }

/* Na coluna da direita o cartao e menor e o titulo tambem: o desenho
   acompanha, senao vira a coisa mais pesada do cartao. */
/* `.caixa-topo` e flex com `space-between`, para o contador da
   direita. Com um icone na frente do titulo, o texto vira um segundo
   item de flex e o space-between jogava um para cada ponta: icone na
   esquerda, titulo na direita, um vao no meio. Quem vai para a
   direita ja tem `margin-left: auto` proprio. */
.caixa-topo { justify-content: flex-start; }
.caixa-topo .bt-ico { width: 16px; height: 16px; }
.caixa-topo .bt-ico svg { width: 16px; height: 16px; }

/* O rotulo de secao da pagina inteira (>=1180px) ja e display 20px:
   ali o icone pode crescer um pouco e fica no tom do titulo, nao no
   acento, porque a linha depois dele ja e o elemento colorido. */
.sec-rot h2 { display: inline-flex; align-items: center; gap: 10px; }
.sec-rot .bt-ico { width: 19px; height: 19px; color: var(--accent); }
.sec-rot .bt-ico svg { width: 19px; height: 19px; }

/* ---------- icone dentro das abas ----------
   Nas abas o desenho segue a COR DA ABA, e nao o acento: a aba
   inativa e cinza inteira, a ativa e clara inteira. Icone aceso numa
   aba apagada faria as oito parecerem todas ativas. */
.chips.abas .chip { display: inline-flex; align-items: center; gap: 7px; }
.chips.abas .chip .bt-ico { width: 15px; height: 15px; color: inherit; opacity: .85; }
.chips.abas .chip .bt-ico svg { width: 15px; height: 15px; }
.chips.abas .chip.ativo .bt-ico { color: var(--accent); opacity: 1; }

/* ---------- o menu de abas na pagina inteira ----------
   Era 15px de texto fino com 16px entre um rotulo e outro, numa
   coluna de novecentos pixels: ao lado de um placar de 44px e de
   titulos de bloco em display, a navegacao principal da tela era a
   coisa mais apagada dela. Sobe para 16px, ganha altura de alvo e
   ar entre os rotulos. */
#conteudo > .abas-barra .chips.abas { gap: 26px; }
/* Centralizado SO quando tudo cabe. `.sem-setas` e posta pelo JS
   exatamente nesse caso. Com a fileira rolando, `justify-content:
   center` corta o primeiro item: o overflow para a esquerda fica
   inalcancavel, e a primeira aba simplesmente nao existe mais. */
#conteudo > .abas-barra.sem-setas .chips.abas { justify-content: center; }
#conteudo > .abas-barra .chip { height: 46px; font-size: 17px; padding-bottom: 0; }
#conteudo > .abas-barra .abas-seta { font-size: 23px; width: 30px; }

/* ---------- icone nos atalhos da lateral ----------
   As competicoes da lateral tem escudo desde sempre; os atalhos logo
   abaixo ("Jogos de ontem", "Meus avisos") nao tinham nada, e a
   coluna terminava num bloco de texto solto que nao parecia da mesma
   tela. */
.menu-atalho { display: flex; align-items: center; gap: 10px; }
.menu-atalho .bt-ico { width: 16px; height: 16px; color: var(--text-muted); }
.menu-atalho .bt-ico svg { width: 16px; height: 16px; }
.menu-atalho:hover .bt-ico, .menu-atalho.ativo .bt-ico { color: var(--accent); }

/* Tabela da home: setas no lugar do <select>.

   O menu nativo com quarenta competicoes custava mais do que valia, e
   no celular abria a roleta do sistema, que nao tem nada a ver com o
   resto do site. Duas setas andam de uma em uma (o gesto de quem so
   esta dando uma olhada) e o nome no meio abre a folha com a lista
   inteira (para quem sabe aonde quer ir). */
.trilho-topo { display: grid; grid-template-columns: 30px minmax(0, 1fr) 30px;
  align-items: center; gap: 4px; }
.trilho-passo { width: 30px; height: 30px; display: grid; place-items: center;
  border: 0; border-radius: 9px; background: none; cursor: pointer;
  color: var(--text-secondary); font-size: 21px; line-height: 1; font-family: inherit;
  transition: background var(--mola), color var(--mola); }
.trilho-passo:hover:not(:disabled) { background: var(--n70); color: var(--text-primary); }
.trilho-passo:disabled { opacity: .3; cursor: default; }
.trilho-passo:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.trilho-topo .trilho-liga { display: flex; align-items: center; justify-content: center;
  gap: 7px; width: 100%; max-width: none; height: 32px; padding: 0 10px;
  border: 0; border-radius: 9px; cursor: pointer;
  font-family: inherit; font-size: 13.5px; font-weight: 600; }
.trilho-topo .trilho-liga img { width: 16px; height: 16px; object-fit: contain; flex: none; }
/* `.caixa-topo span` mais acima empurra com margin-left:auto e poe
   fundo proprio -- desenhado para o contador que fica na ponta da
   caixa. Dentro do seletor isso jogaria o nome contra a seta da
   direita, com uma caixinha escura em volta. */
.trilho-topo .trilho-liga span { min-width: 0; overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap;
  margin-left: 0; background: none; font-weight: 600; }
.trilho-topo .trilho-liga:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
/* O dos artilheiros vive numa .secao, que ja e uma linha flex com o
   titulo a esquerda: ele nao pode tomar a largura toda. */
.art-topo { grid-template-columns: 28px minmax(0, 140px) 28px; margin-left: auto; }

/* O cartao do estadio. A foto fica numa faixa curta em cima: e
   contexto, nao o assunto. Sem foto, o cartao continua inteiro em vez
   de deixar um retangulo cinza reservado. */
.est { padding: 0; overflow: hidden; }
.est-foto { height: 132px; background: var(--n80); }
.est-foto img { width: 100%; height: 100%; object-fit: cover; display: block; }
.est-txt { padding: var(--s4) var(--s5) var(--s5); }
.est-txt .bloco-tit { margin-top: 0; }

/* Retrospecto de cada time COM o arbitro.

   E a leitura que o torcedor ja faz sozinho ("com o Claus a gente
   nunca ganha"), aqui com o numero do lado em vez de virar lenda. */
.arb-times { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
  gap: 8px; margin-top: 14px; }
.arb-time { display: flex; align-items: center; gap: 10px; min-width: 0;
  padding: 10px 12px; border-radius: 12px; background: var(--n80); }
.arb-time img { width: 24px; height: 24px; object-fit: contain; flex: none; }
.arb-time div { min-width: 0; display: grid; gap: 1px; }
.arb-time strong { font-size: 14px; font-weight: 600; color: var(--text-primary);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.arb-time span { font-size: 12.5px; color: var(--text-secondary);
  font-variant-numeric: tabular-nums; }
.arb-rot { margin: 18px 0 2px; font-size: 12px; font-weight: 700;
  letter-spacing: .07em; text-transform: uppercase; color: var(--text-muted); }

/* O confronto direto virou botao.

   A lista mostrava o placar de 2024 e terminava ali: a partida existe
   no site, com escalacao e estatistica, e nao havia caminho ate ela.
   Agora abre. O desenho nao muda -- so ganha estado de clique e uma
   seta discreta, que e o que diz "da para entrar aqui". */
/* Sem mexer em padding nem em height: as duas listas ja tinham o
   espacamento delas mais acima, e zerar aqui achatava a linha. O que
   entra e so o que o <button> precisa para parecer o que era. */
.confronto, .mh-jogo { width: 100%; border: 0; background: none;
  font: inherit; color: inherit; text-align: left; cursor: pointer;
  transition: background var(--mola); }
/* ... menos a do confronto direto, que e centrada por inteiro. */
.mh-jogo { text-align: center; }
.mh-jogo { border-top: 1px solid var(--border-subtle); }
.confronto { border-bottom: 1px solid var(--border-subtle); }
.confronto:hover, .mh-jogo:hover { background: rgba(255, 255, 255, .045); }
.confronto:focus-visible, .mh-jogo:focus-visible {
  outline: 2px solid var(--accent); outline-offset: -2px; border-radius: 6px; }
.confronto-seta { margin-left: auto; color: var(--text-muted); font-size: 19px;
  line-height: 1; padding-left: 6px; }
.confronto:hover .confronto-seta { color: var(--accent); }

/* Seguir competicao.

   Contorno quando nao segue, cheio quando segue. Mesmo desenho nos
   dois estados de proposito: trocar o icone faz o botao parecer outro
   botao e a pessoa perde a referencia do que acabou de fazer. */
.seguir-liga { display: inline-flex; align-items: center; gap: 7px; flex: none;
  height: 34px; padding: 0 14px; border-radius: 999px;
  border: 1px solid var(--border-default); background: transparent;
  color: var(--text-secondary); font: inherit; font-size: 14px; font-weight: 600;
  cursor: pointer; transition: background var(--mola), color var(--mola), border-color var(--mola); }
.seguir-liga i { display: grid; place-items: center; }
.seguir-liga:hover { color: var(--text-primary); border-color: var(--border-strong); }
.seguir-liga.seguindo { background: var(--accent-soft); color: var(--accent);
  border-color: transparent; }
.seguir-liga:disabled { opacity: .55; cursor: progress; }
.seguir-liga:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
/* Na capa da competicao ele vai para a direita, e o titulo cede o
   espaco em vez de empurrar o botao para fora da tela. */
.time-capa .seguir-liga { margin-left: auto; }
.time-capa .time-txt { min-width: 0; }

/* A divisa entre as competicoes seguidas e o resto da lista. Sem ela,
   as seguidas no topo parecem so uma ordem alfabetica quebrada. */
.ml-corte { padding: 12px 12px 5px; font-size: 12px; font-weight: 700;
  letter-spacing: .08em; text-transform: uppercase; color: var(--text-muted); }
.ml-seguida { display: grid; place-items: center; margin-left: auto; flex: none;
  color: var(--accent); }
.ml-seguida svg { width: 12px; height: 12px; }

/* ============================================================
   Nota do jogador, cartao, gol e substituicao
   ============================================================

   O numero da nota ja estava no banco desde sempre (34 mil linhas);
   a escalacao e que nunca leu. Ele vai no canto do retrato, do lado
   OPOSTO ao numero da camisa, que mora no canto de baixo a direita.

   Cor por faixa, e nao um verde so: o ponto e bater o olho no
   campinho e ver quem foi bem sem ler numero por numero. */
/* O retrato e o unico ancoradouro: o .campo-jog e tao largo quanto o
   NOME do jogador (ate 92px), entao ancorar nele jogaria o selo para
   longe da foto. E este nao recorta, senao o cartao sai pela metade. */
.campo-retrato, .reserva-retrato { position: relative; display: grid; place-items: center; }
.reserva-retrato { width: 44px; height: 44px; }

.nota-jog {
  position: absolute; top: -5px; left: -7px; z-index: 4;
  min-width: 23px; height: 18px; padding: 0 4px;
  display: grid; place-items: center;
  border-radius: 6px;
  font-family: var(--display); font-size: 12.5px; font-weight: 700;
  color: #0B0B0D; background: var(--text-secondary);
  box-shadow: 0 2px 8px rgba(0, 0, 0, .45);
}
.nota-jog.otima { background: #35d07f; }
.nota-jog.boa   { background: #9fe3bf; }
.nota-jog.media { background: #f0c05a; }
.nota-jog.ruim  { background: #ef6d6d; color: #fff; }

/* As marcas do que aconteceu com ele. Empilham na vertical no canto
   de cima a direita, porque gol, cartao e saida podem acontecer na
   mesma partida com o mesmo jogador. */
.mrcs { position: absolute; top: -5px; right: -9px; z-index: 4;
  display: grid; gap: 2px; justify-items: center; }
.mrc { display: grid; place-items: center; border-radius: 999px;
  font-style: normal; box-shadow: 0 2px 6px rgba(0, 0, 0, .45); }
.mrc.gol { width: 18px; height: 18px; background: #fff; color: #0B0B0D; }
/* Dois gols viram pastilha "bola 2". O contador era um circulo azul
   POR CIMA do selo, no canto, e cobria metade do desenho da bola --
   justamente o desenho que foi refeito para dar para identificar. */
/* Medido no campinho a 412px: com `padding: 0 6px 0 4px` a pastilha de
   dois gols encostava 3px na nota do jogador. Apertada, sobra folga
   em todos os onze. */
.mrc.gol.varios { width: auto; display: inline-flex; align-items: center; gap: 2px;
  padding: 0 4px 0 3px; border-radius: 999px; }
.mrc.gol s { text-decoration: none; font-size: 12px; font-weight: 800;
  font-variant-numeric: tabular-nums; }
.mrc.contra { width: 18px; height: 18px; background: #ef6d6d; color: #fff; }
.mrc.amarelo { width: 9px; height: 13px; border-radius: 2px; background: #f2c53d; }
.mrc.vermelho { width: 9px; height: 13px; border-radius: 2px; background: #e4483f; }
/* Saiu e entrou: seta mais minuto, na mesma pastilha. O minuto
   sozinho, que era o que estava ali, nao diz o que aconteceu naquele
   minuto -- podia ser gol, cartao ou troca. Vermelho sai, verde
   entra, que e a convencao de todo placar. */
.mrc.saiu, .mrc.entrou { display: inline-flex; align-items: center; gap: 2px;
  min-width: 0; height: 18px; padding: 0 5px 0 3px; border-radius: 5px;
  font-size: 12px; font-weight: 700; }
.mrc.saiu { background: #ef6d6d; color: #fff; }
.mrc.entrou { background: var(--success); color: #06210F; }
.mrc.saiu s, .mrc.entrou s { text-decoration: none; font-variant-numeric: tabular-nums; }
.mrc.saiu svg, .mrc.entrou svg { flex: none; }
/* No campinho a pastilha vira um selo redondo do tamanho dos outros:
   com o minuto ela media 44px num retrato de 42 e cobria a nota. */
.mrc.so-seta { width: 18px; height: 18px; padding: 0; justify-content: center;
  border-radius: 999px; }

/* Quem entrou tem borda: numa lista de doze reservas, os que jogaram
   sao os unicos que interessam depois do apito. */
.reserva.entrou { box-shadow: inset 0 0 0 1px var(--border-default); }
.reserva .nota-jog { position: static; }
.reserva-retrato .mrcs { top: -6px; right: -8px; }

/* ============================================================
   Tabela de numeros dos jogadores
   ============================================================

   Ordenada por nota, do melhor para o pior. Rola na horizontal no
   celular com a coluna do nome fixa: sem a coluna fixa, rolar ate
   "desarmes" faz perder de vista de quem e a linha. */
/* `min-width: 0` nao e detalhe: sem ele a tabela QUEBRA O PAINEL.

   Item de grid nasce com `min-width: auto`, ou seja, se recusa a
   ficar menor que o proprio conteudo. A tabela tem treze colunas, e a
   .aba-secao (que e grid) obedecia a ela: o bloco inteiro virava 702px
   dentro de um painel de 520px e empurrava campinho, abas e cabecalho
   para fora da tela. O `overflow-x: auto` do .tj-rolo nunca chegava a
   agir, porque nada estava estourando -- o pai e que tinha crescido. */
.aba-secao > * { min-width: 0; }
.tab-jogadores { margin-top: var(--s6); min-width: 0; max-width: 100%; }
.tj-rolo { overflow-x: auto; max-width: 100%; margin: var(--s3) 0 0; -webkit-overflow-scrolling: touch; }
.tj { width: 100%; border-collapse: separate; border-spacing: 0; font-size: 13.5px; }
.tj th, .tj td { padding: 7px 8px; text-align: center; white-space: nowrap;
  font-variant-numeric: tabular-nums; }
.tj thead th { position: sticky; top: 0; z-index: 2; background: var(--bg-secondary);
  font-size: 12px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
  color: var(--text-muted); border-bottom: 1px solid var(--border-subtle); }
.tj thead th:first-child, .tj tbody th {
  position: sticky; left: 0; z-index: 3; text-align: left;
  background: var(--bg-secondary); min-width: 150px; max-width: 190px; }
.tj thead th:first-child { z-index: 4; }
.tj thead button { border: 0; background: none; padding: 2px 3px; cursor: pointer;
  font: inherit; color: inherit; letter-spacing: inherit; text-transform: inherit;
  border-radius: 5px; }
.tj thead button:hover { color: var(--text-primary); }
.tj thead button.ativa { color: var(--accent); }
.tj thead button:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.tj tbody tr:nth-child(odd) th, .tj tbody tr:nth-child(odd) td { background: var(--n80); }
.tj tbody tr:nth-child(odd) th { background: var(--n80); }
.tj-quem { display: flex; align-items: center; gap: 7px; width: 100%;
  border: 0; background: none; padding: 0; cursor: pointer; font: inherit;
  color: var(--text-primary); font-weight: 600; text-align: left; }
.tj-quem img { width: 16px; height: 16px; object-fit: contain; flex: none; }
.tj-quem span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tj-quem:hover span { color: var(--accent); }
.tj-quem:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 4px; }
.tj-quem .mrc { position: static; flex: none; box-shadow: none; }
.tj td.tj-zero { color: var(--text-muted); }
.tj-sem { color: var(--text-muted); }
.tj .nota-jog { position: static; margin: 0 auto; }

/* ============================================================
   Previa do servidor
   ============================================================

   O servidor escreve um h1, um paragrafo e a lista de links dentro do
   <main> antes de mandar a pagina. E o que o robo de busca le, e e o
   que a pessoa ve por um instante enquanto o JavaScript carrega -- ou
   pelo tempo todo, se o JavaScript nao carregar.

   Por isso ela precisa parecer parte do site e nao um rascunho: se um
   dia o app.js quebrar, esta e a pagina. Assim que a tela de verdade
   desenha, o innerHTML do <main> e substituido e isto some sozinho. */
.seo-previa { display: grid; gap: var(--s3); padding: var(--s6) 0 var(--s4); max-width: 720px; }
.seo-previa h1 {
  margin: 0;
  font-size: 23px;
  font-weight: 700;
  line-height: 1.25;
  letter-spacing: -.01em;
  color: var(--text-primary);
  text-wrap: balance;
}
.seo-previa > p { margin: 0; font-size: 15px; line-height: 1.6; color: var(--text-secondary); }

.seo-lista { display: grid; gap: var(--s2); }
.seo-lista h2 {
  margin: var(--s3) 0 0;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--text-muted);
}
.seo-lista ul { margin: 0; padding: 0; list-style: none; display: flex; flex-wrap: wrap; gap: var(--s2) var(--s3); }
.seo-lista a {
  font-size: 14px;
  color: var(--text-secondary);
  text-decoration: none;
  transition: color var(--mola);
}
.seo-lista a:hover { color: var(--accent); }
.seo-lista a:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 3px; }


/* ============================================================
   MELHOR DA PARTIDA
   ============================================================
   O bloco nao existia, e a pergunta que ele responde e a primeira que
   se faz depois do apito. A resposta ja estava na base, espalhada em
   vinte e duas linhas de uma tabela de treze colunas.

   Desenho: retrato grande com a nota pendurada, nome, time, e o que
   ele fez em numero. A nota sozinha seria opiniao com cara de dado;
   "2 gols, 1 assistencia" e o que a sustenta.
   ============================================================ */
.mvp-card {
  display: flex; align-items: center; gap: 16px; width: 100%;
  padding: 4px 2px; border: 0; background: none; cursor: pointer;
  text-align: left; color: inherit; font-family: var(--ui);
}
.mvp-card:hover .mvp-txt strong { color: var(--accent); }
.mvp-retrato { position: relative; flex: none; }
.mvp-foto {
  position: relative; display: block; width: 68px; height: 68px;
  overflow: hidden; border-radius: 50%; background: var(--surface-2);
}
.mvp-foto img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
/* A nota sai do circulo de proposito: dentro dela competiria com o
   rosto, e e ela que da a hierarquia do bloco. */
/* `top` e `left` PRECISAM ser anulados: a regra base do selo de nota
   ancora em top/left, e so declarar right/bottom nao desancora nada
   -- o selo fica preso no canto de cima a esquerda e ignora o que foi
   pedido aqui. */
.mvp-retrato .nota-jog {
  position: absolute; top: auto; left: auto; right: -6px; bottom: -4px; z-index: 2;
  font-size: 14px; padding: 2px 7px; min-width: 26px; height: 20px;
}
.mvp-txt { display: grid; gap: 4px; min-width: 0; }
.mvp-txt strong { font-size: 19px; font-weight: 700; color: var(--text-primary);
  line-height: 1.15; transition: color var(--mv-curto) var(--mv-entra); }
.mvp-time { display: flex; align-items: center; gap: 7px; min-width: 0;
  font-size: 13px; color: var(--text-muted); }
.mvp-time img { width: 17px; height: 17px; object-fit: contain; flex: none; }
.mvp-feitos { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 2px; }
.mvp-feitos em { font-style: normal; font-size: 13px; color: var(--text-secondary);
  background: rgba(255, 255, 255, .05); border-radius: 7px; padding: 3px 9px; }
.mvp-feitos b { font-weight: 700; color: var(--text-primary);
  font-variant-numeric: tabular-nums; }

/* ---------- selecao da rodada (pagina da liga) ----------
   Mesmo retrato e mesmo selo de nota da escalacao da partida
   (.campo-retrato, .nota-jog), para a pessoa ler as duas telas do
   mesmo jeito. O campo e desenhado so com CSS: gramado escuro, linha
   do meio e as duas areas, sem imagem para baixar. */
.sel-destaque { display: flex; align-items: center; gap: 8px; margin: 14px 0 10px;
  padding: 10px 14px; border-radius: 12px; background: var(--surface-1);
  font-size: 14.5px; color: var(--text-secondary); }
.sel-destaque svg { width: 18px; height: 18px; color: #f0c05a; fill: currentColor; flex: none; }
.sel-destaque b { color: var(--text-primary); }
.sel-grade { display: grid; grid-template-columns: minmax(0, 500px) minmax(250px, 1fr); gap: 16px; align-items: start; }
.sel-campo { position: relative; width: 100%; aspect-ratio: 68 / 100; border-radius: 16px; overflow: hidden;
  background:
    radial-gradient(ellipse at 50% 50%, rgba(255,255,255,.06), transparent 70%),
    repeating-linear-gradient(180deg, #1f6f3d 0 10%, #1b6436 10% 20%);
  box-shadow: inset 0 0 0 1px rgba(255,255,255,.08), 0 10px 30px rgba(0,0,0,.35); }
.sel-riscos { position: absolute; inset: 0; width: 100%; height: 100%; }
.sel-riscos * { fill: none; stroke: rgba(255,255,255,.45); stroke-width: 1.5; vector-effect: non-scaling-stroke; }
.sel-linhas { position: absolute; inset: 0; display: grid; grid-template-rows: 1.05fr 1fr 1fr .95fr; padding: 4% 2% 3%; }
.sel-linha { display: flex; align-items: center; justify-content: space-evenly; gap: 2px; }
.sel-jog { display: grid; justify-items: center; gap: 3px; flex: 1 1 0; min-width: 0; max-width: 108px;
  padding: 4px 2px; border-radius: 12px; text-align: center; background: transparent; }
.sel-jog:hover, .sel-jog:focus-visible { background: rgba(0,0,0,.18); }
.sel-retrato { position: relative; width: 60px; height: 60px; border-radius: 50%; background: rgba(255,255,255,.14);
  border: 2px solid rgba(255,255,255,.9); box-shadow: 0 4px 12px rgba(0,0,0,.35); display: block; }
.sel-jog.craque .sel-retrato { border-color: #f0c05a; box-shadow: 0 0 0 3px rgba(240,192,90,.35), 0 4px 12px rgba(0,0,0,.35); }
.sel-foto { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; display: block; }
.sel-escudo { position: absolute; left: -6px; top: -4px; width: 22px; height: 22px; object-fit: contain;
  padding: 2px; border-radius: 50%; background: #fff; }
.sel-craque { position: absolute; right: -7px; top: -6px; width: 20px; height: 20px; color: #f0c05a; }
.sel-craque svg { width: 20px; height: 20px; fill: currentColor; filter: drop-shadow(0 1px 2px rgba(0,0,0,.5)); }
.sel-nota { display: inline-grid; place-items: center; min-width: 30px; height: 20px; padding: 0 6px; border-radius: 6px;
  font-size: 12.5px; font-weight: 800; color: #0B0B0D; background: var(--text-secondary); font-variant-numeric: tabular-nums; }
.sel-retrato .sel-nota { position: absolute; left: 50%; bottom: -9px; transform: translateX(-50%);
  box-shadow: 0 2px 6px rgba(0,0,0,.4); }
.sel-nota.otima { background: #35d07f; }
.sel-nota.boa { background: #9fe3bf; }
.sel-nota.media { background: #f0c05a; }
.sel-nota.ruim { background: #ef6d6d; color: #fff; }
.sel-nome { margin-top: 10px; max-width: 100%; padding: 2px 8px; border-radius: 6px; background: rgba(0,0,0,.55);
  font-size: 12.5px; font-weight: 700; color: #fff; line-height: 1.35; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sel-feito { font-size: 12px; font-weight: 600; color: #fff; text-shadow: 0 1px 2px rgba(0,0,0,.6); }
.sel-lista { list-style: none; margin: 0; padding: 8px; display: grid; gap: 2px; border-radius: 16px; background: var(--surface-1); }
.sel-item { display: grid; grid-template-columns: 20px 24px minmax(0, 1fr) auto; align-items: center; gap: 10px;
  width: 100%; min-height: 46px; padding: 6px 8px; border-radius: 10px; text-align: left; color: var(--text-primary); }
.sel-item:hover, .sel-item:focus-visible { background: var(--surface-2); }
.sel-i { font-size: 12px; font-weight: 700; color: var(--text-muted); text-align: center; }
.sel-item img { width: 24px; height: 24px; object-fit: contain; }
.sel-item-nome { min-width: 0; font-size: 14px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sel-item-nome i { display: block; font-style: normal; font-size: 12px; font-weight: 500; color: var(--text-muted); }
.sel-pe { margin: 10px 2px 0; font-size: 12.5px; color: var(--text-muted); line-height: 1.5; }
.sel-pe b { color: var(--text-secondary); font-weight: 600; }
.sel-carregando { padding: 40px 0; text-align: center; color: var(--text-muted); font-size: 14px; }


/* ---------- chat da partida ----------
   Altura fixa com rolagem propria: a lista cresce durante o jogo e,
   sem limite, empurraria o campo de escrever para longe do polegar. */
.chat { display: grid; gap: 10px; }
.chat-regras { margin: 0; font-size: 12.5px; line-height: 1.5; color: var(--text-muted); }
.chat-lista { height: clamp(220px, 42vh, 460px); overflow-y: auto; overscroll-behavior: contain;
  display: flex; flex-direction: column; gap: 8px; padding: 10px;
  background: var(--surface-1); border-radius: var(--radius-md); }
.chat-vazio { margin: auto; font-size: 14px; color: var(--text-muted); text-align: center; }
.chat-msg { max-width: 88%; align-self: flex-start; padding: 7px 10px 8px;
  background: var(--surface-2); border-radius: 12px 12px 12px 4px; }
.chat-msg.minha { align-self: flex-end; border-radius: 12px 12px 4px 12px;
  background: color-mix(in srgb, var(--accent) 18%, var(--surface-2)); }
.chat-msg.oculta { opacity: .7; }
.chat-msg p { margin: 2px 0 0; font-size: 14.5px; line-height: 1.4; color: var(--text-primary);
  overflow-wrap: anywhere; white-space: pre-wrap; }
.chat-topo { display: flex; align-items: baseline; gap: 8px; font-size: 12px; color: var(--text-muted); }
.chat-topo b { color: var(--text-secondary); font-weight: 600; }
.chat-topo time { margin-left: auto; font-variant-numeric: tabular-nums; }
.chat-oculta { color: var(--text-muted); font-size: 13px; }
.chat-acoes { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 5px; }
.chat-acoes button { font-size: 12px; color: var(--text-muted); padding: 3px 8px; border-radius: 6px;
  background: transparent; border: 1px solid var(--border-subtle); }
.chat-acoes button:hover, .chat-acoes button:focus-visible { color: var(--text-primary); background: var(--surface-hover); }
.chat-acoes button.perigo { color: var(--danger); }
.chat-recado { font-size: 13.5px; line-height: 1.45; color: var(--text-secondary);
  padding: 8px 12px; border-radius: var(--radius-md); background: var(--surface-2); }
.chat-recado.forte { color: var(--text-primary); background: color-mix(in srgb, var(--warning) 22%, var(--surface-2)); }
.chat-form { display: flex; align-items: center; gap: 8px; }
.chat-campo { flex: 1 1 auto; min-width: 0; height: 44px; padding: 0 12px; font-size: 16px;
  color: var(--text-primary); background: var(--surface-2); border: 1px solid var(--border-subtle); border-radius: 10px; }
.chat-campo:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.chat-conta { flex: none; font-size: 12px; color: var(--text-muted); font-variant-numeric: tabular-nums; }
.chat-form .btn, .chat-caixa > .btn { width: auto; height: 44px; }
.chat-fechado { margin: 0; font-size: 14px; color: var(--text-muted); text-align: center; padding: 8px 0; }

.chatm-lista { display: grid; gap: 8px; margin: 8px 0 12px; }
.chatm-item { padding: 10px 12px; border-radius: var(--radius-md); background: var(--surface-2); }
.chatm-item.oculta { border-left: 3px solid var(--warning); }
.chatm-item p { margin: 4px 0 0; font-size: 14px; line-height: 1.4; overflow-wrap: anywhere; }
.chatm-topo { display: flex; flex-wrap: wrap; gap: 4px 10px; align-items: baseline; font-size: 12.5px; color: var(--text-muted); }
.chatm-topo b { color: var(--text-primary); font-size: 13.5px; }
.chatm-topo a { color: var(--accent); }
.chatm-sit { margin-left: auto; }
.chatm-sub { margin: 16px 0 4px; font-size: 14px; color: var(--text-secondary); }


/* ---------- chaveamento em arvore ----------
   Cada coluna e uma fase; cada slot ocupa a mesma fracao da altura.
   Com metade dos slots na coluna seguinte, o centro de cada cartao cai
   exatamente entre os dois que o alimentam, e as linhas fecham sem
   conta nenhuma em JavaScript. Rola de lado no celular. */
.chv-rolo { overflow-x: auto; padding-bottom: 8px; margin-bottom: var(--s4); }
.chv { --colunas: 4; display: grid; grid-template-columns: repeat(var(--colunas), minmax(186px, 1fr)); column-gap: 24px;
  min-width: calc(var(--colunas) * 210px); }
.chv-col { display: flex; flex-direction: column; min-width: 0; }
.chv-tit { margin: 0 0 6px; font-size: 12.5px; font-weight: 600; letter-spacing: .04em; text-transform: uppercase;
  color: var(--text-muted); text-align: center; }
.chv-lista { flex: 1; display: flex; flex-direction: column; }
.chv-slot { flex: 1; display: flex; align-items: center; position: relative; padding: 5px 0; }
.chv-slot > * { width: 100%; }
.chv-col:not(.ultima) .chv-slot::after { content: ''; position: absolute; right: -12px; top: 50%; width: 12px;
  border-top: 1px solid var(--border-default); }
.chv-col:not(.ultima) .chv-slot:nth-child(odd)::before { content: ''; position: absolute; right: -12px; top: 50%; bottom: 0;
  border-right: 1px solid var(--border-default); }
.chv-col:not(.ultima) .chv-slot:nth-child(even)::before { content: ''; position: absolute; right: -12px; top: 0; bottom: 50%;
  border-right: 1px solid var(--border-default); }
.chv-col:not(:first-child) .chv-jogo { position: relative; }
.chv-col:not(:first-child) .chv-jogo::before { content: ''; position: absolute; left: -13px; top: 50%; width: 12px;
  border-top: 1px solid var(--border-default); }
.chv-jogo { display: grid; gap: 4px; padding: 8px 10px; text-align: left; color: var(--text-primary);
  background: var(--surface-2); border-radius: 10px; }
button.chv-jogo:hover, button.chv-jogo:focus-visible { background: var(--surface-hover); }
.chv-jogo.futuro { background: transparent; border: 1px dashed var(--border-default); }
.chv-lado { display: flex; align-items: center; gap: 8px; font-size: 13.5px; min-width: 0; }
.chv-lado img { width: 18px; height: 18px; object-fit: contain; flex: none; }
.chv-lado b { flex: 1; min-width: 0; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.chv-jogo.futuro .chv-lado b { font-weight: 500; color: var(--text-secondary); white-space: normal; font-size: 12.5px; }
.chv-lado em { font-style: normal; font-weight: 700; font-variant-numeric: tabular-nums; }
.chv-lado em small { font-size: 12px; font-weight: 500; color: var(--text-muted); }
.chv-lado.caiu { opacity: .5; }
.chv-lado.meu b { color: var(--accent); }
.chv-leg { font-size: 12px; color: var(--text-muted); font-variant-numeric: tabular-nums; }
.chv-tbd { width: 18px; height: 18px; flex: none; border-radius: 50%; background: var(--surface-hover); }


/* ---------- todas as competicoes ---------- */
.cp { display: grid; gap: var(--s5); }
.cp-cab h1 { margin: 0 0 4px; font-size: 26px; }
.cp-cab p { margin: 0 0 12px; font-size: 14px; color: var(--text-muted); }
.cp-busca { width: 100%; max-width: 440px; height: 44px; padding: 0 14px; font-size: 16px; color: var(--text-primary);
  background: var(--surface-2); border: 1px solid var(--border-subtle); border-radius: 10px; }
.cp-busca:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.cp-corpo { display: grid; gap: var(--s5); }
.cp-grupo[hidden], .cp-item[hidden], .cp-nada[hidden] { display: none; }
.cp-tit { margin: 0 0 8px; font-size: 13px; font-weight: 600; letter-spacing: .04em; text-transform: uppercase;
  color: var(--text-secondary); }
.cp-tit em { font-style: normal; color: var(--text-muted); font-weight: 500; margin-left: 4px; }
.cp-grade { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 6px; }
.cp-item { display: flex; align-items: center; gap: 10px; min-height: 46px; padding: 8px 12px; border-radius: 10px;
  background: var(--surface-1); color: var(--text-primary); text-decoration: none; }
.cp-item:hover, .cp-item:focus-visible { background: var(--surface-hover); }
.cp-item img { width: 24px; height: 24px; object-fit: contain; flex: none; }
.cp-nome { flex: 1; min-width: 0; font-size: 14px; font-weight: 500; }
.cp-segue { font-style: normal; font-size: 12px; color: var(--accent); }
.cp-nada { font-size: 14px; color: var(--text-muted); }
.ml-todas { display: block; margin: 6px 0 0; padding: 8px 12px; font-size: 13px; color: var(--accent); text-decoration: none; }
.ml-todas:hover { text-decoration: underline; }


/* Temporada da competicao: parece texto do cabecalho, abre a folha. */
/* Mais visivel: "ainda nao ta com a opcao de ver outras temporadas".
   Estava la, mas parecia texto; agora parece botao. */
.liga-temporada { display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; margin: 6px 0 0 -2px;
  font: inherit; font-weight: 600; color: var(--text-primary); border-radius: 8px; background: var(--surface-2);
  border: 1px solid color-mix(in srgb, var(--accent) 45%, transparent); }
.liga-temporada small { font-size: 12px; font-weight: 600; color: var(--accent); }
.liga-temporada:hover, .liga-temporada:focus-visible { background: var(--surface-hover); }
.liga-temporada b { font-size: 12px; color: var(--text-muted); }
.liga-passada { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; margin: 0 0 12px; padding: 10px 14px;
  font-size: 14px; color: var(--text-secondary); border-radius: var(--radius-md);
  background: color-mix(in srgb, var(--warning) 14%, var(--surface-1)); }
.liga-passada button { font-size: 13px; font-weight: 600; color: var(--accent); background: transparent; }


/* Aba Times: o menu da competicao em cima, as principais embaixo. */
.times-escolha { margin-bottom: 10px; max-width: 420px; }


/* ---------- numeros da competicao (numeros.js) ---------- */
.nm { margin-top: var(--s5); }
.nm .secao { margin-bottom: 10px; }
.nm-destaque { display: grid; grid-template-columns: minmax(170px, 230px) minmax(0, 1fr); gap: 10px; margin-bottom: 10px; }
.nm-grande, .nm-resultados, .nm-tile, .nm-card, .nm-goleada { background: var(--surface-1); border-radius: 12px; }
.nm-grande { display: grid; align-content: center; gap: 2px; padding: 16px 18px; }
.nm-grande b { font-size: 40px; line-height: 1; font-weight: 800; color: var(--accent); font-variant-numeric: tabular-nums; }
.nm-grande span { font-size: 14px; font-weight: 600; color: var(--text-primary); }
.nm-grande small { font-size: 12px; color: var(--text-muted); }
.nm-resultados { display: grid; align-content: center; gap: 12px; padding: 16px 18px; }
.nm-barra { display: flex; height: 14px; border-radius: 99px; overflow: hidden; background: var(--surface-2); }
.nm-barra i { display: block; height: 100%; }
.nm-barra i + i { box-shadow: -2px 0 0 var(--surface-1); }
.nm-barra .casa, .nm-legenda i.casa { background: var(--accent); }
.nm-barra .empate, .nm-legenda i.empate { background: var(--text-muted); }
.nm-barra .fora, .nm-legenda i.fora { background: var(--warning); }
.nm-legenda { display: flex; flex-wrap: wrap; gap: 6px 18px; font-size: 13px; color: var(--text-secondary); }
.nm-legenda span { display: inline-flex; align-items: center; gap: 6px; }
.nm-legenda i { width: 10px; height: 10px; border-radius: 3px; display: inline-block; }
.nm-legenda b { color: var(--text-primary); font-variant-numeric: tabular-nums; }
.nm-tiles { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; }
.nm-nota { margin: 8px 2px 0; font-size: 12.5px; color: var(--text-muted); }
.nm-tile { display: grid; gap: 2px; padding: 14px 16px; }
.nm-tile b { font-size: 24px; font-weight: 800; color: var(--text-primary); font-variant-numeric: tabular-nums; }
.nm-tile span { font-size: 13px; color: var(--text-secondary); }
.nm-tile small { font-size: 12px; color: var(--text-muted); }
.nm-goleada { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 16px;
  width: 100%; margin-top: 10px; padding: 12px 16px; text-align: left; color: var(--text-primary); }
.nm-goleada:hover, .nm-goleada:focus-visible { background: var(--surface-hover); }
.nm-goleada-rot { font-size: 12px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--text-muted); }
.nm-goleada-jogo { display: inline-flex; align-items: center; gap: 8px; font-size: 14px; }
.nm-goleada-jogo img { width: 22px; height: 22px; object-fit: contain; }
.nm-goleada-jogo em { font-style: normal; font-weight: 800; font-size: 16px; padding: 2px 10px; border-radius: 8px;
  background: var(--surface-2); font-variant-numeric: tabular-nums; }
.nm-cards { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
/* Numero impar de cartoes: o ultimo ocupa a linha inteira, em vez de
   ficar sozinho com um buraco do lado ("diagramacao maldita"). */
.nm-cards > :last-child:nth-child(odd) { grid-column: 1 / -1; }
/* ---------- lideres (artilheiros, assistencias, cartoes) ---------- */
.lideres { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; align-items: start; }
.lideres > :last-child:nth-child(odd) { grid-column: 1 / -1; }
.lider .art-lista { margin-bottom: 0; }
.lider-tit { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin: 0 2px 8px;
  font-size: 15px; font-weight: 700; color: var(--text-primary); }
.lider-tit small { font-size: 12px; font-weight: 500; color: var(--text-muted); }
.nm-card { padding: 12px; display: grid; gap: 2px; align-content: start; }
.nm-card-tit { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; padding: 2px 4px 8px;
  font-size: 14px; font-weight: 700; color: var(--text-primary); }
.nm-card-tit small { font-size: 12px; font-weight: 500; color: var(--text-muted); }
.nm-linha { display: grid; grid-template-columns: 18px 26px minmax(0, 1fr) auto; align-items: center; gap: 8px;
  min-height: 40px; padding: 4px; border-radius: 8px; text-align: left; color: var(--text-primary); }
.nm-linha:hover, .nm-linha:focus-visible { background: var(--surface-2); }
.nm-pos { font-size: 12px; font-weight: 700; color: var(--text-muted); text-align: center; font-variant-numeric: tabular-nums; }
.nm-linha img { width: 24px; height: 24px; object-fit: contain; }
.nm-linha img.nm-foto { width: 26px; height: 26px; border-radius: 50%; object-fit: cover; background: var(--surface-2); }
.nm-nome { min-width: 0; font-size: 14px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nm-nome i { display: block; font-style: normal; font-size: 12px; font-weight: 400; color: var(--text-muted);
  overflow: hidden; text-overflow: ellipsis; }
.nm-linha b { font-size: 15px; font-weight: 800; color: var(--text-primary); font-variant-numeric: tabular-nums; }
/* O lider do ranking em destaque. */
.nm-linha:first-of-type b { color: var(--accent); }


/* Convite dos Favoritos para quem nao tem conta ou nao segue ninguem. */
.convite { display: grid; justify-items: center; gap: 10px; text-align: center; margin: var(--s5) 0;
  padding: 32px 20px; border-radius: 14px; background: var(--surface-1); }
.convite-ico { display: grid; place-items: center; width: 52px; height: 52px; border-radius: 50%;
  background: color-mix(in srgb, var(--accent) 18%, var(--surface-2)); color: var(--accent); }
.convite-ico svg { width: 26px; height: 26px; }
.convite h2 { margin: 4px 0 0; font-size: 22px; }
.convite p { margin: 0; max-width: 460px; font-size: 15px; line-height: 1.5; color: var(--text-secondary); }
.convite .btn { width: auto; min-width: 220px; margin-top: 6px; }
.convite small { font-size: 12.5px; color: var(--text-muted); }


.ml-grupo { margin: 14px 12px 4px; font-size: 12px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
  color: var(--text-muted); }


/* ---------- ficha do jogador: resumo em cartoes ----------
   Era uma faixa de numeros solta no fundo da pagina, encostada na
   borda, sem superficie: "sem margem, mal diagramado, sem contraste".
   Agora cada numero e um cartao, o gol em destaque, e cada um diz o
   que significa em ritmo (por 90 minutos, por jogo). */
.jg-resumo { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; margin: 16px 0 18px; }
.jg-tile { display: grid; gap: 2px; align-content: start; padding: 14px 16px; border-radius: 12px;
  background: var(--surface-1); border: 1px solid rgba(255, 255, 255, .06); color: var(--text-primary); }
.jg-tile b { font-size: 28px; line-height: 1.1; font-weight: 800; color: inherit; font-variant-numeric: tabular-nums;
  letter-spacing: -.02em; }
.jg-tile span { font-size: 12.5px; font-weight: 600; letter-spacing: .04em; text-transform: uppercase; color: var(--text-secondary); }
.jg-tile small { font-size: 12.5px; color: var(--text-muted); }
.jg-tile.destaque { background: color-mix(in srgb, var(--success) 14%, var(--surface-1));
  border-color: color-mix(in srgb, var(--success) 35%, transparent); }
.jg-tile.destaque b { color: var(--success); }
.jogador-capa { background: linear-gradient(120deg, color-mix(in srgb, var(--accent) 12%, var(--surface-1)), var(--surface-1) 55%); }
.jogador-capa .retrato { border: 3px solid color-mix(in srgb, var(--accent) 55%, transparent);
  box-shadow: 0 6px 18px rgba(0, 0, 0, .35); }
.jogador-capa .time-txt span { color: var(--text-secondary); }
.jg-filtro { margin: 14px 0 0; }


.jg-filtro.dois { display: grid; grid-template-columns: minmax(0, 220px) minmax(0, 1fr); gap: 10px; }
.jg-origem { margin: 8px 2px 0; font-size: 12.5px; color: var(--text-muted); }


.escolha-linha.dois { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 200px); gap: 10px; }


.lider .art-linha { grid-template-columns: 26px 44px 1fr auto; }
.lider-rosto { position: relative; width: 40px; height: 40px; border-radius: 50%; background: var(--surface-2); display: block; }
.lider .lider-rosto img.lider-foto { width: 40px; height: 40px; border-radius: 50%; object-fit: cover; display: block; }
.lider .lider-rosto img.lider-escudo { position: absolute; right: -4px; bottom: -3px; width: 18px; height: 18px;
  padding: 1px; border-radius: 50%; background: var(--surface-1); object-fit: contain; }


/* ---------- contexto: o que esta em jogo, simulacao, tendencias ---------- */
/* --p (porcentagem da barra) vem no style de cada elemento; 0 por padrao. */
.ctx-chances li i, .ctx-chance, .tnd-barras i { --p: 0%; }
.ctx-duelo { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
.ctx-lado { display: grid; gap: 10px; align-content: start; padding: 12px; border-radius: 12px; background: var(--surface-2); }
.ctx-cab { display: flex; align-items: center; gap: 8px; min-width: 0; }
.ctx-cab img { width: 26px; height: 26px; object-fit: contain; }
.ctx-cab b { font-size: 15px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ctx-cab span { margin-left: auto; font-size: 13px; color: var(--text-secondary); font-variant-numeric: tabular-nums; white-space: nowrap; }
.ctx-cenarios { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; }
.ctx-cenarios span { display: grid; gap: 2px; padding: 8px 6px; border-radius: 8px; text-align: center; font-size: 12px;
  color: var(--text-secondary); background: var(--surface-1); }
.ctx-cenarios b { font-size: 18px; color: var(--text-primary); font-variant-numeric: tabular-nums; }
.ctx-cenarios .v b { color: var(--success); }
.ctx-cenarios .d b { color: var(--danger); }
.ctx-chances { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
.ctx-chances li { display: grid; grid-template-columns: minmax(0, 1fr) 80px 44px; align-items: center; gap: 8px; font-size: 13px;
  color: var(--text-secondary); }
.ctx-chances li span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ctx-chances li i { height: 6px; border-radius: 99px; background: linear-gradient(90deg, var(--accent) var(--p), var(--surface-1) var(--p)); }
.ctx-chances li i.ruim { background: linear-gradient(90deg, var(--danger) var(--p), var(--surface-1) var(--p)); }
.ctx-chances li b { text-align: right; color: var(--text-primary); font-variant-numeric: tabular-nums; }
.ctx-nota { margin: 0 2px 12px; font-size: 13px; line-height: 1.5; color: var(--text-muted); }
.ctx-tabela-rolo { overflow-x: auto; border-radius: 12px; background: var(--surface-1); }
.ctx-tabela { width: 100%; border-collapse: collapse; font-size: 13.5px; font-variant-numeric: tabular-nums; }
.ctx-tabela th { padding: 10px 8px; font-size: 12px; font-weight: 600; color: var(--text-muted); text-align: center; white-space: nowrap;
  border-bottom: 1px solid var(--border-subtle); }
.ctx-tabela th.ctx-time-cab { text-align: left; }
.ctx-tabela td { padding: 6px 8px; text-align: center; border-bottom: 1px solid var(--border-subtle); color: var(--text-secondary); }
.ctx-tabela tr:last-child td { border-bottom: 0; }
.ctx-tabela td.forte { color: var(--text-primary); font-weight: 700; }
.ctx-pos { width: 28px; color: var(--text-muted); }
.ctx-tabela td.ctx-pts { font-weight: 700; color: var(--text-primary); }
.ctx-time { display: flex; align-items: center; gap: 8px; min-width: 150px; text-align: left; color: var(--text-primary); font-weight: 600; }
.ctx-time img { width: 22px; height: 22px; object-fit: contain; }
.ctx-chance { display: inline-block; min-width: 46px; padding: 3px 6px; border-radius: 6px; font-weight: 700; color: var(--text-primary);
  background: linear-gradient(90deg, color-mix(in srgb, var(--accent) 40%, transparent) var(--p), transparent var(--p)); }
.ctx-chance.ruim { background: linear-gradient(90deg, color-mix(in srgb, var(--danger) 40%, transparent) var(--p), transparent var(--p)); }
.tnd-cab { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 8px; }
.tnd-cab > div { display: grid; gap: 2px; }
.tnd-cab > div:last-child { text-align: right; justify-items: end; }
.tnd-cab b { font-size: 15px; }
.tnd-cab small { font-size: 12px; color: var(--text-muted); }
.ctx-forma { display: inline-flex; gap: 3px; margin-top: 4px; }
.ctx-forma i { display: grid; place-items: center; width: 20px; height: 20px; border-radius: 5px; font-style: normal;
  font-size: 12px; font-weight: 800; color: #0B0B0D; }
.ctx-forma .s-V { background: var(--success); }
.ctx-forma .s-E { background: var(--text-muted); }
.ctx-forma .s-D { background: var(--danger); color: #fff; }
.tnd-linhas { display: grid; }
.tnd-linha { display: grid; grid-template-columns: 70px minmax(0, 1fr) 70px; align-items: center; gap: 10px; min-height: 44px;
  border-top: 1px solid var(--border-subtle); }
.tnd-v { font-size: 16px; font-weight: 800; font-variant-numeric: tabular-nums; }
.tnd-linha .tnd-v:last-child { text-align: right; }
.tnd-rot { display: grid; gap: 4px; justify-items: center; text-align: center; font-size: 13px; color: var(--text-secondary); }
.tnd-barras { display: grid; grid-template-columns: 1fr 1fr; gap: 4px; width: 100%; max-width: 260px; }
.tnd-barras i { height: 5px; border-radius: 99px; }
.tnd-barras i:first-child { background: linear-gradient(270deg, var(--cor-casa, var(--accent)) var(--p), var(--surface-2) var(--p)); }
.tnd-barras i:last-child { background: linear-gradient(90deg, var(--cor-fora, var(--warning)) var(--p), var(--surface-2) var(--p)); }
.tnd-odds { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 14px; margin-top: 12px; }
.tnd-odds .btn { width: auto; }
.tnd-odds small { font-size: 12px; color: var(--text-muted); }
.tnd-recortes { margin-bottom: 10px; }
.tnd-ordem { font: inherit; color: inherit; background: transparent; white-space: normal; max-width: 90px; line-height: 1.25; }
.tnd-ordem.ativo { color: var(--accent); }


.sel-acoes { display: flex; justify-content: flex-end; margin: 0 0 10px; }
.sel-acoes .btn { width: auto; }

@media (max-width: 560px) {
  .ds-cta { max-width: none; }
}

@media (max-width: 560px) {
  .ds-cta { max-width: none; margin-left: 0; }
  .ds-trava p, .ds-recado { padding-left: 0; margin-left: 0; }
}

@media (min-width: 900px) {
  /* Seis cartoes: 2x3 no celular, 3x2 aqui. Sempre fileira cheia. */
  .h2h-cards { grid-template-columns: repeat(3, 1fr); }
  /* Com tres colunas o rotulo cabe numa linha so e as duas reservadas
     viram um buraco em cima de cada numero. */
  .hc-rot { min-height: 0; }
  /* seis colunas numa linha so: sobre + quatro listas + navegar */
  .rodape-grade { grid-template-columns: minmax(230px, 1.5fr) repeat(5, minmax(0, .82fr)); }
  .n-curto { display: none; }
  .n-longo { display: block; }
  .row-jogo { grid-template-columns: 150px minmax(0, 1fr) 86px minmax(0, 1fr) 190px; }
  .detalhes-grade { display: grid; grid-template-columns: minmax(0, 1.55fr) minmax(300px, .95fr); gap: 16px; align-items: stretch; }}

@media (min-width: 1180px) {
  /* A pagina da partida vira uma rolagem so: todas as secoes na tela,
     o menu leva ate elas e gruda no topo. */
  .abas-barra { position: sticky; top: var(--header-h); z-index: 12; background: var(--bg);
    padding-top: 10px; margin-bottom: 18px; }
  .aba-secao { scroll-margin-top: calc(var(--header-h) + 62px); }

  .row-jogo.jc { min-height: 0; }

  /* O trilho de icones fica na primeira coluna; a lateral de
     competicoes na segunda. */
  /* O trilho de icones repetia os atalhos da barra de topo (Jogos,
     Favoritos, Tabela, Times) e a conta, que tambem esta no topo.
     Saiu do HTML; a grade ficou com duas colunas. */
  .menu { border-right: 1px solid var(--border-subtle); overflow-y: auto; scrollbar-width: none; }
  .menu::-webkit-scrollbar { display: none; }
  .trilho { position: sticky; top: calc(var(--header-h) + 20px); }
  /* Era display:block, e bloco ignora gap. Com as margens dos filhos
     zeradas, os cartoes ficavam colados um no outro. */
  .trilho { display: grid; gap: 20px; align-content: start; width: var(--rail-w); }
  /* Travar o meio em 860px deixava uma faixa branca enorme nas telas
     largas. A grade ja limita a largura util; o meio ocupa o resto. */
  #conteudo { width: 100%; max-width: none; min-width: 0; }
  .rodape { width: 100%; max-width: 1320px; margin-left: auto; margin-right: auto; }
  /* Barra de topo em cima ocupando a largura toda, lateral so com as
     competicoes, conteudo e trilho embaixo. Nada mais e fixo: e grade. */
  /* A lateral e o trilho de icones ficavam colados na borda esquerda
     e so o conteudo era centralizado, dentro do que sobrava. Numa tela
     de 1900 isso jogava o bloco inteiro uns 150px para a direita do
     centro da janela, e a pagina parecia torta.

     Agora o conjunto todo tem largura maxima e centraliza junto. Em
     telas menores que --app-max nada muda: a regra so aparece quando
     existe sobra dos dois lados. */
  :root { --header-h: 84px; }
  /* A margem lateral pertence a GRADE, nao so a coluna do meio.
     Estava so no .centro, entao o trilho respirava 36px na direita
     enquanto o rail encostava na borda esquerda: o conjunto ficava
     36px fora do centro da janela em tela larga. */
  .app { padding-inline: clamp(20px, 2vw, 36px); }
  .app { margin-inline: auto; max-width: var(--app-max); display: grid;
    grid-template-columns: var(--sidebar-w) minmax(0, 1fr);
    grid-template-rows: var(--header-h) minmax(0, 1fr);
    grid-template-areas: 'topo topo' 'menu centro'; }
  /* A area da grade tem altura fixa, entao sticky nao tem para onde
     escorregar: o topo sairia da tela. Fixo resolve, e a linha da
     grade continua reservando o espaco dele. */
  /* A barra de topo atravessa a janela inteira, de borda a borda:
     limitada a --app-max ela parava antes das pontas e sobrava uma
     tira de fundo dos dois lados, como se o cabecalho estivesse
     faltando pedaco. Quem continua centralizado e o CONTEUDO dela: o
     recheio lateral acompanha a sobra que a grade deixa, entao a
     marca nasce na mesma coluna do trilho e a busca fica alinhada com
     o meio da pagina. */
  .topo { grid-area: topo; position: fixed; top: 0; z-index: 30;
    left: 0; right: 0; transform: none; width: 100%;
    padding-inline: calc(max(0px, (100vw - var(--app-max)) / 2) + clamp(20px, 2vw, 36px));
    height: var(--header-h); margin-bottom: 0;
    border-bottom: 1px solid var(--border-subtle); }
  .topo-marca, .topo-nav { display: flex; }
  .so-celular { display: none; }
  /* A faixa horizontal de competicoes vira redundante: a mesma lista
     esta na lateral. No celular, onde nao ha lateral, ela continua. */
  .menu { grid-area: menu; display: flex; flex-direction: column; position: sticky;
    top: var(--header-h); width: var(--sidebar-w); max-height: calc(100vh - var(--header-h));
    left: auto; bottom: auto; padding: var(--s5) var(--s2) var(--s4); }
  /* Sem recuo lateral proprio: quem da a margem agora e o .app, para
     o rail e o trilho ficarem a mesma distancia das bordas. */
  .centro { grid-area: centro; padding: var(--s6) 0 40px 22px; }
  .conteudo-grade { display: grid; grid-template-columns: minmax(0, 1fr) var(--rail-w); gap: 20px; align-items: start; width: 100%; max-width: 1400px; margin: 0 auto; }
  .conteudo-grade.com-painel { grid-template-columns: minmax(0, 1fr) var(--painel-w); }
  .conteudo-grade.com-painel .trilho { width: var(--painel-w); }
}

@media (min-width: 1500px) {
  .conteudo-grade { column-gap: 20px; }}

@media (min-width: 1800px) {
  :root { --pad: 40px; }}

@media (min-width: 1180px) and (max-width: 1360px) {
  :root { --sidebar-w: 202px; --rail-w: 280px; --painel-w: 420px; }
  .conteudo-grade { gap: 20px; }
  .busca { width: min(560px, 100%); }}

@media (min-width: 1361px) and (max-width: 1439px) {
  :root { --sidebar-w: 220px; --rail-w: 300px; --painel-w: 460px; --pad: 24px; }
  .topo-marca .brand-logo { width: 118px; }}

@media (max-width: 1179px) {
  /* Banner: no celular o nome inteiro nao cabe ao lado do placar. Os
     nomes descem para baixo dos escudos. */
  .banner-rodada { padding: 14px 14px; gap: 6px; }
  /* Uma linha. A manchete repete o que o duelo logo abaixo já diz
     com escudo, nome e competição: duas linhas dela eram 40px
     gastos para dizer a mesma coisa de novo. */
  .bn-titulo { font-size: 17px; display: -webkit-box; -webkit-line-clamp: 1;
    -webkit-box-orient: vertical; overflow: hidden; }
  .bn-duelo { gap: 10px; }
  .bn-time { flex-direction: column; gap: 6px; text-align: center; }
  /* O visitante vem com o nome antes do escudo no HTML; em coluna, o
     reverse mantem o escudo em cima nos dois lados. */
  .bn-time.dir { flex-direction: column-reverse; gap: 6px; text-align: center; }
  .bn-time img, .bn-time .comp-bola { width: 38px; height: 38px; }
  .bn-time b { font-size: 16px; font-weight: 700; white-space: normal; text-align: center; line-height: 1.2; }
  .bn-placar { font-size: 34px; }
  .bn-placar.hora { font-size: 30px; }

  /* Pagina do time: a faixa de numeros era uma fila que nao cabia e
     cortava os valores. Vira grade de tres colunas. */
  .time-capa { display: grid; grid-template-columns: 64px minmax(0, 1fr); gap: 14px;
    align-items: center; padding: 16px; }
  .time-capa > img { width: 64px; height: 64px; }
  .time-txt h1 { font-size: 25px; line-height: 1.12; }
  .time-capa .btn-seguir { grid-column: 1 / -1; margin-left: 0; width: 100%;
    justify-content: center; }
  /* A capa e GRADE aqui, de `64px 1fr`. O grupo de acoes caia na
     primeira coluna e vivia com 64 pixels de largura: os tres botoes
     saiam empilhados e encavalados na borda esquerda. Ele ocupa a
     linha inteira, e ai os filhos dividem o espaco em vez de brigar
     por ele. */
  .time-capa .capa-acoes { grid-column: 1 / -1; width: auto; }
  .time-capa .capa-acoes .btn-seguir { grid-column: auto; width: auto; }
  .time-capa::after { display: none; }

  .faixa-resumo { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
    overflow: visible; min-height: 0; border: 0; background: var(--surface-1);
    border-radius: 10px; margin: 16px 0 20px; }
  .faixa-resumo > div { padding: 12px 10px; border-right: 1px solid var(--border-subtle);
    border-bottom: 1px solid var(--border-subtle); white-space: normal; text-align: center;
    justify-items: center; }
  .faixa-resumo > div:nth-child(3n) { border-right: 0; }
  .faixa-resumo > div:last-child { border-bottom: 0; }
  .faixa-resumo strong { font-size: 20px; }
  .faixa-resumo span { font-size: 12.5px; }

  /* Titulo de secao no celular: 22px com um botao ao lado quebrava em
     duas linhas. */
  .secao { flex-wrap: wrap; gap: 8px; margin: 20px 0 10px; }
  .secao-titulo { font-size: 20px; }

  /* Linha do tempo no celular: mesma ideia do computador, dois lados e
     o minuto no meio, so que compacta. O nome quebra em duas linhas em
     vez de espremer tudo numa coluna so. */
  .linha-tempo { gap: 8px; }
  .lt-cab { grid-template-columns: 1fr 46px 1fr; font-size: 12px; letter-spacing: .06em; }
  .lt-cab span:first-child { padding-right: 8px; }
  .lt-cab span:last-child { padding-left: 8px; }
  .lt-item { grid-template-columns: 1fr 46px 1fr; }
  .lt-lado { gap: 8px; padding: 8px 10px; border-radius: 8px; }
  .lt-txt b { font-size: 13.5px; white-space: normal; line-height: 1.2; }
  .lt-rot { font-size: 12px; }
  .lt-apoio { font-size: 12px; }
  .lc-foto, .lc-foto img, .lc-iniciais { width: 30px; height: 30px; }
  .lc-iniciais { font-size: 12px; }
  .lc-escudo { width: 15px; height: 15px; right: -2px; bottom: -2px; border-width: 2px; }
  .lc-escudo img { width: 11px; height: 11px; }
  .lt-ico { width: 24px; height: 24px; }
  .lt-ico svg { width: 13px; height: 13px; }
  .lt-min { font-size: 13.5px; }
  .lt-tempo { font-size: 12px; }
  .linha-tempo::before { left: 50%; }

  /* Fluxo da partida cabe menor no celular. */
  .mm-grafico { height: 108px; }
  .mm-caixa { grid-template-columns: 20px minmax(0, 1fr); column-gap: 8px; }
  .mm-lado img { width: 17px; height: 17px; }
  .mm-regua { margin-left: 28px; }

  /* Cabecalho de competicao no celular: sem fundo proprio, "La Liga"
     parecia solto dentro do fundo da pagina. */
  /* Sem caixa alta: "LIBERTADORES" gritando em cima de uma única
     partida deixava o nome da liga mais pesado que o jogo. */
  .grupo-txt strong { font-size: 15px; letter-spacing: -.01em; }
  .grupo-txt small { font-size: 12.5px; }
  .grupo-topo img { width: 24px; height: 24px; }

  /* Respiro entre blocos: encostados, viravam um bloco so. */
  .bloco, .caixa, .resumo-ia, .stat-grupo, .art-lista, .info-jogo { margin-bottom: 18px; }
  /* A LEGENDA DAS BARRAS NO CELULAR: LARGURA DE TEXTO, NAO DE GRADE.
     Tirar o escudo (feito logo abaixo, e ha tempo) nao bastou. O que
     apertava era a grade `1fr auto 1fr`: ela parte a faixa em duas
     metades IGUAIS, e a metade de 95px nao cabe "Bournemouth", que
     pede 107. O nome saia como "Bourne..." em cima das proprias
     barras que comparam os dois times.
     Aqui os tres pedacos passam a ocupar a largura que o texto pede,
     lado a lado e centrados: medido a 390px, bolinha + os dois nomes
     + "contra" somam 285 dos 318 disponiveis, e nada mais e cortado.
     No computador a grade fica, porque la ela e o que mantem o
     "contra" exatamente no meio, em cima do encontro das barras. */
  .lados { display: flex; flex-wrap: wrap; justify-content: center;
    padding: 10px 12px; gap: 6px 14px; }
  .lados .um, .lados .um.dir { flex: 0 1 auto; font-size: 14px; gap: 7px; }
  /* O escudo sai desta faixa no celular. Medido a 390px: a coluna tem
     105px e o escudo mais os vaos comiam 45, sobrando 60 para o nome
     -- "America-MG" pede 72 e quebrava em "America" / "-MG".
     O escudo aqui nao esta identificando nada que ja nao esteja
     identificado: o cabecalho da partida mostra os dois escudos
     grandes uma tela acima, e quem liga o time a cor da barra e a
     bolinha, nao o escudo. Tirando ele, o nome ganha 28px e cabe
     inteiro numa linha. No computador ele fica, porque la sobra
     espaco e ele ajuda a varrer a coluna. */
  .lados .um img { display: none; }

  .linhas {}
  .row-jogo.jc { padding: 11px 12px; row-gap: 4px; }
  .jc-lado img { width: 30px; height: 30px; }
  .jc-nome { font-size: 15.5px; }
  .row-jogo.jc { --jc-meio: 21px; }
  .conteudo-grade { display: block; }
  /* O trilho ficava escondido no celular, e com ele sumiam o jogador
     da semana, os melhores jogos e os grandes jogos que vem por ai.
     Quem mais usa o site esta no celular: o conteudo desce para
     baixo da lista em vez de deixar de existir. */
  .trilho { display: flex; width: 100%; margin-top: var(--s5); }
  .trilho:empty { display: none; }
  /* A coluna da direita so acompanha a aba Detalhes. Ver o comentario
     em jogo.js: fora dali ela era o mesmo rodape repetido cinco
     vezes, e em duas abas repetia conteudo que ja estava na tela. */
  .trilho.so-nos-detalhes { display: none; }
  .trilho::before {
    content: attr(data-rotulo);
    display: block;
    font-family: var(--display);
    font-size: 14px;
    font-weight: 700;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--text-muted);
    padding-top: var(--s3);
    border-top: 1px solid var(--border-subtle);
  }
  .bb { display: grid; justify-items: center; gap: 3px; height: 56px; align-content: center; font-size: 13px; color: var(--text-secondary); }
  .bb i { display: grid; place-items: center; }
  .bb svg { width: 20px; height: 20px; fill: currentColor; }
  .bb.ativo { color: var(--accent); font-weight: 600; }
  body::before { display: none; }
  .datas { gap: 10px; margin-bottom: 16px; }
  .data-seta, .data-atalho { min-width: 56px; width: 56px; }
  .linhas { gap: 0; }
  .rj-status { font-size: 13px; }
  .rj-placar { font-size: 25px; }
  .rj-gols { font-size: 13px; gap: 6px 14px; }
  /* A barra de baixo pertence a ESTE site. O `rgba(17,17,17,.97)`
     que estava aqui e um cinza-preto que nao existe em lugar nenhum
     do sistema: ela parecia um retangulo colado de outro aplicativo
     embaixo de uma interface azul-marinho. Agora e a superficie do
     projeto, com a mesma aresta das outras. */
  .barra-baixo { position: fixed; left: 0; right: 0; bottom: 0; z-index: 30;
    display: grid; grid-template-columns: repeat(5, 1fr);
    background: var(--surface-1); border-top: 1px solid var(--aresta);
    padding-bottom: env(safe-area-inset-bottom); }
  /* 56px da barra + a faixa do sistema + respiro. Estava em 60px
     fixos: num aparelho com faixa inferior, os ultimos pixels do
     conteudo ficavam atras dela. */
  body { padding-bottom: calc(56px + env(safe-area-inset-bottom, 0px) + 10px);
    background-image: none; }
  .centro { padding: 0 16px 32px; }
  .topo { height: auto; padding: 0 0 12px; border-bottom: none; margin-bottom: 12px; padding-top: 0; top: 0; background: var(--bg); backdrop-filter: blur(14px); box-shadow: none; }
  .topo::after { display: none; }
  .topo-fim { display: flex; margin-left: auto; gap: var(--s1); }
  .topo-fim .ic-topo { width: 38px; height: 38px; }
  .topo-fim .ic-topo.perfil { width: auto; height: 38px; padding: 0 var(--s3); font-size: var(--t-cap); }
  .busca { display: none; width: 100%; }
  .busca.aberta { display: flex; width: 100%; }
  .cabeca { min-height: 220px; margin: 6px auto 22px; padding: 28px 18px 24px; border-radius: 18px; }
  .cabeca::after { left: 18px; right: auto; top: 12px; }
  .duelo { gap: 18px; }
  .duelo-time img { width: 56px; height: 56px; }
  .duelo-time span { font-size: 17px; }
  .duelo-placar { font-size: 25px; }
  .duelo-hora { font-size: 25px; }
  /* Empilhados, os dois cabecalhos da escalacao ficavam um cartao
     largo com o escudo na esquerda e outro com o escudo na direita,
     e cada um com um vazio enorme no meio: parecia bloco pela
     metade. Lado a lado o espelhamento faz sentido (casa a esquerda,
     visitante a direita); empilhado, nao faz nenhum. No celular os
     dois viram duas colunas estreitas, os dois alinhados a esquerda,
     e o cartao volta a ter comeco e fim. */
  .esc-cabs { flex-direction: row; gap: 8px; margin-bottom: 14px; }
  .esc-cab { width: auto; flex: 1 1 0; min-width: 0; padding: 10px 12px;
    gap: 8px; border-radius: 12px; }
  .esc-cab.dir { flex-direction: row; text-align: left; justify-content: flex-start; }
  .esc-cab img { width: 26px; height: 26px; }
  .esc-cab strong { font-size: 15px; overflow: hidden; text-overflow: ellipsis;
    white-space: nowrap; }
  .esc-cab span { margin-top: 3px; padding: 2px 7px; }
  .gramado { padding: 16px 8px; border-radius: 18px; }
  .gramado::after { inset: 10px; }
  .lado-campo { min-height: 270px; padding: 16px 6px; }
  .campo-linha { min-height: 62px; gap: 8px; }
  .campo-foto { width: 46px; height: 46px; }
  .campo-jog > span { max-width: 70px; font-size: 13px; }
  .tecnicos-grid { grid-template-columns: 1fr; }
  .banco, .tecnico-card { border-radius: 16px; }
  .time-capa { border-radius: 16px 16px 0 0; min-height: 0; gap: 14px; padding: 18px 16px; }
  .time-capa > img { width: 64px; height: 64px; }
  .time-txt h1 { font-size: 25px; }
  .time-capa + .chips.abas { padding-left: 14px; padding-right: 14px; padding: 0 16px; overflow-x: auto; scrollbar-width: none; }
  .chips.abas { gap: 20px; margin-bottom: 20px; }
  .chips.abas .chip { height: 42px; white-space: nowrap; }
  .faixa-resumo { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); margin: 18px 0 24px; }
  .faixa-resumo > div { min-height: 78px; padding: 16px 12px; border-right: 0 !important; border-top: 1px solid var(--border-subtle); }
  .faixa-resumo > div:nth-child(-n+2) { border-top: 0; }
  .faixa-resumo > div:first-child { padding-left: 12px; }
  .faixa-resumo strong { font-size: 25px; }
  .jogador { grid-template-columns: 48px minmax(0, 1fr) auto; min-height: 70px; padding: 11px 12px; }
  .jogador-foto { width: 48px; height: 48px; }
  .jogador-num { min-width: 38px; height: 32px; }
  .detalhes-grade { display: grid; grid-template-columns: 1fr; gap: 14px; }
  .detalhes-metricas { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .detalhe-card { min-height: 96px; }
  .detalhe-card strong { font-size: 25px; }
  .estadio-faixa { min-height: 206px; }
  .estadio-txt { left: 16px; right: 16px; bottom: 16px; }
  .estadio-txt strong { font-size: 25px; }
/* linha vira cartao: com gap entre elas, a divisoria embaixo
     duplica a separacao */
  .row-jogo { grid-template-columns: 56px minmax(0, 1fr) 76px minmax(0, 1fr) 28px; align-items: center; gap: var(--s2); min-height: 56px; padding: 0 var(--s4); border-radius: 0; border-bottom: none; background: var(--n80); }
  .row-jogo:hover { background: var(--surface-hover); }
/* a faixa de competicoes e datas ocupava quase 200px de altura
     antes do primeiro jogo aparecer */ .datas { gap: 8px; margin-bottom: 12px; }
  .secao { margin: 20px 0 12px; font-size: 17px; }
  html, body { overflow-x: hidden; }
  .conteudo-grade, #conteudo, .centro { max-width: 100%; min-width: 0; }
  .busca-caixa { max-height: 60vh; }
  .busca-item em { display: none; }
  /* ---------- densidade no celular ----------
     Medido a 390x844: 474px de cabecalho antes do primeiro jogo e
     cartao de 163px, ou seja duas partidas e um quarto na primeira
     tela. O alvo e tres partidas inteiras. Nada foi escondido:
     tudo encolheu junto, para a proporcao continuar a mesma.
     Os cartoes precisam de ".linhas ." na frente porque
     ".linhas-vivo .row-jogo.ao-vivo" tem peso maior e vencia. */
  .casa-item { grid-template-columns: 1fr auto; row-gap: 8px; }
  .casa-link { grid-column: 1 / -1; }
  .casa-logo { grid-column: 1 / -1; justify-self: start; width: 54px; }

  .cb-gols { grid-template-columns: 1fr 20px 1fr; gap: 6px; padding-top: 10px; }
  .cbg-lado { font-size: 12.5px; }

  .qv { gap: 9px; }
  .qv-lado { width: 46px; }
  .prob-miudos { grid-template-columns: 1fr 1fr; }

  .od-linha { flex-direction: column; align-items: stretch; gap: 8px; padding: 10px; }
  .od-precos { width: 100%; max-width: none; }
  .od-casa { font-size: 14px; }

  .tira { padding: 5px; gap: 5px; margin-bottom: 14px; border-radius: 9px; }
  .tira-seta { width: 26px; font-size: 18px; }
  .tira-tag { padding: 0 8px; font-size: 12px; letter-spacing: .03em; }
  .tc { padding: 6px 9px; gap: 6px; }
  .tc img { width: 16px; height: 16px; }
  .tc-est { font-size: 12px; min-width: 26px; }
  .tc-placar { font-size: 13px; }

  /* Mesma conta do desktop, so menor: 32 dentro + 5 + 5 = 42, e a
     faixa de destaques logo acima usa exatamente o mesmo numero. */
  .datas { gap: 5px; margin-bottom: 14px; padding: 5px; border-radius: 9px; }
  .data, .data-seta, .data-atalho { height: 32px; border-radius: 6px; }
  .tira-seta, .tira-tag, .tc { height: 32px; border-radius: 6px; }
  .data { min-width: 66px; padding: 0 10px; }
  .data b { font-size: 13.5px; }
  .data span { font-size: 12px; }
  .data-seta, .data-atalho { width: 36px; font-size: 19px; }

  .banner-rodada { padding: 12px 13px; gap: 4px; margin-bottom: 14px; border-radius: 10px; }
  .bn-tag { font-size: 12px; padding: 2px 8px; }
  .bn-liga { font-size: 12px; }
  .bn-titulo { font-size: 15px; }
  .bn-duelo { gap: 6px; margin-top: 0; }
  .bn-time img, .bn-time .comp-bola { width: 32px; height: 32px; }
  .bn-time b { font-size: 14px; font-weight: 700; }
  .bn-placar { font-size: 28px; }
  .bn-placar.hora { font-size: 25px; }
  .bn-estado { font-size: 12px; }
  .bn-pe { font-size: 12px; margin-top: 0; }

  /* .secao.vivo tem margem propria e peso maior: sem citar as duas,
     o "AO VIVO AGORA" continuava com 24px em cima. */
  .secao{ margin-top: 12px; }
  .secao { margin-bottom: 6px; font-size: 15.5px; min-height: 0; }
  .modos-lista { margin-bottom: 18px; }
  .modo-lista { height: 30px; padding: 0 12px; font-size: 13.5px; }

  .grupo-liga { margin-bottom: 10px; }
  .grupo-topo { height: auto; padding: 8px 12px; margin-bottom: 0; gap: 8px; }
  .grupo-txt strong { font-size: 14px; }
  .grupo-txt small { font-size: 12px; }
  .grupo-topo img { width: 20px; height: 20px; }
  .grupo-topo > span:not(.grupo-txt) { font-size: 12px; padding: 2px 8px; }
  .grupo-vivo { font-size: 12px; padding: 2px 7px; }

  /* Lista no celular: a coluna do estado encolhe, o nome curto volta
     e a coluna da direita some quando nao tem o que dizer. O que
     separa uma partida da outra e o fio, nao o vao. */
  .linhas { gap: 0; border-radius: 10px; }
  .linhas .row-jogo.jc { padding: 11px 13px; column-gap: 11px; border: 0; }
  .linhas .row-jogo.jc + .row-jogo.jc { border-top: 1px solid var(--border-subtle); }
  .jc-duelo { gap: 7px; }
  .jc-lado { gap: 7px; }
  .jc-lado img { width: 24px; height: 24px; }
  .jc-nome { font-size: 14px; }
  .linhas .row-jogo.jc { --jc-meio: 18px; }
  /* Sigla no celular: 'Red Bull Bragantino' e 'Borussia Monchengladbach'
     nao cabem em meia linha de 390px, e o ellipsis apagaria os dois. */
  .jc-lado .n-curto { display: inline; }
  .jc-lado .n-longo { display: none; }
  .jc-selo { font-size: 14px; }
  /* No celular o nome do canal roubava a largura do nome do time:
     "Vasco da Gama" virava "V..". Fica so o icone, como no FotMob;
     o canal continua escrito na pagina da partida. */
  .jc-pe { max-width: 72px; }
  .jc-tv b, .jc-tv i { display: none; }

  /* A faixa de gols usa a linha INTEIRA no celular. O `grid-column`
     que estava aqui prendia ela na segunda faixa da grade antiga de
     tres colunas; com a linha centrada em coluna unica ele CRIAVA uma
     segunda coluna do nada, e era ela que empurrava o duelo para o
     lado e fazia o placar cair em x diferente de linha para linha.
     O nome pode quebrar em duas linhas: cortar o nome de quem fez o
     gol e pior do que gastar uma linha. */
  .jc-gols { gap: 3px 16px; }
  .jc-onde { display: none; }
  .jc-liga { font-size: 12px; }
  .jc-agr { font-size: 12px; padding: 2px 8px; }
  .row-jogo.jc .rj-gols { font-size: 12px; gap: 3px 12px; }

  /* ---------- densidade no celular: pagina da partida ----------
     Medido a 390x844: 434px so de cabecalho antes das abas, com o
     nome da competicao quebrando em duas linhas e os quatro dados da
     ficha um debaixo do outro. Mesma ideia da home: encolher tudo
     junto em vez de esconder alguma coisa. */
  .cabeca { min-height: 0; margin: 4px auto 14px; padding: 16px 14px 0;
    border-radius: 14px; gap: 10px; }
  /* O cartao tem 14px de padding lateral no celular, e nao 16: a
     barra precisa da negativa certa, senao ela sobra dois pixels de
     cada lado e o `overflow: hidden` corta o fio da borda. */
  .cabeca-liga { font-size: 12px; letter-spacing: .06em;
    margin: -16px -14px 0; padding: 9px 14px; }
  .duelo { gap: 18px; }
  .duelo-time { gap: 8px; padding: 4px; }
  .duelo-time img { width: 48px; height: 48px; }
  .duelo-time span { font-size: 15.5px; }
  .duelo-meio { gap: 5px; }
  .cabeca-faixa { margin: 12px -14px 0; padding: 8px 14px; gap: 5px; }
  .cf-item { font-size: 12.5px; gap: 6px; }
}

@media (max-width: 900px) {
  /* O selo "CENTRAL DA PARTIDA" e absoluto no canto e, no celular,
     cai por cima do nome da competicao. Some. */
  .cabeca::after { display: none; }
  .cabeca-faixa { flex-direction: column; align-items: center; gap: 5px; }}

@media (max-width: 900px) {
  /* No celular as colunas viram uma so, e o texto de "sobre" fica
     depois dos links: quem esta no telefone quer navegar, nao ler. */
  .rodape-grade { grid-template-columns: 1fr; gap: var(--s5); }
  .rodape-grade .rodape-sobre { order: 9; }
  .rodape-sobre { max-width: none; }
  .rodape-col button, .rodape-col a { white-space: normal; }}

@media (max-width: 900px) {
  /* camada ScoreSpot no celular. Linha de 52: e alvo de toque de
     sobra e cabe um terco a mais de jogo na tela. */
  .row-jogo { padding: 0 var(--s3); min-height: 52px; }
  .row-jogo.compacta { min-height: 52px; }
  .linhas { gap: 0; }/* A coluna de acoes some no celular, mas some por VISIBILIDADE e
     nao por display: a coluna precisa continuar ocupando lugar. Sem
     ela o duelo perdia o par do lado direito e ficava 20px a direita
     do centro, com o placar desalinhado em toda a lista. Só o icone
     de seta sai; a estrela de time seguido continua. */

  /* A barra de topo substituiu o hero. No celular ela leva a marca a
     esquerda e os tres botoes a direita, e a lista comeca logo abaixo. */
  .topo { height: 52px; padding: 0 var(--s3); gap: var(--s2); margin-bottom: var(--s3); }
  .topo-marca .brand-logo { width: 104px; }
  .topo-fim { margin-left: auto; }

  .data { width: auto; }

/* Só o que o bloco de 1179px não cobre. As regras que os dois
     definiam foram removidas daqui: elas desfaziam o desenho novo
     de celular em qualquer tela abaixo de 900px. */
  /* ---------- abas da partida: sem setas no celular ----------
     As setas existem para quem tem mouse e a faixa nao cabe. No
     celular elas sao duas coisas erradas ao mesmo tempo: alvos de 26px
     (abaixo de qualquer minimo de toque) e um controle para fazer o
     que o dedo ja faz melhor sozinho, que e arrastar. E ainda comem
     52px dos 358 uteis, que sao os 52px que fazem a proxima aba nao
     aparecer pela metade -- e a aba pela metade e justamente o que
     conta para a pessoa que a faixa continua.
     Aqui o dedo rola, e a aba ativa se traz para a tela pelo JS. */
  .abas-seta { display: none; }
  .abas-barra { gap: 0; }
  .chips.abas { scroll-padding-inline: 16px; }

  /* ============================================================
     A tabela no celular volta a ter TODAS as colunas
     ============================================================
     O desenho anterior cortava V, E e D e descia a forma para uma
     segunda fileira embaixo do nome. O raciocinio era que ponto e a
     unica razao de abrir uma tabela e que V/E/D e derivavel. O dono
     do produto discordou depois de usar: "a tabela mobile ta
     bagunçada e curta, poderia ser igual a do desktop com todas as
     infos, e com a opcao de virar a tela de lado".
     Ele esta certo em dois pontos. A segunda fileira e o que deixava
     a tabela "bagunçada": cada time ocupava duas alturas diferentes
     conforme o nome quebrasse ou nao, e a lista perdia o pente. E
     "derivavel" nao e "disponivel": ninguem faz 27-10-8 de cabeca
     rolando uma tabela.
     Agora sao as nove colunas do computador, uma fileira por time, e
     a tabela rola de lado com posicao e nome presos a esquerda. Em
     pe sobram umas cinco colunas visiveis e o dedo alcanca o resto;
     deitado (844px) a tabela inteira cabe sem rolar, que e
     exatamente a "opcao de virar a tela" -- e ela nao custa uma
     linha de codigo a mais. */
  .tab-cab, .tab-linha {
    /* 48 na primeira coluna: la dentro cabem a faixa da zona (3), a
       posicao de dois digitos e a setinha de quem subiu ou caiu na
       rodada. Com 36 a seta transbordava por cima do escudo do time,
       e como as duas primeiras colunas ficam grudadas na rolagem o
       transbordo nao saia da tela junto com o resto. */
    grid-template-columns: 48px minmax(130px, 1fr) 42px 36px 34px 34px 34px 44px 98px;
    grid-template-rows: auto;
    /* SUBGRADE: e o que faz as colunas baterem entre as linhas.
       Cada linha e um <button>, ou seja, uma grade INDEPENDENTE. Com
       `1fr` mais `min-width: max-content`, a coluna do nome media o
       nome DAQUELA linha: media 130px na do Bahia e 218px na do
       Atletico Paranaense, e os pontos de uma linha nao caiam embaixo
       dos da outra.
       Com `subgrid`, quem define as colunas e a `.tabela`, uma vez so,
       e a coluna do nome nasce do nome mais longo da tabela inteira --
       entao alinha E nenhum nome precisa ser cortado, que era a razao
       de o `max-content` ter entrado aqui.
       A linha acima continua como reserva: navegador sem subgrade
       ignora a declaracao invalida e fica no desenho antigo. */
    grid-template-columns: subgrid;
    grid-column: 1 / -1;
    /* VAO ZERO, E O RESPIRO VAI DENTRO DE CADA CELULA.
       Com `column-gap` o espaco entre as colunas nao pertence a
       celula nenhuma, entao nao tem fundo -- e por aquela fresta de
       5px as colunas que passam por baixo apareciam DENTRO da faixa
       grudada, entre o numero da posicao e o escudo. Padding por
       celula resolve: o respiro e o mesmo e o fundo e continuo. */
    column-gap: 0; row-gap: 0;
    padding: 0; font-size: 13.5px;
  }
  /* A grade de verdade mora aqui, e as linhas so a seguem.
     `max-content` na coluna do nome: ela nao encolhe abaixo do nome
     mais longo, entao a tabela passa da largura da tela e a propria
     `.tabela` rola de lado -- que e o comportamento que ja existia,
     agora sem desalinhar. */
  .tabela {
    display: grid;
    grid-template-columns: 48px max-content 42px 36px 34px 34px 34px 44px 98px;
  }
  .tab-cab > *, .tab-linha > * { padding: 0 3px; }
  .tab-cab > :first-child, .tab-linha > :first-child { padding-left: 8px; }
  .tab-cab > :last-child, .tab-linha > :last-child { padding-right: 8px; }
  .tab-linha { height: 46px; }
  .tabela { overflow-x: auto; }
  /* A COLUNA GRUDADA PRECISA DE FUNDO OPACO.
     `position: sticky` num fundo transparente deixa as colunas que
     passam por baixo aparecerem atraves do nome do time. Entao a
     linha ganha fundo solido aqui, e as duas celulas presas herdam
     ele -- assim o time marcado e o hover continuam pintando as duas
     junto com o resto da linha, em vez de virarem um retangulo de
     cor diferente grudado na esquerda. */
  .tab-cab, .tab-linha { background: var(--surface-1); }
  .tab-linha.meu { background: var(--surface-2); }
  .tab-linha:hover { background: var(--surface-2); transform: none; }
  .tab-cab > :nth-child(1), .tab-linha > :nth-child(1),
  .tab-cab > :nth-child(2), .tab-linha > :nth-child(2) {
    position: sticky; z-index: 2; background: inherit; }
  .tab-cab > :nth-child(1), .tab-linha > :nth-child(1) { left: 0; z-index: 3; }
  .tab-cab > :nth-child(2), .tab-linha > :nth-child(2) { left: 48px; }
  /* O vao de 12px do computador nao cabe em 36: a zona, o numero e a
     seta de variacao dividem a coluna. */
  .c-pos { gap: 4px; font-size: 15px; }
  /* O nome volta a uma linha so: a fileira dupla acabou. */
  .c-time b { white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    font-size: 14.5px; }
  .c-forma .seq-p { width: 16px; height: 16px; font-size: 12px; border-radius: 3px; }

  /* A linha de "Proximas partidas" e "Ultimos jogos" no celular.
     Medido a 390px: das quatro colunas fixas mais os vaos sobravam
     48px para o NOME DO ADVERSARIO, que e a unica coisa que a pessoa
     esta procurando ali. "Atletico Goianiense" saia como "Atl...",
     "Athletico Paranaense" como "Ath..." -- dois times diferentes,
     mesmo texto na tela.
     A data cabe em 44 ("18/09" tem 36px a 12px), o escudo em 22, a
     hora em 52 e o quadrado de forma em 20. Com vao de 6 isso libera
     uns 85px para o nome, quase o dobro. */
  .jogo-time { grid-template-columns: 44px 22px minmax(0,1fr) 52px 20px;
    gap: 6px; padding: 0 8px; }
  .jt-local { display: none; }
  .jt-data { font-size: 13px; }
  .jogo-time img { width: 22px; height: 22px; }
  .jt-adv { font-size: 15px; }
  .jt-placar { font-size: 17px; }
  .jt-placar .hora { font-size: 14px; }
  .escalacoes, .banco-lista { grid-template-columns: 1fr; }
  .jogador-capa .retrato { width: 72px; height: 72px; }
  /* No celular a capa empilha, e as acoes viravam tres botoes de
     larguras diferentes, um por linha. Numa linha so, dividindo o
     espaco, elas voltam a parecer um grupo. */
  .capa-acoes { margin-left: 0; width: 100%; justify-content: flex-start; }
  .capa-acoes > * { flex: 1 1 auto; justify-content: center; white-space: nowrap; }
  .btn-seguir { margin-left: 0; }
  .par-casa-fora { gap: var(--s6); }
  .jogadores-partida { grid-template-columns: 1fr; gap: 24px; }
  .h2h { gap: 12px; }
  .h2h-lado strong, .h2h-meio strong { font-size: 25px; }
  .acontecendo p { font-size: 17px; }
  .rj-status { font-size: 15px; text-align: left; }
  .rj-placar { gap: 6px; align-content: center; justify-items: center; line-height: 1; }
  .rj-placar em {}
  .rj-gols { grid-area: unset; grid-column: 1 / -1; margin-top: 10px; padding-top: 10px; }
  /* Horizontal, 64 de altura, os dois times na mesma linha e o placar
     no meio: e a linha do ScoreSpot. Os nomes ja vem encurtados pelo
     exibirCurto, entao cabe. O mandante fica encostado no placar em vez
     de comecar pela esquerda: e a mesma correcao do desktop, para o
     meio da linha nao virar um vazio. */
  .row-jogo { grid-template-columns: 34px minmax(0, 1fr) 48px minmax(0, 1fr) 34px; grid-template-areas: none;
    align-items: center; gap: 6px; min-height: 52px; padding: 0 10px; }
  .rj-placar { grid-area: auto; display: flex; align-items: center; justify-content: center; font-size: var(--t-b2); }
  .rj-placar em { display: inline; margin: 0 2px; }
  .destaque { padding: 10px; }}

@media (max-width: 900px) {
  /* A grade de times era minmax(210px), o que no celular vira uma
     coluna so: vinte times do Brasileirao viravam vinte linhas de
     rolagem. Cartao menor, nome em duas linhas, quatro por fileira. */
  .grade { grid-template-columns: repeat(auto-fill, minmax(102px, 1fr)); gap: 8px; }
  /* Duas fichas por fileira ja e o limite: em 102px nao cabe nem o
     nome nem a camisa. */
  .elenco { grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 8px; }
  .escudo { height: auto; min-height: 84px; padding: 10px 6px; gap: 6px; }
  .escudo img { width: 30px; height: 30px; }
  /* Tres linhas, como no computador: com duas, "Athletic Club de
     Minas Gerais" virava "Athletic Club d...". */
  .escudo span { font-size: 12.5px; line-height: 1.25; display: -webkit-box;
    -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }}

@media (max-width: 680px) {
  /* AS ULTIMAS ATUACOES EM DUAS FILEIRAS.
     Oito colunas num celular de 390px deixavam o adversario com
     largura ZERO -- a linha saia "17/09 casa [escudo] 1-1 E 1 ... 7,4"
     sem dizer contra quem. Em duas fileiras cada peca tem o seu
     espaco: em cima o duelo, embaixo a data e o que ele fez, e a nota
     de pe nas duas. */
  .ja-linha {
    grid-template-columns: 20px minmax(0, 1fr) auto auto auto;
    column-gap: 8px; row-gap: 2px;
  }
  .ja-escudo { grid-area: 1 / 1 / 3 / 2; }
  .ja-adv { grid-area: 1 / 2 / 2 / 3; }
  .ja-placar { grid-area: 1 / 3 / 2 / 4; }
  .ja-linha .seq-p { grid-area: 1 / 4 / 2 / 5; }
  .ja-linha .nota { grid-area: 1 / 5 / 3 / 6; align-self: center; }
  .ja-data { grid-area: 2 / 2 / 3 / 3; }
  .ja-onde { grid-area: 2 / 3 / 3 / 4; }
  .ja-fez { grid-area: 2 / 4 / 3 / 5; justify-self: end; }

  /* Dois raio-x lado a lado num celular dao 150px por coluna, e o
     grafico de seis barras fica ilegivel. Empilha. */
  /* No celular a tabela continua de tres colunas (os valores sao
     curtos), mas os dois graficos de minuto lado a lado ficariam com
     33px de largura cada: eles empilham. */
  .rx-cab, .rx-linha, .rx-forma-linha {
    grid-template-columns: minmax(0, 1fr) minmax(76px, auto) minmax(0, 1fr); gap: 6px; }
  .rx-linha {
    grid-template-columns: minmax(0, 1fr) minmax(92px, auto) minmax(0, 1fr); }
  .rx-rot { font-size: 12px; letter-spacing: .03em; white-space: normal; }
  .rx-v { font-size: 14.5px; }
  /* No celular o escudo e o nome ficam em cima e a amostra embaixo,
     em vez de tudo numa linha so de 130px.
     A AMOSTRA VOLTA A APARECER. Ela estava com `display: none` aqui,
     e isso e o contrario da regra do bloco: comparar 50% de quatro
     jogos com 27% de dez sem dizer que sao quatro e dez e a
     desonestidade que este Raio-X existe para nao cometer. Ela nao
     pode viver so no computador. */
  .rx-time { flex-wrap: wrap; row-gap: 1px; }
  .rx-time strong { font-size: 13.5px; flex: 1 1 auto; }
  .rx-time span { display: block; flex: 1 0 100%; font-size: 12px; }
  .rx-time { justify-content: center; text-align: center; }
  .rx-time span { text-align: center; }
  .rx-par { grid-template-columns: 1fr; gap: 14px; }
  .rx-forma-linha .sf { width: 17px; height: 17px; }
  .pl-cab, .pl-linha { grid-template-columns: 30px minmax(0, 1fr) 56px 52px 50px;
    padding: 0 10px; font-size: 14px; gap: 6px; }
  .df-lados, .sq-lados { grid-template-columns: 1fr; gap: 22px; }
  .duelo { gap: 10px; }
  .duelo-time span { font-size: 15px; }
  .duelo-placar { font-size: 25px; }
  .data, .data-seta, .data-atalho { min-width: 66px; height: 42px; }
  .data-seta { min-width: 44px; }
  .row-jogo { min-height: 52px; padding: 0 10px; gap: 6px; }
  .rj-placar { font-size: 17px; }
  .rj-status { font-size: 13px; }
  .chips.abas { gap: 16px; }
  .faixa-resumo strong { font-size: 25px; }
  /* Aqui so o aperto fino. A GRADE e uma so, declarada no bloco de
     900px: antes ela era redeclarada inteira aqui embaixo com um
     numero de colunas diferente, e quem editasse a de cima nao veria
     efeito nenhum abaixo de 680 -- foi o que aconteceu quando as
     nove colunas voltaram para o celular e a tabela continuou saindo
     com cinco, embaralhada em duas fileiras. */
  .tab-cab, .tab-linha { font-size: 13px; }
  .c-time img { width: 18px; height: 18px; }
  .c-time b { font-size: 14.5px; }}

@media (max-width: 560px) {
  .cmp-linha span { min-width: 96px; font-size: 13px; }
  .cmp-cab img { width: 56px; height: 56px; }
  /* Quatro por fileira num celular de 390px. */
  .grade { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  /* Quatro fichas de elenco num celular de 390px davam 90px cada:
     nenhum nome de jogador cabe em 90px. Uma por fileira. */
  .elenco { grid-template-columns: 1fr; }
  .escudo span { font-size: 12px; }
  /* A barra de navegacao mora no rodape no celular. O aviso sobe
     acima dela, senao ele cobre "Inicio", "Favoritos" e o resto --
     e a primeira coisa que a pessoa faz no site e navegar. */
  .cookies { bottom: calc(56px + env(safe-area-inset-bottom, 0px));
    padding-bottom: 10px; gap: 10px; }
  .cookies-btns { flex: 0 0 auto; }
  .cookies-btns button { padding: 0 16px; }}

@media (max-width: 560px) {
  /* Os selos de cobertura passam para baixo do nome: em linha, num
     celular, eles espremiam o nome da competicao ate sumir. */
  .cat-item { flex-wrap: wrap; }
  .cat-selos { width: 100%; padding-left: 30px; }

  /* Cinco colunas nao cabem num celular. A linha vira duas fileiras:
     peso e nome em cima, os dois controles embaixo. O cabecalho sai,
     porque com a linha quebrada ele deixa de apontar para nada. */
  .lg-cab { display: none; }
  /* Cada celula ganha posicao explicita. Deixar no automatico jogava
     a contagem de jogos para a primeira coluna e empurrava o nome
     para fora da linha. */
  .lg-linha { grid-template-columns: 56px minmax(0, 1fr) minmax(96px, auto);
    gap: 8px; padding: 8px 10px; }
  .lg-linha > input[type="number"] { grid-area: 1 / 1 / 2 / 2; }
  .lg-nome  { grid-area: 1 / 2 / 2 / 3; }
  .lg-jogos { grid-area: 1 / 3 / 2 / 4; }
  .lg-check { grid-area: 2 / 1 / 3 / 3; }
  .lg-linha select { grid-area: 2 / 3 / 3 / 4; width: 100%; font-size: 13px; }
  /* O pais some: numa linha de 170px ele comia o nome da competicao,
     que e a unica coisa que a pessoa procura nesta tela. */
  .lg-nome small { display: none; }}

@media (prefers-reduced-motion: reduce) {
  /* O afundar do clique tambem para aqui. */
  .tc:active, .data:active, .chip:active, .menu-atalho:active,
  .row-jogo.jc:active, .el-jog:active, .prox-l:active, .art-linha:active {
    transform: none;
  }
  * { animation: none !important; transition: none !important; }}

/* Este bloco fica MIL E TREZENTAS linhas depois das regras que ele
   sobrescreve, e ele ganha. Foi aqui que a barra de baixo continuou
   preta depois de eu troca-la pela superficie do sistema la em cima:
   a regra certa estava escrita e esta aqui desfazia. E o padrao que
   o `npm run auditoria` aponta como seletor repetido a distancia.
   As cores aqui agora saem das MESMAS variaveis, com transparencia
   para o desfoque ter o que desfocar. */
@supports (backdrop-filter: blur(12px)) or (-webkit-backdrop-filter: blur(12px)) {
  .topo { background: color-mix(in srgb, var(--bg) 88%, transparent);
    -webkit-backdrop-filter: blur(14px) saturate(140%);
    backdrop-filter: blur(14px) saturate(140%); }
  .barra-baixo { background: color-mix(in srgb, var(--surface-1) 92%, transparent);
    -webkit-backdrop-filter: blur(14px) saturate(140%);
    backdrop-filter: blur(14px) saturate(140%); }}

/* Navegador sem color-mix cai num veu fixo em vez de perder o fundo
   inteiro do bloco de leitura. */
@supports not (background: color-mix(in srgb, red 10%, transparent)) {
  .leitura { background: var(--surface-1); }}

/* ============================================================
   trava final: as duas faixas do topo da home andam JUNTAS
   ============================================================
   Isto fica no fim do arquivo de proposito, e nao por preguica.
   A altura dos botoes de dia estava declarada em SEIS lugares
   (linhas 647, 978, 4042, 4549 e em duas media queries), e a das
   pecas da faixa de destaques em outros tres. Eu ajustei duas
   dessas e achei que tinha resolvido; no ar, uma regra de
   `max-width: 680px` sete centenas de linhas abaixo continuava
   mandando 42px so nos dias, e a faixa de cima ficava com 42 de
   altura total contra 52 da de baixo.
   Enquanto as duas nao forem reescritas num lugar so, esta trava e
   o que garante que elas tenham a mesma medida. Um seletor, os dois
   componentes, a ultima palavra. */
@media (min-width: 681px) {
  .datas, .tira { padding: 5px; border-radius: 10px; }
  .data, .data-seta, .data-atalho,
  .tira-seta, .tira-tag, .tc { height: 34px; border-radius: 7px; }
}
@media (max-width: 680px) {
  .datas, .tira { padding: 5px; border-radius: 9px; }
  .data, .data-seta, .data-atalho,
  .tira-seta, .tira-tag, .tc { height: 32px; border-radius: 6px; }
}

/* ============================================================
   mercado: chegou, saiu, e a carreira
   ============================================================
   Duas listas separadas em vez de uma so com setas nos dois
   sentidos: quem abre a aba quer responder "quem meu time
   contratou" OU "quem meu time perdeu", nunca as duas coisas ao
   mesmo tempo. Misturar obriga a ler o sentido da seta linha a
   linha, que e trabalho que a tela deveria poupar. */
@media (min-width: 1px) {
  .tr-lista { display: grid; }
  .tr-linha {
    display: grid;
    grid-template-columns: 30px minmax(0, 1.1fr) minmax(0, 1fr) auto;
    align-items: center;
    gap: 12px;
    width: 100%;
    padding: 9px 4px;
    border: 0;
    border-top: 1px solid var(--border-subtle);
    background: none;
    color: var(--text-primary);
    font-family: inherit;
    text-align: left;
    cursor: pointer;
    transition: background var(--mola);
  }
  .tr-linha:first-child { border-top: 0; }
  .tr-linha:hover { background: var(--surface-hover); }
  /* Virou caixa com as iniciais dentro, e a imagem por cima quando
     existe: a coluna da foto vinha vazia em quase toda linha. */
  .tr-foto {
    position: relative; width: 30px; height: 30px; border-radius: 50%;
    overflow: hidden; flex: none; background: var(--surface-2);
    display: grid; place-items: center;
  }
  .tr-foto img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
  .tr-foto .avatar-fallback { font-size: 12px; }
  /* 14,5px nao existe na escala do site (12 / 13 / 14 / 15 / 16), e
     esta era a unica tela usando. As tres linhas abaixo descem para a
     escala: nome 15, clube 14, data 13, tipo 12. */
  .tr-nome {
    font-size: 15px; font-weight: 600; min-width: 0;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  .tr-clube { display: flex; align-items: center; gap: 7px; min-width: 0; }
  .tr-clube img { width: 18px; height: 18px; object-fit: contain; flex: none; }
  .tr-clube em {
    font-style: normal; font-size: 14px; color: var(--text-secondary);
    min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  /* A seta diz de onde veio ou para onde foi. Verde entrando,
     vermelho saindo: e a mesma gramatica de cor do resto do site,
     onde verde e ganho e vermelho e perda. */
  .tr-seta { font-style: normal; font-size: 15px; flex: none; }
  .tr-seta.entrou { color: var(--success); }
  .tr-seta.saiu { color: var(--danger); }
  .tr-quando {
    display: grid; justify-items: end; gap: 1px; flex: none;
    font-size: 13px; color: var(--text-muted); white-space: nowrap;
  }
  /* O tipo da movimentacao e a resposta de "o que foi isso": ele nao
     pode ser a coisa mais apagada da linha. Sobe de --text-disabled
     (2:1, o tom de "botao desligado") para --text-secondary. */
  .tr-quando small { font-size: 12px; color: var(--text-secondary); }

  .vazio-curto { margin: 0; padding: 12px 4px; font-size: 14px; color: var(--text-muted); }
  .bloco-pe.fora-do-bloco {
    margin: -8px 0 20px; padding: 0 4px; background: none; border: 0;
    text-align: center;
  }

  /* A carreira do jogador: clube, seta, clube, na mesma linha. */
  .cr-lista { display: grid; }
  .cr-linha {
    display: grid;
    grid-template-columns: 74px minmax(0, 1fr) 16px minmax(0, 1fr) auto;
    align-items: center; gap: 10px;
    padding: 9px 4px;
    border-top: 1px solid var(--border-subtle);
  }
  .cr-linha:first-child { border-top: 0; }
  .cr-data {
    font-size: 13px; color: var(--text-muted);
    font-variant-numeric: tabular-nums; white-space: nowrap;
  }
  .cr-clube { display: flex; align-items: center; gap: 7px; min-width: 0; cursor: pointer; }
  .cr-clube img { width: 20px; height: 20px; object-fit: contain; flex: none; }
  .cr-clube em {
    font-style: normal; font-size: 14.5px; font-weight: 600; min-width: 0;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  .cr-clube:hover em { color: var(--accent); }
  .cr-seta { font-style: normal; color: var(--text-muted); text-align: center; }
  .cr-tipo {
    font-size: 12px; color: var(--text-muted); white-space: nowrap;
    padding: 2px 8px; border-radius: 999px; background: rgba(255, 255, 255, .05);
  }
}

@media (max-width: 680px) {
  /* Sem posicao explicita, o grid empurrava a data para a PRIMEIRA
     coluna da segunda linha, embaixo da foto. Aqui cada peca tem
     endereco: retrato ocupando as duas linhas, nome e data em cima,
     clube embaixo atravessando o resto. */
  .tr-linha { grid-template-columns: 28px minmax(0, 1fr) auto; row-gap: 3px; gap: 10px; }
  .tr-foto { grid-row: 1 / span 2; align-self: start; }
  .tr-nome { grid-column: 2; grid-row: 1; }
  .tr-quando { grid-column: 3; grid-row: 1; display: flex; align-items: baseline; gap: 6px; }
  .tr-clube { grid-column: 2 / -1; grid-row: 2; }
  .cr-linha { grid-template-columns: 56px minmax(0, 1fr) 14px minmax(0, 1fr); row-gap: 3px; gap: 8px; }
  .cr-data { font-size: 12px; }
  .cr-clube em { font-size: 13.5px; }
  .cr-tipo { grid-column: 2 / -1; justify-self: start; }
}

/* ============================================================
   o topo da partida no celular, na proporcao do computador
   ============================================================
   "Quero igual ao do desktop esse topo com os times."
   Medido a 375x812: o cabecalho ocupava 323px, quase metade da tela
   antes de qualquer conteudo. E o que mais destoava nao era o
   tamanho, era a PROPORCAO. No computador o placar tem 56px contra
   escudos de 78: ele domina, e o cartao inteiro existe em volta
   dele. No celular o placar estava em 24px contra escudos de 48 e
   nomes de 16 -- do mesmo peso que o resto, e a peca perdia o
   centro.

   Duas correcoes, e as duas andam juntas:
   1. O placar sobe para 38 e passa a mandar na composicao, mesma
      relacao com o escudo que o computador tem.
   2. A faixa de data, horario, estadio e arbitro sai de
      `flex-direction: column`. Empilhada ela sozinha comia 96px em
      quatro linhas, e o conteudo de verdade comecava depois de meia
      tela. Voltando a fluir, ela cabe em duas.

   O resultado e um cabecalho menor E com mais presenca, que e
   exatamente o que estava faltando. Estas regras ficam no fim do
   arquivo porque as de celular estao espalhadas por quatro blocos de
   media diferentes e precisam perder para esta. */
/* A data por extenso some abaixo de 900; acima dela, a curta e que
   nao existe. Uma das duas sempre esta na tela.
   `min-width: 1px` e sempre verdade: e o envelope que o verificador
   exige para qualquer regra escrita depois da primeira media query
   deste arquivo. */
@media (min-width: 1px) {
  .cf-longo, .cf-curto { font-weight: inherit; }
  .cf-curto { display: none; }
}

@media (max-width: 1179px) {
  /* Esta faixa (tablet e janela estreita) tinha o placar em 24px, o
     mesmo do celular, com escudos de 78. O placar volta a mandar. */
  .duelo-placar { font-size: 46px; }
  .duelo-placar em { font-size: 27px; }
  .duelo-hora { font-size: 40px; }
}

@media (max-width: 900px) {
  .cf-longo { display: none; }
  .cf-curto { display: inline; }

  /* DEPOIS DO APITO, SO O PLACAR.
     "Podemos tirar essas informacoes de data, hora, etc do mobile apos
     o inicio do jogo, deixar so antes, pq pra quem quer tirar print
     fica ruim." Antes do jogo, data, hora, estadio e arbitro sao o que
     a pessoa veio ver. Depois, sao quatro linhas entre o placar e o
     conteudo, e cortam o print no meio. No computador a faixa fica:
     la ela e uma linha so e nao atrapalha. */
  .cabeca.depois-do-apito .cabeca-faixa { display: none; }
  .cabeca.depois-do-apito { padding-bottom: 12px; }
  /* No celular a folga simetrica para o botao de compartilhar quebrava
     "BRASILEIRAO SERIE A · 28a RODADA" em duas linhas. A folga fica so
     do lado do botao; o texto desloca 15px, e cabe numa linha. */
  .cabeca .cabeca-liga { padding-left: 12px; padding-right: 42px; }
  .cabeca { padding: 14px 14px 0; gap: 12px; min-height: 0; margin: 6px auto 18px; }

  /* ---------- o duelo no celular, MEDIDO contra o computador -------
     Eu tentei quatro vezes acertar este topo "no olho" e errei as
     quatro. Na quinta eu renderizei a gaveta do computador e a
     pagina cheia do celular lado a lado e li os numeros de cada
     peca. O que saiu de la:

       peca      computador     celular (v148)
       escudo    44px           70px
       nome      15px, 1 linha  15px, DUAS linhas
       placar    26px           50px
       estado    texto simples  pilula com fundo
       dois-pts  3px de folga   16px de folga

     Nao era "quase igual com outra escala". Era outro desenho.
     O placar de 50px comia 100px de largura e sobravam 110 por
     lado; "America-MG" precisa de 102 a 15px, entao ele quebrava
     em duas linhas e so de um lado -- e a pilula do estado punha
     uma caixa cinza no meio que o computador nao tem.

     Agora vale a proporcao do computador, subida so o tanto que uma
     pagina inteira pede (o computador e uma gaveta de 1016px; aqui
     sao 326). Escudo 58 contra placar 32: a MESMA hierarquia de
     44 contra 26, e com 62px de placar sobram 124 por lado, que e
     mais do que "America-MG" pede. O nome cabe numa linha, os dois
     escudos ficam de nivel sozinhos e a caixa cinza sai. */
  .duelo { gap: 10px; align-items: start; }
  .duelo-time { gap: 9px; padding: 0; min-width: 0; }
  .duelo-time img { width: 58px; height: 58px; }
  .duelo-time span { font-size: 15.5px; line-height: 1.22; min-height: 0;
    display: block; text-align: center; }
  .duelo-meio { gap: 5px; padding-top: 4px; }
  .duelo-placar { font-size: 32px; letter-spacing: -.01em; gap: 0; }
  /* 3px de cada lado, igual ao `margin: 0 3px` do .pj-placar. Com o
     `gap: var(--s3)` que estava aqui, o "1 : 2" abria 16px de buraco
     e deixava de ler como um placar so. */
  .duelo-placar em { font-size: 20px; margin: 0 3px; }
  .duelo-hora { font-size: 28px; }
  /* Texto solto, como no computador. Sem fundo, sem borda, sem
     caixa: o estado e uma legenda do placar, nao um botao. */
  .duelo-estado { font-size: 12.5px; font-weight: 600; padding: 0;
    background: none; border-radius: 0; letter-spacing: .06em; }
  /* No celular NENHUM estado tem caixa, nem o ao vivo. Sem esta
     linha a regra de cima (.duelo-estado.vivo, mais especifica)
     devolveria o fundo so para o jogo rolando, e ai o ao vivo
     seria o unico estado do site com pastilha. */
  .duelo-estado.vivo { background: none; }

  /* UMA INFORMACAO POR LINHA.
     Em fileira com quebra automatica, os quatro itens caiam em duas ou
     tres fileiras de larguras diferentes -- data e hora numa, estadio
     sozinho na outra, arbitro sozinho na terceira -- e cada fileira
     centrada na sua propria largura. O resultado era uma escada, que
     foi o que apareceu no relato marcado com caneta nas duas bordas.
     Uma por linha e mais alto em 20px e nunca desalinha: tudo no
     mesmo eixo, que e o que a pagina inteira faz. */
  .cabeca-faixa {
    flex-direction: column;
    flex-wrap: nowrap;
    align-items: center;
    gap: 3px;
    padding: 9px 14px 11px;
  }
  .cf-item { font-size: 12.5px; gap: 5px; max-width: 100%;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .cf-item i, .cf-item i svg { width: 13px; height: 13px; }

  .painel-jogo .cb-gols, .cabeca .cb-gols { padding-top: 8px; }
}

/* ============================================================
   os autores de gol grudam no nome de quem fez
   ============================================================
   `.jc-times` distribuia o MESMO espaco entre tudo: nome, autores,
   nome, autores. Com nove pixels iguais entre cada par, os autores
   ficavam a mesma distancia do proprio time e do time de baixo, e
   a lista parecia solta no meio da linha em vez de pendurada no
   nome -- "muito pra baixo", no relato.
   Agora a grade e apertada (2px) e quem abre espaco e a margem
   ANTES do segundo time. A linha volta a ter dois blocos, e nao
   quatro pedacos soltos. */
@media (min-width: 1px) {
  .jc-gt { margin-top: 1px; }
}

/* ============================================================
   consertos vistos no celular
   ============================================================ */
@media (min-width: 1px) {
  /* "Intervalo" media 52px numa coluna de 44 e saia por cima dos
     escudos, entao encolhia para 11px e quebrava em duas linhas. A
     coluna acabou: o estado agora tem a linha inteira em cima do
     placar, e cabe inteiro em corpo normal. A classe fica porque o
     JavaScript ainda a escreve, e ela serve para outra coisa agora:
     estado comprido nao pode empurrar a linha, entao ele corta com
     reticencias em vez de crescer. */
  .jc-selo.longo {
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    justify-content: center;
  }

  /* A bolinha de gol na lista da home. `<s>` e so o gancho: o risco
     que o navegador poe em `s` sai, porque aqui ele carrega um icone
     e nao texto riscado. */
  .jc-bola {
    display: inline-grid;
    place-items: center;
    width: 13px;
    height: 13px;
    flex: none;
    text-decoration: none;
    color: var(--success);
    opacity: .85;
  }
  .jc-bola svg { width: 13px; height: 13px; display: block; }

  /* A COLUNA DO ESTADO ACABOU.
     Ela existiu em tres medidas -- 54px na regra base, 44 numa media
     query e 62 aqui -- e cada medida foi uma tentativa de fazer
     "Intervalo" caber sem passar por cima do escudo. O problema nunca
     foi a largura: era a coluna. Com o estado em cima do placar e a
     linha inteira centrada, ele tem a largura toda e nao empurra
     ninguem. Ver "A LINHA DA HOME, CENTRADA". */
}

@media (max-width: 900px) {
  /* O VAO DE 38 PIXELS ENTRE OS CARTOES DA COLUNA.
     `.trilho` tem `gap: 20px` e cada `.caixa` carrega
     `margin-bottom: 18px` da regra de celular. Os dois somam, e a
     regra que zerava a margem (`.trilho > *`) fica antes na cascata,
     entao perde. Zerar de novo aqui, depois dela, e o que resolve --
     e o gap desce para 14, que e o respiro de um cartao para o
     outro e nao de uma secao para a outra. */
  .trilho { gap: 14px; }
  .trilho > * { margin-bottom: 0; }
}

@media (max-width: 480px) {
  .mvp-card { gap: 13px; }
  .mvp-foto { width: 58px; height: 58px; }
  .mvp-txt strong { font-size: 17px; }
}

@media (max-width: 560px) {
  .ctx-duelo { grid-template-columns: 1fr; }
  .nm-tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .nm-cards, .lideres { grid-template-columns: 1fr; }
  .sel-retrato { width: 46px; height: 46px; }
  .sel-nome { font-size: 12px; padding: 1px 5px; }
  .sel-feito { display: none; }
  .nm-destaque { grid-template-columns: 1fr; }
  .nm-grande b { font-size: 34px; }
}

/* A lista dos onze desce para baixo do campo em tela estreita. */
@media (max-width: 1280px) {
  .sel-grade { grid-template-columns: 1fr; }
  .sel-campo { max-width: 520px; margin: 0 auto; }
}
