/* =========================================================================
   PlayCash — base visual compartilhada

   Esta folha é o vocabulário comum das quatro frentes de tela. Tudo que
   aparece em mais de uma tela mora aqui, com nome; o que é de uma tela só
   mora em css/telas/*.css, que carrega depois desta e vence no empate.

   Regras da casa:
   - Nenhum hex, nenhum rgba, nenhum nome de cor neste arquivo. Cor vem de
     tokens.css. Onde é preciso um véu translúcido, color-mix() em cima de um
     token resolve — assim o véu acompanha o tema sozinho.
   - color-mix() SÓ dentro de @supports, nunca solto. A regra base fica com um
     token sólido; o véu entra depois, no bloco @supports. Escrever as duas
     declarações na mesma regra não segura nada: a segunda tem var() dentro,
     o navegador antigo só descobre que não entende na hora de computar, e aí
     a propriedade cai para o valor inicial — fundo transparente, traço
     nenhum — em vez de voltar para a declaração de cima. Aparelho popular é
     o público: bloco sem fundo é bloco sumido.
   - Espaço, raio, tamanho de texto, peso, tempo e curva também vêm de token.
     px solto só onde não existe token (diâmetro de avatar, traço de 1px).
   - Azul é o chassi. Verde é dinheiro entrando. Vermelho é risco. Ouro é
     conquista. Saída de saldo NÃO é vermelha: sair para o Pix é bom.
   - Marca como TEXTO usa --marca-texto (no escuro --marca não passa AA como
     texto). Marca como PREENCHIMENTO usa --marca.
   ========================================================================= */

/* =============================================================== 1. RESET */

*,
*::before,
*::after {
  box-sizing: border-box;
  -webkit-tap-highlight-color: transparent;
}

/* Regra de autor com `display` vence o [hidden] do navegador. Sem esta linha
   o topo e a barra inferior aparecem na tela de entrada. Já aconteceu. */
[hidden] { display: none !important; }

html {
  -webkit-text-size-adjust: 100%;
  color-scheme: light dark;
}

body {
  margin: 0;
  background: var(--fundo);
  color: var(--texto);
  font-family: var(--fonte);
  font-size: var(--txt-corpo);
  line-height: var(--altura-normal);
  -webkit-font-smoothing: antialiased;
  overscroll-behavior-y: contain;
}

/* Nenhuma largura pode empurrar a página para os lados entre 320 e 430px.
   `clip` é o certo; `hidden` fica de rede para o celular velho que não conhece. */
body,
.app { max-width: 100%; overflow-x: hidden; overflow-x: clip; }

/* Enquanto modal ou folha está aberta, o fundo não rola. Quem liga e desliga
   é fx.js — a classe é do <body>, não de tela. */
body.sem-rolagem { overflow: hidden; }

h1, h2, h3, h4, p, figure, ul, ol { margin: 0; }
ul, ol { padding: 0; list-style: none; }

img, svg, canvas { max-width: 100%; }

button, input, select, textarea { font-family: inherit; }
button { color: inherit; }

a { color: var(--marca-texto); }

/* Quebra de palavra longa (e-mail, chave aleatória) em vez de rolagem lateral. */
p, span, strong, li, td, th, label { overflow-wrap: anywhere; }

/* ========================================================== 2. TIPOGRAFIA */

.h1 {
  font-size: var(--txt-titulo);
  font-weight: var(--peso-forte);
  letter-spacing: var(--letra-titulo);
  line-height: var(--altura-apertada);
}

.h2 {
  font-size: var(--txt-forte);
  font-weight: var(--peso-forte);
  line-height: var(--altura-apertada);
}

.h3 {
  font-size: var(--txt-corpo);
  font-weight: var(--peso-medio);
  line-height: var(--altura-apertada);
}

.destaque-titulo {
  font-size: var(--txt-destaque);
  font-weight: var(--peso-extra);
  letter-spacing: var(--letra-titulo);
  line-height: var(--altura-apertada);
}

.nota { color: var(--texto-fraco); font-size: var(--txt-nota); }
.nota-fraca { color: var(--texto-3); font-size: var(--txt-mini); }
.centro { text-align: center; }
.direita { text-align: right; }
.forte { font-weight: var(--peso-forte); }

/* Rótulo em caixa-alta: grupo de dia no extrato, título de bloco pequeno. */
.rotulo-caixa,
.grupo-dia {
  font-size: var(--txt-mini);
  font-weight: var(--peso-forte);
  text-transform: uppercase;
  letter-spacing: var(--letra-rotulo);
  color: var(--texto-fraco);
}

.grupo-dia { margin-top: var(--e-2); }

/* Todo número em R$ é tabular: sem isto o saldo dança na contagem, e saldo
   que dança parece saldo que muda sozinho. */
.valor,
.num,
.topo-saldo-valor,
.cartao-saldo-valor,
.valor-mais,
.valor-menos,
.ganho-total,
.selo-ganho,
.stat-valor,
.palco-tempo,
.linha-resumo strong,
.codigo,
.agregado-pct { font-variant-numeric: tabular-nums; }

.valor-grande {
  font-size: var(--txt-valor);
  font-weight: var(--peso-extra);
  line-height: var(--altura-apertada);
  letter-spacing: var(--letra-titulo);
  font-variant-numeric: tabular-nums;
}

.valor-mais { color: var(--verde); white-space: nowrap; }
/* Saída de saldo não é perda: o dinheiro foi para o Pix da própria pessoa. */
.valor-menos { color: var(--texto-fraco); white-space: nowrap; }

.link {
  background: none;
  border: 0;
  color: var(--marca-texto);
  font-weight: var(--peso-medio);
  font-size: var(--txt-nota);
  cursor: pointer;
  padding: var(--e-3) var(--e-2);
  margin: calc(var(--e-3) * -1) calc(var(--e-2) * -1);  /* alvo sem mexer no layout */
  min-height: var(--toque-min-compacto);
}

.link-perigo { color: var(--vermelho); }

.mono {
  font-family: var(--fonte-mono);
  letter-spacing: .04em;
}

/* =============================================================== 3. TOPO */

/* A BARRA É ESCURA, E ISSO É POR CAUSA DA MARCA.
   Ela era dourada, com um degradê de --marca para --marca-2, e funcionava
   enquanto a marca ali era um ícone de traço com o nome escrito ao lado — traço
   escuro sobre dourado se lê bem. A arte real da marca é OURO SOBRE PRETO: posta
   naquele fundo, a moeda dourada encostava no dourado da barra e desaparecia.
   Trocar a cor da barra é o que devolve o contraste que a marca foi desenhada
   para ter. O carvão quente daqui é o mesmo --superficie do resto do app, então
   a barra deixa de ser uma faixa de outra cor no alto e passa a ser o app. */
.topo {
  position: fixed;
  inset: 0 0 auto 0;
  z-index: 40;
  height: calc(var(--topo-h) + env(safe-area-inset-top));
  padding: env(safe-area-inset-top) var(--pad-tela) 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--e-3);
  background: linear-gradient(140deg, var(--barra-2) 0%, var(--barra) 100%);
  color: var(--sobre-barra);
  border-bottom: 1px solid var(--barra-borda);
  box-shadow: var(--sombra-topo);
}

/* A arte da marca, com o preto dela dissolvido.
   O arquivo é ouro sobre preto, e recortar o fundo à mão comeria o brilho que
   vaza da moeda — é justamente esse halo que faz a peça parecer metal. `screen`
   resolve os dois: preto sobre preto some, e o brilho continua brilhando. Só
   funciona porque a barra é escura; foi o que decidiu a cor dela acima. */
.topo-logo {
  height: 34px;
  width: auto;
  display: block;
  mix-blend-mode: screen;
}

/* É um <button> (volta para o início): zera o visual nativo e mantém o mesmo
   alvo de toque do saldo, do outro lado da barra. */
.topo-marca {
  display: flex;
  align-items: center;
  gap: var(--e-2);
  min-width: 0;
  background: none;
  border: 0;
  padding: 0;
  min-height: var(--toque-min-compacto);
  color: inherit;
  font: inherit;
  text-align: left;
  cursor: pointer;
  transition: transform var(--tempo-instante) var(--curva), opacity var(--tempo-instante) var(--curva);
}

.topo-marca:active { transform: scale(.97); opacity: .85; }

/* .topo-simbolo é o nome novo; .topo-cifrao fica pelo código que ainda usa. */
.topo-simbolo,
.topo-cifrao {
  display: grid;
  place-items: center;
  width: 32px;
  height: 32px;
  border-radius: var(--raio-p);
  background: var(--overlay);
  color: var(--sobre-marca);
  font-weight: var(--peso-extra);
  font-size: var(--txt-forte);
  flex: none;
}

@supports (color: color-mix(in srgb, transparent, transparent)) {
  .topo-simbolo,
  .topo-cifrao { background: color-mix(in srgb, var(--sobre-marca) 20%, transparent); }
}

