/* ── fontes, servidas do PRÓPRIO domínio ─────────────────────────────────────
   Até 2026-08-05 as duas vinham do Google Fonts, em `<link>` nas catorze páginas. Saíram por
   três razões, e a terceira é a que decide:

   1. Terceiro no caminho crítico de RENDERIZAÇÃO — duas conexões (fonts.googleapis.com e
      fonts.gstatic.com) antes do primeiro texto aparecer.
   2. É a mesma regra que o projeto já aplicou ao `supabase-js`, recusado por "CDN de terceiro
      no caminho crítico do login". Fonte não é menos caminho crítico que login.
   3. PRIVACIDADE: toda visita mandava o IP do visitante para o Google. O objetivo declarado
      no item 1.1 é não vazar de onde o site é operado nem quem o visita, e manter um terceiro
      recebendo cada carregamento contradiz isso mais do que qualquer outra coisa na página.

   São OITO arquivos e nem todos descem: `unicode-range` faz o navegador buscar só o subconjunto
   que a página usa. O caso comum é latin — 43K de Garamond e 29K de Plex Mono. O latin-ext só
   entra quando aparece um nome de carta que exige, e o itálico só na assinatura dos decks.

   Licença: as duas são SIL OFL, que PERMITE hospedar e EXIGE distribuir a licença junto. Os
   dois textos estão em site/fontes/, e é por isso que estão lá. */

/* EB Garamond normal é VARIÁVEL: 500, 600 e 700 saem do mesmo arquivo, e o Google servia os
   três apontando para ele. Uma declaração com faixa de peso, não três iguais. */