/* Com a barra escura, a pílula do saldo e o sino ganham o dourado que a barra
   perdeu: eram vazados sobre ouro, e vazados sobre carvão sumiriam. O saldo é a
   única coisa desta barra que a pessoa procura — ele passa a ser o ponto de cor. */
.topo .topo-saldo {
  background: var(--marca);
  color: var(--sobre-marca);
  box-shadow: var(--sombra-marca);
}

.topo .topo-sino {
  background: var(--barra-2);
  color: var(--sobre-barra);
  border: 1px solid var(--barra-borda);
}

.topo-nome {
  font-weight: var(--peso-forte);
  font-size: var(--txt-corpo);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.topo-saldo {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  justify-content: center;
  background: var(--overlay);
  border: 0;
  border-radius: var(--raio-pill);
  padding: var(--e-1) var(--e-4);
  min-height: var(--toque-min-compacto);
  color: var(--sobre-marca);
  cursor: pointer;
  flex: none;
  transition: transform var(--tempo-instante) var(--curva);
}

@supports (color: color-mix(in srgb, transparent, transparent)) {
  .topo-saldo { background: color-mix(in srgb, var(--palco) 26%, transparent); }
}

.topo-saldo:active { transform: scale(.97); }

.topo-saldo-rotulo {
  font-size: var(--txt-micro);
  text-transform: uppercase;
  letter-spacing: var(--letra-rotulo);
  opacity: .85;
  line-height: var(--altura-apertada);
}

.topo-saldo-valor {
  font-size: var(--txt-corpo);
  font-weight: var(--peso-extra);
  line-height: var(--altura-apertada);
}

/* ---- a chamada do saque, no topo -----------------------------------------

   A SETA E A PALAVRA SÃO UMA COISA SÓ, e ficam na barra o app inteiro.

   O botão de sacar do 1.0 morava dentro do feed e acendia quando o mínimo
   chegava. Aqui ele é placa de estrada: aponta para o destino desde o primeiro
   segundo, quando ainda faltam três etapas para lá. O que muda quando o mínimo
   é alcançado não é a presença — é o brilho (ver .topo-sacar-liberado).

   A seta corre NO SENTIDO DA LEITURA e termina na palavra. Ela não recebe
   toque: quem chama não pode ficar na frente de quem atende. */

.topo-chamada {
  display: flex;
  align-items: center;
  gap: 2px;
  flex: none;
  min-width: 0;
}

/* 135° é a volta exata que põe a arte na horizontal: o desenho aponta para cima
   e para a esquerda, e um quarto de volta e meia leva a ponta para a direita.
   (O pop-up do saque usa 180° na mesma imagem, e por isso a dele desce.)

   ELA ENCOSTA NA PALAVRA, e as duas coisas que fazem isso acontecer são o
   tamanho e a margem negativa. Uma imagem girada 45° ocupa uma caixa muito
   maior que o próprio desenho — a ponta da seta fica no meio da borda direita
   dessa caixa, com um vão de ar depois dela. A margem come esse vão e leva a
   ponta até a pílula; sem ela, a seta aponta para um espaço vazio a três dedos
   do alvo. */
.topo-seta {
  width: 74px;
  height: auto;
  margin-right: -16px;
  transform: rotate(135deg);
  pointer-events: none;
  filter: drop-shadow(0 3px 8px rgba(0, 0, 0, .45));
  /* O empurrão horizontal é o que faz a seta PARECER apontar em vez de estar
     desenhada ali. Ele mexe só na seta — o alvo do dedo fica parado. */
  animation: seta-aponta 1.5s cubic-bezier(.4, 0, .2, 1) infinite;
}

@keyframes seta-aponta {
  0%, 100% { transform: rotate(135deg) translate(0, 0); }
  55%      { transform: rotate(135deg) translate(-9px, 9px); }
}

/* NA TELA DE SAQUE A SETA SAI DE CENA.
   Ela é uma placa de estrada, e placa de estrada dentro do destino é ruído: a
   pessoa já chegou. A palavra continua ali — é por ela que se volta ao saque de
   qualquer outra tela —, mas sem o dedo apontado e sem o pulso. */
.topo-no-saque .topo-seta { display: none; }
.topo-no-saque .topo-sacar { animation: none; box-shadow: none; }

/* A palavra. Pílula VERDE, e não na cor da marca: o saldo ao lado já é a pílula
   da marca, e duas pílulas iguais na mesma barra viram uma peça só. Verde é a
   cor do dinheiro que entra no app inteiro, e é dela que sai o anel de
   `.pulsa-chamando`. */
.topo-sacar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: var(--toque-min-compacto);
  padding: 0 var(--e-4);
  border: 0;
  border-radius: var(--raio-pill);
  background: var(--verde-cheio);
  color: #fff;
  font: inherit;
  font-weight: var(--peso-extra);
  font-size: var(--txt-corpo);
  letter-spacing: var(--letra-titulo);
  cursor: pointer;
  flex: none;
  transition: transform var(--tempo-instante) var(--curva);
}

.topo-sacar:active { transform: scale(.96); }

/* Com o mínimo alcançado o botão não muda de lugar nem de tamanho — muda de
   intensidade. É o degrau que impede o pulso de virar cenário: se antes e
   depois pulsassem igual, o pulso deixaria de dizer alguma coisa. */
.topo-sacar-liberado {
  animation-duration: .95s;
  box-shadow: 0 0 0 0 rgba(45, 212, 122, .9);
}

/* Barra estreita: a seta encolhe antes de qualquer coisa sumir. A palavra é o
   destino e o saldo é o motivo — os dois ficam. */
@media (max-width: 359px) {
  .topo-seta { width: 38px; }
  .topo-sacar { padding: 0 var(--e-3); }
}

.topo-acoes { display: flex; align-items: center; gap: var(--e-2); flex: none; }

/* Sino do topo: o pontinho só aparece com .tem-aviso. */
.topo-sino {
  position: relative;
  display: grid;
  place-items: center;
  width: var(--toque-min-compacto);
  height: var(--toque-min-compacto);
  border: 0;
  border-radius: 50%;
  background: var(--overlay);
  color: var(--sobre-marca);
  cursor: pointer;
  flex: none;
}

@supports (color: color-mix(in srgb, transparent, transparent)) {
  .topo-sino { background: color-mix(in srgb, var(--sobre-marca) 16%, transparent); }
}

.topo-sino.tem-aviso::after {
  content: "";
  position: absolute;
  top: 10px;
  right: 11px;
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: var(--amarelo);
  box-shadow: 0 0 0 2px var(--marca);
}

/* ============================================================= 4. LAYOUT */

.app {
  max-width: var(--largura);
  margin: 0 auto;
  padding:
    calc(var(--topo-h) + env(safe-area-inset-top) + var(--e-4))
    var(--pad-tela)
    calc(var(--nav-h) + env(safe-area-inset-bottom) + var(--e-6));
}

/* Sem topo e sem barra (tela de entrada) o respiro volta ao normal. */
.topo[hidden] ~ .app { padding-top: 0; padding-bottom: var(--e-7); }

.tela { display: flex; flex-direction: column; gap: var(--e-4); }
.bloco { display: flex; flex-direction: column; gap: var(--e-3); }
.bloco-topo { display: flex; align-items: center; justify-content: space-between; gap: var(--e-2); }
.lista { display: flex; flex-direction: column; gap: var(--e-3); }
.lista-junta { display: flex; flex-direction: column; gap: var(--e-2); }
.saudacao { display: flex; flex-direction: column; gap: var(--e-1); }

.linha { display: flex; align-items: center; gap: var(--e-3); }
.linha-entre { display: flex; align-items: center; justify-content: space-between; gap: var(--e-3); }
.coluna { display: flex; flex-direction: column; gap: var(--e-2); }
.cresce { flex: 1; min-width: 0; }
.fixo { flex: none; }
.empurra { margin-left: auto; }

.grade-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--e-3); }
.grade-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--e-2); }
.grade-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--e-2); }
.grade-atalhos { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--e-3); }
.grade-stats { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--e-3); }

.separador { border: 0; border-top: 1px solid var(--borda); margin: var(--e-1) 0; width: 100%; }

/* Rolagem horizontal contida: só o trilho rola, a página nunca. */
.rolagem-h {
  display: flex;
  gap: var(--e-2);
  overflow-x: auto;
  padding-bottom: var(--e-1);
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}

.rolagem-h::-webkit-scrollbar { display: none; }

/* ============================================================= 5. BOTÕES */

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--e-2);
  font-weight: var(--peso-forte);
  font-size: var(--txt-corpo);
  line-height: var(--altura-apertada);
  padding: var(--e-3) var(--e-5);
  min-height: var(--toque-min);
  border: 2px solid transparent;
  border-radius: var(--raio-pill);
  background: none;
  color: var(--texto);
  cursor: pointer;
  text-align: center;
  transition:
    transform var(--tempo-instante) var(--curva),
    background var(--tempo-curto) var(--curva),
    border-color var(--tempo-curto) var(--curva),
    filter var(--tempo-curto) var(--curva);
}

.btn:active { transform: scale(.975); }

.btn-bloco { width: 100%; }
.btn-grande { padding: var(--e-4) var(--e-6); font-size: var(--txt-forte); min-height: 56px; }
.btn-pequeno { padding: var(--e-2) var(--e-4); font-size: var(--txt-nota); min-height: var(--toque-min-compacto); flex: none; }

.btn-primario {
  background: linear-gradient(140deg, var(--marca) 0%, var(--marca-2) 100%);
  color: var(--sobre-marca);
  box-shadow: var(--sombra-marca);
}

.btn-primario:active { filter: brightness(.94); }

/* Botão de dinheiro entrando (sacar, pegar). Verde só aqui — não vire enfeite. */
.btn-verde {
  background: var(--verde-cheio);
  color: var(--sobre-verde);
  box-shadow: var(--sombra-verde);
}

.btn-vazado { background: transparent; color: var(--texto); border-color: var(--borda-forte); }
.btn-vazado:active { background: var(--superficie-2); }

/* Secundário de catálogo: preenchimento sólido, mesmo porte do primário.
   É a alternativa que ANDA JUNTO da ação principal — "voltar" ao lado de
   "assistir" —, e para isso ela precisa do mesmo peso de bloco, só que muda.
   O vazado continua sendo o certo em diálogo e em ação de risco, onde a
   alternativa deve pesar MENOS. Dois papéis diferentes, dois botões. */
.btn-secundario { background: var(--superficie-3); color: var(--texto); }
.btn-secundario:active { background: var(--superficie-2); }

.btn-suave { background: var(--marca-suave); color: var(--marca-texto); }
.btn-suave:active { background: var(--marca-suave-2); }

/* `border: 0` porque `.btn-texto` também é usado SOZINHO, sem `.btn` ao lado —
   é o caso do "Continuar sem o bônus…" na folha do dobro. Sem `.btn` para
   zerar a borda, o botão saía com o contorno branco que o navegador desenha
   por padrão: uma caixa em volta de um link de texto. */
.btn-texto {
  background: none;
  border: 0;
  color: var(--texto-fraco);
  font-weight: var(--peso-medio);
  box-shadow: none;
}
.btn-texto:active { background: var(--superficie-2); }

.btn-perigo { background: transparent; color: var(--vermelho); border-color: var(--vermelho); }

.btn-desativado,
.btn:disabled {
  background: var(--superficie-3);
  color: var(--texto-3);
  border-color: transparent;
  box-shadow: none;
  filter: none;
  cursor: not-allowed;
}

.btn-desativado:active,
.btn:disabled:active { transform: none; filter: none; }

/* Botão redondo de ícone (voltar, fechar, copiar). */
.btn-icone {
  display: grid;
  place-items: center;
  width: var(--toque-min-compacto);
  height: var(--toque-min-compacto);
  padding: 0;
  border-radius: 50%;
  border: 1px solid var(--borda);
  background: var(--superficie);
  color: var(--texto);
  cursor: pointer;
  flex: none;
  transition: transform var(--tempo-instante) var(--curva), background var(--tempo-curto) var(--curva);
}

.btn-icone:active { transform: scale(.94); background: var(--superficie-2); }
.btn-icone-limpo { border-color: transparent; background: transparent; }

/* Par de botões lado a lado, sempre 50/50. */
.par-botoes { display: flex; gap: var(--e-3); }
.par-botoes > .btn { flex: 1; min-width: 0; }

.icone { flex: none; }
.icone-fraco { color: var(--texto-fraco); }
.icone-marca { color: var(--marca-texto); }
.icone-verde { color: var(--verde); }
.icone-alerta { color: var(--vermelho); }
.icone-ouro { color: var(--amarelo); }

/* Caixa de ícone: quadrado arredondado com tinta da própria cor. */
.icone-caixa {
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: var(--raio-p);
  background: var(--marca-suave);
  color: var(--marca-texto);
  flex: none;
}

.icone-caixa-verde { background: var(--verde-suave); color: var(--verde); }
.icone-caixa-ouro { background: var(--amarelo-suave); color: var(--alerta); }
.icone-caixa-vermelho { background: var(--vermelho-suave); color: var(--vermelho); }
.icone-caixa-neutro { background: var(--superficie-3); color: var(--texto-fraco); }

/* ============================================================ 6. CARTÕES */

.cartao {
  background: var(--superficie);
  border: 1px solid var(--borda);
  border-radius: var(--raio);
  padding: var(--e-4);
  display: flex;
  flex-direction: column;
  gap: var(--e-3);
  box-shadow: var(--sombra);
}

.cartao hr { border: 0; border-top: 1px solid var(--borda); margin: var(--e-1) 0; width: 100%; }

.cartao-plano { box-shadow: none; }
.cartao-suave { background: var(--superficie-2); box-shadow: none; }
.cartao-apertado { padding: var(--e-3); gap: var(--e-2); }
.cartao-grande { border-radius: var(--raio-g); padding: var(--e-5); }

/* Cartão que responde ao toque (é <button> ou tem onclick). */
.cartao-toque {
  width: 100%;
  text-align: left;
  color: var(--texto);
  cursor: pointer;
  transition: transform var(--tempo-instante) var(--curva);
}

.cartao-toque:active { transform: scale(.98); }

.cartao-marca {
  background: linear-gradient(140deg, var(--marca) 0%, var(--marca-2) 100%);
  color: var(--sobre-marca);
  border: 0;
  box-shadow: var(--sombra-marca);
}

/* O cartão de saldo: o maior número do app, sem concorrente na tela. */
.cartao-saldo {
  background: linear-gradient(140deg, var(--marca) 0%, var(--marca-2) 100%);
  color: var(--sobre-marca);
  border: 0;
  border-radius: var(--raio-g);
  padding: var(--e-5);
  display: flex;
  flex-direction: column;
  gap: var(--e-2);
  box-shadow: var(--sombra-marca-forte);
}

.cartao-saldo-rotulo {
  font-size: var(--txt-mini);
  text-transform: uppercase;
  letter-spacing: var(--letra-rotulo);
  opacity: .9;
}

.cartao-saldo-valor {
  font-size: var(--txt-valor);
  font-weight: var(--peso-extra);
  line-height: var(--altura-apertada);
  letter-spacing: var(--letra-titulo);
}

.cartao-saldo-nota { font-size: var(--txt-nota); opacity: .92; }
.cartao-saldo-linha { display: flex; flex-wrap: wrap; gap: var(--e-2); margin-top: var(--e-1); }
.cartao-saldo .barra { background: var(--overlay); }
.cartao-saldo .barra-fill { background: var(--sobre-marca); }
.cartao-saldo .btn-vazado { color: var(--sobre-marca); border-color: var(--sobre-marca); }

@supports (color: color-mix(in srgb, transparent, transparent)) {
  .cartao-saldo .barra { background: color-mix(in srgb, var(--sobre-marca) 28%, transparent); }
  .cartao-saldo .btn-vazado { border-color: color-mix(in srgb, var(--sobre-marca) 55%, transparent); }
}
.cartao-saldo .btn-primario {
  background: var(--sobre-marca);
  color: var(--marca);
  box-shadow: none;
}

/* Pílula pequena dentro de superfície de marca (sequência, nível). */
.mini {
  display: inline-flex;
  align-items: center;
  gap: var(--e-1);
  background: var(--overlay);
  border-radius: var(--raio-pill);
  padding: var(--e-1) var(--e-3);
  font-size: var(--txt-nota);
  font-weight: var(--peso-medio);
}

@supports (color: color-mix(in srgb, transparent, transparent)) {
  .mini { background: color-mix(in srgb, var(--palco) 26%, transparent); }
}

/* Bloco de destaque de fim de tarefa. */
.destaque {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--e-2);
  text-align: center;
  padding: var(--e-6) var(--e-4);
  background: var(--superficie);
  border: 1px solid var(--borda);
  border-radius: var(--raio-g);
  box-shadow: var(--sombra);
}

.destaque-ok {
  background: linear-gradient(140deg, var(--verde-suave), var(--superficie));
  border-color: var(--verde);
}

.destaque-icone { font-size: var(--txt-valor); line-height: 1; }
.ganho-total { font-size: var(--txt-destaque); font-weight: var(--peso-extra); color: var(--verde); }

/* Selo de resultado (bloco com moldura). */
.selo {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--e-1);
  padding: var(--e-6);
  border-radius: var(--raio-g);
  border: 2px solid var(--borda);
  background: var(--superficie);
  text-align: center;
}

.selo-icone { font-size: var(--txt-destaque); line-height: 1; }
.selo strong { font-size: var(--txt-forte); }
.selo-ganho { font-size: var(--txt-titulo); font-weight: var(--peso-extra); }

.selo.selo-ok { background: var(--verde-suave); border-color: var(--verde); color: var(--texto); }
.selo.selo-ok .selo-ganho { color: var(--verde); }
.selo.selo-erro { background: var(--vermelho-suave); border-color: var(--vermelho); color: var(--texto); }
.selo.selo-erro .selo-ganho { color: var(--texto); }