@font-face {
  font-family: 'EB Garamond'; font-style: normal; font-weight: 500 700; font-display: swap;
  src: url('../fontes/garamond-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
    U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'EB Garamond'; font-style: normal; font-weight: 500 700; font-display: swap;
  src: url('../fontes/garamond-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304,
    U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
    U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'EB Garamond'; font-style: italic; font-weight: 500; font-display: swap;
  src: url('../fontes/garamond-italico-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
    U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'EB Garamond'; font-style: italic; font-weight: 500; font-display: swap;
  src: url('../fontes/garamond-italico-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304,
    U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
    U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 400; font-display: swap;
  src: url('../fontes/plexmono-400-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
    U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 400; font-display: swap;
  src: url('../fontes/plexmono-400-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304,
    U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
    U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 500; font-display: swap;
  src: url('../fontes/plexmono-500-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
    U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 500; font-display: swap;
  src: url('../fontes/plexmono-500-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304,
    U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
    U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* Canonic — arquivo do formato.
   Princípios desta folha:
   · superfície plana + filete fino. Nenhum gradiente decorativo, nenhuma sombra em UI —
     sombra só onde algo de fato flutua sobre o conteúdo (imagem de carta).
   · hierarquia por tamanho, peso e espaço. Nada de barra colorida sob título.
   · âmbar é acento, não cor de texto: link, estado interativo e a tagline. Mais nada.
   · prosa medida em ~68 caracteres; largura cheia só para o que é tabular (listas de deck).
   A única arte é a carta, sempre inteira (Fan Content Policy). */

:root {
  --fundo: #14130f;
  --painel: #1b1915;
  --borda: #35312a;
  --filete: #26231d;          /* divisor interno, mais discreto que --borda */
  --texto: #e8e3d7;
  --texto-2: #9c968a;
  --titulo: #e6d3a8;        /* ouro claro: separa título de corpo sem gastar o âmbar do acento */
  --titulo-pagina: #c3a068;  /* h1 mais fundo que os h2/h3: no tamanho dele, contraste alto grita */
  --acento: #cf9540;
  /* Texto SOBRE o âmbar (botões). Era um preto fixo, o que só funcionava no tema escuro,
     onde o âmbar é claro. No tema claro o âmbar é escuro e o preto sobre ele caía para
     3,57:1 — e no hover, sobre --titulo, para 1,61:1, praticamente invisível. */
  --sobre-acento: #17120a;
  --erro: #cd6a56;
  --ok: #86a86e;

  /* Escala ~1.28, corpo em 19px. O site é parte referência e parte ferramenta, não texto
     longo — daí um corpo abaixo do padrão editorial (~21px) e acima do de site de dados
     (~15px). Coluna e corpo andam juntos: 52rem em 19px dá ~77 caracteres por linha. */
  --t--2: 0.75rem;
  --t--1: 0.9375rem;
  --t-0: 1.1875rem;
  --t-1: 1.5rem;
  --t-2: 1.9375rem;
  --t-3: 2.5rem;
  --coluna: 52rem;   /* coluna de texto — grid do main E rodapé usam esta, para alinharem */
  --medida: 34em;    /* medida de prosa dentro de blocos largos (cards de deck) */
  --largura: 84rem;  /* breakout: carrossel, listas de deck, cabeçalho e rodapé */

  --serif: "EB Garamond", Georgia, serif;
  --mono: "IBM Plex Mono", ui-monospace, Consolas, monospace;
  --sombra: 0 2px 14px rgb(0 0 0 / 0.22);
  /* Tons calibrados por CONTRASTE contra o fundo escuro, não por gosto. Os originais
     variavam de 2,32 (preto) a 11,77 (branco) — e forma clara sobre fundo escuro parece
     maior que escura do mesmo tamanho, então pips idênticos liam como tamanhos diferentes. */
  /* Tons fundos. O preto é o mais escuro do conjunto de propósito — antes era um roxo
     claro; agora é ardósia, com só um resto de violeta para não virar cinza puro.
     O anel é que garante a beirada, então preenchimento escuro não desaparece. */
  /* O branco é a exceção da faixa, e de propósito. Igualado por contraste aos outros
     (4,13:1) ele virava oliva — a cor certa na medida errada: pip branco que não lê como
     branco não é pip branco. Subiu para 9,74:1, o suficiente para ler como marfim sem o
     estouro de 11,7:1, em que ele volta a parecer maior que o vermelho. */
  --mana-w: #c4bba6; --mana-u: #3f7391; --mana-b: #4a4550; --mana-r: #a44c34; --mana-g: #4a7355;
  /* anel dos pips: contrasta com o FUNDO, não com o preenchimento. É ele que dá a mesma
     beirada a todos e neutraliza a irradiação (cor clara parecer maior que escura).
     Reforçado para 0.55 porque agora sustenta um pip bem escuro. */
  --pip-borda: rgb(240 234 220 / 0.55);

  /* Tier: vermelho no A, verde no E. Calibradas ao MESMO contraste (6,2:1 aqui), variando
     a luminosidade de cada matiz — o que distingue é a cor, não o brilho. */
  --tier-a: #d78375; --tier-b: #cb8c4d; --tier-c: #a99b40; --tier-d: #7da644; --tier-e: #6fa864;
}

@media (prefers-color-scheme: light) {
  :root {
    --fundo: #f6f2e9;
    --painel: #fbf8f1;
    --borda: #d3ccbb;
    --filete: #e3ddcf;
    --texto: #26241f;
    --texto-2: #6b6559;
    --titulo: #4a3517;
    --titulo-pagina: #6b4a17;
    --acento: #9a5f14;
    --sobre-acento: #fbf8f1;   /* 4,92:1 sobre o âmbar e 10,92:1 no hover */
    --erro: #a63c28;
    --ok: #46693c;
    --sombra: 0 2px 14px rgb(80 60 25 / 0.1);
    --pip-borda: rgb(38 36 31 / 0.38);   /* no claro o anel inverte, para seguir contrastando com o fundo */
    /* O branco também inverte, pela mesma razão do anel: o marfim do tema escuro dá 1,71:1
       sobre o creme daqui e some. Só ele — as outras quatro cores contrastam nos dois. */
    --mana-w: #83764f;
    /* mesma rampa, do lado escuro do matiz, a 5,6:1 sobre o creme */
    --tier-a: #a94331; --tier-b: #8a5928; --tier-c: #6d642a; --tier-d: #516c2c; --tier-e: #466e3e;
  }
}

* { box-sizing: border-box; }

/* `[hidden]` do navegador é `display: none` com especificidade zero, então QUALQUER regra
   de autor com display o anula em silêncio. Já aconteceu duas vezes aqui: o popup de carta
   ficava na tela com `hidden = true`, e os botões de exportar apareciam num torneio vazio,
   os dois por causa de um `display: flex`. Esta linha encerra a categoria — conferir a flag
   no DOM volta a significar conferir o pixel. */
[hidden] { display: none !important; }

html { -webkit-text-size-adjust: 100%; }

body {
  margin: 0;
  background: var(--fundo);
  color: var(--texto);
  font-family: system-ui, sans-serif;
  font-size: var(--t-0);
  line-height: 1.6;
  text-wrap: pretty;
}

/* grão de papel — a única textura, e bem no limite do perceptível */
body::after {
  content: '';
  position: fixed; inset: 0;
  pointer-events: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  opacity: 0.035;
}

/* Estrutura de documento, não de dashboard: uma coluna de texto na medida de leitura
   (~68 caracteres), e "breakout" para o que só funciona largo — carrossel e listas de
   deck. Títulos e prosa dividem a mesma coluna, então tudo alinha. */
main {
  display: grid;
  grid-template-columns: 1fr min(var(--coluna), calc(100% - 3rem)) 1fr;
  padding: 3rem 0;        /* mesmo respiro acima e abaixo do conteúdo */
}
/* a margem final do último elemento somaria ao respiro e o desequilibraria */
main > :last-child { margin-bottom: 0; }
main > * { grid-column: 2; }
/* item de grid estica por padrão — botão tem que ficar na largura natural dele */
main > button { justify-self: start; }
main > .largo {
  grid-column: 1 / -1;
  width: min(var(--largura), calc(100% - 3rem));
  margin-inline: auto;
}

.rev-nota { max-width: var(--medida); }

h1, h2, h3 {
  font-family: var(--serif);
  font-weight: 600;
  line-height: 1.15;
  text-wrap: balance;
  color: var(--titulo);
}
h1 { font-size: var(--t-3); margin: 0 0 1.5rem; letter-spacing: -0.005em; color: var(--titulo-pagina); }
h2 { font-size: var(--t-2); margin: 3rem 0 0.75rem; }
h3 { font-size: var(--t-1); margin: 2rem 0 0.5rem; }
p { margin: 0 0 1rem; }

/* filete curto sob o h2 — sólido, estrutural. A versão em gradiente era enfeite.
   `.blocos h3` entra junto porque no /status o título do card é `h3` (ele vive sob um `h2` de
   seção) e no da home é `h2`: sem esta linha o MESMO componente saía com filete numa página e
   sem filete na outra, que é a inconsistência que usar o mesmo componente existia para evitar. */
h2::after, .blocos h3::after {
  content: ''; display: block;
  width: 2.5rem; height: 1px; margin-top: 0.5rem;
  background: var(--borda);
}

/* moldura dupla: eco da borda da carta de 2003, e o que dá acabamento de peça de acervo.
   Superfície plana de propósito — gradiente em painel é o tell mais comum de template.
   O .deck ficou fora: a arte encosta na borda dele, e o filete interno cortaria a faixa. */
.moldura, .blocos article, .painel div {
  background: var(--painel);
  border: 1px solid var(--borda);
  outline: 1px solid var(--filete);
  outline-offset: -5px;
  border-radius: 2px;
  box-shadow: var(--sombra);
}

a { color: var(--acento); text-decoration-thickness: from-font; text-underline-offset: 0.15em; }
a:hover { text-decoration-thickness: 2px; }

:focus-visible { outline: 2px solid var(--acento); outline-offset: 2px; }

code {
  font-family: var(--mono); font-size: 0.9em;
  background: var(--painel); border: 1px solid var(--filete);
  padding: 0.1em 0.35em; border-radius: 3px;
}
dt { font-weight: 600; margin-top: 1.25rem; }
dd { margin: 0.2rem 0 0; color: var(--texto-2); }
ul, ol { padding-left: 1.25rem; }
/* ESPAÇO ENTRE ITENS > ESPAÇO ENTRE LINHAS DO MESMO ITEM. A regra parece óbvia escrita assim,
   e estava invertida — medido no navegador em 2026-08-06, na página de regras:

     entrelinha do item          30,4px  (corpo de 19px, `line-height` 1,6)
     folga ÓPTICA entre linhas   11,4px  (30,4 − 19)
     folga entre um item e o próximo   5,6px   ← metade da de dentro

   Com 8 dos 15 itens quebrando em mais de uma linha, a segunda linha de um item ficava mais
   longe do próprio item do que o item seguinte — o olho não tinha como agrupar, e a lista lia
   como um bloco de texto picado.

   `0.7rem` é 11,2px, que somados à folga óptica dão ~23px entre itens contra ~11px dentro:
   pouco mais que o dobro, que é onde o agrupamento passa a ser imediato. Vai em `li + li` e
   não em `margin-bottom` de propósito — margem de irmãos adjacentes COLABA, e era isso que
   transformava `margin: 0.4rem 0` em 0,4rem de espaço em vez de 0,8rem.

   O SELETOR CUSTOU DUAS MEDIÇÕES, e as duas primeiras tentativas vazaram:

     `li + li` global          → as 44 banidas ganharam 11px entre nomes de UMA linha, e as
                                 linhas de evento e de lista registrada — que já se separam
                                 por filete — ganharam folga que a tabela não pediu
     `ul:not([class])`         → pegou as 862 linhas de DECKLIST do /decks, que também são
                                 `<ul>` sem classe. Lista de dado nem sempre tem classe.

   O que separa de verdade é a PROFUNDIDADE, e ela já estava no HTML: prosa é filha direta de
   `<main>`; decklist mora dentro de `<section>`, dentro do card do deck. `.observadas` entra à
   mão porque tem classe própria (largura e recuo) e é prosa. */
li { margin-bottom: 0.35rem; }
main > ul > li + li,
main > ol > li + li,
.observadas > li + li { margin-top: 0.7rem; }
/* âmbar porque é interativo — junto com o cursor, é o que diz que abre */
summary { cursor: pointer; color: var(--acento); }
summary:hover { color: var(--titulo); }

/* dados: mono, algarismos tabulares */
.meta, .est, .col-meta, .rev-data, .lista h3, .historico summary {
  font-family: var(--mono);
  font-variant-numeric: tabular-nums;
}
.meta { font-size: var(--t--1); color: var(--texto-2); }
/* Coleções legais: nome à esquerda, código e mês/ano à direita, com filete entre linhas.
   Duas colunas porque são 94 entradas — em coluna única viraria uma tira interminável. */
.colecoes { columns: 2 19rem; column-gap: 2.5rem; list-style: none; padding: 0; margin-top: 1rem; }
.colecoes li {
  break-inside: avoid; margin: 0;
  display: flex; justify-content: space-between; align-items: baseline; gap: 1rem;
  padding: 0.3rem 0; border-bottom: 1px solid var(--filete);
  font-size: var(--t--1);
}
.col-meta { font-size: var(--t--2); color: var(--texto-2); white-space: nowrap; }

/* lista de banidas: 44 nomes curtos — em coluna única viraria uma tira vertical longa */
#banidas { columns: 3 12rem; column-gap: 2rem; margin-top: 1rem; }
#banidas li { break-inside: avoid; }

/* ── cabeçalho ──────────────────────────────────────────── */
header { border-bottom: 1px solid var(--borda); }
/* `center`, não `baseline`: o wordmark é bem maior que os links, e alinhar pela linha de
   base jogava os links para baixo do eixo da barra. */
header nav {
  max-width: var(--largura); margin: 0 auto; padding: 1.25rem 1.5rem;
  display: flex; gap: 1.75rem; align-items: center; flex-wrap: wrap;
}
header nav a { text-decoration: none; color: var(--texto-2); font-size: var(--t--1); }
header nav a:hover { color: var(--texto); }
header nav a[aria-current] { color: var(--texto); }
header nav a.marca {
  display: inline-flex; align-items: center; gap: 0.45rem;
  font-family: var(--serif); font-size: var(--t-1); font-weight: 600;
  color: var(--texto); margin-right: auto; letter-spacing: 0.01em;
}
/* o ::first-letter agora mora no span: com o SVG antes dele, a regra no <a> não pegaria */
header nav a.marca span::first-letter { color: var(--acento); }
/* Emblema é imagem, não mais SVG: a arte é do usuário e tem textura, coisa que vetor com
   `currentColor` não faria. Some junto o herdar da cor do acento — a arte já é dourada, e no
   tema claro ela fica um pouco mais quente que o âmbar escuro do resto. É o custo de usar
   arte pronta em vez de forma que se recolore.
   O arquivo sai quadrado do gerador, então 1em x 1em não esmaga nada; `object-fit` está aqui
   como cinto de segurança para o dia em que a arte-fonte trocar e vier retangular. */
.marca-emblema { width: 1em; height: 1em; flex: none; object-fit: contain; }

/* A arte é dourada e foi feita para fundo escuro. Medido: 7,24:1 no tema escuro, igual ao
   wordmark (7,10:1) — e 2,30:1 no claro, contra 4,67:1 do wordmark. Metade do contraste, e o
   emblema ficava lavado ao lado de um nome bem mais escuro.
   É o mesmo problema do pip branco, que também precisou de correção por tema: cor calibrada
   num fundo não serve no oposto. Aqui o ajuste é filtro e não outra arte, porque manter dois
   arquivos da mesma imagem é manter duas verdades.
   0,6 foi chegado medindo, não estimando: 0,68 levava a 3,77:1, ainda abaixo do wordmark. */
@media (prefers-color-scheme: light) {
  .marca-emblema { filter: brightness(0.6) saturate(1.2); }
}

/* selo como divisor: marca onde acaba a identidade e começa a navegação.
   O emblema ocupa o mesmo espaço; quem é pequeno são os pips (raio 4 no viewBox de 64). */
.nav-selo { width: 1.4rem; height: 1.4rem; flex: none; margin-right: 0.5rem; }

/* ── home ───────────────────────────────────────────────── */
/* O HERO FOI COMPRIMIDO EM 2026-08-10, E O NÚMERO QUE MANDOU FOI A DOBRA. Medido em 1386×910:
   o hero tinha 795px e terminava em y=922 — doze pixels ABAIXO da borda da janela. O primeiro
   rolo era brasão, título, tagline, subtítulo, pips, assinatura e carrossel, e nenhuma palavra
   do argumento. Pior que cortar no meio: cortando, quem olha sabe que há mais; terminando
   rente, a página parece acabar ali.
   Cada corte abaixo tem o seu porquê, e nenhum é "diminuir um pouco":
     brasão   170→140   a arte se lê a partir de 110px (o mínimo já estava anotado aqui)
     h1 teto  68→60px   o clamp continua o mesmo em tela estreita; só o teto desceu
     pips     24→16     ornamento não precisa do vão de um bloco de conteúdo
     est      24→16     idem
   Total medido: −84px. O hero fecha em ~711 e a capitular aparece com ~70px acima da dobra. */
.hero { padding: 1.5rem 0 1rem; text-align: center; }
/* a arte só se lê grande: 110px é o mínimo em que a fumaça e os pinos aparecem.
   Servido em 240px para ficar nítido em tela retina. */
.brasao { width: 140px; height: auto; margin-bottom: 0.25rem; }
.hero h1 {
  font-size: clamp(2.75rem, 8vw, 3.75rem);
  margin: 0;
  letter-spacing: 0.01em;
}
.hero .tagline {
  font-family: var(--serif); font-style: italic;
  font-size: var(--t-2); color: var(--acento);
  margin: 0.35rem auto 0; max-width: 28em;
}
.hero .sub { color: var(--texto-2); margin: 0.75rem auto 0; }
.est {
  font-size: var(--t--2); letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--texto-2); margin: 1rem 0 0;
}

/* pips WUBRG — ornamento, não enfeite: separa a assinatura do resto */
.mana { display: flex; gap: 0.45rem; justify-content: center; margin-top: 1rem; }
.mana i { width: 5px; height: 5px; border-radius: 50%; }
.mana i:nth-child(1) { background: var(--mana-w); }
.mana i:nth-child(2) { background: var(--mana-u); }
.mana i:nth-child(3) { background: var(--mana-b); }
.mana i:nth-child(4) { background: var(--mana-r); }
.mana i:nth-child(5) { background: var(--mana-g); }

/* A TESE da home: a frase que os dois parágrafos acima constroem. Era um `<p><strong>` entre
   eles, com o mesmo corpo e a mesma medida — lida como terceira linha do argumento em vez da
   conclusão dele.

   Centrada, em serifa e maior, com filete em cima e embaixo para separá-la do texto corrido
   sem virar card. SEM negrito: o peso vem do tamanho e do espaço em volta, e `<strong>` num
   parágrafo inteiro é ênfase que não distingue nada. `text-wrap: balance` porque frase curta
   e centrada com uma palavra órfã na segunda linha perde exatamente o efeito que se quer. */
/* As margens de 2rem aqui, 2rem/1rem nos `.blocos` e 2rem nas `.acoes` são A RÉGUA DA HOME, e
   ela foi MEDIDA em 2026-08-10 pelo mesmo método do /status. `<main>` é grid, então margem de
   irmão não colapsa: tudo se soma, e os vãos entre os blocos da página eram
   48 · 56 · 96 · 104 · 56. Os dois outliers vinham de `.tese` e `.blocos` empilharem 40+56 e
   56+48 sem que ninguém tivesse escolhido nenhum dos quatro números.
   São DOIS números na página: 48px dentro do argumento, 64px em volta da faixa de três blocos,
   que é a banda que se separa do texto. Mais do que o /status usa (24/48) de propósito — a home
   é vitrine e respira mais; o que ela não podia é respirar em cinco medidas diferentes. */
.tese {
  font-family: var(--serif); font-size: var(--t-1); line-height: 1.35;
  color: var(--titulo); text-align: center; text-wrap: balance;
  margin: 2rem 0; padding: 1.5rem 0;
  border-block: 1px solid var(--filete);
}
/* SEM `max-width`: ela tinha 30ch e quebrava em duas linhas no meio da frase. Cabe inteira na
   coluna da página, e uma tese em uma linha só é o que a faz ler como conclusão em vez de
   parágrafo curto. Em tela estreita ela quebra sozinha, que é o certo — o que não pode é
   quebrar onde sobra espaço. */

/* Capitular erguida. `initial-letter: 2 1` = 2 linhas de altura afundando só 1, então o
   glifo sobe acima da primeira linha e o texto volta à margem já na segunda.
   Fazer isso com float não dá: a line-height do glifo infla a primeira linha e o float
   acaba alcançando a segunda de qualquer jeito. */
.capitular::first-letter {
  font-family: var(--serif);
  color: var(--titulo-pagina);
  -webkit-initial-letter: 2 1;
  initial-letter: 2 1;
  margin-right: 0.06em;
}
/* Firefox ainda não implementa initial-letter: cai no capitular clássico com float */
@supports not ((initial-letter: 2 1) or (-webkit-initial-letter: 2 1)) {
  .capitular::first-letter {
    float: left; font-size: 2.2em; line-height: 0.9; margin: 0 0.07em 0 0;
  }
}

/* carrossel — vitrine contínua, sem zoom e sem pausar no hover */
.carrossel {
  /* 2rem embaixo + o 1rem de padding do hero = 3rem, o mesmo respiro que o `main` dá acima e
     abaixo do conteúdo. Antes eram só os 16px do hero, contra vãos de 56 a 104px no resto da
     página — o carrossel praticamente encostava no primeiro parágrafo. Medido, não estimado. */
  overflow: hidden; margin: 2.5rem 0 2rem;
  mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent);
}
.carrossel-faixa { display: flex; width: max-content; animation: rolar 60s linear infinite; }
@media (prefers-reduced-motion: reduce) { .carrossel-faixa { animation: none; } }
.carrossel img {
  width: 11rem; aspect-ratio: 488 / 680;
  border-radius: 4.75% / 3.5%;
  margin-right: 1.25rem;
  box-shadow: 0 4px 16px rgb(0 0 0 / 0.35);
}
@keyframes rolar { to { transform: translateX(-50%); } }

.acoes {
  display: flex; gap: 1.75rem; align-items: center; justify-content: center;
  margin: 2rem 0 4rem; flex-wrap: wrap;
}
/* O BOTÃO É A MOLDURA DUPLA, não um bloco chapado. Refeito em 2026-08-10 (pedido do usuário:
   "não combina com a estética da página"), e ele tinha razão pelo motivo que dá para escrever:
   o âmbar neste site é ACENTO — filete, link, pip, o `C` do wordmark, o carimbo do painel. Ele
   nunca preenche área. Um retângulo sólido de âmbar era a única superfície da página inteira
   pintada com a cor de destaque, e por isso lia como peça de outro site colada nesta.

   O que ele é agora é exatamente o que os cards, o `.painel` e o popup de carta já são —
   `background: var(--painel)`, borda de 1px e um segundo filete por dentro a −5px, que é o eco
   da borda da carta de 2003. A diferença entre ele e um card é a que faz dele botão: a borda
   externa é ÂMBAR em vez de `--borda`, e o rótulo é serifado, como todo título desta casa.

   A hierarquia contra o `.vazado` não se perde — ao contrário: um tem moldura e superfície, o
   outro é texto puro com uma seta. Antes eram sólido contra texto, que é a mesma distância.

   O hover não troca a cor de fundo (era o gesto abrupto que o comentário anterior já apontava):
   sobe o filete interno para âmbar e abre a sombra. A moldura ACENDE, que é o gesto que uma
   página feita de molduras tem para oferecer. */
.botao {
  display: inline-block;
  padding: 0.8rem 2rem;
  background: var(--painel); color: var(--acento);
  font-family: var(--serif); font-size: var(--t-0); font-weight: 600;
  text-decoration: none; letter-spacing: 0.01em;
  border: 1px solid var(--acento); border-radius: 2px;
  outline: 1px solid var(--filete); outline-offset: -5px;
  box-shadow: var(--sombra);
  transition: color 0.15s, outline-color 0.15s, box-shadow 0.15s;
}
.botao:hover {
  color: var(--titulo);
  outline-color: var(--acento);
  box-shadow: var(--sombra), 0 0 0 3px rgb(207 149 64 / 0.12);
}

/* `border: 0` e `box-shadow: none` NÃO são zelo preventivo: quando o `.botao` virou moldura em
   2026-08-10, o `.vazado` — que só zerava `background` e `outline` — herdou a borda âmbar e a
   sombra, e as duas ações ficaram com a MESMA caixa. A hierarquia que a dupla existe para
   mostrar desapareceu na tela, com o CSS parecendo certo. */
.botao.vazado {
  background: none; color: var(--acento);
  padding: 0.7rem 0; outline: none; border: 0; box-shadow: none;
  text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 0.35em;
  transition: color 0.15s, text-decoration-thickness 0.15s;
}
.botao.vazado::after { content: ' →'; }
.botao.vazado:hover { color: var(--titulo); text-decoration-thickness: 2px; }

/* três blocos, em moldura */
.blocos {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
  gap: 1.5rem; margin: 2rem 0 1rem;   /* a régua da home — razão no comentário da `.tese` */
}
.blocos article { padding: 1.5rem 1.6rem; }
/* `h3` junto do `h2` porque o mesmo bloco é o primeiro nível abaixo do `h1` na home e o
   terceiro no /status, onde ele vive sob um `h2` de seção. O esqueleto muda; a aparência não. */
.blocos h2, .blocos h3 { margin: 0 0 0.5rem; font-size: var(--t-1); }
.blocos p { color: var(--texto-2); margin: 0; font-size: var(--t--1); line-height: 1.7; }
/* Card de mais de um parágrafo (news, desde 2026-08-10): sem isto os dois correm juntos, e com
   line-height 1.7 a quebra de parágrafo some — a última linha de um e a primeira do outro ficam
   à mesma distância que duas linhas do mesmo parágrafo. (0,1,2) para vencer o `margin: 0` acima. */
.blocos p + p { margin-top: 0.7rem; }

/* Etiqueta de estado (/status): a resposta que a página existe para dar, no mesmo lugar em
   todos os cards, para ser VARRIDA antes de qualquer frase ser lida. Mono e caixa alta pela
   mesma razão do `.painel span`: é rótulo de dado, não prosa.
   Duas variantes e não cinco: o âmbar diz "isto funciona hoje", o cinza diz "isto não
   funciona ainda", e a palavra dentro da etiqueta carrega a nuance. Cor por nuance obrigaria
   quem lê a aprender uma legenda que a página não tem espaço para imprimir.

   `p.selo-estado` E NÃO `.selo-estado`, e isto foi MEDIDO depois de sair errado na tela: a
   etiqueta é um `<p>` dentro de `.blocos`, e `.blocos p { margin: 0 }` tem especificidade
   (0,1,1) contra (0,1,0) da classe sozinha. A margem de 0,75rem computava ZERO e o selo
   encostava no título — a regra estava escrita, e escrita não é aplicada. Qualificar pela
   tag empata a especificidade, e vindo depois no arquivo, ganha.

   A folga é 0,85rem e não 0,75 por ser ÓPTICA e não geométrica: o selo é uma caixa com borda,
   e caixa com borda fecha o próprio espaço — o vão até a serifa do título parece menor que o
   mesmo número entre duas linhas de texto. */
/* A APARÊNCIA vale para qualquer tag, e a MARGEM só para o `<p>`. A versão anterior qualificava
   a regra inteira por tag para vencer o `.blocos p`, e no dia em que a etiqueta virou `<span>`
   na lista de artigos ela apareceu como texto solto, sem moldura — a especificidade que
   consertava a margem levou junto a borda, que não precisava dela. */
.selo-estado {
  display: inline-block;
  font-family: var(--mono); font-size: var(--t--2);
  letter-spacing: 0.08em; text-transform: uppercase;
  padding: 0.15rem 0.5rem; border: 1px solid var(--filete); border-radius: 2px;
  color: var(--texto-2);
}
p.selo-estado { margin: 0 0 0.85rem; }   /* (0,1,1) para vencer `.blocos p { margin: 0 }` */
.selo-estado.vivo { color: var(--acento); border-color: var(--acento); }

/* ── placas do acervo (status) ───────────────────────────── */
/* 2×2 dentro da coluna de texto: alinha com título e prosa em vez de virar
   uma faixa larga de dashboard atravessando a página. */
/* O GAP E O PADDING SÃO OS DOS `.blocos`, DE PROPÓSITO — e eram diferentes por acidente, não
   por escolha: 1rem/1,35rem aqui contra 1,5rem/1,5rem lá. As duas grades têm a MESMA largura
   (832px medidos) e ficam a 200px uma da outra na mesma página; duas réguas de vão nessa
   distância não leem como duas famílias de componente, leem como desalinho. Medido em
   2026-08-10. Se um dia divergirem de novo, que seja com uma razão escrita aqui. */
.painel {
  display: grid; grid-template-columns: repeat(4, 1fr);
  gap: 1.5rem; margin: 2rem 0 1rem;
}
@media (max-width: 62rem) { .painel { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 34rem) { .painel { grid-template-columns: 1fr; } }
/* O padding VERTICAL é o dos blocos; o HORIZONTAL é menor, e isso é conta e não gosto: com o
   gap em 1,5rem cada célula fica com (832−72)/4 = 190px, e 1,6rem dos dois lados deixariam
   138px de conteúdo para uma data que mede ~145px em mono de 22px — "Oct 2, 2026" quebrava em
   duas linhas. Em 1,25rem sobram 150px e ela cabe. O painel é dado denso em quatro colunas, os
   blocos são prosa em três: o vão entre eles é que precisa ser o mesmo, não a folga interna. */
.painel div { padding: 1.5rem 1.25rem; }
.painel strong {
  display: block; font-family: var(--mono); font-variant-numeric: tabular-nums;
  font-size: 1.375rem; font-weight: 500; color: var(--acento); line-height: 1.2;
}
/* A quarta placa não é do mesmo tipo das outras três: as três dizem o que o pool É, ela diz o
   que vem. Filete âmbar por DENTRO (`inset`, o mesmo gesto de `.posto.aberto`) e não borda —
   borda mudaria a largura da célula e desalinharia a fileira em 3px. */
.painel .destaque { box-shadow: var(--sombra), inset 3px 0 0 var(--acento); }
.painel span {
  display: block; margin-top: 0.4rem;
  font-size: var(--t--2); letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--texto-2);
}

/* Corpo do artigo: a data e a etiqueta ficam ACIMA do `h1`, e por isso o `h1` perde a margem
   de topo — senão sobra um vão de título entre duas coisas que são o mesmo cabeçalho. */
.artigo-corpo > .artigo-topo { margin: 0 0 0.6rem; }
.artigo-corpo > h1 { margin-top: 0; }
.artigo-corpo h2 { margin-top: 2.5rem; }

/* ── a lista de artigos (/news) ───────────────────────────────
   Linha inteira clicável, filete só ENTRE as linhas (não em cima da primeira nem embaixo da
   última, senão a lista vira uma tabela fechada no meio de uma página que não tem tabelas).
   Data e etiqueta na mesma fileira, título embaixo: é a ordem em que se decide se vale abrir —
   quando foi, do que é, e só então o quê. */
.artigos { list-style: none; padding: 0; margin: 1rem 0 0; }
.artigos li + li { border-top: 1px solid var(--filete); }
.artigo {
  display: block; padding: 1.1rem 0; text-decoration: none; color: inherit;
  border-radius: 2px;
}
/* O hover mexe no TÍTULO e não no fundo da linha: fundo inteiro acendendo numa página sem
   nenhuma outra superfície interativa lê como seleção, não como link. */
.artigo:hover .artigo-titulo { color: var(--acento); }
.artigo-topo { display: flex; align-items: center; gap: 0.75rem; flex-wrap: wrap; }
.artigo-data {
  font-family: var(--mono); font-size: var(--t--2); font-variant-numeric: tabular-nums;
  color: var(--texto-2);
}
/* A etiqueta aqui é a MESMA peça dos cards abaixo, e por isso ela perde a margem de baixo:
   lá ela fica sobre o título, aqui ao lado da data. */
.artigo .selo-estado { margin: 0; }
.artigo-titulo {
  display: block; margin-top: 0.45rem;
  font-family: var(--serif); font-size: var(--t-1); line-height: 1.3;
  color: var(--titulo-pagina); transition: color 0.15s;
}
.artigo-resumo {
  display: block; margin-top: 0.3rem;
  font-size: var(--t--1); line-height: 1.6; color: var(--texto-2);
}

/* ── a régua vertical do /status ──────────────────────────────
   MEDIDA em 2026-08-10, e o que ela mostrou é que ninguém tinha decidido nada: os vãos entre
   os blocos da página eram 56 · 16 · 64 · 12 · 16 · 72 · 104 · 68 · 80 · 24. Não é ritmo, é
   soma — `<main>` é grid, então margem de irmão NÃO colapsa aqui e todo valor se empilha com
   o vizinho. `.blocos` carregava `margin: 3.5rem 0`, que é o número certo na HOME (lá ele
   separa o hero da prosa) e o errado aqui, onde a mesma grade aparece duas vezes dentro de
   seções que já se separam pelo `h2`.

   São DOIS números na página inteira, e a hierarquia é essa: 24px dentro de uma seção,
   48px entre seções. O `h2` já traz os 48 no `margin-top` dele — então o que sobra é zerar o
   que estava somando por cima. */
.pagina-news .blocos { margin: 0.5rem 0 0; }        /* prosa(16) + 8 = 24 até a grade */
/* A linha "Card index last updated" ZERAVA a margem de baixo porque o vizinho dela era um `h2`
   e os 16px viravam 64. Com o painel descendo para dentro da seção em 2026-08-10, o vizinho
   passou a ser um parágrafo e o vão foi a ZERO — a linha colou no texto. A regra existe pelo
   mesmo motivo de antes, só que agora ela é do par certo. */
.pagina-news .painel + .meta + h2 { margin-top: 3rem; }

/* DUAS LINHAS RESERVADAS PARA O TÍTULO, e é o que alinha os cards de verdade. Sem isto, um
   título de uma linha ("The next set") e um de duas ("Accounts, events and pairings") fazem o
   corpo do card começar em alturas diferentes, e três cards lado a lado com o texto em degrau
   é o que se lê como desalinho — não a moldura, que sempre esteve alinhada.
   Reservar é melhor que encurtar: encurtar alinha a página de HOJE e volta a desalinhar no
   próximo título que alguém escrever. O branco extra sob um título curto é IGUAL nos três
   cards da mesma grade, e vão igual não se enxerga — degrau se enxerga.
   `em` e não `lh`: 1,15 é a entrelinha computada do `h3` aqui, e `lh` ainda não é seguro. */
/* Só a partir de duas colunas: empilhados em coluna única não há card ao lado com que alinhar,
   e a linha reservada vira vão morto entre título e texto — medido em 375px, onde os seis
   títulos cabem em uma linha e os 44px do `h3` sobravam 16px em cada card.
   30rem porque a coluna mínima da grade é 14rem: duas delas mais o vão de 1,5rem dão 29,5rem. */
/* `calc(2.3em + 9px)` e não `2.3em`: o filete do `h3::after` mora DENTRO do `h3` e custa
   8px de margem mais 1px de linha. Com a reserva em 2,3em o título de duas linhas passava
   para 64,2px e o de uma parava em 55,2 — o degrau de 9px que esta regra existe para não
   deixar acontecer voltou no dia em que o filete entrou, e só a medição pegou. */
@media (min-width: 30rem) { .pagina-news .blocos h3 { min-height: calc(2.3em + 9px); } }

/* O painel âmbar cai logo abaixo da grade, na MESMA largura, e vinha com 16/20 de folga contra
   24/25,6 dos cards. Empilhados e do mesmo tamanho, dois paddings diferentes leem como um
   card mais apertado que o outro. Escopado à página porque `.aviso-forte` também mora em
   /metagame, /decks e /rules, onde ele não faz par com card nenhum. */
.pagina-news .aviso-forte { padding: 1.5rem 1.6rem; }

/* ── decks ──────────────────────────────────────────────── */
/* A página de decks trabalha numa coluna mais larga: a lista de 75 cartas precisa de três
   colunas. Um único token cuida disso, então texto e cards nascem na mesma largura. */
/* Larga o bastante para 4 colunas na lista de 75 cartas, sem esticar a linha de texto
   além do tolerável: corpo e largura andam juntos, e a 76rem em 19px dava 113 caracteres. */
/* Estes dois tokens moram no <body>, não no <main>: o rodapé fica fora do main e precisa
   do MESMO valor para alinhar. Escopado no main, o rodapé caía no 52rem global e a margem
   esquerda dele destoava do conteúdo. */
.pagina-decks { --coluna: 62rem; }

/* A home é vitrine, não leitura longa: parágrafos curtos aguentam linha mais larga.
   Os três blocos ficam na MESMA coluna do texto, então as bordas alinham — só o hero e
   o carrossel escapam para 84rem, e escapam de forma óbvia, sem parecer desalinho. */
.pagina-home { --coluna: 62rem; }

.aviso-vivo { color: var(--texto-2); font-size: var(--t--1); line-height: 1.7; }
/* A nota de manutenção do /decks desceu para DEPOIS dos eixos em 2026-08-10, e lá ela encostava
   neles: vão medido de 0px. Não era defeito da regra acima — no lugar antigo ela ficava entre
   dois blocos que davam a folga, e `<main>` é grid, então margem nenhuma vinha de graça.
   Só o `p` que é filho direto do `main`: `.aviso-vivo` também veste o painel do topo, e ele já
   tem margem própria. */
main > p.aviso-vivo { margin: 2rem 0 0; }

/* Ressalva que precisa ser LIDA antes dos números, não encontrada depois deles: painel com
   filete à esquerda, no lugar onde a página normalmente já põe conteúdo. Não usa cor de erro
   de propósito — não há nada errado aqui, há pouca amostra, e pintar de vermelho ensinaria a
   pessoa a fechar o aviso em vez de ler. */
.aviso-forte {
  background: var(--painel);
  border: 1px solid var(--borda);
  border-left: 3px solid var(--texto-2);
  border-radius: 2px;
  padding: 1rem 1.25rem;
  margin: 1.5rem 0;
}
.aviso-forte h2 { margin: 0 0 .5rem; font-size: var(--t-1); }

/* Variante PROIBIÇÃO do mesmo painel. Os dois avisos que já existiam são ressalva — "leia
   isto antes dos números", "isto não é uma regra a seguir" — e o filete cinza está certo
   neles. Este é o único que diz "nunca", e em qualquer contexto: o âmbar é o que separa
   uma coisa da outra sem inventar um segundo componente.
   Continua não sendo vermelho, pela razão que o comentário acima já dá: cor de erro ensina
   a fechar o aviso em vez de lê-lo, e aqui não há erro nenhum — há um limite. */
.aviso-regra { border-left-color: var(--acento); }
/* O `h3` aqui é rótulo do painel, não título de seção: some com o corpo grande que ele teria
   dentro de `.secao-corpo` e vira a mesma etiqueta miúda dos cabeçalhos de coluna do /decks. */
.aviso-forte h3 {
  margin: 0 0 0.6rem; font-size: var(--t--2); font-weight: 500;
  text-transform: uppercase; letter-spacing: 0.1em; color: var(--texto-2);
}
/* A frase que a seção inteira existe para dizer, no corpo da serifada: ela é conclusão, e é
   o mesmo tratamento que a tese da home recebe pelo mesmo motivo. */
.regra-frase {
  font-family: var(--serif); font-size: var(--t-1); line-height: 1.35;
  color: var(--titulo); margin: 0 0 0.75rem; text-wrap: balance;
}
/* A regra do formato citada em bloco na /news. Mesmo filete à esquerda do `.aviso-forte` e
   mesma serifa da `.regra-frase` — a citação é a frase que o site inteiro aplica, e não ganha
   um terceiro vocabulário visual por isso. */
.regra-citada {
  margin: 0 0 1rem; padding: 0.1rem 0 0.1rem 1rem;
  border-left: 3px solid var(--acento);
  font-family: var(--serif); font-size: var(--t-1); line-height: 1.4;
  color: var(--titulo);
}
/* Link de saída no fim de um painel: 1,2rem e não os 0,6rem de parágrafo vizinho — ele não
   continua o argumento, ele sai dele. */
.aviso-forte .link-adiante { margin-top: 1.2rem; }
.aviso-forte > p:last-child { margin-bottom: 0; }
.aviso-forte p { margin: .6rem 0 0; }
.aviso-forte p:first-of-type { margin-top: 0; }
/* ── deck comprimido ─────────────────────────────────────────
   Fechado, cada deck é uma linha: nome à esquerda, arte das três cartas de assinatura à
   direita. Card é contexto mais denso que texto corrido, daí a base 17px com a lista de
   cartas em 15px logo abaixo. */
/* moldura simples (sem o filete interno) para a arte poder encostar na borda */
/* ── os três eixos: Aggro, Control, Combo ────────────────────
   Reusam a gramática do cartão de deck de propósito — mesma moldura, mesma faixa de arte,
   mesmo gesto de abrir. São a mesma coisa um nível acima, e inventar um segundo visual para
   isso obrigaria quem lê a aprender duas linguagens na mesma página.

   As DIFERENÇAS são as três que dizem "isto contém aquilo": faixa mais alta, nome em corpo
   maior, e um recuo do conteúdo. Sem elas, um deck aberto dentro de um eixo parecia irmão
   dele, não filho. */
.eixo {
  background: var(--painel);
  border: 1px solid var(--borda);
  border-radius: 2px;
  box-shadow: var(--sombra);
  margin-top: 1.25rem;
  overflow: hidden;
}
.eixo > summary {
  display: flex; align-items: center; justify-content: space-between; gap: 1.5rem;
  padding: 0 0 0 2rem; min-height: 7rem; list-style: none; color: var(--texto);
}
.eixo > summary::-webkit-details-marker { display: none; }
.eixo > summary:hover .eixo-nome { color: var(--titulo); }
.eixo-nome {
  font-family: var(--serif); font-size: var(--t-3); font-weight: 600;
  color: var(--titulo-pagina); line-height: 1.15;
}
.eixo-corpo { padding: 1.25rem 1.5rem 1.5rem; border-top: 1px solid var(--filete); }
.eixo-descricao { max-width: var(--medida); margin: 0 0 0.5rem; color: var(--texto-2); }
/* O cartão de deck DENTRO do eixo perde a sombra e ganha um fundo um passo acima: empilhar
   sombra dentro de sombra dá uma borda dupla que lê como erro de renderização. */
.eixo .deck { box-shadow: none; background: var(--fundo); }

/* QUATRO artes no eixo contra três no deck, e a largura de cada uma vem de conta, não de olho.
   A faixa tem 27rem (432px) e as artes se sobrepõem em 1,5rem (24px), então quatro cabem em
   `4w - 72 = 432`, isto é, 126px = 7,875rem. Com os 10rem herdados do deck, a quarta arte
   nascia inteiramente FORA da faixa — recortada pelo `overflow: hidden`, sem erro nenhum na
   tela. Medido: a quarta ia de 1144 a 1304 numa faixa que acaba em 1143. */
.eixo > summary .deck-artes img { width: 7.875rem; }

/* ── o cardápio de sideboard, recolhido ──────────────────────
   Fechado por padrão (decisão do usuário, 2026-08-07): aberto, ele são sete seções e ~30
   nomes empurrando a lista principal para cima da dobra em todo deck. Quem quer sideboard
   pede sideboard. */
.cardapio { margin-top: 2rem; border-top: 1px solid var(--filete); }
.cardapio > summary {
  display: flex; align-items: baseline; gap: 0.75rem; flex-wrap: wrap;
  padding: 1.25rem 0 0; cursor: pointer; list-style: none;
}
.cardapio > summary::-webkit-details-marker { display: none; }
/* O triângulo é DESENHADO, e não o marcador nativo: `list-style: none` some com ele nos dois
   motores, e um resumo clicável sem seta nenhuma não se anuncia como clicável. */
.cardapio > summary .side-titulo::before {
  content: '▸'; display: inline-block; margin-right: 0.5rem;
  font-size: 0.85em; color: var(--texto-2);
  /* a duração mora no bloco de movimento, lá embaixo, junto das outras três */
}
.cardapio[open] > summary .side-titulo::before { transform: rotate(90deg); }
.cardapio > summary:hover .side-titulo { color: var(--titulo-pagina); }
/* Dentro do resumo o título perde a margem e o filete: quem os carrega agora é o `<details>`. */
.cardapio > summary .side-titulo { margin: 0; padding: 0; border: 0; }

.deck {
  background: var(--painel);
  border: 1px solid var(--borda);
  border-radius: 2px;
  box-shadow: var(--sombra);
  margin-top: 1rem; font-size: 1.0625rem;
  overflow: hidden;                                  /* recorta a faixa na borda do card */
}

.deck > summary {
  display: flex; align-items: center; justify-content: space-between; gap: 1.5rem;
  padding: 0 0 0 2rem;                               /* sem folga à direita: a arte encosta */
  min-height: 5.5rem;
  list-style: none;                                  /* Firefox */
  color: var(--texto);
}
.deck > summary::-webkit-details-marker { display: none; }
.deck > summary:hover .deck-nome { color: var(--titulo); }

.deck-titulo { display: flex; flex-direction: column; gap: 0.1rem; min-width: 0; }
.deck-nome {
  font-family: var(--serif); font-size: var(--t-1); font-weight: 600;
  color: var(--titulo-pagina); line-height: 1.2;
}
/* Pips ao lado do nome, data na linha de baixo. `center` e não `baseline`: pip é grafismo
   sem texto dentro, e alinhar pela linha de base de um flex vazio dá resultado errático. */
.deck-linha-nome { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.deck-data { font-family: var(--mono); font-size: var(--t--2); color: var(--texto-2); }

/* Símbolos de mana oficiais, de site/img/mana/. Cada um já traz forma e cor, então a
   calibração de contraste e o anel que as bolinhas exigiam deixaram de fazer sentido —
   quem lê Magic reconhece o símbolo sem aprender a legenda de cor.
   15px porque abaixo disso o desenho dentro do círculo some; o respingo cai para 11px.

   `.simbolo` e NÃO `.mana`: `.mana` já é o ornamento WUBRG do hero, com margin-top de
   1,5rem. Reusar o nome colava 24px em cima de cada símbolo, empurrando a fileira para
   baixo do nome do deck — e o `align-items: center` daqui não tinha como corrigir, porque
   margem de item flex não é alinhamento, é espaço ocupado. */
.deck-cores { display: inline-flex; align-items: center; gap: 3px; flex: none; }
.deck-cores .simbolo { width: 15px; height: 15px; display: block; }
.deck-cores .simbolo.respingo { width: 11px; height: 11px; }

/* O mesmo par de tamanhos onde o arquétipo aparece fora da página de decks: linha do
   /metagame, título do /archetype e a tabela do /admin. Era só `.deck-cores` e por isso as
   outras telas pintavam principal e respingo do mesmo tamanho — a informação existia e a
   página não a mostrava. */
.meta-cores .simbolo { width: 15px; height: 15px; }
.meta-cores .simbolo.respingo { width: 11px; height: 11px; }

/* A faixa ocupa a altura inteira do card e some para a esquerda, emergindo do fundo em
   vez de terminar num corte reto. O crédito fica sobre a arte, então não custa altura. */
/* A faixa tem largura própria e a arte dentro dela é absoluta. Sem isso a imagem entra no
   fluxo e a altura NATURAL dela (117px em 160px de largura) passa a definir a altura da
   linha — o card ia de 88 para 119px sozinho. Assim quem manda na altura é o texto. */
/* `min(27rem, 45%)` e não 27rem cravado. A faixa nasceu medida para a coluna larga do
   desktop, onde 432px são 43% de um cartão de 992 — proporção certa. Só que ela é FIXA, e
   entre o breakpoint de 40rem (onde a faixa some) e ~900px o cartão encolhe e ela não:
   medido a 800px, o cartão tem 685 e a faixa ficava com 432, isto é, 63% dele. Sobravam
   221px para um título que pede 157 mais os pips, e NOVE dos trinta nomes quebravam em duas
   linhas. Ninguém tinha olhado essa faixa — ela não é celular nem desktop cheio.

   No desktop o cartão de EIXO fica nos 432 de sempre (45% de 992 = 446, e o `min` escolhe
   432). O cartão de DECK, que mora dentro do eixo e por isso tem 940 e não 992, passa de 432
   para 409 — 23px a menos de arte, medidos, e nenhuma das quatro artes do eixo é recortada. */
.deck-assinatura { position: relative; align-self: stretch; flex: none; width: min(27rem, 45%); }

.deck-artes {
  position: absolute; inset: 0; display: flex; overflow: hidden;
  /* esfumaça a faixa toda pela esquerda */
  mask-image: linear-gradient(90deg, transparent, #000 40%);
}
/* O `art_crop` do Scryfall é 626×457 (1,37) e a faixa é 160×88 (1,82): sobra altura, e o
   `cover` joga fora ~25% dela. Centralizado, ele tira 12% em cima — e é em cima que ficam
   os rostos. Liliana, Kroxa, Teferi, Adeline e Snapcaster saíam decapitados.
   25% desce a janela: corta 6% do topo e 19% do rodapé, onde costuma ter chão e moldura.
   Conferido nas 42 artes de assinatura; 12% seria demais e comeria a Stoneforge Mystic. */
.deck-artes img {
  height: 100%; width: 10rem; flex: none;
  object-fit: cover; object-position: 50% 25%;
}
/* fusão: cada arte entra por cima da anterior com a própria borda esquerda esfumaçada,
   então a emenda entre elas deixa de ser uma linha */
.deck-artes img + img {
  margin-left: -1.5rem;
  mask-image: linear-gradient(90deg, transparent, #000 55%);
}
/* O véu escuro no rodapé da faixa saiu junto com o crédito que ele existia para tornar
   legível. Sem texto por cima, ele era só um escurecimento da arte — e a arte é o que a
   faixa existe para mostrar. O crédito agora vive no rodapé da página. */

.deck-corpo { padding: 0.75rem 2rem 2rem; border-top: 1px solid var(--filete); }

/* prosa do card ocupa a largura do card — cap de medida aqui deixava um vão à direita */
.deck-corpo > p, .destaque-deck { max-width: none; }

/* em tela estreita a faixa não cabe ao lado do nome: os três tiles mais o crédito
   deixariam o nome com duas palavras por linha */
@media (max-width: 40rem) {
  .deck-assinatura { display: none; }

  /* …MENOS no cartão de EIXO, que fica com UMA arte (decisão do usuário, 2026-08-07).
     Medido a 375px: o resumo tem 325px de largura e 112 de altura, o título "Aggro" mais a
     contagem ocupam 82, e sobram 212px à direita — cabe uma arte com folga. Quatro não
     caberiam; uma cabe, e um cartão de eixo sem imagem nenhuma ao lado de cartões que TÊM
     imagem no desktop perde a única pista visual do que é cada eixo.

     A regra vence a de cima por especificidade (0-2-2 contra 0-1-0), sem `!important`. */
  .eixo > summary .deck-assinatura { display: block; width: 9.5rem; }
  .eixo > summary .deck-artes img { width: 100%; margin-left: 0; }
  .eixo > summary .deck-artes img + img { display: none; }

  /* O CARTÃO DE DECK GANHOU ARTE NO CELULAR EM 2026-08-10 (pedido do usuário) — e ela desceu
     para BAIXO do nome em vez de ficar ao lado, porque a conta não fechava de nenhum outro
     jeito. Medido a 375px: o resumo tem 299px, o padding come 29 e o gap 24, sobram 246 para
     dividir entre nome e arte; e o nome mais largo com os pips, `Goryo's Reanimator`, mede
     212 sozinho. Ao lado, a arte ficaria com 34px — não é arte, é um respingo. Era esta a
     conta por trás do "sem arte no celular", e ela continua certa: o que mudou foi o eixo em
     que a peça entra.
     Em faixa inteira embaixo, ela ganha os 299px e as TRÊS artes cabem, contra a UMA do
     cartão de eixo. A carta de assinatura é a pista visual mais rápida de que deck é aquele,
     e no celular ela passou a ter mais espaço do que tinha no desktop, não menos.
     `margin` negativa lateral: a faixa sangra até a borda do cartão, como no desktop, onde a
     arte encosta na moldura em vez de flutuar dentro de um padding. */
  .deck > summary { padding: 0.85rem 1.25rem; }
  .deck > summary {
    flex-direction: column; align-items: stretch; gap: 0;
    padding-bottom: 0; min-height: 0;
  }
  .deck > summary .deck-assinatura {
    display: block; width: auto; height: 4.75rem;
    margin: 0.85rem -1.25rem 0;
  }
  /* 40% cada com −8% de emenda dá 104% — cobre a faixa inteira e mantém a fusão esfumaçada
     entre as três, que é o que evita a linha dura de encontro. Sem isto os 10rem fixos do
     desktop deixariam a terceira arte para fora. */
  .deck > summary .deck-artes img { width: 40%; }
  .deck > summary .deck-artes img + img { margin-left: -8%; }
  /* Sem o esfumaçado da ESQUERDA. No desktop ele existe para a arte dissolver no texto que
     está ao lado dela; aqui o texto está ACIMA, e a mesma máscara só escurecia a primeira das
     três artes sem nada para dissolver. A fusão ENTRE as artes continua, que é a máscara do
     `img + img` e é outra: aquela evita a linha dura de encontro, e essa continua fazendo
     falta. */
  .deck > summary .deck-artes { mask-image: none; }
  .deck-corpo { padding: 0.75rem 1.25rem 1.5rem; }

  /* Os pips encolhem de 15 para 12px (respingo 11→9, vão 3→2) porque em tela estreita É ELES
     que jogam o nome do deck para duas linhas, e não o nome. Medido a 320px: `5c Humans` tem
     88px de nome numa faixa de 180 e mesmo assim quebrava, porque cinco pips a 15px custam
     87px — mais que o próprio nome. A 12px custam 68, e a linha fecha.
     O par principal/respingo continua distinguível: a diferença relativa é a mesma. */
  .deck-cores { gap: 2px; }
  .deck-cores .simbolo { width: 12px; height: 12px; }
  .deck-cores .simbolo.respingo { width: 9px; height: 9px; }
}

@media (max-width: 28rem) {
  /* Cartão dentro de cartão cobra padding duas vezes. Medido a 320px: dos 272px da coluna,
     40 iam para o padding do `.eixo-corpo` e 40 para o do `> summary` do deck — 80px, quase
     um terço da largura, gastos em respiro aninhado. Aparados, a faixa do título passa de
     180 para ~219px, que é o que faz caber nome mais pips na mesma linha. */
  .eixo-corpo { padding-inline: 0.75rem; }
  .eixo .deck > summary { padding-inline: 0.9rem; }
  /* A faixa de arte sangra por MARGEM NEGATIVA, então ela tem de acompanhar o padding aqui.
     Medido a 375px com os −1,25rem herdados: a arte ia de 32 a 355 num cartão que vai de 37 a
     338, e os 17px que sobravam do lado direito eram comidos pelo `overflow: hidden` do cartão
     — não aparecia como erro, aparecia como um pedaço a menos da terceira arte. */
  .eixo .deck > summary .deck-assinatura { margin-inline: -0.9rem; }
  .eixo .deck-corpo { padding-inline: 0.9rem; }
  /* 12px de vão entre o nome e os pips viram 8. Não é ajuste no olho: depois de tudo acima,
     `Goryo's Reanimator` precisava de 216px numa faixa de 215 — faltava UM pixel, e um pixel
     jogava a fileira inteira de símbolos para a linha de baixo. */
  .deck-linha-nome { gap: 8px; }
}

/* Justificar só com linha longa o bastante. Em coluna estreita a justificação abre
   rios entre as palavras — pior no itálico serifado da citação. */
@media (min-width: 46rem) {
  /* O rodapé entra junto: com o corpo justificado e ele não, a borda direita dele parava
     antes e a mesma caixa parecia mais estreita. Só a última linha de um parágrafo fica
     solta, então os textos curtos do rodapé não esticam. */
  /* `:not(.tese)` porque a TESE não é corpo de texto: ela é centrada, e justificada ela saía
     com buracos entre as palavras na primeira linha. A regra de justificar tem especificidade
     maior que `.tese`, então empilhar peso lá seria uma briga; dizer aqui que a exceção existe
     é o que descreve a intenção — corpo justifica, conclusão não. */
  .pagina-home main > p:not(.tese), .pagina-decks main > p,
  .pagina-home footer p, .pagina-decks footer p,
  .deck-corpo > p, .destaque-deck {
    text-align: justify; hyphens: auto;
  }
}
.deck-corpo > .meta { margin: 0 0 1rem; }
.destaque-deck {
  /* 19px na serifada casa opticamente com os 17px da sans do card: EB Garamond tem
     altura-x menor, então o mesmo px pareceria menor. O que distingue a citação é o
     itálico, o filete e o tom — não o tamanho. */
  font-family: var(--serif); font-style: italic; font-size: var(--t-0);
  color: var(--texto-2); line-height: 1.55;
  border-left: 1px solid var(--acento); padding-left: 1.25rem;
  margin: 1.5rem 0;
}
.lista { columns: 4 12rem; column-gap: 2.25rem; margin-top: 1.75rem; }
.lista section { break-inside: avoid; margin-bottom: 1.5rem; }
.lista h3 {
  margin: 0 0 0.5rem; font-size: var(--t--2); font-weight: 500;
  text-transform: uppercase; letter-spacing: 0.1em; color: var(--texto-2);
  padding-bottom: 0.35rem; border-bottom: 1px solid var(--filete);
}
.lista ul, .cartas { list-style: none; padding: 0; margin: 0; }
.lista li { margin: 0; padding: 0.12rem 0; font-size: var(--t--1); }

/* ── o cardápio de sideboard ─────────────────────────────────
   Bloco separado do main pelo filete, porque são duas leituras diferentes: o main é UMA lista,
   o cardápio são sete listas paralelas. Na mesma grade de colunas do main, "vs Big mana"
   aparecia ao lado de "Creatures (14)" e as duas viravam uma lista só. */
.side-titulo {
  margin: 2rem 0 0.35rem; padding-top: 1.5rem; border-top: 1px solid var(--filete);
  font-family: var(--serif); font-size: var(--t-0); font-weight: 400; color: var(--titulo);
  text-transform: none; letter-spacing: 0;
}
/* Colunas mais estreitas que as do main: aqui a linha é só o nome, sem a quantidade na
   frente, e 12rem deixava metade da coluna vazia. */
.lista-side { columns: 4 10rem; margin-top: 1.25rem; }

/* NOME DE CARTA citado na prosa das regras. As duas classes não são decoração: elas dizem se
   a carta está NO POOL (`.carta-citada`) ou fora (`.carta-citada-fora`), e `testar-dados.mjs` confere
   cada uma contra `legalidade.json`. Sem a marca, citar uma carta errada — nome trocado, ou
   uma carta que na verdade é legal apresentada como excluída — só seria pego por alguém que
   já soubesse a resposta. É a mesma regra que governa o resto do site: número e nome de
   carta não são digitados sem quem os cobre.

   O contraste entre as duas é sutil de propósito. A frase já diz qual é qual; o estilo só
   não deve fazer a carta excluída parecer um link ou um erro. */
/* `-citada` no nome, e NÃO `.carta`: `.carta` já existe mais abaixo neste arquivo — é o nome
   de carta clicável, com sublinhado pontilhado e popup, usado nas 862 linhas de decklist do
   /decks. A primeira versão destas duas regras se chamava `.carta` e repintou todas elas. A
   colisão não deu erro nenhum: só mudou a cor de meio site, calada. */
.carta-citada { color: var(--titulo); font-weight: 600; }
.carta-citada-fora { color: var(--texto-2); font-weight: 600; }

.observadas { margin: 1rem 0 1.5rem; padding-left: 1.1rem; max-width: var(--medida); }

/* ── seções da página de regras, em card que abre ────────────
   `<details>` nativo: teclado e "sem JavaScript" já vêm de graça, e o navegador ainda ABRE
   sozinho um `<details>` quando o alvo de um link âncora está dentro dele — é por isso que
   `#estrelas`, que o /metagame linka, virou id do próprio `<details>`.

   O `<h2>` mora DENTRO do `<summary>`. É permitido (o modelo de conteúdo do summary aceita um
   elemento de cabeçalho) e é o que mantém o esqueleto do documento: quem navega por cabeçalho
   continua achando as seções, mesmo fechadas. */
.secao {
  background: var(--painel);
  border: 1px solid var(--borda);
  border-radius: 3px;
  margin: 0.75rem 0;
}
.secao > summary {
  padding: 0.9rem 1.25rem;
  color: inherit;                 /* o `summary` genérico é âmbar; aqui quem manda é o h2 */
  list-style: none;               /* o triângulo padrão vira o nosso, abaixo */
  display: flex; align-items: center; gap: 0.75rem;
}
.secao > summary::-webkit-details-marker { display: none; }
.secao > summary h2 { margin: 0; font-size: var(--t-1); }
.secao > summary:hover h2 { color: var(--acento); }

/* O sinal de aberto/fechado. `::after` e não `::marker` porque marker não aceita transform em
   todos os navegadores, e um triângulo que não gira não diz nada. */
.secao > summary::after {
  content: ''; margin-left: auto; flex: none;
  width: 0.55rem; height: 0.55rem;
  border-right: 2px solid var(--texto-2); border-bottom: 2px solid var(--texto-2);
  transform: rotate(45deg) translate(-2px, -2px);
  /* a duração mora no bloco de MOVIMENTO, junto das outras, para o site ter um sotaque só */
}
.secao[open] > summary::after { transform: rotate(-135deg) translate(-2px, -2px); }

/* O filete só existe quando a seção está aberta: fechado, ele desenharia uma linha solta
   embaixo do título. */
.secao[open] > summary { border-bottom: 1px solid var(--filete); }
.secao-corpo { padding: 0.25rem 1.25rem 1.25rem; }
.secao-corpo > :first-child { margin-top: 1rem; }
.secao-corpo h3 { font-size: var(--t-0); margin-top: 1.75rem; }

/* log de revisões */
.historico { margin-top: 2rem; max-width: var(--medida); }
.historico summary {
  cursor: pointer; font-size: var(--t--2);
  text-transform: uppercase; letter-spacing: 0.1em; color: var(--texto-2);
}
.historico summary:hover { color: var(--texto); }
.historico ul { list-style: none; padding: 0; margin: 1.5rem 0 0; }
.historico li { margin-bottom: 1.75rem; }
.rev-titulo { margin: 0 0 0.4rem; font-weight: 600; }
.rev-data { font-size: var(--t--1); color: var(--texto-2); margin-right: 0.6rem; }
.rev-saiu, .rev-entrou { font-family: var(--mono); font-size: var(--t--1); margin: 0.15rem 0; }
.rev-saiu { color: var(--erro); }
.rev-entrou { color: var(--ok); }
.rev-nota { color: var(--texto-2); font-size: var(--t--1); line-height: 1.7; margin: 0.6rem 0 0; }

/* ── nome de carta + popup ──────────────────────────────── */
.carta {
  cursor: pointer;
  text-decoration: underline; text-decoration-style: dotted;
  text-decoration-color: var(--borda); text-underline-offset: 0.2em;
}
.carta:hover { text-decoration-color: var(--acento); }

#carta-popup { position: fixed; z-index: 30; display: flex; gap: 6px; pointer-events: none; }
/* obrigatório: o `display: flex` acima é regra de autor e venceria o `[hidden]` do
   navegador, deixando o popup na tela para sempre. Sem esta linha, esconder não esconde. */
#carta-popup[hidden] { display: none; }
#carta-popup img, #carta-popup .esqueleto {
  width: min(19rem, 44vw); /* dupla face: duas imagens dividem a tela */
  aspect-ratio: 488 / 680;
  border-radius: 4.75% / 3.5%;
  box-shadow: 0 8px 28px rgb(0 0 0 / 0.45);
}
#carta-popup img:only-child, #carta-popup .esqueleto:only-child { width: min(19rem, 85vw); }
#carta-popup .esqueleto { background: var(--painel); border: 1px solid var(--borda); }

/* ── validador ──────────────────────────────────────────── */
/* resultado à esquerda, sob a caixa; botão à direita da mesma linha */
/* `flex-wrap: wrap` DESDE 2026-08-11, e ele conserta rolagem lateral a 375px — medida, não
   suposta: a fileira media 366px numa viewport de 356. A causa eram duas ausências que só
   juntas estouram: `.validador-botoes` tem `flex: none` (não encolhe) e esta caixa era
   `nowrap` (não quebra), então a linha não tinha para onde ceder e vazou pela direita.
   Os dois botões JÁ tinham `flex-wrap: wrap` entre si, e ele nunca disparava — com o pai
   sizing por max-content, os filhos nunca precisavam quebrar.
   Medido nas quatro larguras: a 375 o vão sai de 10px para ZERO e os botões passam a duas
   linhas; a 414, 768 e 1280 o resultado é IDÊNTICO ao de antes, byte por byte de geometria. */
.validador-acao {
  display: flex; flex-wrap: wrap; gap: 2rem; justify-content: space-between; align-items: flex-start;
  margin-top: 1rem;
}
.validador-acao #resultado { flex: 1; }
.validador-acao button { flex: none; margin-top: 0; }
/* Os dois botões andam juntos, com vão PRÓPRIO: soltos dentro do `.validador-acao` eles
   herdariam o gap de 2rem, que existe para separar o resultado da ação — e 32px entre duas
   ações da mesma caixa as faz parecer de blocos diferentes. */
/* `flex: 0 1 auto` e não `none`: precisa PODER encolher para que o `flex-wrap` de dentro
   sirva para alguma coisa. Com `none` ele media sempre max-content, e os dois botões nunca
   quebravam — a caixa só ficava maior que a tela. */
.validador-botoes { display: flex; gap: 0.75rem; flex: 0 1 auto; flex-wrap: wrap; }

/* altura fixa e sem alça de redimensionar: uma lista de 75 cartas não caberia em caixa
   nenhuma, então o rolamento interno é inevitável — melhor uma caixa de tamanho estável
   do que uma que o usuário arrasta e desalinha o layout. */
#lista {
  width: 100%; height: 24rem; resize: none;
  font-family: var(--mono); font-size: var(--t--1); line-height: 1.7;
  background: var(--painel); color: var(--texto);
  border: 1px solid var(--borda); border-radius: 3px;
  padding: 1rem 1.25rem;
}
/* o exemplo dentro da caixa tem que ler como exemplo, não como conteúdo já digitado */
/* 0.8 e não 0.55: a 55% o exemplo caía para 2,26:1 no tema claro — e este placeholder não
   é enfeite, é a explicação do formato que a caixa espera. Ainda fica abaixo do texto real,
   que é o que faz ler como exemplo. */
#lista::placeholder { color: var(--texto-2); opacity: 0.8; }
/* Mesmo tratamento do `.botao` — e esta linha de comentário já estava aqui antes de ser
   verdade. Em 2026-08-10 o `.botao` da home deixou de ser bloco chapado e virou moldura, e a
   promessa "o validador não tem um botão de outra família" passou a ser falsa: o botão do
   validador continuou sendo o único retângulo de âmbar sólido do site. Trocado aqui, na regra
   COMPARTILHADA, e não no validador — corrigir só a página que se estava olhando criaria um
   terceiro estilo de botão em vez de acabar com o segundo.

   SEM o filete interno a −5px que o `.botao` tem: naquele ele cabe porque é um botão de herói
   com 58px de altura; num controle de 30px o `outline-offset` negativo se cruza e desenha
   sujeira. O que unifica é a MOLDURA — superfície de painel, borda âmbar, rótulo âmbar —, e
   ela funciona em qualquer tamanho.

   A fonte fica `inherit` (sem serifa) e a serifa fica só no `.botao`: aquele é uma chamada
   dentro de uma página de títulos serifados, este é controle dentro de formulário. Os botões
   densos da mesa e do /admin já pedem `--mono` por cima desta regra, e continuam pedindo. */
button {
  background: var(--painel); color: var(--acento);
  border: 1px solid var(--acento); border-radius: 2px;
  padding: 0.7rem 1.75rem;
  font-size: var(--t-0); font-family: inherit; font-weight: 600; letter-spacing: 0.01em;
  cursor: pointer; margin-top: 1rem;
  transition: color 0.15s, border-color 0.15s, background-color 0.15s;
}
button:hover { color: var(--titulo); border-color: var(--titulo); }
.ok { color: var(--ok); font-weight: 600; }
.erro { color: var(--erro); font-weight: 600; }
.problemas { color: var(--erro); list-style: none; padding: 0; }
.problemas li { margin-bottom: 0.3rem; }
li.banida::after, li.desconhecida::after {
  font-family: var(--mono); font-size: 0.85em; color: var(--erro);
}
li.banida::after { content: ' — banned'; }
li.desconhecida::after { content: ' — not legal or misspelled'; }

/* ── telas estreitas ────────────────────────────────────────
   A escala acima é calibrada para desktop. No celular o corpo cai para 17px, os títulos
   encolhem mais que o corpo (num espaço curto, título grande come a tela), e os cards
   perdem respiro lateral para o texto não virar uma coluna de duas palavras. */
@media (max-width: 46rem) {
  :root {
    --t--2: 0.75rem;
    --t--1: 0.875rem;
    --t-0: 1.0625rem;
    --t-1: 1.1875rem;
    --t-2: 1.5rem;
    --t-3: 2rem;
  }
  /* O cabeçalho comia 172px de uma tela de 800 — 21% do primeiro rolo era navegação, em
     TODAS as páginas, e o <h1> só começava em 204px. Medido: 460px de itens contra 224px
     só de vãos (28px × 8). O vão custava metade do que o conteúdo custa, e era ele que
     jogava os links para uma terceira fileira. */
  /* PISO DE 16px EM CAMPO DE FORMULÁRIO — a correção de celular que não se vê no desktop.
     O Safari do iOS dá ZOOM no viewport ao focar qualquer input, select ou textarea com fonte
     MENOR que 16px, e não desfaz o zoom ao sair do campo: a pessoa fica com a página torta e
     rolando de lado até recarregar. Medido aqui: o textarea do validador estava em 14px, os
     dois selects do metagame em 14, os campos de `/admin` em 12. Só `.form-conta input` já
     estava certo, em 17.

     A regra é UMA e larga de propósito, em vez de uma lista de seletores: lista envelhece no
     primeiro campo novo, e o defeito volta calado. `--t-0` (17px aqui) e não 16px cravado
     porque é o tamanho que o campo do `/account` já usava — o piso passa a ser o mesmo número
     que a página que estava correta.

     E o `!important` é o ponto, não preguiça: sem ele a regra PERDE para `#lista` e `#nomes`
     (seletores de id) e para `.campo-periodo select` e `.admin-linha input` (classe + tipo).
     Escrevi a versão sem ele primeiro e MEDI: os dois textareas continuaram em 14px. Media
     query não muda especificidade. É o mesmo uso que `prefers-reduced-motion` já faz aqui —
     piso de plataforma que tem de vencer qualquer ajuste local. */
  input, select, textarea { font-size: var(--t-0) !important; }

  /* 0,5rem e não 0,85: com o link levando 0,7rem de padding próprio (ver abaixo), a folga da
     barra passou a ser paga DUAS vezes — a do link, que é área tocável, e a do `nav`, que não
     é. Medido: sem este corte o cabeçalho ia a 123px; com ele, 112. */
  header nav { gap: 0.15rem 1rem; padding: 0.5rem 1.25rem; }
  /* O selo é decoração e sai antes do que é dado — mesma regra da faixa de arte do deck. */
  .nav-selo { display: none; }
  /* O alvo de toque do link tinha 22px de altura. O padding cresce o alvo e o vão entre
     fileiras encolhe na mesma medida, então quem dá o respiro visual passa a ser o padding do
     próprio link, que é área tocável.
     0,7rem E NÃO 0,35rem desde 2026-08-10: a 0,35 o alvo media 33px, e a diretriz da Apple pede
     44 para controle isolado — abaixo disso o erro de toque sobe, e a barra é o único caminho
     entre páginas no celular. O custo foi MEDIDO e é 15px de cabeçalho (101 → 116 numa tela de
     812, de 12,4% para 14,3% do primeiro rolo). Foi por causa desse custo que o item ficou em
     aberto desde 01/08; com o número na mão, 15px é barato pelo alvo que a plataforma pede. */
  /* `:not(.marca)` porque o wordmark já nasce com 42px de alvo (o emblema o infla), e levar o
     mesmo padding o punha em 53 — 22px de cabeçalho pagos por um alvo que já estava bom. */
  header nav a:not(.marca) { padding: 0.7rem 0; }

  /* Numa página cujo conteúdo É o número, ele saía menor (22px) que o título da página
     (32px). O bloco também era 65% ar: 97px de altura para 34px de conteúdo. */
  .painel div { padding: 1.1rem 1.25rem; }
  .painel strong { font-size: 1.75rem; }

  /* `padding-block` e não só `padding-top`: a regra base promete "mesmo respiro acima e abaixo
     do conteúdo", e no celular só o de cima encolhia — medi 32px em cima contra 48 embaixo. A
     promessa estava escrita e quebrada. */
  main { padding-block: 2rem; }
  .hero { padding: 1rem 0 0.5rem; }
  /* O carrossel é o ÚLTIMO elemento do hero, e o `0.5rem` acima foi dimensionado quando o
     hero terminava numa linha de texto miúdo. Com uma fileira de cartas ali, medi 8px entre
     a base das imagens e "Modern was born…" — contra 56, 96 e 104px nos outros vãos da mesma
     página. 1.5rem + os 0.5rem do hero = 2rem, que é exatamente o respiro de topo do `main`
     no celular: o número não é novo, é o que a página já usa para separar bloco de bloco. */
  .carrossel { margin-bottom: 1.5rem; }
  .brasao { width: 130px; }   /* em tela curta o brasão não pode empurrar o resto para fora */
  /* .deck NÃO leva padding: sobra do design antigo, quando o deck era um card sempre aberto.
     Depois da compressão quem tem padding é o > summary, e o padding aqui empurrava a faixa
     de arte para dentro da moldura (ela precisa encostar) e somava ao do summary. */
  .destaque-deck { padding-left: 1rem; }
  .carrossel img { width: 8rem; margin-right: 1rem; }
  .acoes { gap: 1.25rem; margin: 2rem 0 3rem; }
}

/* ── cabeçalho em duas FILEIRAS, de propósito ────────────────
   Os números, medidos a 375px com as fontes já reduzidas por `46rem`:

     marca 93px + vão 16 + cinco links 292 + padding 40  =  441px para caber numa linha
     só os cinco links + padding                          =  332px

   Entre 332 e 441 a barra quebrava sozinha, e quebrava FEIO: a marca tem `margin-right:auto`,
   então a fileira de cima empurrava Rules/Decks/Metagame para a direita e Validator/Status
   caíam à esquerda embaixo — duas fileiras desalinhadas uma da outra, lidas como defeito. A
   altura ia a 106px, o dobro do cabeçalho de uma linha.

   Aqui a quebra deixa de ser acidente: a marca toma a primeira fileira inteira e os cinco
   links ficam CENTRADOS na segunda, todos com o mesmo peso. Ninguém perde alvo de toque —
   o `padding: 0.35rem 0` de cima continua valendo.

   28rem = 448px, logo acima dos 441 medidos. Abaixo de 20rem (320px, o iPhone SE) nem os
   links sozinhos cabem em 332, então ali o vão e o padding lateral encolhem o suficiente e
   nada mais: 228 de texto + 4 vãos + padding tem de fechar abaixo de 320. */
@media (max-width: 28rem) {
  /* O padding vertical cai de 0.85 para 0.6rem porque quem dá respiro entre as duas fileiras
     agora é o `row-gap` mais o padding tocável do próprio link. Somados, os 0.85 devolviam um
     cabeçalho de 109px numa tela de 812 — 13% do primeiro rolo só para navegar. */
  header nav { justify-content: center; row-gap: 0.35rem; padding-block: 0.6rem; }
  header nav a.marca { flex: 1 0 100%; margin-right: 0; }
}
@media (max-width: 20rem) {
  header nav { padding-inline: 1rem; column-gap: 0.9rem; }
}

/* ── rodapé ─────────────────────────────────────────────── */
/* Mesmo grid do main: o rodapé ocupa exatamente a coluna da página, então acompanha
   sozinho as páginas que usam coluna mais larga (home e decks, via classe no body). */
footer {
  display: grid;
  grid-template-columns: 1fr min(var(--coluna), calc(100% - 3rem)) 1fr;
  max-width: var(--largura);
  margin: 0 auto; padding: 1.5rem 0 3rem;   /* o respiro vem do padding do main, não daqui */
  border-top: 1px solid var(--borda);
  color: var(--texto-2); font-size: var(--t--2); line-height: 1.7;
}
footer > * { grid-column: 2; }

/* ── mesa do organizador ─────────────────────────────────────
   Ferramenta, não texto: campos grandes o bastante para dedo em balcão de loja, e nada
   que exija precisão de mouse. A coluna é a de leitura mesmo assim — a tabela de
   classificação tem sete colunas estreitas e cabe. */
.pagina-torneio .campo { display: block; margin: 2rem 0 0; }
.pagina-torneio .campo span {
  display: block; margin-bottom: 0.4rem;
  font-family: var(--mono); font-size: var(--t--2); color: var(--texto-2);
  text-transform: uppercase; letter-spacing: 0.1em;
}
/* `.form-conta input` entra aqui em vez de ganhar regra própria: caixa de texto do site é
   uma só, e duplicar as declarações é como as duas famílias de botão quase nasceram.

   Os campos do `/admin` entraram na MESMA lista em 2026-08-06, e não por elegância: eles
   tinham nascido sem regra nenhuma e o navegador os desenhava BRANCOS, no meio de um site
   escuro. Não apareceu lendo o CSS — apareceu na captura de tela depois de a grade ficar
   pronta. Escrever um segundo bloco para eles seria a duplicação que este comentário já
   avisava, e a diferença de tamanho dentro da linha da tabela mora numa regra à parte,
   sobrescrevendo só o que muda. */
/* A REGRA DEIXOU DE SER UMA LISTA DE IDs EM 2026-08-10, e a razão está no comentário logo
   acima: ele descreve ESTE MESMO defeito acontecendo antes, e o defeito voltou. `#codigo-evento`,
   o campo de código do /tournament, nasceu fora da lista e o navegador o desenhava BRANCO, com
   texto preto e borda de 2px, no meio de um site escuro — e em 13,3px, abaixo do piso de 16 que
   faz o Safari do iOS dar zoom. Apareceu na captura de tela, como da outra vez; ler o CSS não
   mostra o campo que a lista não menciona.
   Lista de seletores envelhece no primeiro campo novo, e o defeito volta calado. Esta é a mesma
   escolha que a regra de piso de 16px já tinha feito, pela mesma razão, e agora as duas cobrem
   o mesmo conjunto: TODO campo de texto, por tipo.
   `:is()` com os tipos escritos, e não `input` puro: caixa de seleção não é campo de texto, e
   pintá-la de painel com padding de 0,6rem a transformaria num retângulo cinza sem marca. */
input:is([type="text"], [type="email"], [type="date"], [type="number"],
         [type="search"], [type="url"], [type="tel"], [type="password"]),
select, textarea {
  font-family: inherit; font-size: var(--t-0);
  background: var(--painel); color: var(--texto);
  border: 1px solid var(--borda); border-radius: 3px; padding: 0.6rem 0.9rem;
}
/* A LARGURA continua sendo lista, e a divisão é proposital: o que falhava calado era a
   APARÊNCIA (campo branco em site escuro, que só a captura de tela denuncia), e é ela que
   precisa da regra larga. Largura é layout — quando está errada, aparece na hora e no lugar.
   E larga aqui QUEBRARIA: os dois selects do /metagame vivem lado a lado numa fileira, e
   `width: 100%` os empilharia. Campo que deve ocupar a linha inteira pede por isso. */
#nome-torneio, #nomes, #lista, #deck-escolhido,
.form-conta input, .admin-linha input, .admin-linha select, .linha-form input { width: 100%; }
#nomes { font-family: var(--mono); font-size: var(--t--1); line-height: 1.7; resize: vertical; }
#nome-torneio::placeholder, #nomes::placeholder, .form-conta input::placeholder {
  color: var(--texto-2); opacity: 0.8;
}

/* aviso de revanche: o motor nunca trava, mas quando repete confronto tem de dizer */
.aviso-revanche {
  border-left: 3px solid var(--erro); background: var(--painel);
  padding: 0.75rem 1rem; margin: 1.5rem 0; font-size: var(--t--1);
}

/* uma coluna só: cada inscrito abre uma decklist inteira, e coluna estreita não comporta */
.inscritos { list-style: none; padding: 0; margin: 1.25rem 0 0; }
.inscritos li {
  display: flex; align-items: start; gap: 0.5rem;
  padding: 0.15rem 0; border-bottom: 1px solid var(--filete); font-size: var(--t--1);
}
.inscritos .inscrito { flex: 1; min-width: 0; }
.inscritos summary {
  display: flex; align-items: baseline; gap: 0.6rem;
  padding: 0.35rem 0; color: var(--texto);
}
.inscritos summary:hover .quem-nome { color: var(--titulo); }
.quem-nome { flex: 1; min-width: 0; overflow-wrap: anywhere; }
/* o estado da lista é a informação que o organizador varre a mesa procurando */
.inscritos summary em {
  font-family: var(--mono); font-size: var(--t--2); font-style: normal; white-space: nowrap;
}
.sem-lista { color: var(--texto-2); }
.lista-ok { color: var(--ok); }
.lista-erro { color: var(--erro); }
.lista-deck {
  width: 100%; margin: 0.3rem 0 0.6rem; resize: vertical;
  font-family: var(--mono); font-size: var(--t--2); line-height: 1.7;
  background: var(--fundo); color: var(--texto);
  border: 1px solid var(--borda); border-radius: 3px; padding: 0.6rem 0.8rem;
}
.inscritos .problemas { margin: 0 0 0.7rem; font-size: var(--t--2); }
.tirar {
  background: none; border: none; color: var(--texto-2); cursor: pointer;
  font-size: var(--t-0); line-height: 1; padding: 0 0.2rem; margin: 0;
}
.tirar:hover { color: var(--erro); }

/* parágrafo de estado vazio não pode ocupar espaço: o resumo e o "faltando" só existem
   depois que há jogador ou rodada */
#resumo:empty, #faltando:empty { display: none; }

.acoes-torneio { display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-top: 1.5rem; }
/* …MENOS quando a fileira tem um campo com rótulo: `.campo` é o `<span>` do rótulo MAIS o
   input, e mede ~70px contra os 50 do botão. Centrado, o botão ficava na altura do rótulo e
   cruzando o topo do campo — 30px acima da base dele, medidos. Alinhado pela BASE, botão e
   campo terminam na mesma linha, que é onde o olho espera.
   O `center` continua valendo nas outras duas fileiras, que são botões mais um `<span class=
   "meta">`: ali é texto ao lado de botão, e alinhar pela base o jogaria para o rodapé do botão.
   Descoberto quando `#codigo-evento` ganhou estilo: sem estilo ele tinha 21px de altura, o
   conjunto ficava MENOR que o botão e o desalinho não aparecia. Consertar um defeito revelou o
   outro que ele escondia. */
.acoes-torneio:has(.campo) { align-items: flex-end; }
.acoes-torneio button { margin-top: 0; }
/* `border-color` e não `outline-color` desde 2026-08-10: quando o `button` virou moldura, o
   anel deixou de ser `outline` e passou a ser `border`. Estas quatro regras continuavam
   pintando um `outline` que não existe mais — não quebravam nada visível, e é justamente por
   isso que precisavam ser trocadas: uma regra que não faz nada some do radar e volta a ser
   copiada. O primário tem superfície de painel; o secundário é o mesmo desenho SEM superfície,
   com a borda em `--borda` em vez de âmbar. */
button.secundario {
  background: none; color: var(--acento);
  border-color: var(--borda); font-weight: 500;
}
button.secundario:hover { background: none; color: var(--titulo); border-color: var(--acento); }
button:disabled { opacity: 0.4; cursor: not-allowed; }
button:disabled:hover { color: var(--acento); border-color: var(--acento); }
/* A regra acima cancela o hover DEVOLVENDO a cor do botão primário, e por isso ela também
   tinha de ser desfeita no secundário — as duas têm a mesma especificidade e ela vem depois.
   No desenho antigo o sintoma era pior (ela repintava o FUNDO sólido, e o botão desabilitado
   da paginação ficava preenchido enquanto o mouse estivesse em cima); agora seria só a borda
   virando âmbar num botão que deve ter borda cinza. Menor, e igualmente errado. */
button.secundario:disabled:hover { background: none; color: var(--acento); border-color: var(--borda); }

/* Um par por linha, nome à esquerda e à direita, placar no meio. Vencedor em ouro: numa
   mesa com dezesseis pares, ler a linha inteira para saber quem ganhou é lento. */
.pares { list-style: none; padding: 0; margin: 1rem 0 0; }
.par {
  display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 1rem;
  padding: 0.6rem 1rem; margin-bottom: 0.4rem;
  background: var(--painel); border: 1px solid var(--filete); border-radius: 2px;
}
.par.feito { border-color: var(--borda); }
.par .quem { font-size: var(--t--1); overflow-wrap: anywhere; }
.par .quem:last-child { text-align: right; }
.par .quem.venceu { color: var(--titulo); font-weight: 600; }
.par.bye em { font-family: var(--mono); font-size: var(--t--2); color: var(--texto-2); font-style: normal; }
.par.bye { grid-template-columns: 1fr auto; }
.placar { display: flex; gap: 0.35rem; }
.placar input {
  width: 2.6rem; text-align: center;
  font-family: var(--mono); font-size: var(--t--1);
  background: var(--fundo); color: var(--texto);
  border: 1px solid var(--borda); border-radius: 2px; padding: 0.3rem 0;
}
/* a terceira caixa é de empates e quase sempre fica em zero — recua para não competir */
.placar input:last-child { color: var(--texto-2); }

/* A margem era só EM CIMA, e em /rules isso se via: a tabela de estrelas tinha 16px de folga
   acima e ZERO abaixo, com o parágrafo seguinte encostando na última linha — medido em
   2026-08-10. Passou a ser simétrica. Nas outras páginas onde ela aparece (/event, /organizer,
   a mesa do torneio) a tabela é o último elemento do bloco, então os 16px de baixo não movem
   nada; o defeito só aparecia onde há texto DEPOIS dela, que é aqui. */
.classificacao { width: 100%; border-collapse: collapse; margin: 1rem 0; font-size: var(--t--1); }
.classificacao th, .classificacao td { padding: 0.35rem 0.5rem; border-bottom: 1px solid var(--filete); }
.classificacao thead th {
  font-family: var(--mono); font-size: var(--t--2); font-weight: 500; color: var(--texto-2);
  text-transform: uppercase; letter-spacing: 0.08em; text-align: left;
}
.classificacao .num { text-align: right; font-family: var(--mono); font-variant-numeric: tabular-nums; }
.classificacao .pos { color: var(--texto-2); font-family: var(--mono); width: 2rem; }
.classificacao tbody tr:first-child td { color: var(--titulo); }

@media (max-width: 40rem) {
  .par { grid-template-columns: 1fr; gap: 0.4rem; text-align: left; }
  .par .quem:last-child { text-align: left; }
  .inscritos { columns: 2 8rem; }
  /* A tabela transbordava a coluna: precisava de 360px numa caixa de 332, e encostava na
     borda direita da tela com 24px de margem só do lado esquerdo — parecia cortada.
     Medido: das 360px, 112 eram padding de célula (16px × 7 colunas) contra 248 de
     conteúdo. Apertar o padding devolve 56px e fecha em 304, sem tirar coluna nenhuma —
     e nenhuma pode sair: OMW%, GW% e OGW% são a ordem de desempate do MTR, que é o motivo
     de a tabela existir. */
  .classificacao th, .classificacao td { padding: 0.35rem 0.25rem; }
}

/* ── movimento ───────────────────────────────────────────────
   Regra desta folha: animação explica o que mudou de lugar; não enfeita. Duas coisas
   mudam de lugar neste site — o corpo do deck, que abre, e a página, que troca. Estado
   (hover, foco) continua instantâneo, porque não há percurso a mostrar.
   Nada aqui usa JavaScript, e tudo aqui é desligado em prefers-reduced-motion. */

/* `height: auto` não interpola por padrão — é o que sempre obrigou a medir a altura em JS.
   `interpolate-size` libera a interpolação para palavra-chave e resolve isso em CSS puro. */
:root { interpolate-size: allow-keywords; }

/* ::details-content é a caixa que o <details> revela; animar o <details> inteiro levaria o
   resumo junto. O `overflow: hidden` do .deck é que recorta o corpo enquanto ele cresce. */
.deck::details-content {
  block-size: 0;
  overflow: hidden;
  /* content-visibility é discreta: sem allow-discrete ela salta para `visible` só no fim,
     e a abertura inteira acontece com o conteúdo invisível */
  transition: block-size 260ms cubic-bezier(0.25, 0.6, 0.3, 1),
              content-visibility 260ms allow-discrete;
}
.deck[open]::details-content { block-size: auto; }

/* o histórico de revisões abre dentro do card já aberto — mais curto, porque é um trecho */
.historico::details-content {
  block-size: 0; overflow: hidden;
  transition: block-size 180ms ease, content-visibility 180ms allow-discrete;
}
.historico[open]::details-content { block-size: auto; }

/* O EIXO — o cartão que contém os cartões. Mesma técnica, e a duração sai da mesma regra que
   deu 300ms à seção de regras: o acordeão é EXCLUSIVO, então dois movimentos acontecem ao
   mesmo tempo, um fechando e outro abrindo, e no tempo curto do deck (260ms) a página dá um
   solavanco enquanto a de baixo sobe.

   Aqui o percurso é ainda maior — o eixo Aggro abre 12 cartões de deck, algo como 1.100px
   contra os ~400px de um corpo de deck —, e é por isso que ele fica no teto da folha em vez
   de acompanhar o deck. A CURVA é a mesma dos outros três, que é o que mantém o sotaque:
   trocar a curva faria a página ter dois jeitos de abrir. */
.eixo::details-content {
  block-size: 0;
  overflow: hidden;
  transition: block-size 320ms cubic-bezier(0.25, 0.6, 0.3, 1),
              content-visibility 320ms allow-discrete;
}
.eixo[open]::details-content { block-size: auto; }

/* O cardápio de sideboard é um TRECHO dentro de um cartão já aberto, exatamente como o
   histórico de revisões — mesma duração, e de propósito: as duas coisas são a mesma coisa
   para quem lê, e dar tempos diferentes a elas inventaria uma distinção que não existe. */
.cardapio::details-content {
  block-size: 0; overflow: hidden;
  transition: block-size 180ms ease, content-visibility 180ms allow-discrete;
}
.cardapio[open]::details-content { block-size: auto; }

/* O triângulo acompanha o corpo em vez de chegar antes — a lição de `.secao > summary::after`,
   que girava em 120ms sobre uma abertura de 300 e terminava com a seção no meio do caminho.
   Estava em 150ms sobre 180; agora são os mesmos 180ms. */
.cardapio > summary .side-titulo::before { transition: transform 180ms ease; }

/* As seções da página de regras usam a MESMA técnica, e não uma segunda: elas nasceram sem
   transição nenhuma e abriam com um salto. Reusar aqui é o que impede duas gramáticas de
   abertura no mesmo site — o card de deck e a seção de regra fazem a mesma coisa e agora se
   movem igual.

   300ms e não os 260 do deck: com o acordeão EXCLUSIVO, dois movimentos acontecem ao mesmo
   tempo — uma seção fecha enquanto a outra abre —, e no tempo mais curto a página dá um
   solavanco enquanto a de baixo sobe. A curva é a mesma, que é o que mantém o "sotaque". */
.secao::details-content {
  block-size: 0;
  overflow: hidden;
  transition: block-size 300ms cubic-bezier(0.25, 0.6, 0.3, 1),
              content-visibility 300ms allow-discrete;
}
.secao[open]::details-content { block-size: auto; }

/* O chevron acompanha o corpo em vez de chegar antes: eram 120ms contra 300, e o sinal
   terminava de girar com a seção ainda no meio do caminho. Mesma curva, mesma duração. */
.secao > summary::after { transition: transform 300ms cubic-bezier(0.25, 0.6, 0.3, 1); }

/* a cor do resumo acompanha a abertura em vez de piscar */
summary, .deck > summary .deck-nome { transition: color 0.15s; }

/* Transição entre páginas. `navigation: auto` só vale para navegação no mesmo site, e
   quem não suporta simplesmente troca de página como antes — não há fallback a escrever. */
@view-transition { navigation: auto; }

/* Cabeçalho e rodapé são idênticos em todas as páginas: nomeados, o navegador os trata
   como o MESMO elemento e eles ficam parados enquanto o miolo troca. Sem isso a página
   inteira faz crossfade e a navegação pisca junto, que é o efeito de template. */
header { view-transition-name: cabecalho; }
footer { view-transition-name: rodape; }

/* A saída é mais rápida que a entrada: o conteúdo velho sai da frente e o novo se
   apresenta. Tempos iguais dão o borrão de duas páginas sobrepostas. */
::view-transition-old(root) { animation: 90ms ease-out both sumir; }
::view-transition-new(root) { animation: 220ms cubic-bezier(0.25, 0.6, 0.3, 1) both surgir; }
@keyframes sumir  { to   { opacity: 0; } }
@keyframes surgir { from { opacity: 0; transform: translateY(8px); } }

@media (prefers-reduced-motion: reduce) {
  .deck::details-content, .historico::details-content,
  .secao::details-content, .secao > summary::after,
  .eixo::details-content, .cardapio::details-content,
  .cardapio > summary .side-titulo::before { transition: none; }
  /* a troca de página continua acontecendo, só que sem percurso */
  ::view-transition-group(*), ::view-transition-old(*), ::view-transition-new(*) {
    animation: none !important;
  }
}


/* ── conta ────────────────────────────────────────────────────────────────── */

/* O link de conta é o único da barra que fica na ponta direita: ele não é navegação de
   conteúdo, é estado. `margin-left: auto` não serve — a marca já usa esse truque e teria
   dois elementos disputando a sobra. */
.nav-conta { order: 1; }

/* Coluna estreita de propósito: campo de e-mail largo demais sugere que cabe mais coisa
   dentro. 22rem comporta o endereço mais longo que aparece na prática. */
.form-conta { max-width: 22rem; margin-top: 1.5rem; }
.form-conta label {
  display: block; margin-bottom: 0.4rem;
  font-family: var(--mono); font-size: var(--t--2); letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--texto-2);
}

/* Rótulo e valor lado a lado, com o rótulo em mono para não competir com o dado.
   `align-items: baseline` e não `center`: rótulo e valor estão em fontes e tamanhos
   diferentes, então centrar as caixas deixa os dois textos em alturas diferentes. Baseline
   é o que o olho usa para dizer que duas palavras estão na mesma linha. */
.dados-conta {
  display: grid; grid-template-columns: auto 1fr; gap: 0.6rem 1.25rem;
  align-items: baseline;
  margin: 1.5rem 0 0; max-width: 30rem;
}
/* o `dt` global leva margin-top de 1,25rem, para listas de definição em prosa. Aqui a
   grade é que dá o espaçamento, e a margem herdada empurrava só o rótulo para baixo. */
.dados-conta dt {
  font-family: var(--mono); font-size: var(--t--2); letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--texto-2); margin-top: 0; font-weight: 400;
}
.dados-conta dd { margin: 0; overflow-wrap: anywhere; }

.recado-conta {
  margin-top: 1.5rem; padding: 0.75rem 1rem;
  border-left: 3px solid var(--acento); background: var(--painel);
  font-size: var(--t--1);
}
.recado-conta.erro { border-left-color: var(--erro); font-weight: 400; }

/* ── metagame ─────────────────────────────────────────────────────────────── */

/* Os dois selects são a MESMA pergunta — sobre o que estes números falam —, então vivem numa
   fileira só. Soltos, cada um herdava a coluna inteira do grid do `main` e ocupava uma linha
   de 832px para um controle de 200. */
/* O `row-gap` é 1.1rem e não 0.5 porque a NOTA cai nessa fileira de baixo, e 0.5rem dava 8px
   entre o select e ela — contra 9px de folga óptica ENTRE AS LINHAS da própria nota (15px de
   corpo, entrelinha 24). Ela ficava mais perto do controle do que de si mesma, que é o mesmo
   defeito das listas de prosa, reintroduzido aqui por mim. 17,6px contra 9 é quase o dobro,
   que é onde o agrupamento passa a ser imediato.
   O `column-gap` continua 2rem: ele separa os dois selects, e ali não há prosa envolvida. */
/* A saída do metagame vazio. Corpo normal e não `.meta`: essa classe é mono, miúda e apagada,
   certa para nota de rodapé e errada para a única ação da página — só a troca já levou os
   links de 12px mono para 17px de corpo.
   E PAROU AÍ. Tentei dar alvo de toque de 44px a eles (`inline-block` com padding e entrelinha
   de 2.6) e DESFIZ olhando a tela: a frase quebra em duas linhas a 375px, e com a entrelinha
   necessária para o padding caber as duas partes ficavam distantes uma da outra, parecendo dois
   parágrafos soltos. Pior que o problema. A diretriz dos 44px é para CONTROLE ISOLADO; aqui são
   links inline dentro de uma frase, iguais aos de /rules e da home, e abrir exceção para um só
   deixa a página inteira inconsistente para consertar um caso que a regra não cobre. */
.sem-nada { margin: 1.5rem 0; }

.filtros {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: 1.1rem 2rem; margin: 1.5rem 0;
}
/* OBRIGATÓRIO, e é a lição mais cara desta base: `display: flex` é regra de AUTOR e vence o
   `[hidden]` do navegador, que é regra de user-agent. Sem esta linha, `filtros.hidden = true`
   deixa a flag certa no DOM e os selects na tela — exatamente como o popup de carta "fechava"
   e continuava aparecendo. Mesma guarda que `#carta-popup[hidden]` já tem. */
.filtros[hidden] { display: none; }
.campo-periodo {
  display: inline-flex; align-items: center; gap: 0.75rem;
  font-family: var(--mono); font-size: var(--t--2); letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--texto-2);
}
/* Nota de um controle: mora colada nele, e não quatro parágrafos abaixo explicando um select
   que o leitor já passou.

   `flex-basis: 100%` para quebrar a fileira e ficar embaixo dos dois — e agora ele FUNCIONA:
   escrevi um antes, quando o pai ainda era o grid do `main`, e a declaração não fazia nada.
   Com o `.filtros` ela passou a ser a que decide.

   E SEM `max-width`: eu tinha posto `var(--medida)` aqui, e a nota saía com 510px no meio de
   uma página cujo texto todo tem 832 — a única coisa fora do prumo na tela. Medido. */
.campo-nota { flex-basis: 100%; margin: 0; }

.campo-periodo select {
  font-family: inherit; font-size: var(--t--1); letter-spacing: 0; text-transform: none;
  background: var(--painel); color: var(--texto);
  border: 1px solid var(--borda); border-radius: 3px; padding: 0.4rem 0.6rem;
}

/* Eventos: estrela primeiro, porque é ela que diz quanto a linha vale. Nome no meio com a
   sobra, loja e data alinhadas à direita em mono para virarem coluna sem tabela. */
.eventos { list-style: none; padding: 0; margin: 1rem 0 0; }
.evento {
  display: grid; grid-template-columns: auto 1fr auto auto;
  align-items: baseline; gap: 0 1rem;
  padding: 0.6rem 0; border-bottom: 1px solid var(--filete);
}
.evento-estrelas { color: var(--acento); letter-spacing: 0.05em; }
.evento-nome { overflow-wrap: anywhere; }
.evento-onde, .evento-data { font-family: var(--mono); font-size: var(--t--2); color: var(--texto-2); }
.vazio { color: var(--texto-2); font-style: italic; }

/* A linha do metagame reusa a gramática do card de deck em vez de virar tabela: mesma
   serifa no nome, mesmos símbolos de mana, mesmo filete. A referência que originou esta
   página é uma planilha; aqui a linha é a carta. */
/* A linha LEVA à página do arquétipo; ela não abre no lugar. A GRADE mora no `<a>` de
   dentro, não na linha: a arte é filha da grade e precisa de uma faixa própria.
   `color: inherit` e `text-decoration: none` não são enfeite — sem eles o nome em serifa
   herda o acento e o sublinhado de link, e a linha deixa de parecer a linha do card de deck,
   que é a gramática que esta página reusa de propósito. */
.meta-linha { margin-bottom: 0.35rem; }
.meta-linha > a {
  display: grid; grid-template-columns: 1fr auto 2.5rem 8rem;
  align-items: center; gap: 0 1rem;
  padding: 0.7rem 1rem;
  background: var(--painel); border: 1px solid var(--filete); border-radius: 2px;
  color: inherit; text-decoration: none;
}
.meta-linha > a:hover { background: var(--fundo); }
.meta-linha > a:hover .meta-nome { color: var(--titulo); }

/* Uma lista registrada por linha. Mono nas colunas de dado para virarem coluna sem tabela.
   A GRADE mora no `<a>` de dentro (mais abaixo), não aqui: a linha inteira é link. */
.listas { list-style: none; padding: 0; margin: 0.5rem 0 0; }
.lista-linha {
  border-bottom: 1px solid var(--filete);
  font-size: var(--t--1);
}
.lista-linha:last-child { border-bottom: none; }
.lista-recorde { font-family: var(--mono); color: var(--titulo); }
.lista-quem { overflow-wrap: anywhere; }
.lista-evento, .lista-data { font-family: var(--mono); font-size: var(--t--2); color: var(--texto-2); }
.lista-estrelas { color: var(--acento); font-size: var(--t--2); }

/* O medidor sobe com a DIFERENÇA. A barra usa escala 3x — 33% de divergência já a enche —
   porque a faixa real vive entre 0 e 25%: em escala 1:1 toda lista ficaria colada no zero e
   o medidor não distinguiria nada, que é o mesmo que não existir. */
.lista-div { display: flex; justify-content: flex-end; }
.divergencia { display: inline-flex; align-items: center; gap: 0.5rem; }
.div-barra {
  width: 3rem; height: 5px; flex: none;
  background: var(--filete); border-radius: 3px; overflow: hidden;
}
.div-barra i { display: block; height: 100%; background: var(--acento); }
.divergencia small { font-family: var(--mono); font-size: var(--t--2); color: var(--texto-2); }
.div-vazio { color: var(--texto-2); }
.meta-nome { font-family: var(--serif); font-size: var(--t-1); color: var(--titulo); }
.meta-nome em { color: var(--texto-2); font-size: var(--t-0); }
.meta-cores { display: inline-flex; align-items: center; gap: 3px; }
.meta-cores .simbolo { width: 15px; height: 15px; display: block; }
.meta-share { text-align: right; font-family: var(--mono); font-size: var(--t--1); }
.meta-share small { color: var(--texto-2); }
.meta-tier { text-align: center; }

/* Selo de tier: quadrado, mono, sem cor por faixa. Cor por tier viraria semáforo — "A é
   bom, C é ruim" — e tier aqui é participação, não qualidade. O que separa as faixas é o
   peso do traço, não o matiz. */
.tier {
  display: inline-block; width: 1.6rem; line-height: 1.6rem;
  font-family: var(--mono); font-size: var(--t--2); font-weight: 600;
  border: 1px solid currentColor; border-radius: 2px;
  color: var(--texto-2);
}

/* A vermelho, E verde, e a rampa entre os dois.
   A leitura é de AMEAÇA, não de qualidade: tier A é o deck que você provavelmente vai
   enfrentar e para o qual o sideboard tem de responder; tier E é o que praticamente não
   aparece. Vermelho no topo é coerente com isso — não é "A é ruim".

   As cinco cores têm o MESMO contraste contra o painel: 6,2:1 no escuro, 5,6:1 no claro,
   resolvido variando a luminosidade de cada matiz até bater no alvo. Igualar importa porque
   diferença de brilho vira hierarquia falsa — foi o que aconteceu com os pips WUBRG desta
   base, em que pips idênticos liam como tamanhos diferentes. Aqui o que distingue é o matiz,
   e só ele. A borda usa `currentColor`, então acompanha sem uma segunda calibração. */
.tier-A { color: var(--tier-a); }
.tier-B { color: var(--tier-b); }
.tier-C { color: var(--tier-c); }
.tier-D { color: var(--tier-d); }
.tier-E { color: var(--tier-e); }

/* Paginação da página de arquétipo. Os botões reusam `button.secundario`, que já existe —
   não há estilo novo aqui, só o arranjo da faixa.

   Ela é um <nav>, e por isso caiu na regra `nav {}` que era global e servia ao cabeçalho:
   herdava `max-width`, `padding` e um `flex-wrap` que eu não tinha escrito. A regra do
   cabeçalho passou a ser `header nav` — todos os outros <nav> do site estão dentro do
   <header>, então escopá-la não mexeu em nada e fechou a armadilha para o próximo. */
.paginacao {
  display: flex; align-items: center; justify-content: center; gap: 1rem;
  margin-top: 1.5rem;
}
.paginacao button { margin-top: 0; }
.paginacao-onde { font-family: var(--mono); font-size: var(--t--2); color: var(--texto-2); }

@media (max-width: 40rem) {
  /* Em 380px os três somam 357px numa faixa de 332 e o "Older" caía sozinho numa segunda
     linha, desalinhado do irmão. Medido, não estimado. A contagem sobe para a própria linha
     e os dois botões dividem a de baixo em partes iguais. */
  .paginacao { flex-wrap: wrap; }
  .paginacao-onde { order: -1; width: 100%; text-align: center; }
  .paginacao button { flex: 1; padding-left: 0.5rem; padding-right: 0.5rem; }
}

/* ── /me: um deck salvo por linha ─────────────────────────
   Reusa `.listas` e `.lista-linha` da página de arquétipo: é a mesma coisa — uma lista
   registrada —, e uma segunda aparência para o mesmo conceito seria duas gramáticas.
   A diferença é que aqui a linha não é link (ainda não há para onde levar), então a grade
   mora nela e não num `<a>` de dentro.

   O SELETOR É DE DUAS CLASSES, e isso foi conserto de bug em 2026-08-06. Ele era `.meu-deck`
   sozinho, apostando na ORDEM para vencer o `display: block` de `.lista-linha` — e perdeu: há
   uma SEGUNDA declaração de `.lista-linha` bem mais abaixo neste arquivo, junto do arranjo da
   página de arquétipo, e ela redeclara `display: block`. Medido no navegador, `/me` computava
   `display: block` com `grid-template-columns` definido e inerte: a grade nunca valeu, e a
   linha inteira vinha como texto corrido. Aposta em ordem de arquivo quebra na primeira
   declaração nova; `.lista-linha.meu-deck` tem especificidade maior e a ordem deixa de
   importar. É o mesmo erro do `[hidden]` contra `display:flex` de autor, de novo. */
.lista-linha.meu-deck {
  display: grid; grid-template-columns: 1fr auto 6rem auto;
  align-items: center; gap: 0 1rem; padding: 0.6rem 0.25rem;
}
.meu-nome { font-family: var(--serif); font-size: var(--t-0); color: var(--titulo); overflow-wrap: anywhere; }
/* Os DOIS nomes da mesma lista: o que a pessoa deu (em cima) e o balde do formato (embaixo).
   Empilhados e não lado a lado porque o primeiro é livre e pode ser longo — em linha, um nome
   comprido empurrava o arquétipo para fora da coluna de 1fr. */
.meu-nome .meta { display: block; font-family: var(--mono); font-size: var(--t--2); }
.meu-conta, .meu-data { font-family: var(--mono); font-size: var(--t--2); color: var(--texto-2); }
.meu-acao { justify-self: end; }
.meu-acao button { margin-top: 0; padding: 0.35rem 0.9rem; font-size: var(--t--2); }

/* ── linhas do /admin ────────────────────────────────────────
   Mesma gramática de `.meu-deck`, e o mesmo seletor de duas classes pela mesma razão medida.
   Sem isto as linhas do painel eram spans inline dentro de um `li` block: 426px de conteúdo
   espalhados em 832px de linha, nada alinhado entre uma linha e a seguinte, e 65px de altura
   por causa da margem de topo do botão. Medido antes de mexer, como manda a casa.

   Duas grades porque são duas perguntas diferentes: a de Others termina num controle largo
   (escolher arquétipo), a de Archetypes tem dois campos editáveis de larguras fixas. Uma
   grade só faria uma das duas parecer certa. */
.lista-linha.admin-linha {
  display: grid; align-items: center; gap: 0 1rem; padding: 0.5rem 0.25rem;
}
/* Abrir período é o único formulário do painel. Em linha porque são três controles curtos e
   uma quebra entre eles faria parecer três decisões separadas, quando é uma só. */
.linha-form {
  display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: center; margin-top: 0.75rem;
}
.linha-form input { width: auto; flex: 1 1 12rem; font-size: var(--t--1); padding: 0.4rem 0.7rem; }
.linha-form button { margin-top: 0; }

.lista-linha.admin-fila     { grid-template-columns: 1fr auto auto; }
.lista-linha.admin-others   { grid-template-columns: 1fr 8rem auto; }
.lista-linha.admin-arquetipo { grid-template-columns: 9rem 1fr 6rem auto; }
.admin-linha button { margin-top: 0; padding: 0.35rem 0.9rem; font-size: var(--t--2); }
/* Só o que MUDA em relação à caixa de texto do site: dentro de uma linha de tabela ela é
   menor e mais rasa. Cor, borda e fundo vêm de lá, e é por isso que só há três declarações
   aqui em vez de sete repetidas. */
.admin-linha select, .admin-linha input { font-size: var(--t--2); padding: 0.3rem 0.5rem; }
.admin-linha .admin-acao { justify-self: end; display: flex; gap: 0.5rem; align-items: center; }
.admin-slug { font-family: var(--mono); font-size: var(--t--2); color: var(--texto-2); }

@media (max-width: 46rem) {
  /* Quatro colunas em tela estreita espremem os campos até virarem caixas de três letras. O
     rótulo sobe e os controles ficam embaixo, mesma solução de `.meu-deck`. */
  .lista-linha.admin-fila,
  .lista-linha.admin-others,
  .lista-linha.admin-arquetipo { grid-template-columns: 1fr auto; row-gap: 0.5rem; }
  .admin-linha .admin-largo { grid-column: 1 / -1; }
}

@media (max-width: 40rem) {
  /* Quatro colunas em 332px espremem o nome do deck a duas palavras. Nome em cima, os três
     dados embaixo — mesma solução da linha do metagame. */
  .lista-linha.meu-deck { grid-template-columns: auto auto 1fr; row-gap: 0.35rem; }
  .meu-nome { grid-column: 1 / -1; }
}

@media (max-width: 40rem) {
  /* Em tela estreita a linha vira duas: nome e cores em cima, tier e share embaixo. Quatro
     colunas em 375px espremem a porcentagem contra a borda.
     A `grid-template-columns` desta linha mora no bloco de 40rem lá embaixo, junto com o
     resto do arranjo estreito — declarar nos dois lugares foi o que deixou o `row-gap` sem
     efeito, porque o outro vinha depois e reescrevia a grade inteira. */
  .meta-linha > a { row-gap: 0.4rem; }
  .meta-tier, .meta-share { grid-row: 2; }
  .meta-tier { text-align: left; }
  .evento { grid-template-columns: auto 1fr; }
  .evento-onde, .evento-data { grid-column: 2; }
}

@media (max-width: 52rem) {
  /* Evento e data saem antes das outras: quem, recorde e medidor são o que se compara.
     A grade estreita é declarada junto do `<a>`, mais abaixo — aqui só o que some. */
  .lista-evento, .lista-data { display: none; }
}

/* ── tela do evento ───────────────────────────────────────────────────────── */

.volta { font-family: var(--mono); font-size: var(--t--2); margin-bottom: 1.5rem; }

/* A linha do evento virou link. A grade sai do <li> e vai para o <a>, senão o link vira uma
   caixa dentro da grade e as colunas colapsam para dentro dele. */
.evento { display: block; padding: 0; border-bottom: 1px solid var(--filete); }
.evento > a {
  display: grid; grid-template-columns: auto 1fr auto auto;
  align-items: baseline; gap: 0 1rem;
  padding: 0.6rem 0.5rem; margin: 0 -0.5rem;
  color: inherit; text-decoration: none; border-radius: 2px;
}
.evento > a:hover { background: var(--painel); }
.evento > a:hover .evento-nome { color: var(--titulo); }

/* Duas colunas: classificação fixa à esquerda, lista no centro. A da esquerda tem largura
   fixa porque ela é índice — se ela respirasse com o conteúdo, trocar de deck moveria a
   coluna inteira e o item em que se acabou de clicar sairia de baixo do cursor. */
.evento-grade { display: grid; grid-template-columns: 24rem 1fr; gap: 0 2.5rem; align-items: start; }
.evento-lado h2:first-child, .evento-lista h2 { margin-top: 0; }

.postos { list-style: none; padding: 0; margin: 0.5rem 0 0; counter-reset: none; }
.posto button {
  display: grid; grid-template-columns: 1.75rem 1fr auto;
  align-items: baseline; gap: 0 0.6rem;
  width: 100%; text-align: left;
  background: none; border: none; outline: none;
  padding: 0.4rem 0.5rem; margin: 0;
  border-radius: 2px; cursor: pointer;
  font-family: inherit; font-size: var(--t--1); font-weight: 400; color: var(--texto);
  transition: background-color 0.12s;
}
.posto button:hover { background: var(--painel); }
.posto button:focus-visible { outline: 2px solid var(--acento); outline-offset: -2px; }
.posto.aberto button { background: var(--painel); box-shadow: inset 3px 0 0 var(--acento); }
/* Posição EXPLÍCITA nas quatro. Só o arquétipo tinha posição declarada, e o recorte
   automático então empurrava o recorde para uma terceira linha, na primeira coluna, longe do
   nome a que ele pertence. Numa grade de duas linhas com um item que salta de coluna, deixar
   o resto no automático é entregar a decisão ao algoritmo de preenchimento. */
.posto-n   { grid-column: 1; grid-row: 1 / 3; font-family: var(--mono); font-size: var(--t--2); color: var(--texto-2); }
.posto-quem { grid-column: 2; grid-row: 1; overflow-wrap: anywhere; }
.posto-rec { grid-column: 3; grid-row: 1; font-family: var(--mono); font-size: var(--t--2); color: var(--titulo); }
.posto-arq {
  grid-column: 2 / -1; grid-row: 2;
  font-family: var(--mono); font-size: var(--t--2); color: var(--texto-2);
}

@media (max-width: 60rem) {
  /* Empilha: a classificação vira a lista de cima e a decklist vem abaixo dela. Duas colunas
     em 700px deixariam a decklist com 20rem, e lista de deck em 20rem quebra nome de carta. */
  .evento-grade { grid-template-columns: 1fr; gap: 2rem; }
}

/* A linha da lista virou link. Como no evento, a grade sai do <li> e vai para o <a>: link
   dentro da grade viraria uma caixa só e as colunas colapsariam dentro dele. */
.lista-linha { display: block; padding: 0; }

/* As duas colunas do meio eram `1fr 1fr`, e isso é o que abria o vão da queixa: medido em
   2026-08-06 numa linha de 1360px, a coluna do JOGADOR recebia 480px para 68px de conteúdo —
   412px de vazio entre o nome e o evento — e a do evento, 480 para 180. `1fr` reparte a sobra
   igualmente, e a sobra era quase toda a linha.

   Agora quem estica é só o EVENTO, que é o texto que de fato cresce ("Canonic #5 — Corner
   Store" já mede 180px). O jogador vira `auto` com piso de 6rem: acompanha o nome mais longo
   em vez de receber um quinhão fixo do vazio. Larguras naturais medidas: recorde 35, jogador
   68, evento 180, estrelas 20, data 72. */
.lista-linha > a {
  display: grid;
  grid-template-columns: 3rem minmax(6rem, auto) minmax(11rem, 1fr) 3.5rem 6rem 7rem;
  align-items: center; gap: 0 0.9rem;
  padding: 0.45rem 0.5rem; margin: 0 -0.5rem;
  color: inherit; text-decoration: none; border-radius: 2px;
}

/* E o TETO, que é a outra metade: mesmo com as colunas certas, a lista herda a largura do
   `.largo` (84rem) e a linha sai com 1360px para ~575 de conteúdo. 52rem é a MEDIDA do texto
   da própria página, então a tabela passa a alinhar com os parágrafos acima em vez de flutuar
   mais larga que eles. Não encolhe conteúdo: sobra folga para o nome de evento crescer.

   `margin-inline: auto` NÃO é enfeite, e faltou na primeira tentativa: o título e a prosa
   desta página já vêm centrados dentro do bloco largo, então limitar a largura sem centrar
   deixava a lista encostada na esquerda enquanto o título ficava no meio — medido em 1600px,
   título em 377–1209 e lista em 121–953. Largura menor sem centro é desalinhamento, não
   contenção. */
#listas { max-width: 52rem; margin-inline: auto; }
.lista-linha > a:hover { background: var(--fundo); }
.lista-linha > a:hover .lista-quem { color: var(--titulo); }

@media (max-width: 52rem) {
  .lista-linha > a { grid-template-columns: 3rem 1fr 3.5rem 7rem; }
}

/* "Rest of the field" é aba, não seção: o summary imita o h2 ao lado dele — mesma serifa,
   mesmo tamanho, mesmo filete curto embaixo — para a coluna ter uma hierarquia só. */
/* Atravessa as duas colunas da grade. Não é barra lateral: é rodapé da tela. */
.resto-campo { grid-column: 1 / -1; margin-top: 3rem; }

/* Quantas colunas couberem a 18rem cada. 20rem parecia melhor e media pior: a 700px de
   viewport sobravam 12px e o bloco caía para UMA coluna. `auto-fill` e não `auto-fit`: com poucos nomes,
   `auto-fit` colapsaria as faixas vazias e esticaria dois nomes por toda a largura. */
.postos-largo {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
  gap: 0 1.5rem;
}
/* Bloco, não flex. Com `display: flex` e `flex-wrap: nowrap`, o `::after` do filete pedia
   `flex-basis: 100%` e espremia o título — "Rest of the field" quebrava em duas linhas. Em
   fluxo normal a seta é inline, o texto flui, e o filete cai embaixo como bloco. */
.resto-campo > summary {
  font-family: var(--serif); font-size: var(--t-2); font-weight: 600;
  line-height: 1.15; color: var(--titulo);
  cursor: pointer; list-style: none;
}
.resto-campo > summary::-webkit-details-marker { display: none; }
/* seta em CSS, girando ao abrir. `inline-block` porque transform não pega em caixa inline. */
.resto-campo > summary::before {
  content: '▸'; display: inline-block; width: 1em;
  font-family: var(--mono); font-size: var(--t-0); color: var(--acento);
  transition: transform 0.15s;
}
.resto-campo[open] > summary::before { transform: rotate(90deg); }
/* mesmo filete dos h2, para a aba não parecer de outra família */
.resto-campo > summary::after {
  content: ''; display: block;
  width: 2.5rem; height: 1px; margin-top: 0.5rem;
  background: var(--borda);
}
.resto-n { font-family: var(--mono); font-size: var(--t--1); color: var(--texto-2); }

/* A faixa da estrela é 3.5rem FIXA nas duas grades, e não `auto`. Grade dimensiona o
   próprio `auto` pelo próprio conteúdo: a linha media dois caracteres de estrela e o
   cabeçalho media a palavra "Level", então as duas faixas saíam com larguras diferentes e
   o título caía 31px fora da coluna que ele nomeia.

   Cabeçalho das colunas dentro do arquétipo. Mesma grade das linhas — se ele tivesse grade
   própria, os títulos deixariam de bater com os dados na primeira mudança de largura.
   `aria-hidden` no HTML: para leitor de tela isto é decoração, porque cada célula de dado
   já carrega o próprio rótulo no texto ou no aria-label do medidor. */
.lista-cabecalho {
  display: grid; grid-template-columns: 3rem 1fr 1fr 3.5rem 6rem 7rem;
  align-items: baseline; gap: 0 0.9rem;
  padding: 0.2rem 0.5rem 0.4rem; margin: 0 -0.5rem;
  border-bottom: 1px solid var(--borda);
  font-family: var(--mono); font-size: var(--t--2); letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--texto-2);
}
.lista-cabecalho .lista-div { justify-content: flex-end; }

@media (max-width: 52rem) {
  /* some as mesmas duas colunas que as linhas escondem, na mesma ordem */
  .lista-cabecalho { grid-template-columns: 3rem 1fr 3.5rem 7rem; }
  .lista-cabecalho span:nth-child(3), .lista-cabecalho span:nth-child(5) { display: none; }
}


/* ── faixa de arte: metagame e classificação ──────────────────────────────── */
/* Mesma gramática do card de deck, e de propósito: a arte ocupa a altura inteira da linha,
   some para a esquerda em vez de terminar num corte reto, e o crédito vive sobre ela.
   Miniatura retangular colada ao lado do texto lê como imagem pregada; faixa que emerge do
   fundo lê como parte da linha. */

/* Largura própria e arte ABSOLUTA lá dentro. Sem isso a altura natural da imagem entra no
   fluxo e passa a mandar na altura da linha — foi o que a página de decks já resolveu assim,
   e lá o card ia de 88 para 119px sozinho. */
.meta-assinatura, .posto-assinatura {
  position: relative; align-self: stretch; justify-self: stretch;
  overflow: hidden; border-radius: 0 2px 2px 0;
}
.meta-artes, .posto-artes {
  position: absolute; inset: 0;
  mask-image: linear-gradient(90deg, transparent, #000 55%);
}
/* 25% e não `center`: o art_crop é 1,37 e a faixa é bem mais larga que alta, então `cover`
   joga fora ~25% da altura. Centralizado ele tira de cima, que é onde ficam os rostos —
   Liliana, Kroxa e Snapcaster saíam decapitados na página de decks pelo mesmo motivo. */
.meta-artes img, .posto-artes img {
  width: 100%; height: 100%; display: block;
  object-fit: cover; object-position: 50% 25%;
}

/* A faixa é a última coluna da linha, e a linha ganha um respiro à direita = 0: a arte
   encosta na borda, como no card de deck. */
/* QUATRO faixas para quatro filhos: título (nome + pips), tier, share e a arte. O nome e os
   pips viraram um bloco só, então a coluna de `auto` que existia para eles saiu junto — e
   enquanto ela ficou sobrando, o share caía na faixa de 2,5rem e quebrava em três linhas,
   levando a linha de 63 para 96px. */
.meta-linha > a {
  grid-template-columns: 1fr 2.5rem 8rem 14rem;
  padding-right: 0; gap: 0 1.25rem;
}
.meta-titulo { display: flex; align-items: center; gap: 0.75rem; min-width: 0; }

/* Na classificação a faixa é mais estreita: a coluna toda tem 24rem. Sem crédito por linha
   aqui — ele sai coletivo embaixo da coluna, senão três linhas de texto num item de 53px. */
.posto button { grid-template-columns: 1.75rem 1fr auto 7rem; padding-right: 0; }
.posto-deck { grid-column: 2; grid-row: 1; }
.posto-quem { grid-column: 2; grid-row: 2; }
.posto-rec  { grid-column: 3; grid-row: 1 / 3; align-self: center; }
.posto-assinatura { grid-column: 4; grid-row: 1 / 3; }

@media (max-width: 40rem) {
  /* a arte sai antes do resto: ela é referência, não dado */
  .meta-assinatura, .posto-assinatura { display: none; }
  /* `auto 1fr`: o tier ocupa o que precisa e a porcentagem começa logo depois dele. Com
     `1fr auto` a porcentagem era empurrada para a borda oposta e sobrava um vão no meio da
     segunda fileira, com o selo de tier órfão de um lado e o número do outro. */
  .meta-linha > a { grid-template-columns: auto 1fr; padding-right: 1rem; }
  /* O título atravessa as duas colunas e volta a ser FLUXO, não flex: como flex, o nome
     comprido quebrava em duas linhas e os pips ficavam centrados à direita, soltos do texto.
     Em fluxo eles seguem a última palavra do nome, que é onde se lê "Goryo's Reanimator UB". */
  .meta-titulo { grid-column: 1 / -1; display: block; }
  .meta-nome { margin-right: 0.5rem; }
  .meta-cores { vertical-align: middle; }
  .meta-share { justify-self: start; text-align: left; }
  .posto button { grid-template-columns: 1.75rem 1fr auto; padding-right: 0.5rem; }
}

/* Crédito de artista, no RODAPÉ da página que exibe arte.

   Não é enfeite e não é opcional. A Fan Content Policy da Wizards não exige crédito a
   artista, mas exige não REMOVER avisos existentes — e o `art_crop` remove, porque corta
   fora a faixa onde ficam o nome do artista e a linha de copyright. A Scryfall, de onde as
   imagens vêm, é explícita: mostrar copyright, aviso e crédito "wherever you display this
   image".

   Rodapé e não linha a linha: o rodapé está na MESMA página que as artes e nomeia todos os
   artistas dela, então "wherever you display" continua atendido. O `title` de cada faixa
   segue trazendo a carta e o artista daquela linha específica.
   O card de deck é a exceção e continua com o crédito colado na arte: lá a faixa é grande e
   o crédito faz parte do desenho. */
.credito-arte {
  font-family: var(--mono); font-size: var(--t--2); line-height: 1.5;
  color: var(--texto-2); margin-top: 1.25rem;
}

/* A faixa tem de SANGRAR até a borda da linha, como no card de deck. A margem negativa
   cancela o padding vertical do botão: sem ela sobra uma tira de fundo em cima e embaixo da
   arte, e a imagem lê como bloco colado em vez de parte da linha. */
.posto-assinatura { margin: -0.4rem 0; }
.posto button { padding-right: 0; }

/* Mesma coisa no metagame, que eu tinha esquecido: `align-self: stretch` estica até a caixa
   de CONTEÚDO, não até a borda, então o padding de 0,7rem do summary sobrava como fundo em
   cima e embaixo. Medido: faixa de 38px numa linha de 63, com 12px de sobra de cada lado.
   A margem negativa cancela o padding e a arte passa a ocupar a linha inteira, como no card
   de deck. */
.meta-assinatura { margin: -0.7rem 0; }

/* ── mesa de jogo ─────────────────────────────────────────
   A mesa ocupa a JANELA do navegador (decisão de 2026-08-01, seção 11.5.1 do plano do
   motor): 100% da largura e da altura, sem cabeçalho nem rodapé do site. Não é a tela cheia
   do monitor — abas e barra de endereço continuam, e é lá que mora o link da sala.

   Os dois tokens abaixo são os únicos novos, derivados da rampa quente que já existe. O campo
   quieto da referência vive entre 1,9% e 4,5% de luminância; --painel está em 1,0%, escuro
   demais para a carta ter onde se apoiar. --mesa está em 2,0%. */
.pagina-mesa {
  --mesa: #2a261f;
  --mesa-alto: #322d25;
  /* TAMANHO DA CARTA, e ele acompanha a janela — era 104px fixo, e numa tela grande o
     tabuleiro inteiro virava uma tira pequena no meio do vazio.
     A conta é MEDIDA, e ela é a única razão do 262: o campo tem SEIS fileiras de carta (mão,
     terrenos e criaturas de cada lado), e o que não é carta soma 262px — barra 34, padding e
     borda das seis fileiras 96, divisa 24, gaps 48, padding do campo 16, mais os 42 das DUAS
     fileiras de mão, que não custam o mesmo que as outras: as pilhas moram nelas, e pilha é
     carta MAIS a linha de rótulo e contagem (21px cada fileira, medidos).
     Foi exatamente esse termo que faltou na primeira versão: as pilhas vazavam 15px para cima,
     por baixo da fileira de trás, porque a conta as tratava como carta pelada.
     Chutar aqui não é opção: com o piso de fileira abaixo, uma carta grande demais empurra o
     tabuleiro para fora da janela e o campo passa a rolar — foi o que 13vh fazia.

     O TETO NÃO É MAIS UM NÚMERO. Era 150px, e um número redondo ali só adiava a pergunta:
     numa tela alta a carta parava de crescer e sobrava faixa vazia. Agora o teto é a LARGURA
     disponível, porque é ela que quebra de verdade — a fileira da mão precisa caber sete
     cartas lado a lado, e ela tem 2/3 do campo, que é a janela menos a barra lateral. Daí
     `(100vw - 236px) × 0,133`, que é a mesma conta de sete cartas mais os gaps resolvida para
     a altura. Quem for menor manda: em 16:9 é sempre a altura, e a largura só aparece em
     janela alta e estreita, que é justamente onde ela precisava aparecer.
     O piso de 88px é onde a arte deixa de se distinguir.
     Sem JS: `vh` e `vw` já refazem a conta ao arrastar a janela, e ouvir `resize` para calcular
     o que o navegador calcula sozinho seria código para manter sem nada a mais em troca. */
  /* 294 e não 262: as quatro fileiras que rolam ganharam 8px cada para a barra, e sem
     devolver esses 32px aqui o tabuleiro passaria a rolar na vertical — trocar recorte por
     rolagem de página seria a mesma perda com outro nome. */
  --carta: max(88px, min(calc((100vh - 294px) / 6), calc((100vw - 236px) * 0.133 - 12px)));
  /* A carta é 63×88mm; a largura sai da altura, nunca digitada de novo. */
  --carta-larga: calc(var(--carta) * 0.716);
  height: 100vh; display: grid; grid-template-rows: 34px 1fr; overflow: hidden;
}
.mesa-barra {
  display: flex; align-items: center; gap: 1rem; padding: 0 0.75rem;
  background: var(--painel); border-bottom: 1px solid var(--filete);
  font-family: var(--mono); font-size: 11px; color: var(--texto-2);
}
.mesa-barra a { color: var(--texto-2); text-decoration: none; }
.mesa-barra a:hover { color: var(--acento); }
.mesa-barra .marca { color: var(--titulo); font-family: var(--serif); font-size: 14px; }
.mesa-barra .marca b { color: var(--acento); font-weight: 600; }
.mesa-barra .dir { margin-left: auto; display: flex; gap: 0.9rem; align-items: center; }

/* 220px, e não os 11% da referência. Ela mede 1800px de largura, então os 11% dela são ~200px
   — o que importa para a barra é a LARGURA ABSOLUTA, porque quem manda nela é a legibilidade
   da carta em prévia, não a proporção da tela. Copiar a porcentagem numa janela de 1280 daria
   141px e a prévia deixaria de se ler, que é justamente o que ela existe para fazer. */
.mesa-tela { display: grid; grid-template-columns: 1fr 220px; min-height: 0; }
.mesa-campo {
  background: var(--mesa); position: relative; min-height: 0; overflow: auto;
  display: grid; grid-template-rows: auto 1fr 1fr auto auto; gap: 0.5rem; padding: 0.5rem;
}

/* Zona é traço fino, nunca painel preenchido: é o que deixa a arte dominar. */
/* A zona é a MOLDURA, e ela não recorta nada: o rótulo dela mora 7px acima da borda, do lado de
   fora da caixa. Quem rola é a fileira de dentro — ver `.mesa-zona-fila`. */
.mesa-zona {
  /* O respiro de dentro mudou de casa: era `padding: 0.4rem` aqui, e agora 0,15rem aqui mais
     4px na fileira. A soma é a mesma, e a diferença é que os 4px ficam DENTRO da caixa que
     rola — é onde o anel de estado (atacando, revelada) precisa de espaço para não ser
     cortado no primeiro e no último da fila. */
  border: 1px solid var(--borda); border-radius: 2px; padding: 0.15rem;
  display: flex; align-items: center; min-height: 0; position: relative;
  /* `min-width: 0` é o que faz a fileira de dentro ROLAR em vez de esticar a zona: o tamanho
     mínimo automático de um item de grade é o CONTEÚDO, então sem esta linha a zona cresce
     junto com as dezessete cartas e escapa da coluna — e aí não há o que rolar, porque nada
     transbordou. */
  min-width: 0;
}
/* A FILEIRA NÃO QUEBRA: ela ROLA na horizontal. Quebrar em duas linhas fazia a mão de dez
   cartas comer a altura do tabuleiro inteiro — as fileiras dividem entre si o que sobra, então
   uma linha a mais na mão encolhia o campo de batalha das duas pessoas.

   Ela é elemento PRÓPRIO dentro da zona porque rolar de lado e deixar o rótulo aparecer não
   cabem no mesmo elemento: `overflow-x: auto` obriga o eixo vertical a recortar junto — a
   especificação não deixa um eixo `visible` com o outro `auto` —, e a zona que rolava comia o
   próprio rótulo e as pontas das cartas. Achado em pixel, na mão do oponente.

   `safe center`: centrado enquanto cabe, e ancorado na ESQUERDA quando não cabe. Sem o `safe`,
   o centro joga o começo da fileira para fora da caixa em coordenada negativa, e o que sai por
   ali não volta com rolagem nenhuma — some de vez.

   O vão é 0,55rem: com a fileira rolando, cartas encostadas viram uma parede de arte, e o vão é
   o que deixa contar as criaturas de relance. */
.mesa-zona-fila {
  flex: 1; min-width: 0; align-self: stretch; padding: 4px;
  display: flex; gap: 0.55rem; align-items: center; justify-content: safe center;
  flex-wrap: nowrap; overflow-x: auto; overflow-y: hidden;
  scrollbar-width: thin; scrollbar-color: var(--borda) transparent;
}
/* A carta não encolhe para caber: é o que faz a fileira rolar em vez de espremer a arte até o
   ilegível, que é o defeito que a rolagem existe para não ter. */
.mesa-zona-fila > .mesa-carta, .mesa-zona-fila > .mesa-verso { flex: none; }
/* O LEQUE: quando não cabem, as cartas se SOBREPÕEM em vez de a fileira rolar. Quem mede o
   quanto é `encaixarFileiras()`, no desenho — largura não se sabe em CSS. Rolar escondia as
   cartas das pontas e cortava a primeira ao meio, e mão que não se vê inteira é mão que se
   decide errado. */
/* `:is(...)` não é enfeite: sem ele o seletor tem a MESMA especificidade de `.mesa-carta`, que
   zera a margem lá embaixo e vem depois no arquivo — a sobreposição era calculada, a variável
   era escrita, e nada acontecia na tela. Medi: `margin-left` computado dava 0px. */
.mesa-zona-fila > :is(.mesa-carta, .mesa-verso, .mesa-pilha) + * {
  margin-left: calc(-1 * var(--sobrepor, 0px));
}
/* A carta sob o cursor (ou com foco) vem para a FRENTE das vizinhas. Sem isto, sobreposta ela
   continuaria coberta justamente na hora em que se quer olhá-la — e a prévia da barra, que já
   mostra a carta inteira, exige passar o mouse para funcionar. */
.mesa-zona-fila > .mesa-carta { position: relative; }
.mesa-zona-fila > .mesa-carta:hover, .mesa-zona-fila > .mesa-carta:focus-visible { z-index: 2; }
/* Barra de rolagem discreta: ela vive por cima do feltro e não pode virar o elemento mais
   chamativo do tabuleiro. */
.mesa-zona-fila::-webkit-scrollbar { height: 6px; }
.mesa-zona-fila::-webkit-scrollbar-thumb { background: var(--borda); border-radius: 3px; }
.mesa-zona-fila::-webkit-scrollbar-track { background: transparent; }
/* A carta some de baixo do cursor enquanto é arrastada para arrumar a fileira — mesma marca do
   pedido de ordem, porque é o mesmo gesto. */
.mesa-carta.arrastando { opacity: 0.4; }
/* CARTA REVELADA (CR 701.16): contorno tracejado em âmbar, a mesma linguagem do "alvejável" —
   nos dois casos a carta está fora do estado normal dela por causa de uma regra, e não por
   causa de um gesto em curso. Vale nas duas mãos: na do oponente explica por que ela está de
   frente, e na minha lembra do que ele já viu. */
.mesa-carta.revelada { outline: 1px dashed var(--acento); outline-offset: 2px; }
/* O monte da mão do oponente é uma pilha como as outras, e o rótulo dela diz "hidden N" — o
   número do rótulo da zona é o TOTAL, e os dois não são a mesma conta quando há revelada. */
.mesa-mao-monte { flex: none; }
.mesa-zona.permanentes { background: var(--mesa-alto); }
/* O rótulo monta na borda de cima da zona, e o `-7px` tem de caber no VÃO entre as fileiras:
   ele tem fundo opaco, então o que passar do vão apaga a borda da fileira de trás. Com o vão em
   6,4px era o que acontecia — "LANDS · GUEST" comia o canto de baixo da pilha do oponente. O
   vão do campo subiu para 8px por causa desta linha, e não por gosto de respiro. */
.mesa-zona > .rotulo {
  position: absolute; top: -7px; left: 8px; padding: 0 4px; background: var(--mesa);
  color: var(--texto-2); font-family: var(--mono); font-size: 8px;
  letter-spacing: 0.1em; text-transform: uppercase;
}
/* O nome de quem está de vez, em âmbar. A cor sozinha não carrega a informação — a barra diz
   "turn 2, Guest to play" por escrito —, ela só torna a resposta imediata. */
.mesa-zona > .rotulo .ativo { color: var(--acento); font-weight: 600; }

/* CRACHÁ DO JOGADOR, ao lado da biblioteca: RETRATO em cima, VIDA embaixo — dois quadrados de
   canto redondo empilhados, pedido do usuário em 02/08/2026.
   A largura é a da CARTA, e a soma das duas alturas fecha a altura da carta: é o que faz o
   crachá terminar na mesma linha de base das três pilhas, sem esticar a fileira e sem mexer na
   conta que decide o tamanho da carta.
   Ele é a ÂNCORA do gesto de apontar — jogador é alvo legal em Magic, e sem lugar na tela não
   havia para onde apontar. */
.mesa-jogador {
  display: flex; flex-direction: column; gap: 0.25rem; align-items: center;
  flex: none; border-radius: 6px;
}
/* O quadrado do retrato espera ARTE DE PERSONAGEM. Até ela chegar, a inicial do nome: ela
   identifica o assento e não finge ser ilustração. `overflow: hidden` e `object-fit: cover`
   já deixados prontos — a imagem entra aqui dentro sem mexer em mais nada. */
.mesa-jogador .retrato {
  width: var(--carta-larga); aspect-ratio: 1; border-radius: 8px;
  background: var(--mesa-alto); border: 1px solid var(--borda); overflow: hidden;
  display: grid; place-items: center;
  font-family: var(--serif); font-size: calc(var(--carta) * 0.3); line-height: 1;
  color: var(--texto-2); text-transform: uppercase;
}
.mesa-jogador .retrato img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* A vida é o número grande do crachá: é o que se consulta o tempo todo, e agora está no
   tabuleiro em vez de só na barra lateral. */
.mesa-jogador .vida {
  width: var(--carta-larga); border-radius: 6px;
  background: var(--mesa-alto); border: 1px solid var(--borda);
  font-family: var(--mono); font-size: 13px; color: var(--titulo);
  padding: 0.15rem 0; text-align: center; white-space: nowrap;
}
/* De quem é o turno, também aqui: a borda do retrato acende. É o mesmo sinal do nome em âmbar
   no rótulo da fileira, e nenhum dos dois é a única pista — a barra diz por escrito. */
.mesa-jogador.ativo .retrato { border-color: var(--acento); color: var(--acento); }
/* Alvejável só enquanto o gesto de apontar está aberto. Fora dele o crachá não tem cursor de
   mão nem realce: o que só às vezes faz algo mente o resto do tempo. */
.mesa-jogador.alvejavel { cursor: pointer; outline: 1px dashed var(--acento); outline-offset: 3px; }
.mesa-jogador.alvejavel .vida { color: var(--acento); }
.mesa-jogador:focus-visible { outline: 2px solid var(--acento); outline-offset: 3px; }

/* A CAMADA DAS SETAS. `fixed` cobrindo a janela e `pointer-events: none`: ela desenha por cima
   de tudo e não intercepta nada — seta que come clique seria pior que seta nenhuma.
   Abaixo da janela da pilha (z-index 40) e do menu, acima do tabuleiro. */
.mesa-setas {
  position: fixed; inset: 0; width: 100%; height: 100%;
  pointer-events: none; z-index: 30; overflow: visible;
}
/* Alvo em âmbar, que é a cor da ação em curso nesta tela; anexo em claro, que é a mesma
   distinção do anel de atacante e de bloqueador. Tracejado no anexo porque ele é permanente e
   fica na tela o jogo inteiro — linha cheia o tempo todo viraria ruído. */
/* O traço é CURVA e não reta: entre cartas vizinhas a reta de centro a centro tem 84px e some
   atrás das próprias cartas — a curva sai por fora das duas. `fill: none` porque um `path`
   fechado por padrão pintaria a área entre a curva e a corda. */
/* CONTRASTE: a seta atravessa os dois fundos mais diferentes desta tela — o tabuleiro escuro e
   a ARTE DA CARTA, que é colorida e clara. Cor sozinha não resolve: qualquer tom some contra um
   dos dois. Por isso ela vai com HALO — a sombra na cor do fundo desenha um contorno escuro em
   volta do traço, e é ele que faz a linha se ver por cima da arte. Duas sombras porque uma só
   fica lavada sobre carta clara. */
.mesa-setas path { fill: none; filter: drop-shadow(0 0 1.5px var(--fundo)) drop-shadow(0 0 3px var(--fundo)); }
.mesa-setas path.alvo  { stroke: var(--acento); stroke-width: 2.5; opacity: 1; }
.mesa-setas path.anexo { stroke: var(--titulo); stroke-width: 1.5; stroke-dasharray: 4 3; opacity: 0.75; }
/* O bloqueio saiu do `--titulo`, e o motivo é o contraste: ele era o ouro PÁLIDO do anel de
   bloqueador, a mesma cor da moldura de toda carta, e sumia em cima da arte. Agora é `--texto`,
   o tom mais claro da paleta no tema escuro e o mais escuro no claro — o único que contrasta
   nos dois temas sem inventar cor nova. O par de canais continua de pé: o ANEL diz "esta
   criatura bloqueia", a CURVA diz "bloqueia aquela". */
.mesa-setas path.bloqueio { stroke: var(--texto); stroke-width: 2.5; opacity: 1; }
/* A PONTA é a única coisa preenchida, e por isso ela é escopada por `marker` — sem isso a
   regra de cima e esta brigariam pelo mesmo `path`. */
.mesa-setas marker path.alvo     { fill: var(--acento); stroke: none; }
.mesa-setas marker path.anexo    { fill: var(--titulo); stroke: none; }
.mesa-setas marker path.bloqueio { fill: var(--texto); stroke: none; }

/* `outline: none` desfaz o ANEL ÂMBAR que todo `button` do site tem (é a moldura dupla dos
   cards, aplicada a botão). Na mesa ele era ruído: a carta já tem moldura impressa, o anel
   ficava 3px FORA dela — cortado pela borda da fileira que rola —, e com as cartas sobrepostas
   virava uma teia de risquinhos entre elas. Quem precisa de anel aqui são os ESTADOS (atacando,
   bloqueando, escolhido, revelada), e cada um tem o seu, com significado. */
.mesa-carta {
  position: relative; border: none; padding: 0; margin: 0; background: none; cursor: pointer;
  outline: none;
}
/* `aspect-ratio` fixo: a largura da carta tem de ser conhecida ANTES de a imagem chegar. Sem
   ele a carta mede zero de largura até a arte carregar, e a conta da sobreposição (que roda
   no desenho) sobrava — a fileira continuava rolando com as cartas já amontoadas. É a mesma
   proporção do `--carta-larga`, que é a da carta de Magic.

   O RAIO É O DO CANTO BRANCO DA IMAGEM, e foi MEDIDO no arquivo — não deduzido do papel. A
   imagem do Scryfall é JPG, JPG não tem transparência, e o que sobra fora do canto arredondado
   vem BRANCO. O `3px` de antes era menor que esse canto e deixava a pontinha aparecer; o anel
   âmbar de todo botão a escondia, e quando ele saiu ela apareceu.

   Medido numa `normal` de 488×680, lendo os pixels da borda de cima: 765 (branco puro) até
   x=13, e daí uma RAMPA — 626, 353, 154, 112, 70 — até 61 (preto) a partir de x=19. O raio tem
   de cobrir a rampa inteira, não só o branco puro: em 15px sobrava a parte cinzenta dela, que é
   a "pontinha" que ainda se via. Em 19px — 3,9% da largura e 2,8% da altura — sobra só preto.

   E o raio subiu de 19px medidos para 5% (~24px na escala da imagem) por uma razão de PIXEL, e
   não de geometria: na mesa a carta tem 74px de largura, então o arco inteiro cabe em três
   pixels — e o antisserrilhado de um arco de três pixels mistura o branco de baixo na borda
   visível. O raio exato da imagem é certo no tamanho da imagem e insuficiente no tamanho da
   tela.

   E o que fecha de vez é o `clip-path`, que RECORTA em vez de cobrir. Foram três tentativas
   antes dele, e cada uma falhou por uma razão diferente:

   1. `box-shadow: inset` — não cobre nada. **Sombra interna é pintada por baixo do conteúdo de
      um elemento substituído**, e o `<img>` desenha por cima dela. A pista foi o `hover`: o
      branco ficava mais FORTE, porque o `filter: brightness` clareia justamente a imagem que
      estava por cima da sombra.
   2. `border: 1px solid #000` — cobre a borda reta, e não a curva. No canto, quem decide o
      pixel é o antisserrilhado do `border-radius`, que MISTURA o branco da imagem com o que
      está atrás e pinta a franja POR CIMA da borda.
   3. Aumentar o raio — não resolve pela mesma razão da 2: qualquer curva nova tem a mesma
      franja, só que em outro lugar.

   O `clip-path` corta 2% de cada lado ANTES de arredondar, e é medida: na escala de exibição
   (74×103) o branco vive nos dois pixels externos — (0,0)=717 e (1,0)=410 numa soma RGB em que
   preto é 61 —, e a partir de (2,0)=111 já é preto. Cortados esses dois, não sobra branco para
   o antisserrilhado misturar. A borda de 1px fica, para as retas.

   O limite superior é essa borda preta, que numa carta moderna tem ~4% da largura. Os 5% a
   ultrapassam de raspão no canto, onde ela é mais grossa na diagonal — e é por isso que o teto
   é aqui: deduzir do papel (3mm em 63mm = 4,76%) e arredondar para cima começaria a comer arte.

   Porcentagem e não pixel porque a carta muda de tamanho com a janela — em pixel o raio
   erraria em todo tamanho menos um. */
.mesa-carta img {
  height: var(--carta); aspect-ratio: 0.716; display: block;
  border-radius: 5% / 3.6%; border: 1px solid #000;
  clip-path: inset(2% round 6% / 4.2%);
}
.mesa-carta:focus-visible { outline: 2px solid var(--acento); outline-offset: 2px; }
.mesa-carta:hover img { filter: brightness(1.12); }
/* Carta virada precisa de CAIXA PRÓPRIA: `rotate()` não reserva a caixa girada, e sem isto a
   arte invade o vizinho em vez de empurrá-lo. 104 de altura vira 104 × 74. */
/* `align-content` e não só `place-items`: a FILEIRA implícita da grade cresce para a altura da
   carta em pé (108px) dentro de uma caixa de 77, e fica ancorada no topo. `place-items` centra
   a imagem DENTRO da fileira, que já está fora do lugar — a arte descia 15px e a moldura ficava
   desalinhada com a caixa. Medido: centro da caixa 391, centro da arte 406; com esta linha, 391
   e 391. Quem centra a fileira na caixa é `align-content`. */
.mesa-carta.virada {
  width: var(--carta); height: var(--carta-larga);
  display: grid; place-items: center; align-content: center;
}
.mesa-carta.virada img { transform: rotate(90deg); }

/* Nome e custo escritos POR CIMA da carta não existem: entraram e saíram em 02/08/2026, por
   decisão do usuário. A carta já diz as duas coisas, e quem precisa ler tem a prévia inteira
   na barra — repetir por cima da arte custa arte e não devolve informação. */

/* As três pilhas: exílio, cemitério e biblioteca, cada uma mostrando a CARTA e não só um
   número. Biblioteca mostra verso (ninguém vê o conteúdo), cemitério mostra a do topo de
   frente, e o exílio depende da face — que é regra, não escolha de layout: exílio virado para
   cima todo mundo lê, virado para baixo só o dono. Tabela de visibilidade na seção 3.8. */
/* SEM `min-height: 0` aqui, e a ausência é a correção: com ele, o mínimo automático do grid
   ficava desligado e a caixa parava em 133px com 148px de pilha dentro — a pilha vazava 15px, e
   como o alinhamento é `flex-end` vazava para CIMA, por baixo da fileira de trás. Agora a
   fileira admite a altura que a pilha tem, e quem cede é a carta, pela conta lá do topo. */
.mesa-pilhas {
  display: flex; gap: 0.5rem; align-items: flex-end; justify-content: center;
  border: 1px solid var(--borda); border-radius: 2px; padding: 0.4rem;
}
.mesa-pilha {
  border: none; background: none; padding: 0; margin: 0; cursor: pointer;
  display: flex; flex-direction: column; align-items: center; gap: 0.2rem;
  font-family: var(--mono); font-size: 8px; color: var(--texto-2);
  letter-spacing: 0.1em; text-transform: uppercase;
}
/* Mesmo raio das cartas da mesa, e pela mesma razão: a ponta branca do JPG do Scryfall. */
.mesa-pilha img {
  height: var(--carta); border-radius: 5% / 3.6%; border: 1px solid #000; display: block;
  clip-path: inset(2% round 6% / 4.2%);
}
/* Pilha vazia continua ocupando a pegada da carta: zona que some quando esvazia obriga o
   jogador a reaprender o tabuleiro a cada turno. */
.mesa-pilha .vazia {
  height: var(--carta); width: var(--carta-larga); border: 1px dashed var(--filete); border-radius: 3px;
}
/* Rótulo e contagem na MESMA linha. Empilhados, eles custavam 15px de altura por fileira de
   mão — e altura aqui não é sobra: ela sai da carta, porque a conta lá do topo divide o que
   resta por seis fileiras. `baseline` e não `center`: são dois textos de corpos diferentes
   (8px e 12px), e o que alinha texto com texto é a linha de base. */
.mesa-pilha .cabeca { display: flex; gap: 4px; align-items: baseline; }
.mesa-pilha b { color: var(--titulo); font-size: 12px; font-weight: 500; }
/* Pilha sem ação não se disfarça de botão: nada de cursor de mão nem realce no hover. */
.mesa-pilha.inerte { cursor: default; }
.mesa-pilha:not(.inerte):hover img,
.mesa-pilha:not(.inerte):hover .mesa-verso { filter: brightness(1.12); }
.mesa-pilha:focus-visible { outline: 2px solid var(--acento); outline-offset: 2px; }

/* A janela da pilha. `position: fixed` para arrastar dentro da JANELA DO NAVEGADOR, e tamanho
   travado de propósito — o pedido foi mover, não redimensionar. */
.mesa-pilha-pop {
  position: fixed; z-index: 40; width: 320px; height: calc(var(--carta) + 74px);
  background: var(--painel); border: 1px solid var(--acento); border-radius: 3px;
  display: flex; flex-direction: column; box-shadow: 0 6px 24px rgba(0, 0, 0, 0.5);
}
.mesa-pilha-pop[hidden] { display: none; }
.mesa-pilha-pop-cabeca {
  cursor: grab; user-select: none; padding: 0.3rem 0.5rem;
  border-bottom: 1px solid var(--filete);
  font-family: var(--mono); font-size: 9px; color: var(--acento);
  letter-spacing: 0.1em; text-transform: uppercase;
}
.mesa-pilha-pop-cabeca:active { cursor: grabbing; }
/* Rola de lado quando há mais objetos do que cabem: a pilha pode ter cinco magias esperando, e
   encolher a carta até caber tiraria justamente a legibilidade que a janela existe para dar. */
.mesa-pilha-pop-corpo {
  flex: 1; display: flex; gap: 0.4rem; align-items: center;
  padding: 0.4rem; overflow-x: auto; overflow-y: hidden; min-height: 0;
}

/* A divisa entre as duas metades. Tracejada porque não é de ninguém — é a mesma razão que a
   faixa da pilha tinha, e o que sobrou dela depois que a pilha virou janela. Agora ela carrega
   a TRILHA DE ETAPAS: o meio do tabuleiro é de ninguém, e a etapa também não é — ela é do
   turno, e os dois jogadores leem a mesma. */
.mesa-divisa {
  border-top: 1px dashed var(--filete);
  display: flex; align-items: center; justify-content: center; padding-top: 0.35rem;
}

/* As doze etapas em fila. Cada uma é uma sigla de duas letras, e a de agora fica ACENTUADA e
   MAIOR — a diferença de tamanho é o que se lê pelo canto do olho, sem parar para procurar.
   `min-width` fixo nos passos para a fila não andar de lado quando a sigla muda de largura:
   trilha que se remexe a cada etapa vira ruído em vez de referência. */
.mesa-fases { display: flex; gap: 2px; align-items: center; font-family: var(--mono); }
.mesa-fases .passo {
  min-width: 22px; padding: 2px 0; text-align: center; border-radius: 2px;
  font-size: 8px; letter-spacing: 0.08em; color: var(--texto-2);
  background: var(--mesa-alto); border: 1px solid transparent;
  transition: color 0.15s;
}
/* As etapas sem prioridade (desvirar e limpeza) são desenhadas apagadas: elas passam e ninguém
   age, e mostrá-las com o mesmo peso prometeria uma parada que as regras não dão. */
.mesa-fases .passo.sem-parada { opacity: 0.45; }
.mesa-fases .passo.agora {
  color: var(--fundo); background: var(--acento); border-color: var(--acento);
  font-weight: 600; opacity: 1;
  /* O crescimento acontece na ENTRADA da etapa e volta ao repouso: é aviso de mudança, não
     estado permanente piscando. `transform-origin: bottom` para o passo crescer sem empurrar
     a linha tracejada. */
  animation: entrou-na-fase 0.45s ease-out;
  transform-origin: center bottom;
}
@keyframes entrou-na-fase {
  0%   { transform: scale(1); }
  35%  { transform: scale(1.55); }
  100% { transform: scale(1.15); }
}
.mesa-fases .passo.agora { transform: scale(1.15); }
/* Respeita quem pediu menos movimento no sistema. A informação continua toda lá — cor, peso e
   tamanho —, o que sai é só a animação. */
@media (prefers-reduced-motion: reduce) {
  .mesa-fases .passo.agora { animation: none; }
}

/* As duas fileiras repartidas, nas proporções pedidas em 2026-08-02. Terreno é o que mais se
   toca num turno e fica com a fatia maior; a mão idem, e as três pilhas cabem no terço que
   sobra porque são três cartas e um número cada. */
.mesa-fila-terra { display: grid; grid-template-columns: 3fr 2fr; gap: 0.4rem; min-height: 0; }
/* A fileira da mão é fileira `auto` no campo, e é a ÚNICA sem `min-height: 0` — de propósito.
   Com ele, o mínimo automático do grid fica desligado e a fileira para de crescer junto com o
   que tem dentro: ela ficava em 142px com 146,8px de pilha, e os 4,8px sobravam por cima da
   fileira de trás. É a mesma armadilha que `.mesa-pilhas` tinha, um nível acima. */
.mesa-fila-mao   { display: grid; grid-template-columns: 2fr 1fr; gap: 0.4rem; }

/* VERSO DE CARTA. Era um padrão em CSS enquanto não havia arte própria; desde 02/08/2026 é
   `img/verso.png`, arte trazida pelo usuário — cortada na moldura e reduzida a 148×219, que é
   o dobro do que a tela mostra (retina) e nada além disso.
   Sem gradiente por baixo de propósito: se o arquivo sumir, o verso tem de ficar visivelmente
   errado. Fallback bonito é a regra "sem fallback silencioso" quebrada onde ninguém procura. */
.mesa-verso {
  height: var(--carta); width: var(--carta-larga); border-radius: 3px; display: block;
  background: #14110e url(../img/verso.png) center / cover;
  border: 1px solid var(--filete);
}

/* Barra lateral: TODO o texto mora aqui, e o tabuleiro fica livre de tipografia. */
.mesa-lado {
  background: var(--painel); border-left: 1px solid var(--filete);
  display: grid; grid-template-rows: auto auto auto 1fr auto; min-height: 0;
}
.mesa-lado > * { padding: 0.5rem 0.6rem; border-bottom: 1px solid var(--filete); min-height: 0; }
.mesa-info { font-family: var(--mono); font-size: 10px; color: var(--texto-2); line-height: 1.6; }
.mesa-info b { color: var(--titulo); font-size: 13px; }
/* Partida encerrada. Ela precisa gritar mais que o campo de etapa, e por um motivo mecânico:
   desde 02/08/2026 o motor RECUSA evento depois do fim, então sem este aviso os botões
   apenas parariam de responder — clique sem efeito e sem explicação é o pior estado
   possível. É a regra 14.0 aplicada ao fim: o que mudou tem de aparecer. */
.mesa-fim {
  font-family: var(--mono); font-size: 11px; font-weight: 600;
  color: var(--acento); text-transform: uppercase; letter-spacing: 0.06em;
}
.mesa-acoes { display: flex; flex-wrap: wrap; gap: 0.3rem; }
.mesa-acoes button {
  margin-top: 0; padding: 0.3rem 0.55rem; font-size: var(--t--2);
  font-family: var(--mono); font-weight: 500;
}
.mesa-mana { display: flex; gap: 0.25rem; align-items: center; flex-wrap: wrap; }
.mesa-mana button { margin-top: 0; padding: 0.2rem 0.45rem; font-size: var(--t--2); min-width: 2rem; }
.mesa-log {
  overflow: auto; font-family: var(--mono); font-size: 9.5px;
  color: var(--texto-2); line-height: 1.7;
}
.mesa-log b { color: var(--texto); font-weight: 400; }

/* A mesa é desktop-first, por decisão de 2026-08-01, e isso é INVERSÃO DELIBERADA em relação
   ao resto do site. Um tabuleiro com duas mãos, pilha, campo e cemitério não cabe em 380px
   sem virar outro produto, e versão espremida é pior que nenhuma. Abaixo do piso, recado
   honesto — estado vazio é funcionalidade, como na página de metagame. */
.mesa-estreita { display: none; }
@media (max-width: 56rem) {
  .mesa-tela { display: none; }
  .mesa-estreita { display: block; padding: 3rem 1.5rem; max-width: var(--medida); margin: 0 auto; }
}

/* A prévia: a carta em tamanho de leitura, presa no pé da barra. Não some quando o mouse
   sai — some seria pisca-pisca, e quem olhou uma carta quer continuar lendo enquanto pensa. */
.mesa-previa { border-bottom: none; }
/* Mesmo raio proporcional das cartas do tabuleiro: a prévia é grande, e ali a pontinha branca
   do JPG do Scryfall seria a mais visível de todas. */
.mesa-previa img {
  width: 100%; border-radius: 5% / 3.6%; border: 1px solid #000; display: block;
  clip-path: inset(2% round 6% / 4.2%);
}
/* O verso na prévia ocupa a mesma pegada da carta — 74px no meio do painel pareceria erro de
   carregamento, e o que a prévia tem de dizer ali é "esta carta está virada", não "faltou algo". */
.mesa-previa .mesa-verso { width: 100%; height: auto; aspect-ratio: 63 / 88; border-radius: 5px; }
.mesa-previa .meta { font-size: var(--t--2); }

/* Menu de contexto na carta — a sétima coisa da lista da seção 11.2. Ele existe para o clique
   deixar de significar quatro coisas: da mão joga, no campo vira, e o RESTO mora aqui. */
.mesa-menu {
  position: fixed; z-index: 50; min-width: 11rem;
  background: var(--painel); border: 1px solid var(--borda); border-radius: 2px;
  box-shadow: var(--sombra); padding: 0.25rem;
  display: flex; flex-direction: column;
}
/* `border: none` entrou em 2026-08-10, junto com a moldura do `button` base: esta regra zerava
   fundo e `outline` (que era onde morava o anel âmbar) e não a borda, que não existia. Com o
   anel virando BORDA, cada item deste menu ganharia contorno âmbar próprio — um menu suspenso
   com moldura em volta de cada linha. Zerar o `outline` continua valendo pelo foco. */
.mesa-menu button {
  margin: 0; padding: 0.4rem 0.6rem; text-align: left; width: 100%;
  background: none; color: var(--texto); border: none; outline: none; border-radius: 2px;
  font-family: var(--mono); font-size: var(--t--2); font-weight: 400;
}
.mesa-menu button:hover { background: var(--fundo); color: var(--titulo); outline: none; }
/* O item focado tem de se ver, e ele é a única pista de onde as setas estão. `outline` para
   dentro porque o menu tem borda própria — para fora, o anel encostaria nela e sumiria.
   `:focus` e NÃO `:focus-visible`: num menu, o item focado é o item ativo e sempre se marca. O
   `:focus-visible` depende de o navegador adivinhar a modalidade de entrada, e quando ele
   adivinha errado o menu fica sem indicação nenhuma de onde as setas estão. */
.mesa-menu button:focus {
  background: var(--fundo); color: var(--titulo);
  outline: 2px solid var(--acento); outline-offset: -2px;
}
.mesa-menu .titulo-menu {
  padding: 0.3rem 0.6rem 0.4rem; color: var(--titulo);
  font-family: var(--serif); font-size: var(--t--1);
  border-bottom: 1px solid var(--filete); margin-bottom: 0.2rem;
}

/* Selos colados na carta: P/T atual, marcadores e dano. Bater com a referência achou que
   marcador mudava o estado e não aparecia na tela — estado invisível é pior que estado errado,
   porque ninguém procura o que não sabe que existe.
   Ficam no canto de baixo, empilhados da direita para a esquerda, sem cobrir a arte. */
.mesa-selo {
  position: absolute; bottom: -6px;
  font-family: var(--mono); font-size: 9px; line-height: 1;
  padding: 2px 4px; border-radius: 2px;
  background: var(--fundo); border: 1px solid var(--borda); color: var(--texto);
}
.selo-pt { right: -4px; color: var(--titulo); border-color: var(--titulo); }
.selo-marca { left: -4px; color: var(--acento); border-color: var(--acento); }
.selo-dano { left: 50%; transform: translateX(-50%); color: var(--erro); border-color: var(--erro); }
/* Na carta virada a caixa gira; os selos não devem girar junto. */
.mesa-carta.virada .mesa-selo { bottom: 2px; }
/* E os selos DE CIMA — par, enjoo, dono — têm de continuar em cima. Eles declaram
   `bottom: auto`, mas com UMA classe só, e a regra logo acima tem DUAS: o `bottom: 2px` vencia
   por especificidade e o selo ficava preso pelo topo E pelo pé, esticado da altura inteira da
   carta. Medido no atacante virado: a caixa do `1` saía 16 × 81 px numa carta de 108 × 77.
   Não é bug do par nem do combate — vale para toda carta virada com selo de cima, e o
   atacante é só onde ele aparece toda partida, porque atacar vira. */
.mesa-carta.virada .selo-par,
.mesa-carta.virada .selo-enjoo,
.mesa-carta.virada .selo-dono { top: 2px; bottom: auto; }

/* Criatura atacando: anel âmbar, que é a cor da ação em curso nesta tela. Não é preenchimento
   nem sombra — a arte da carta continua sendo o que se lê. */
.mesa-carta.atacando img { outline: 2px solid var(--acento); outline-offset: 2px; }
/* Bloqueando: anel CLARO, e a diferença de cor é o que separa os dois papéis num combate onde
   as duas criaturas estão realçadas ao mesmo tempo. */
.mesa-carta.bloqueando img { outline: 2px solid var(--titulo); outline-offset: 2px; }
/* Escolhido e ainda sem atacante: TRACEJADO, porque a escolha está pendente — anel cheio diria
   que o bloqueio já existe, e ele só existe depois do segundo clique. */
.mesa-carta.escolhido img { outline: 2px dashed var(--acento); outline-offset: 3px; }

/* Atacante que o bloqueador escolhido NÃO alcança — voar sem voar nem alcance, CR 509.1b.
   Aparece só enquanto há bloqueador escolhido, e é apagamento e não anel: os anéis desta mesa
   dizem "isto está acontecendo", e este diz o contrário. Mesma opacidade da carta de saída no
   mulligan, que é a outra marca de "não conte com esta". */
.mesa-carta.inalcancavel img { opacity: 0.35; }

/* Carta marcada para o FUNDO no mulligan. Ela ainda está na mão e vai sair: tracejado porque
   a escolha é pendente, como a do bloqueador, e apagada porque é a única marca desta mesa que
   diz "esta carta está de saída". */
.mesa-carta.ao-fundo img { outline: 2px dashed var(--titulo); outline-offset: 3px; opacity: 0.45; }

/* O par de combate, no alto da carta: o atacante leva `1`, quem o bloqueia leva `1.1`, `1.2`,
   na ordem declarada. Fica em CIMA porque os outros três selos moram embaixo, e dois selos no
   mesmo canto viram um borrão. É o substituto da linha de bloqueio da 14.2 enquanto a
   superfície de setas (13.2) não existe. */
.selo-par {
  top: -6px; right: -4px; bottom: auto;
  color: var(--titulo); border-color: var(--titulo); font-weight: 600;
}

/* Enjoo de invocação, no canto de cima à ESQUERDA — o único dos quatro cantos que sobrava
   (P/T embaixo à direita, marcadores embaixo à esquerda, dano no meio, par em cima à direita).
   Quieto de propósito: é estado passivo, não ação em curso, e a criatura recém-chegada não
   deve puxar mais o olho que a que está atacando. Some sozinho na virada do turno, porque a
   condição é "controlada desde este turno". */
.selo-enjoo {
  top: -6px; left: -4px; bottom: auto;
  color: var(--texto-2); border-color: var(--filete); letter-spacing: -0.03em;
}

/* De quem é a mágica na pilha. Mesmo canto do enjoo, e nunca coincidem — um é do campo de
   batalha, o outro é da pilha. A letra é a mesma do retrato do crachá: o jogador tem UM sinal
   na mesa, e não um por lugar onde aparece. */
.selo-dono {
  top: -6px; left: -4px; bottom: auto;
  font-family: var(--serif); font-size: 11px; font-weight: 600;
  color: var(--titulo); border-color: var(--titulo);
}

/* O PEDIDO de escolha (§13.2), JANELA NO CENTRO desde 10/08/2026 — antes era um bloco encostado
   na barra da direita, que é onde moram as ações de rotina. Uma escolha OBRIGATÓRIA, que trava a
   partida até ser respondida, não é rotina: no canto ela se lia como mais um botão. No centro
   ela é a única coisa que dá para fazer, que é a verdade do momento — e se arrasta pela cabeça
   porque pode estar tapando justamente a carta que decide a resposta.

   `z-index` acima da janela da pilha (40): com pedido aberto, a pilha é leitura e o pedido é o
   que se responde; se uma tivesse de tapar a outra, tapar o pedido seria pior.

   A posição inicial é o centro, por `transform`. Do primeiro arrasto em diante quem manda é
   `left/top` em pixel, e aí o `transform` some — as duas coisas não convivem. */
.mesa-pedido {
  position: fixed; z-index: 50; left: 50%; top: 50%; transform: translate(-50%, -50%);
  max-width: min(560px, 92vw); padding: 0;
  border: 1px solid var(--acento); border-radius: 3px;
  background: var(--painel); box-shadow: 0 6px 24px rgba(0, 0, 0, 0.5);
}
.mesa-pedido[hidden] { display: none; }
.mesa-pedido-cabeca {
  cursor: grab; user-select: none; padding: 0.3rem 0.5rem;
  border-bottom: 1px solid var(--filete);
  font-family: var(--mono); font-size: 9px; color: var(--acento);
  letter-spacing: 0.1em; text-transform: uppercase;
}
.mesa-pedido-cabeca:active { cursor: grabbing; }
.mesa-pedido-corpo { padding: 0.5rem; }
.mesa-pedido-pergunta {
  margin: 0 0 0.4rem; font-family: var(--mono); font-size: 10px; line-height: 1.4;
  color: var(--titulo);
}
/* Os botões de um slot ficam numa fileira que quebra: um custo híbrido pode ter várias formas
   de pagar, e elas não podem sumir fora da barra. */
.mesa-pedido-slot { display: flex; flex-wrap: wrap; gap: 0.25rem; }
.mesa-pedido button {
  font-family: var(--mono); font-size: 10px; padding: 0.25rem 0.4rem;
  color: var(--titulo); background: transparent;
  border: 1px solid var(--acento); border-radius: 2px; cursor: pointer;
}
.mesa-pedido button:hover, .mesa-pedido button:focus-visible {
  background: var(--acento); color: var(--fundo);
}
.mesa-pedido-cancelar { margin-top: 0.4rem; border-color: var(--filete) !important; }

/* A ORDEM DE ATRIBUIÇÃO DE DANO (CR 509.2): as cartas em fila, e a ordem é a que se lê da
   esquerda para a direita — a mesma leitura do Arena, e a mesma que a mesa passa a mostrar
   depois de confirmada. A carta é pequena porque o que se está julgando aqui é a SEQUÊNCIA, e
   não a carta: quem precisa ler a carta tem a prévia. */
.mesa-ordem { display: flex; gap: 0.3rem; align-items: flex-start; overflow-x: auto; }
.mesa-ordem-item {
  display: flex; flex-direction: column; align-items: center; gap: 0.15rem;
  padding: 0.2rem; border: 1px solid var(--filete); border-radius: 3px;
  background: var(--fundo); cursor: grab;
}
/* `pointer-events: none` na imagem: sem isto o arrasto começa NA IMAGEM, o navegador usa o
   arrasto nativo de imagem (que copia o arquivo) e o `dragstart` do item nunca dispara. */
.mesa-ordem-item img { width: 52px; display: block; border-radius: 2px; pointer-events: none; }
.mesa-ordem-item.arrastando { opacity: 0.4; cursor: grabbing; }
.mesa-ordem-pos { font-family: var(--mono); font-size: 10px; color: var(--acento); }
.mesa-ordem-setas { display: flex; gap: 0.15rem; }
.mesa-ordem-setas button { padding: 0 0.25rem; line-height: 1.2; }
.mesa-ordem-confirmar { margin-top: 0.4rem; }

/* Alvo ilegal na mágica que espera na pilha (CR 115.7). Este é o ÚNICO selo que grita, e é
   deliberado: os outros descrevem estado, este avisa que a mágica vai resolver sem fazer nada.
   Sem ele a seta some quando o alvo sai de campo e a carta continua idêntica — a mesma classe
   de bug do marcador invisível que a regra da 14.0 existe para proibir.

   Canto de baixo ao centro, que é o que sobrava: P/T à direita, marcadores à esquerda, dano no
   meio, par e dono em cima. */
.selo-fizzle {
  bottom: -6px; left: 50%; transform: translateX(-50%); top: auto;
  color: var(--fundo); background: var(--acento); border-color: var(--acento);
  font-weight: 700;
}

/* A dica da etapa de bloquear. Discreta, mas presente: ela existe porque ali o clique tem um
   significado a mais, e nada acontece nesta mesa sem estar escrito. */
.mesa-dica {
  margin-top: 0.35rem; font-family: var(--mono); font-size: 9px; line-height: 1.4;
  color: var(--acento);
}

/* A marca na barra da mesa: o mesmo emblema das outras páginas, na altura de 34px da faixa. */
.mesa-barra .marca { display: inline-flex; align-items: center; gap: 0.4rem; }
.mesa-barra .marca img { width: 18px; height: 18px; }
.mesa-barra .marca span::first-letter { color: var(--acento); }

/* Cemitério e exílio abertos, por cima do tabuleiro. Não é modal de tela cheia: a mesa
   continua visível atrás, porque olhar o cemitério é uma consulta feita NO MEIO de uma
   decisão, e esconder o resto obrigaria a fechar para lembrar do que se estava decidindo. */
.zona-aberta {
  position: absolute; inset: 1.5rem 1.5rem auto; max-height: 70%;
  overflow: auto; z-index: 20;
  background: var(--painel); border: 1px solid var(--borda); border-radius: 2px;
  box-shadow: var(--sombra); padding: 0.75rem;
}
.zona-cabeca {
  display: flex; align-items: center; gap: 0.6rem; margin-bottom: 0.6rem;
  font-family: var(--serif); font-size: var(--t-0); color: var(--titulo);
}
.zona-cabeca .meta { font-family: var(--mono); font-size: var(--t--2); }
.zona-cabeca button { margin: 0 0 0 auto; padding: 0.25rem 0.7rem; font-size: var(--t--2); }
.zona-cartas { display: flex; flex-wrap: wrap; gap: 0.5rem; }

/* SETE fileiras, três por jogador mais a divisa, depois do rearranjo de 2026-08-02: de fora
   para dentro em cada metade — mão com as pilhas ao lado, terrenos com os outros permanentes,
   e criaturas encostadas no centro. É a seção 12 mantida (terreno na borda, o que luta voltado
   ao centro) com as criaturas separadas do resto do campo. */
/* `minmax(--fileira, 1fr)` e não `1fr` puro: `1fr` deixa a fileira encolher abaixo da carta
   (as zonas têm `min-height: 0`, que é o que desliga o mínimo automático do grid), e aí o
   terreno jogado transbordava por cima da fileira de baixo em janela curta. Com o piso, quem
   cede é a JANELA — o campo rola, que é para isso que ele tem `overflow: auto`. Visto em
   1000×620: a carta escapava da zona; com o piso, não escapa. */
.mesa-campo {
  /* +8px para a BARRA de rolagem: ela vive dentro da fileira, e sem esta folga ela comia a
     ponta de baixo das cartas — foi assim que a mão do oponente apareceu cortada. */
  --fileira: calc(var(--carta) + 1rem + 8px);
  grid-template-rows: auto minmax(var(--fileira), 1fr) minmax(var(--fileira), 1fr)
                      auto minmax(var(--fileira), 1fr) minmax(var(--fileira), 1fr) auto;
}

/* A metade do oponente é espelhada: as pilhas dele ficam do lado de FORA, que no topo é a
   esquerda — a mesma posição relativa que as minhas ocupam embaixo.
   E o espelho entra DENTRO do bloco, não para na borda dele: `row-reverse` inverte exílio,
   cemitério, biblioteca e crachá, de modo que o crachá dele encosta na quina de cima à
   esquerda como o meu encosta na de baixo à direita. Sem isso a metade de cima era a de baixo
   deslocada, e não o reflexo dela — as duas biblioteca ficavam do mesmo lado. */
.mesa-fila-mao.op { grid-template-columns: 1fr 2fr; }
.mesa-fila-mao.op > .mesa-pilhas { order: -1; flex-direction: row-reverse; }

/* `.mesa-pilha-info` saiu em 02/08/2026: as contagens viraram as próprias pilhas desenhadas,
   e a regra que ela carregava — o que não abre não se disfarça de botão — vive agora em
   `.mesa-pilha.inerte`. */

/* Caixa de marcar dentro de `.form-conta`, que empilha rótulo em cima do campo. Aqui o par é
   lado a lado — a caixa é pequena e o rótulo é a frase inteira, então empilhar deixaria um
   quadradinho órfão numa linha só. `align-items: start` porque a frase quebra em duas linhas
   em tela estreita e a caixa tem de ficar na primeira, não centrada no bloco. */
.form-conta .campo-caixa {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 0.6rem;
  align-items: start;
  font-size: var(--t--1);
  color: var(--texto-2);
  line-height: 1.5;
  margin: 0.2rem 0;
}
.form-conta .campo-caixa input { width: auto; margin: 0.2rem 0 0; }