/* ===================================================== 7. LINHAS E ITENS */

/* Linha "rótulo à esquerda, valor à direita" — resumo, comprovante, confirmação. */
.linha-resumo {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--e-3);
  font-size: var(--txt-corpo);
}

.linha-resumo strong { text-align: right; }
.linha-resumo-forte { font-size: var(--txt-forte); font-weight: var(--peso-forte); }

/* Item de lista genérico: ícone, texto, valor. Serve para extrato, saque,
   ranking e qualquer lista futura. */
.item {
  display: flex;
  align-items: center;
  gap: var(--e-3);
  background: var(--superficie);
  border: 1px solid var(--borda);
  border-radius: var(--raio);
  padding: var(--e-3) var(--e-4);
  color: var(--texto);
  width: 100%;
  text-align: left;
  min-height: 56px;
}

.item-toque { cursor: pointer; transition: transform var(--tempo-instante) var(--curva); }
.item-toque:active { transform: scale(.98); }
.item-corpo { display: flex; flex-direction: column; gap: 2px; flex: 1; min-width: 0; }
.item-corpo strong { font-size: var(--txt-corpo); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.item-fim { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; flex: none; }
.item-desativado { opacity: .68; }

/* Linha de ação (perfil, preferências). */
.linha-acao {
  display: flex;
  align-items: center;
  gap: var(--e-3);
  background: var(--superficie);
  border: 1px solid var(--borda);
  border-radius: var(--raio);
  padding: var(--e-3) var(--e-4);
  color: var(--texto);
  cursor: pointer;
  width: 100%;
  text-align: left;
  min-height: 56px;
  transition: transform var(--tempo-instante) var(--curva);
}

.linha-acao:active { transform: scale(.99); }

.linha-acao-icone {
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: var(--raio-p);
  background: var(--marca-suave);
  color: var(--marca-texto);
  flex: none;
}

.linha-acao-txt { display: flex; flex-direction: column; flex: 1; min-width: 0; }
.linha-acao-txt strong { font-size: var(--txt-corpo); }

/* Linha do extrato. */
.linha-extrato {
  display: flex;
  align-items: center;
  gap: var(--e-3);
  background: var(--superficie);
  border: 1px solid var(--borda);
  border-radius: var(--raio);
  padding: var(--e-3) var(--e-4);
}

.extrato-icone { font-size: var(--txt-forte); flex: none; }
.linha-extrato-info { display: flex; flex-direction: column; gap: 1px; flex: 1; min-width: 0; }
.linha-extrato-info span:first-child {
  font-size: var(--txt-corpo);
  font-weight: var(--peso-medio);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Cartão de item com ícone grande (missão, saque, prêmio). */
.cartao-item {
  display: flex;
  align-items: center;
  gap: var(--e-3);
  background: var(--superficie);
  border: 1px solid var(--borda);
  border-radius: var(--raio);
  padding: var(--e-4);
  box-shadow: var(--sombra);
}

.cartao-item.bloqueado { opacity: .68; }
.item-icone { font-size: var(--txt-destaque); flex: none; }
.item-info { display: flex; flex-direction: column; gap: 2px; flex: 1; min-width: 0; }
.item-info strong { font-size: var(--txt-corpo); }
.item-custo { color: var(--marca-texto); font-weight: var(--peso-extra); font-size: var(--txt-corpo); }

/* Missão. */
.missao {
  display: flex;
  align-items: center;
  gap: var(--e-3);
  background: var(--superficie);
  border: 1px solid var(--borda);
  border-radius: var(--raio);
  padding: var(--e-3) var(--e-4);
  box-shadow: var(--sombra);
}

.missao.completa { border-color: var(--verde); background: var(--verde-suave); }
.missao-info { display: flex; flex-direction: column; gap: var(--e-1); flex: 1; min-width: 0; }
.missao-info strong { font-size: var(--txt-corpo); }

/* Selo de missão cumprida: círculo verde sólido com o check branco.
   Escopado dentro de .missao para não brigar com o bloco .selo.selo-ok. */
.selo-check,
.missao .selo-ok {
  display: grid;
  place-items: center;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: var(--verde-cheio);
  color: var(--sobre-verde);
  border: 0;
  flex: none;
}

/* Pessoa em lista (ranking, feed de saques). */
.linha-pessoa {
  display: flex;
  align-items: center;
  gap: var(--e-3);
  background: var(--superficie);
  border: 1px solid var(--borda);
  border-radius: var(--raio);
  padding: var(--e-3) var(--e-4);
  min-height: 56px;
}

.linha-pessoa.voce { border-color: var(--marca); background: var(--marca-suave); }
.linha-pessoa-info { display: flex; flex-direction: column; gap: 1px; flex: 1; min-width: 0; }
.linha-pessoa-info strong { font-size: var(--txt-corpo); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.posicao {
  display: grid;
  place-items: center;
  min-width: 34px;
  height: 34px;
  padding: 0 var(--e-2);
  border-radius: var(--raio-pill);
  background: var(--superficie-3);
  color: var(--texto-fraco);
  font-size: var(--txt-nota);
  font-weight: var(--peso-extra);
  font-variant-numeric: tabular-nums;
  flex: none;
}

.posicao-ouro { background: var(--amarelo); color: var(--sobre-amarelo); }
.posicao-marca { background: var(--marca); color: var(--sobre-marca); }

/* Avatar. */
.avatar {
  display: grid;
  place-items: center;
  width: 74px;
  height: 74px;
  border-radius: 50%;
  background: linear-gradient(140deg, var(--marca), var(--marca-2));
  color: var(--sobre-marca);
  font-size: var(--txt-destaque);
  font-weight: var(--peso-extra);
  box-shadow: var(--sombra-marca);
  flex: none;
}

.avatar-p {
  width: 38px;
  height: 38px;
  font-size: var(--txt-corpo);
  box-shadow: none;
}

.avatar-neutro { background: var(--superficie-3); color: var(--texto-fraco); }

/* ============================================== 8. BARRAS E TRILHA DE ETAPAS */

.barra {
  background: var(--borda);
  border-radius: var(--raio-pill);
  height: 8px;
  overflow: hidden;
  width: 100%;
}

.barra.fina { height: 5px; }
.barra.grossa { height: 12px; }

.barra-fill {
  background: linear-gradient(90deg, var(--marca), var(--marca-2));
  height: 100%;
  border-radius: var(--raio-pill);
  transition: width var(--tempo-longo) var(--curva);
}

.barra-fill.verde { background: linear-gradient(90deg, var(--verde-cheio), var(--verde)); }
.barra-fill.ouro { background: linear-gradient(90deg, var(--alerta), var(--amarelo)); }

/* Passo "1 de 3" com etiqueta ao lado. */
.passo { display: flex; align-items: center; justify-content: space-between; gap: var(--e-3); }
.passo-txt { font-size: var(--txt-nota); font-weight: var(--peso-medio); color: var(--texto-fraco); }

/* Trilha de etapas (pedido feito → em análise → indo pro Pix → caiu). */
.trilha { display: flex; flex-direction: column; gap: 0; }

.trilha-passo {
  display: grid;
  grid-template-columns: 24px 1fr;
  gap: var(--e-3);
  align-items: start;
  padding-bottom: var(--e-4);
  position: relative;
  color: var(--texto-3);
}

.trilha-passo:last-child { padding-bottom: 0; }

/* O MARCADOR DE CADA PARADA É UM ÍCONE, e não mais um ponto.
   O ponto dizia só "aqui tem uma parada"; qual era o estado dela vinha da cor,
   e cor sozinha não é informação — quem não distingue verde de cinza lia quatro
   paradas iguais. Certo, relógio e aviso dizem o estado sem depender disso.
   O `::before` continua existindo como reserva para trilha desenhada sem ícone. */
.trilha-icone {
  grid-column: 1;
  display: grid;
  place-items: center;
  width: 24px;
  height: 24px;
  border-radius: 50%;
  background: var(--superficie-3);
  border: 2px solid var(--borda-forte);
  color: var(--texto-3);
  z-index: 1;
}

.trilha-passo:has(.trilha-icone)::before { display: none; }

.trilha-passo::before {
  content: "";
  grid-column: 1;
  width: 14px;
  height: 14px;
  margin: 4px 5px;
  border-radius: 50%;
  background: var(--superficie-3);
  border: 2px solid var(--borda-forte);
  z-index: 1;
}

/* O fio que liga um ponto ao próximo. */
.trilha-passo:not(:last-child)::after {
  content: "";
  position: absolute;
  left: 11px;
  top: 26px;   /* embaixo do marcador de 24px, não no meio dele */
  bottom: 0;
  width: 2px;
  background: var(--borda);
}

.trilha-passo.feito { color: var(--texto-fraco); }
.trilha-passo.feito::before { background: var(--verde-cheio); border-color: var(--verde-cheio); }
.trilha-passo.feito:not(:last-child)::after { background: var(--verde-cheio); }

.trilha-passo.atual { color: var(--texto); font-weight: var(--peso-medio); }
.trilha-passo.atual::before { background: var(--marca); border-color: var(--marca); box-shadow: var(--anel-foco); }

.trilha-passo.feito .trilha-icone {
  background: var(--verde-cheio);
  border-color: var(--verde-cheio);
  color: var(--sobre-verde);
}

.trilha-passo.atual .trilha-icone {
  background: var(--marca);
  border-color: var(--marca);
  color: var(--sobre-marca);
  box-shadow: var(--anel-foco);
}

/* A parada em que o pedido parou. Vermelha e sem o fio verde descendo dela:
   o fio diz "e seguiu daqui", e daqui não seguiu. */
.trilha-passo.parou { color: var(--texto); font-weight: var(--peso-medio); }
.trilha-passo.parou .trilha-icone {
  background: var(--vermelho-cheio);
  border-color: var(--vermelho-cheio);
  color: var(--sobre-vermelho);
}
.trilha-passo.parou .trilha-nota { color: var(--vermelho); }
.trilha-passo.parou:not(:last-child)::after { background: var(--borda); }

.trilha-rotulo { font-size: var(--txt-corpo); line-height: var(--altura-apertada); }
.trilha-nota { font-size: var(--txt-nota); color: var(--texto-3); }

/* ==================================================== 9. ETIQUETAS E CHIPS */

.etiqueta {
  display: inline-flex;
  align-items: center;
  gap: var(--e-1);
  background: var(--marca-suave);
  color: var(--marca-texto);
  border-radius: var(--raio-pill);
  padding: var(--e-1) var(--e-3);
  font-size: var(--txt-mini);
  font-weight: var(--peso-forte);
  white-space: nowrap;
}

.etiqueta-verde { background: var(--verde-suave); color: var(--verde); }
.etiqueta-ouro { background: var(--amarelo-suave); color: var(--alerta); }
.etiqueta-vermelha { background: var(--vermelho-suave); color: var(--vermelho); }
.etiqueta-neutra { background: var(--superficie-3); color: var(--texto-fraco); }
.etiqueta-cheia { background: var(--verde-cheio); color: var(--sobre-verde); }
.etiqueta-nivel { background: var(--superficie); border: 1px solid var(--borda); color: var(--texto); }

.chips {
  display: flex;
  gap: var(--e-2);
  overflow-x: auto;
  padding-bottom: var(--e-1);
  scrollbar-width: none;
}

.chips::-webkit-scrollbar { display: none; }

.chip {
  background: var(--superficie);
  border: 1px solid var(--borda);
  border-radius: var(--raio-pill);
  padding: var(--e-2) var(--e-4);
  font-size: var(--txt-nota);
  font-weight: var(--peso-medio);
  color: var(--texto-fraco);
  white-space: nowrap;
  cursor: pointer;
  flex: none;
  min-height: var(--toque-min-compacto);
  display: inline-flex;
  align-items: center;
  gap: var(--e-1);
  transition: background var(--tempo-curto) var(--curva), color var(--tempo-curto) var(--curva), border-color var(--tempo-curto) var(--curva);
}

.chip.ativo { background: var(--marca); border-color: var(--marca); color: var(--sobre-marca); }
.chip:disabled { opacity: .5; cursor: not-allowed; }

/* Chip de valor (atalhos R$ 20 · R$ 50 · Tudo). */
.chip-valor { font-weight: var(--peso-forte); font-variant-numeric: tabular-nums; color: var(--texto); }

/* ====================================================== 10. FORMULÁRIOS */

.form { display: flex; flex-direction: column; gap: var(--e-2); }
.campo-grupo { display: flex; flex-direction: column; gap: var(--e-1); }

.rotulo {
  font-size: var(--txt-nota);
  font-weight: var(--peso-medio);
  color: var(--texto-fraco);
  margin-top: var(--e-1);
}

.campo {
  font: inherit;
  font-size: 16px;                 /* abaixo de 16px o iOS dá zoom ao focar */
  padding: var(--e-4);
  border-radius: var(--raio);
  border: 1.5px solid var(--borda);
  background: var(--superficie);
  color: var(--texto);
  width: 100%;
  min-height: var(--toque-min);
  transition: border-color var(--tempo-curto) var(--curva), box-shadow var(--tempo-curto) var(--curva);
}

.campo::placeholder { color: var(--texto-3); }
.campo:focus { outline: none; border-color: var(--marca); box-shadow: var(--anel-foco); }
.campo:disabled { background: var(--superficie-2); color: var(--texto-3); cursor: not-allowed; }
.campo.invalido { border-color: var(--vermelho); }
.campo.invalido:focus { box-shadow: 0 0 0 3.5px var(--vermelho-suave); }

/* Campo de dinheiro: número grande, tabular, alinhado com o teclado numérico. */
.campo-moeda {
  font-size: var(--txt-destaque);
  font-weight: var(--peso-extra);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--letra-titulo);
  text-align: center;
  padding: var(--e-5) var(--e-4);
}

/* Campo com ícone à esquerda. */
.campo-com-icone { position: relative; display: flex; align-items: center; }
.campo-com-icone .icone { position: absolute; left: var(--e-4); color: var(--texto-fraco); pointer-events: none; }
.campo-com-icone .campo { padding-left: calc(var(--e-4) * 2 + var(--e-6)); }

/* O +55 do celular: parte da moldura, não do que se digita.
   Fica dentro da mesma borda do campo para ler como um número só, e o foco
   acende a borda do conjunto — não do input sozinho, que deixaria o prefixo
   apagado do lado de fora do anel. */
.campo-com-pais {
  display: flex;
  align-items: stretch;
  border: 1.5px solid var(--borda);
  border-radius: var(--raio);
  background: var(--superficie);
  overflow: hidden;
  transition: border-color var(--tempo-curto) var(--curva), box-shadow var(--tempo-curto) var(--curva);
}

.campo-com-pais:focus-within {
  border-color: var(--marca);
  box-shadow: var(--anel-foco);
}

.campo-pais {
  display: grid;
  place-items: center;
  padding-inline: var(--e-4);
  font-size: 16px;
  font-variant-numeric: tabular-nums;
  color: var(--texto-2);
  background: var(--superficie-2);
  border-right: 1.5px solid var(--borda);
  user-select: none;
  flex: none;
}

/* O input perde a própria moldura: quem desenha a caixa agora é o pai. */
.campo-com-pais .campo-fone {
  border: none;
  border-radius: 0;
  background: transparent;
  font-variant-numeric: tabular-nums;
  /* Um dígito não muda de largura ao ser digitado, então o campo não "anda". */
  letter-spacing: .02em;
}

.campo-com-pais .campo-fone:focus { box-shadow: none; }

/* Campo inválido pinta o conjunto, senão a borda vermelha some atrás do pai. */
.campo-com-pais:has(.invalido) { border-color: var(--perigo, #e5484d); }

.erro-campo {
  color: var(--vermelho);
  font-size: var(--txt-nota);
  font-weight: var(--peso-medio);
  padding-left: 2px;
}

.ajuda-campo { color: var(--texto-fraco); font-size: var(--txt-nota); padding-left: 2px; }

/* Segmentado: escolha de uma opção entre poucas (CPF · Telefone · E-mail…). */
.segmentado {
  display: flex;
  gap: var(--e-1);
  background: var(--superficie-2);
  border: 1px solid var(--borda);
  border-radius: var(--raio-pill);
  padding: var(--e-1);
}

.segmentado-item {
  flex: 1;
  min-width: 0;
  min-height: var(--toque-min-compacto);
  border: 0;
  border-radius: var(--raio-pill);
  background: none;
  color: var(--texto-fraco);
  font-size: var(--txt-nota);
  font-weight: var(--peso-medio);
  cursor: pointer;
  padding: var(--e-2) var(--e-1);
  transition: background var(--tempo-curto) var(--curva), color var(--tempo-curto) var(--curva);
}

.segmentado-item.ativo { background: var(--superficie); color: var(--texto); box-shadow: var(--sombra); font-weight: var(--peso-forte); }

/* Interruptor (preferências). */
.interruptor {
  position: relative;
  width: 50px;
  height: 30px;
  border-radius: var(--raio-pill);
  background: var(--borda-forte);
  border: 0;
  cursor: pointer;
  flex: none;
  transition: background var(--tempo-curto) var(--curva);
}

.interruptor::after {
  content: "";
  position: absolute;
  top: 3px;
  left: 3px;
  width: 24px;
  height: 24px;
  border-radius: 50%;
  background: var(--superficie);
  box-shadow: var(--sombra);
  transition: transform var(--tempo-curto) var(--curva);
}

.interruptor.ativo { background: var(--verde-cheio); }
.interruptor.ativo::after { transform: translateX(20px); }

/* Código copiável (chave Pix, id do comprovante). */
.codigo {
  font-family: var(--fonte-mono);
  background: var(--superficie-2);
  border: 1px dashed var(--borda-forte);
  border-radius: var(--raio-p);
  padding: var(--e-1) var(--e-2);
  font-size: var(--txt-nota);
  font-weight: var(--peso-forte);
  letter-spacing: .06em;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.codigo-grande {
  display: block;
  text-align: center;
  font-size: var(--txt-titulo);
  padding: var(--e-4);
  letter-spacing: .1em;
  white-space: normal;
}

/* ================================================ 11. AVISOS E ESTADO VAZIO */

.aviso-suave {
  background: var(--marca-suave);
  border-left: 3px solid var(--marca);
  border-radius: var(--raio-p);
  padding: var(--e-3);
  font-size: var(--txt-nota);
  color: var(--texto);
}

.aviso-ok { background: var(--verde-suave); border-left-color: var(--verde-cheio); }
.aviso-ouro { background: var(--amarelo-suave); border-left-color: var(--amarelo); }
.aviso-erro { background: var(--vermelho-suave); border-left-color: var(--vermelho-cheio); }

/* Faixa de informação no topo de uma lista. */
.faixa-info {
  display: flex;
  align-items: center;
  gap: var(--e-2);
  background: var(--superficie);
  border: 1px solid var(--borda);
  border-radius: var(--raio);
  padding: var(--e-3) var(--e-4);
  font-size: var(--txt-nota);
  color: var(--texto-fraco);
}

.faixa-info strong { color: var(--texto); }

.vazio {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--e-3);
  text-align: center;
  padding: var(--e-8) var(--e-5);
  background: var(--superficie);
  border: 1px dashed var(--borda-forte);
  border-radius: var(--raio);
}

.vazio-icone { font-size: var(--txt-destaque); color: var(--texto-3); }

/* ======================================================== 12. ESQUELETO */

.esqueleto {
  background: linear-gradient(
    90deg,
    var(--superficie-2) 25%,
    var(--superficie-3) 37%,
    var(--superficie-2) 63%
  );
  background-size: 400% 100%;
  border-radius: var(--raio-p);
  animation: esqueleto-onda 1.4s ease-in-out infinite;
}

.esqueleto-linha { height: 14px; width: 100%; }
.esqueleto-linha.curta { width: 42%; }
.esqueleto-linha.media { width: 68%; }
.esqueleto-titulo { height: 22px; width: 55%; border-radius: var(--raio-p); }
.esqueleto-circulo { width: 40px; height: 40px; border-radius: 50%; flex: none; }
.esqueleto-bloco { height: 56px; width: 100%; border-radius: var(--raio); }

.esqueleto-cartao {
  display: flex;
  align-items: center;
  gap: var(--e-3);
  background: var(--superficie);
  border: 1px solid var(--borda);
  border-radius: var(--raio);
  padding: var(--e-3) var(--e-4);
  min-height: 56px;
}

.esqueleto-cartao-corpo { display: flex; flex-direction: column; gap: var(--e-2); flex: 1; min-width: 0; }
.esqueleto-lista { display: flex; flex-direction: column; gap: var(--e-3); }

@keyframes esqueleto-onda {
  from { background-position: 100% 0; }
  to { background-position: -100% 0; }
}

/* =========================================================== 13. NAVEGAÇÃO */

.nav {
  position: fixed;
  inset: auto 0 0 0;
  z-index: 40;
  display: flex;
  justify-content: space-around;
  gap: 2px;
  height: calc(var(--nav-h) + env(safe-area-inset-bottom));
  padding: 0 var(--e-1) env(safe-area-inset-bottom);
  background: var(--superficie);
  border-top: 1px solid var(--borda);
  box-shadow: var(--sombra-nav);
}

.nav-item {
  position: relative;
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 2px;
  background: none;
  border: 0;
  color: var(--texto-fraco);
  cursor: pointer;
  padding: var(--e-2) 2px;
  min-width: 0;
  min-height: var(--toque-min-compacto);
  transition: color var(--tempo-curto) var(--curva);
}

.nav-rotulo { font-size: var(--txt-micro); font-weight: var(--peso-forte); letter-spacing: -.01em; }
.nav-item.ativo { color: var(--marca-texto); }
.nav-item .icone { transition: transform var(--tempo-curto) var(--curva); }
.nav-item.ativo .icone { transform: translateY(-1px) scale(1.06); }

/* Pontinho de aviso numa aba. */
.nav-item .ponto {
  position: absolute;
  transform: translate(12px, -10px);
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--amarelo);
}

/* =============================================================== 14. TOAST */

.pilha-toast {
  position: fixed;
  left: 50%;
  bottom: calc(var(--nav-h) + env(safe-area-inset-bottom) + var(--e-3));
  transform: translateX(-50%);
  z-index: 60;
  display: flex;
  flex-direction: column;
  gap: var(--e-2);
  width: min(92vw, var(--largura));
  pointer-events: none;
}

.toast {
  display: flex;
  align-items: center;
  gap: var(--e-2);
  background: var(--toast-fundo);
  color: var(--sobre-toast);
  border-radius: var(--raio);
  padding: var(--e-3) var(--e-4);
  font-size: var(--txt-nota);
  font-weight: var(--peso-medio);
  box-shadow: var(--sombra-alta);
  opacity: 0;
  transform: translateY(14px);
  transition: opacity var(--tempo-curto) var(--curva), transform var(--tempo-curto) var(--curva);
  pointer-events: auto;
}

.toast.visivel { opacity: 1; transform: none; }
.toast-ok { background: var(--verde-cheio); color: var(--sobre-verde); }
.toast-erro { background: var(--vermelho-cheio); color: var(--sobre-vermelho); }
.toast-icone { font-size: var(--txt-forte); flex: none; }

/* ================================================== 15. MODAL E FOLHA */

.modal-fundo,
.folha-fundo {
  position: fixed;
  inset: 0;
  z-index: 70;
  background: var(--overlay);
  opacity: 0;
  transition: opacity var(--tempo-curto) var(--curva);
}

.modal-fundo {
  display: grid;
  place-items: end center;
  padding: var(--pad-tela);
  padding-bottom: calc(var(--pad-tela) + env(safe-area-inset-bottom));
  overflow-y: auto;
}

.modal-fundo.visivel,
.folha-fundo.visivel { opacity: 1; }

.modal {
  position: relative;
  background: var(--superficie);
  border-radius: var(--raio-g);
  padding: var(--e-6) var(--e-5) var(--e-5);
  width: min(100%, var(--largura));
  display: flex;
  flex-direction: column;
  gap: var(--e-3);
  box-shadow: var(--sombra-alta);
  transform: translateY(24px);
  transition: transform var(--tempo-medio) var(--curva);
  margin: auto 0 0;
}

.modal-fundo.visivel .modal { transform: none; }

.modal-fechar {
  position: absolute;
  top: var(--e-2);
  right: var(--e-3);
  display: grid;
  place-items: center;
  width: 36px;
  height: 36px;
  border: 0;
  border-radius: 50%;
  background: var(--superficie-2);
  color: var(--texto-fraco);
  font-size: var(--txt-titulo);
  line-height: 1;
  cursor: pointer;
}

.modal-acoes { display: flex; gap: var(--e-3); margin-top: var(--e-1); }
.modal-acoes .btn { flex: 1; min-width: 0; }
.modal-acoes.coluna { flex-direction: column; }

/* Com um botão só, `flex: 1` o esticaria de ponta a ponta da folha e ele
   deixaria de parecer botão — vira uma faixa. Largura própria e centralizado. */
.modal-acoes-uma { justify-content: center; }
.modal-acoes-uma .btn { flex: 0 1 auto; min-width: 60%; }

/* O botão que virou link continua sendo botão para o olho: `<a class="btn">`
   herda a caixa, mas não o alinhamento do texto nem a altura de linha, que num
   `<a>` vêm do texto e não do controle. */
a.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  text-decoration: none;
}
.modal-premio { align-items: center; text-align: center; }
.modal-premio .h2 { font-size: var(--txt-titulo); }

/* Folha inferior deslizante: lista longa, filtro, escolha rápida. */
.folha-fundo { display: flex; align-items: flex-end; justify-content: center; }

.folha {
  position: relative;
  width: min(100%, var(--largura));
  max-height: 88vh;
  max-height: 88dvh;
  display: flex;
  flex-direction: column;
  background: var(--superficie);
  border-radius: var(--raio-g) var(--raio-g) 0 0;
  box-shadow: var(--sombra-alta);
  padding-bottom: env(safe-area-inset-bottom);
  transform: translateY(100%);
  transition: transform var(--tempo-medio) var(--curva);
  touch-action: none;
}

.folha-fundo.visivel .folha { transform: none; }
.folha.arrastando { transition: none; }

/* 44px aqui é o COMPRIMENTO DO RISCO, não alvo de toque — por isso fica em px
   e não em var(--toque-min-compacto). Fechar a folha tem alvo de tamanho
   inteiro no × da cabeça, além do fundo, do Esc e do arrasto. */
.folha-alca {
  width: 44px;
  height: 5px;
  border-radius: var(--raio-pill);
  background: var(--borda-forte);
  margin: var(--e-3) auto var(--e-1);
  flex: none;
}

.folha-cabeca {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--e-3);
  padding: var(--e-2) var(--e-5) var(--e-3);
  flex: none;
}

.folha-corpo {
  display: flex;
  flex-direction: column;
  gap: var(--e-3);
  padding: 0 var(--e-5) var(--e-5);
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  touch-action: pan-y;
}

.folha-acoes {
  display: flex;
  gap: var(--e-3);
  padding: var(--e-3) var(--e-5) var(--e-5);
  border-top: 1px solid var(--borda);
  flex: none;
}

.folha-acoes .btn { flex: 1; min-width: 0; }

/* Em tela alta e larga o modal vai para o centro. A folha continua no rodapé. */
@media (min-height: 620px) and (min-width: 480px) {
  .modal-fundo { place-items: center; }
  .modal { margin: 0; }
}

/* ========================================================== 16. CONFETE */

.confete { position: fixed; inset: 0; z-index: 65; pointer-events: none; }

/* ======================================================== 17. ANIMAÇÕES */

.entra { animation: entra var(--tempo-medio) var(--curva) both; }
.surge { animation: surge var(--tempo-medio) var(--curva) both; animation-delay: var(--atraso, 0ms); }
.brilho { animation: brilho 2.4s ease-in-out infinite; }
.flutua { animation: flutua 3.2s ease-in-out infinite; }

/* Pulso do saldo: a única coisa do app que tem permissão de comemorar. */
.pulsa { animation: pulsa var(--tempo-longo) var(--curva-mola); }

@keyframes entra {
  from { opacity: 0; transform: translateY(10px); }
  to { opacity: 1; transform: none; }
}

@keyframes surge {
  from { opacity: 0; transform: translateX(-10px); }
  to { opacity: 1; transform: none; }
}

@keyframes pulsa {
  0% { transform: scale(1); }
  35% { transform: scale(1.12); }
  100% { transform: scale(1); }
}

@keyframes brilho {
  0%, 100% { transform: scale(1) rotate(0); }
  50% { transform: scale(1.18) rotate(-8deg); }
}

@keyframes flutua {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-7px); }
}

@keyframes respira {
  0%, 100% { opacity: .45; }
  50% { opacity: .78; }
}

/* Quem pediu menos movimento recebe menos movimento — os tokens de tempo já
   caem para .01ms em tokens.css; aqui morrem os laços infinitos. */
@media (prefers-reduced-motion: reduce) {
  .entra, .surge, .pulsa, .brilho, .flutua, .esqueleto, .opcao,
  .palco.tocando .palco-fundo { animation: none !important; }
  * { transition-duration: .01ms !important; }
}

/* ============================================== 18. TELA DE ENTRADA (base) */

.tela-login {
  min-height: 100vh;
  min-height: 100dvh;
  display: flex;
  flex-direction: column;
  gap: var(--e-5);
  justify-content: center;
  padding:
    calc(var(--e-7) + env(safe-area-inset-top))
    var(--e-5)
    calc(var(--e-7) + env(safe-area-inset-bottom));
  max-width: var(--largura);
  margin: 0 auto;
  background:
    radial-gradient(120% 60% at 50% 0%, var(--marca-suave) 0%, transparent 70%),
    var(--fundo);
}

.login-topo { display: flex; flex-direction: column; align-items: center; gap: var(--e-3); text-align: center; }

/* O símbolo da marca: mão em concha com a moeda de R$ dentro. */
.marca-simbolo,
.marca-cifrao {
  display: grid;
  place-items: center;
  width: 88px;
  height: 88px;
  border-radius: var(--raio-gg);
  background: linear-gradient(140deg, var(--marca) 0%, var(--marca-2) 100%);
  color: var(--sobre-marca);
  box-shadow: var(--sombra-marca-forte);
  flex: none;
}

.login-titulo {
  font-size: var(--txt-destaque);
  font-weight: var(--peso-extra);
  letter-spacing: var(--letra-titulo);
  line-height: var(--altura-apertada);
}

.login-sub { color: var(--texto-fraco); font-size: var(--txt-corpo); max-width: 30ch; }
.login-form { display: flex; flex-direction: column; gap: var(--e-2); }
.login-form .btn { margin-top: var(--e-2); }

.login-bonus {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--e-2);
  background: var(--superficie);
  border: 1px dashed var(--marca);
  border-radius: var(--raio);
  padding: var(--e-3);
  font-size: var(--txt-nota);
  text-align: center;
}

.login-bonus strong { color: var(--marca-texto); }

/* ================================================ 19. ATALHOS E TAREFAS */

.atalho {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 3px;
  background: var(--superficie);
  border: 1px solid var(--borda);
  border-left: 3px solid var(--cor-atalho, var(--marca));
  border-radius: var(--raio);
  padding: var(--e-4);
  text-align: left;
  color: var(--texto);
  cursor: pointer;
  box-shadow: var(--sombra);
  transition: transform var(--tempo-instante) var(--curva);
}

.atalho:active { transform: scale(.97); }
.atalho strong { font-size: var(--txt-corpo); }

.atalho-icone {
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: var(--raio-p);
  margin-bottom: var(--e-1);
  background: var(--superficie-3);
  color: var(--cor-atalho);
}

@supports (color: color-mix(in srgb, transparent, transparent)) {
  .atalho-icone { background: color-mix(in srgb, var(--cor-atalho) 14%, transparent); }
}

.pergunta {
  font-size: var(--txt-titulo);
  font-weight: var(--peso-forte);
  line-height: 1.3;
  margin-top: var(--e-1);
}

.opcoes { display: flex; flex-direction: column; gap: var(--e-3); }

.opcao {
  display: flex;
  align-items: center;
  gap: var(--e-3);
  font-size: var(--txt-corpo);
  font-weight: var(--peso-medio);
  text-align: left;
  padding: var(--e-4);
  min-height: 58px;
  background: var(--superficie);
  color: var(--texto);
  border: 2px solid var(--borda);
  border-radius: var(--raio);
  cursor: pointer;
  box-shadow: var(--sombra);
  transition:
    border-color var(--tempo-curto) var(--curva),
    background var(--tempo-curto) var(--curva),
    transform var(--tempo-instante) var(--curva);
  animation: surge var(--tempo-medio) var(--curva) both;
  animation-delay: var(--atraso, 0ms);
}

.opcao:active { transform: scale(.985); }

.opcao-marca {
  position: relative;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  border: 2px solid var(--borda-forte);
  flex: none;
  transition: border-color var(--tempo-curto) var(--curva), background var(--tempo-curto) var(--curva);
}

.opcao.escolhida { border-color: var(--marca); background: var(--marca-suave); }
.opcao.escolhida .opcao-marca { border-color: var(--marca); background: var(--marca); }

.opcao.escolhida .opcao-marca::after {
  content: "";
  position: absolute;
  inset: 5px 4px 6px 4px;
  border: solid var(--sobre-marca);
  border-width: 0 0 2px 2px;
  transform: rotate(-45deg);
}

.opcoes.travado .opcao { pointer-events: none; }
.opcoes.travado .opcao:not(.escolhida) { opacity: .5; }

/* Agregado de respostas. */
.agregado { display: flex; flex-direction: column; gap: var(--e-2); margin-top: var(--e-1); }
.linha-agregado { display: flex; align-items: center; gap: var(--e-2); font-size: var(--txt-nota); }
.agregado-rotulo {
  flex: 0 0 38%;
  color: var(--texto-fraco);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.agregado-pct { flex: 0 0 36px; text-align: right; font-weight: var(--peso-forte); }

/* ============================================================ 20. VÍDEOS */

.cartao-video {
  display: flex;
  align-items: center;
  gap: var(--e-3);
  background: var(--superficie);
  border: 1px solid var(--borda);
  border-radius: var(--raio);
  padding: var(--e-3);
  text-align: left;
  color: var(--texto);
  cursor: pointer;
  box-shadow: var(--sombra);
  transition: transform var(--tempo-instante) var(--curva);
  width: 100%;
}

.cartao-video:active { transform: scale(.98); }
.cartao-video.visto { opacity: .74; }

.video-capa {
  position: relative;
  display: grid;
  place-items: center;
  width: 76px;
  height: 58px;
  border-radius: var(--raio-p);
  background: var(--cor-video);
  color: var(--sobre-marca);
  flex: none;
}

.video-dur {
  position: absolute;
  right: 4px;
  bottom: 4px;
  background: var(--palco);
  border-radius: 5px;
  padding: 1px 5px;
  font-size: var(--txt-micro);
  font-weight: var(--peso-forte);
  color: var(--sobre-marca);
}

@supports (color: color-mix(in srgb, transparent, transparent)) {
  .video-capa { background: linear-gradient(140deg, var(--cor-video), color-mix(in srgb, var(--cor-video) 55%, var(--palco))); }
  .video-dur { background: color-mix(in srgb, var(--palco) 72%, transparent); }
}

.video-info { display: flex; flex-direction: column; gap: 3px; flex: 1; min-width: 0; }
.video-info strong { font-size: var(--txt-corpo); line-height: 1.25; }
.video-info .etiqueta { align-self: flex-start; }
.video-premio { display: flex; flex-direction: column; align-items: flex-end; flex: none; }
.video-premio strong { color: var(--verde); font-size: var(--txt-corpo); font-variant-numeric: tabular-nums; }

/* Palco do player. */
.palco {
  position: relative;
  display: grid;
  place-items: center;
  width: 100%;
  aspect-ratio: 16 / 11;
  border: 0;
  border-radius: var(--raio-g);
  overflow: hidden;
  cursor: pointer;
  padding: 0;
  background: var(--palco);
  box-shadow: var(--sombra-alta);
}

.palco-fundo {
  position: absolute;
  inset: 0;
  background: var(--cor-video);
  opacity: .55;
  transition: opacity var(--tempo-medio) var(--curva);
}

@supports (color: color-mix(in srgb, transparent, transparent)) {
  .palco-fundo { background: linear-gradient(140deg, var(--cor-video), color-mix(in srgb, var(--cor-video) 35%, var(--palco))); }
}

.palco.tocando .palco-fundo { animation: respira 3.4s ease-in-out infinite; }
.palco.concluido .palco-fundo { opacity: .9; animation: none; }

.anel { position: relative; width: 132px; height: 132px; transform: rotate(-90deg); }
/* O trilho não pode depender de color-mix: o <circle> nasce com stroke: none,
   e sem cor aqui o anel de progresso corre sozinho num vazio. */
.anel-trilho { fill: none; stroke: var(--borda-forte); stroke-width: 7; }

@supports (color: color-mix(in srgb, transparent, transparent)) {
  .anel-trilho { stroke: color-mix(in srgb, var(--sobre-marca) 22%, transparent); }
}

.anel-progresso {
  fill: none;
  stroke: var(--sobre-marca);
  stroke-width: 7;
  stroke-linecap: round;
  transition: stroke-dashoffset var(--tempo-curto) linear;
}

.palco-centro {
  position: absolute;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2px;
  color: var(--sobre-marca);
  text-align: center;
  padding: 0 var(--e-4);
}

.palco-tempo { font-size: var(--txt-destaque); font-weight: var(--peso-extra); line-height: var(--altura-apertada); }
.palco-legenda { font-size: var(--txt-nota); opacity: .9; }

/* ====================================================== 21. PERFIL E NÚMEROS */

.perfil-topo {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--e-2);
  text-align: center;
  padding: var(--e-2) 0 var(--e-1);
}

.stat {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1px;
  background: var(--superficie);
  border: 1px solid var(--borda);
  border-radius: var(--raio);
  padding: var(--e-4) var(--e-3);
  text-align: center;
}

.stat-icone { font-size: var(--txt-titulo); line-height: 1; }
.stat-valor { font-size: var(--txt-titulo); font-weight: var(--peso-extra); line-height: var(--altura-apertada); }

.rodape-nota {
  font-size: var(--txt-mini);
  line-height: var(--altura-normal);
  text-align: center;
  color: var(--texto-3);
  padding: var(--e-2) var(--e-3) 0;
}

/* ==================================================== 22. TELAS MAIORES */

@media (min-width: 560px) {
  .grade-atalhos { grid-template-columns: repeat(4, 1fr); }
  .grade-stats { grid-template-columns: repeat(4, 1fr); }
  .h1 { font-size: var(--txt-destaque); }
}

/* ============================================================== 23. FOCO */

:focus-visible {
  outline: 3px solid var(--marca-texto);
  outline-offset: 2px;
  border-radius: var(--raio-p);
}

/* Toque não deve deixar anel de foco preso depois do clique. */
:focus:not(:focus-visible) { outline: none; }

/* Avatares desenhados: a moldura some, o rosto é o próprio círculo. */
.avatar-rosto,
.cmt-avatar {
  background: none;
  padding: 0;
  overflow: hidden;
  display: grid;
  place-items: center;
}
.avatar-svg { display: block; border-radius: 50%; }

/* ==========================================================================
   AVISO DE CONEXÃO
   Barra fina, no alto, por cima de tudo. Não empurra o conteúdo — a tela que
   a pessoa está vendo continua onde estava, que é justamente o ponto: o app
   segurou a última tela em vez de mostrar erro.
   ========================================================================== */

.conexao {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 90;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  min-height: 34px;
  padding: calc(env(safe-area-inset-top, 0px) + 6px) 14px 6px;
  background: var(--ambar-suave);
  color: var(--ambar);
  font-size: 12.5px;
  font-weight: 600;
  transform: translateY(-100%);
  transition: transform 240ms var(--curva-saida, ease), background 200ms ease, color 200ms ease;
}

.conexao.visivel { transform: translateY(0); }

.conexao-bolha {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: currentColor;
  flex: none;
  animation: conexao-pulsa 1.6s ease-in-out infinite;
}

@keyframes conexao-pulsa {
  0%, 100% { opacity: 1; }
  50%      { opacity: .35; }
}

/* A volta usa o verde do app, e a bolha para de pulsar: acabou a espera. */
.conexao-voltou {
  background: var(--verde-suave);
  color: var(--verde);
}
.conexao-voltou .conexao-bolha { animation: none; }

@media (prefers-reduced-motion: reduce) {
  .conexao { transition: none; }
  .conexao-bolha { animation: none; }
}

/* ================================================ PUXAR PARA ATUALIZAR

   O indicador que desce com o dedo. Ele fica ACIMA do topo da tela e só entra
   no campo de visão enquanto o gesto acontece — parado, não ocupa lugar
   nenhum. */

.puxar {
  position: absolute;
  top: -52px;
  left: 50%;
  margin-left: -20px;
  z-index: 30;
  opacity: 0;
  pointer-events: none;
  transition: transform var(--tempo-curto) var(--curva), opacity var(--tempo-curto) var(--curva);
}

.puxar-disco {
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: var(--superficie-2);
  border: 1px solid var(--borda);
  color: var(--texto-fraco);
  box-shadow: var(--sombra);
}

/* Passou do ponto de soltar: o disco acende e a seta vira meia volta, apontando
   para cima — o desenho passa a dizer "solta" em vez de "puxa". */
.puxar-pronto .puxar-disco {
  background: var(--marca);
  border-color: var(--marca);
  color: var(--sobre-marca);
}

.puxar-pronto .icone { transform: rotate(180deg); }
.puxar-disco .icone { transition: transform var(--tempo-curto) var(--curva); }

.puxar-girando .puxar-disco {
  background: var(--marca);
  border-color: var(--marca);
  color: var(--sobre-marca);
  animation: puxar-gira 700ms linear infinite;
}

@keyframes puxar-gira { to { transform: rotate(360deg); } }

@media (prefers-reduced-motion: reduce) {
  .puxar-girando .puxar-disco { animation: none; }
}

/* ---- o pulso dos botões que chamam ------------------------------------
   Dois botões usam: o "Quero sacar agora" do aviso de saque liberado e o
   "Sacar Agora" da recusa. Os dois aparecem no instante em que a pessoa
   precisa decidir, e os dois competem com uma tela cheia de outras coisas.

   POR QUE NÃO É UM HALO ATRÁS. Era, e não se via: 4px de sobra, na mesma cor
   do botão, com opacidade baixa sobre fundo escuro. A animação rodava —
   medida, a 0.42 de opacidade — e o olho não pegava nada. Um anel que cresce
   PARA FORA e some é a forma que se lê de longe.

   O ALVO NÃO SE MEXE. `box-shadow` não ocupa espaço e `filter` não desloca:
   o botão fica parado no lugar enquanto chama. Alvo que muda de tamanho
   escapa do dedo — foi o defeito do botão de sacar do feed, e não volta. */
.pulsa-chamando {
  position: relative;
  animation: pulso-anel 1.5s cubic-bezier(.4, 0, .2, 1) infinite;
}

@keyframes pulso-anel {
  0% {
    box-shadow: 0 0 0 0 rgba(45, 212, 122, .70), var(--sombra-verde, 0 0 0 0 transparent);
    filter: brightness(1);
  }
  55% {
    box-shadow: 0 0 0 18px rgba(45, 212, 122, 0), var(--sombra-verde, 0 0 0 0 transparent);
    filter: brightness(1.14);
  }
  100% {
    box-shadow: 0 0 0 0 rgba(45, 212, 122, 0), var(--sombra-verde, 0 0 0 0 transparent);
    filter: brightness(1);
  }
}

@media (prefers-reduced-motion: reduce) {
  .pulsa-chamando { animation: none; box-shadow: 0 0 0 3px rgba(45, 212, 122, .45); }
}
