/* CSS próprio de cada tela, num bloco == nome ==. Só o que app.css não resolve; nunca
   redefinir classe pública (docs/DESIGN.md §6). Valores só por token (tokens.css). */

/* == alertas == */
/* #6: a .grade de 3 colunas espremia o <pre> em ~250px e quebrava numeros no meio; e o
   alinhamento por stretch deixava 830px de vazio no cartao do historico.
   #8: todos os valores financeiros da tela vivem dentro do <pre>. */
.grade-alertas{ align-items:start; }
.alertas-destinatario{ color:var(--ink); font-weight:var(--peso-medio); overflow-wrap:anywhere; }
@media (min-width:640px){
  .card-previa-email{ grid-column:1 / -1; }
}
.previa-email{
  white-space:pre-wrap;
  word-break:break-word;
  font-variant-numeric:tabular-nums;
  background:var(--bg-2);
  border:1px solid var(--line);
  border-radius:var(--radius);
  padding:0.9rem 1rem;
  font-family:var(--font-mono);
  font-size:var(--texto-sm);
  line-height:1.5;
  color:var(--ink);
}
.form-alertas-enviar{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:var(--esp-3);
  margin-top:0.5rem;
}
/* Histórico agrupado por dia (<details class="revelar">), a chave técnica em <code> que
   quebra em qualquer ponto — "a_pagar:aberto" e os hashes saíam da tela em 390 px. */
.alertas-historico{ display:flex; flex-direction:column; gap:var(--esp-2); margin-top:var(--esp-2); }
.alertas-dia .revelar-corpo{ padding-top:0; }
.alertas-dia .tabela{ margin-top:0; }
/* Rótulo + chave num bloco só; a chave em linha própria, quebrando só onde precisa (sem
   break-all, que partia "met|as:semana" por caractere em 1280). */
.alertas-tipo{ display:block; min-width:0; }
.alertas-historico code{
  display:block;
  margin-top:var(--esp-1);
  font-family:var(--font-mono);
  font-size:var(--texto-xs);
  color:var(--muted-2);
  overflow-wrap:anywhere;
}
@media (max-width:639.98px){
  .tabela td.alertas-cel-tipo{ display:block; text-align:left; }
  .tabela td.alertas-cel-tipo::before{ display:block; padding:0 0 var(--esp-1); }
}
/* O histórico e o envio automático ocupam a linha inteira da grade (num terço, sobravam
   ~670 px vazios ao lado de cada um). */
@media (min-width:640px){
  .card-historico-alertas, .card-envio-alertas{ grid-column:1 / -1; }
}
.campo-checkbox{
  display:flex;
  align-items:center;
  gap:var(--esp-2);
  color:var(--muted);
  font-size:var(--texto-sm);
}

/* == painel == */
/* Linha do tempo de "A pagar" (#85): a mensagem do item sem valor (o DAS esperando as
   notas) e frase, nao numero — fica sob a descricao, onde quebra; antes ia na coluna do
   valor, que e nowrap, e estourava 390 e 1024 px. */
.linha-tempo-mensagem{ font-size:var(--texto-xs); color:var(--amber); overflow-wrap:anywhere; }
/* ("Mês atual" sem aporte usa .estatistica-nenhum, que mora em app.css com .estatistica.)
   Em desktop o orçamento divide a linha com "Metas em foco" e esticava até a altura dele,
   com um parágrafo e meia tela vazia: fica com a própria altura. */
@media (min-width:1024px){
  .grade-painel > .card-orcamento{ align-self:start; }
}
/* Link de rodapé dos cards de leitura (Fiscal do mês e Cartões, #115/#114): o mesmo
   respiro do link de "A pagar". */
.painel-link-card{ margin-top:var(--esp-3); }
.painel-cartao-nome{ margin:var(--esp-3) 0 var(--esp-2); font-size:var(--texto-sm); }
/* DRE da PJ (#116): o mês e o acumulado do ano sempre empilhados (cada um é uma
   .lista-definicao). Lado a lado, no card de meia coluna da .grade-painel (288–400 px
   entre 640 e 1100), os valores em reais estouravam o card (design-review da #116). */
.painel-dre{ display:grid; grid-template-columns:minmax(0, 1fr); gap:var(--esp-4); }
.painel-dre-titulo{ margin:0 0 var(--esp-2); font-size:var(--texto-sm); color:var(--muted); }
.painel-faturamento progress{ margin-top:var(--esp-2); }
/* Saldos do fluxo e números do fiscal do mês (#116, design-review): abaixo de 1024 px a
   .grade-estatisticas tem 2 colunas fixas e, no card de meia coluna da .grade-painel
   (640–1023 px), o .valor-grande estourava a própria coluna e cobria o "−" do vizinho. Uma
   coluna até o desktop, onde o auto-fit de 190 px volta a valer. */
@media (max-width:1023.98px){
  .grade-estatisticas.painel-saldos{ grid-template-columns:minmax(0, 1fr); }
}

/* == lancamentos == */

/* Select de categoria (issue #22/#25, reaproveitado em recorrentes/parcelamentos) com
   campo livre "Outra…" logo abaixo — mesmo espacamento vertical de .campo. */
.campo-categoria-outra{ margin-top:0.4rem; }

/* Filtros recolhidos no topo da lista: o resumo do <summary> diz o que esta aplicado,
   entao a tela abre pela resposta (totais + lista) e nao pelo formulario. */
.filtros-lancamentos{ margin-bottom:var(--esp-4); }
.filtros-lancamentos .revelar-corpo{ display:flex; flex-direction:column; gap:var(--esp-3); }

/* Previsto x ja pago: a decisao mais cara do app deixa de ser um checkbox miudo ao lado
   do botao e vira dois alvos de 44 px dentro do card. */
.campo-escolha{ border:1px solid var(--line); border-radius:var(--radius); padding:var(--esp-3); margin:0; }
.campo-escolha legend{ padding:0 var(--esp-2); color:var(--muted); font-size:var(--texto-sm); font-weight:600; }
.escolha{
  display:flex;
  align-items:center;
  gap:var(--esp-3);
  min-height:var(--alvo-toque);
  font-size:var(--texto-sm);
  color:var(--muted);
  cursor:pointer;
}
.escolha strong{ color:var(--ink); font-weight:600; }
.escolha input{ flex:0 0 auto; width:1.1rem; height:1.1rem; accent-color:var(--prumo); }

/* O .form-rodape e sticky: sem esta folga ele cobria a linha "Mais opcoes" na unica
   dobra que existe em 390 px. */
.form-novo-lancamento{ padding-bottom:calc(var(--alvo-toque) + var(--esp-6)); }
@media (min-width:1024px){
  .form-novo-lancamento{ padding-bottom:0; }
}

/* Totais do filtro (B1): realizado e previsto em blocos separados, lado a lado a partir
   de 640 px; a outra moeda embaixo, com divisor. Nenhum bloco soma com o outro. */
.totais-blocos{ display:grid; grid-template-columns:minmax(0, 1fr); gap:var(--esp-4); }
.totais-bloco{ min-width:0; }
.totais-titulo{ margin:0; font-size:var(--texto-sm); font-weight:var(--peso-forte); color:var(--ink); }
.totais-apoio{ font-weight:var(--peso-normal); font-size:var(--texto-xs); color:var(--muted); }
.totais-bloco + .totais-bloco{ padding-top:var(--esp-3); border-top:1px solid var(--line); }
.totais-estrangeiro{ margin-top:var(--esp-4); padding-top:var(--esp-3); border-top:1px solid var(--line); }
.totais-estrangeiro .lista-linhas li > span{ min-width:0; overflow-wrap:anywhere; }
@media (min-width:640px){
  .totais-blocos{ grid-template-columns:repeat(2, minmax(0, 1fr)); gap:var(--esp-6); }
  .totais-bloco + .totais-bloco{ padding-top:0; border-top:none; }
  .totais-blocos .grade-estatisticas{ grid-template-columns:repeat(2, minmax(0, 1fr)); }
  .totais-estrangeiro{ padding-top:var(--esp-3); border-top:1px solid var(--line); }
}

/* Prazo relativo ao lado da data absoluta no resumo do detalhe. */
.lanc-relativo{ color:var(--muted); font-weight:400; }

/* Lista /lancamentos. Em 390 px cada linha e um cartao de DUAS linhas (data + valor,
   descricao + situacao): Tipo, Natureza e Conta so aparecem na tabela, a partir de
   640 px. Acima de 640 px a tabela tem layout fixo e cada coluna curta uma largura
   conhecida (<colgroup>); a descricao fica com o que sobra e trunca com o texto inteiro
   no title. */
.tabela-lancamentos .lanc-data,
.tabela-lancamentos .lanc-valor{ white-space:nowrap; font-variant-numeric:tabular-nums; }
.tabela-lancamentos .lanc-abrev{ cursor:help; }
.tabela-lancamentos .lanc-abrev,
.tabela-lancamentos .lanc-status .badge{ white-space:nowrap; }
.tabela-lancamentos .lanc-abrev{ display:none; }
@media (max-width:639.98px){
  .tabela-lancamentos .lanc-so-tabela{ display:none; }
  .tabela-lancamentos tbody tr{
    display:grid;
    grid-template-columns:minmax(0, 1fr) auto;
    grid-template-areas:"data valor" "descricao situacao";
    align-items:center;
    column-gap:var(--esp-3);
    padding:var(--esp-2) 0.7rem;
  }
  .tabela-lancamentos tbody td{
    display:block;
    padding:0;
    border-bottom:none;
    text-align:left;
  }
  .tabela-lancamentos tbody td[data-rotulo]::before{ content:none; }
  .tabela-lancamentos .lanc-data{ grid-area:data; color:var(--muted); font-size:var(--texto-xs); }
  .tabela-lancamentos .lanc-valor{ grid-area:valor; text-align:right; font-weight:600; }
  .tabela-lancamentos tbody td[data-rotulo="Descrição"]{ grid-area:descricao; }
  .tabela-lancamentos .lanc-status{ grid-area:situacao; text-align:right; }
  .tabela-lancamentos .lanc-descricao{
    display:flex;
    align-items:center;
    min-height:var(--alvo-toque);
    overflow-wrap:anywhere;
  }
}
@media (min-width:640px){
  .tabela-lancamentos{ min-width:760px; table-layout:fixed; }
  .tabela-lancamentos th{ white-space:nowrap; }
  .lanc-col-data{ width:82px; }       /* "28/08/26" a 0.875rem + padding */
  .lanc-col-tipo{ width:66px; }       /* "Transf." */
  .lanc-col-natureza{ width:98px; }   /* "Transf. int." */
  .lanc-col-conta{ width:150px; }
  .lanc-col-valor{ width:112px; }     /* "R$ 12.345,67" */
  .lanc-col-status{ width:86px; }     /* badge "Previsto" */
  .tabela-lancamentos td{ overflow:hidden; vertical-align:middle; }
  .tabela-lancamentos .lanc-valor,
  .tabela-lancamentos th.lanc-valor{ text-align:right; }
  .tabela-lancamentos .lanc-descricao,
  .tabela-lancamentos .lanc-conta{
    display:block;
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
  }
  /* Alvo de 44 px tambem no desktop: a descricao e o unico caminho para o detalhe. */
  .tabela-lancamentos .lanc-descricao{ padding-block:0.8rem; }
  .tabela-lancamentos .lanc-abrev{ display:inline; }
  .tabela-lancamentos .lanc-completo{ display:none; }
}
/* Em 1024 px ha folga para o rotulo inteiro; a abreviacao fica so no tablet. */
@media (min-width:1024px){
  .lanc-col-tipo{ width:118px; }      /* "Transferência" inteiro, numa linha */
  .lanc-col-natureza{ width:152px; }  /* "Transferência interna" inteiro */
  .tabela-lancamentos .lanc-abrev{ display:none; }
  .tabela-lancamentos .lanc-completo{ display:inline; }
}

/* == contas == */
/* #116: o caminho até Recorrentes, que saiu do menu. */
.contas-link-recorrentes{ margin-top:var(--esp-3); }
/* Cinco colunas com largura conhecida e layout fixo: a tabela cabe inteira em 1024 px,
   entao as acoes ("Editar" e o menu "⋯") nunca ficam fora da area visivel. */
@media (min-width:640px){
  .tabela-contas{ table-layout:fixed; }
  .conta-col-tipo{ width:150px; }
  .conta-col-ambito{ width:74px; }
  .conta-col-saldo{ width:200px; }
  .conta-col-acoes{ width:154px; }
  .tabela-contas td{ overflow:hidden; }
}
/* Moeda estrangeira: o badge diz, na propria linha, que aquele numero nao entra no
   total em reais (D31). No celular ele cai embaixo do valor. */
.conta-moeda{ margin-left:var(--esp-2); }
@media (max-width:639.98px){
  .conta-moeda{ display:block; margin:var(--esp-1) 0 0; }
}

/* == recorrentes == */
/* A tabela de 7 colunas com `white-space:nowrap` e `.celula-principal{min-width:12rem}`
   pedia 915 px: em 1024 px as colunas Status e Acoes ficavam fora da area visivel e a
   pagina inteira balancava na horizontal (1058x1024). Agora sao 4 colunas com largura
   conhecida e `table-layout:fixed`, como a .tabela-lancamentos ja fazia: a tabela cabe
   inteira e "Editar"/"⋯" ficam sempre alcancaveis (R4.1, R4.2, R9.7). */
@media (min-width:640px){
  .tabela-recorrentes,
  .tabela-parcelamentos{ table-layout:fixed; }
  .rec-col-vence{ width:170px; }
  .rec-col-valor{ width:140px; }
  .rec-col-acoes{ width:154px; }
  .parc-col-pagas{ width:84px; }
  .parc-col-proxima{ width:190px; }
  .parc-col-acoes{ width:176px; }
  .tabela-recorrentes td,
  .tabela-parcelamentos td{ overflow:hidden; }
  /* A descricao e o unico texto livre: quebra normal, sem partir palavra no meio
     ("investiment/o"), e trunca com o texto inteiro no title. */
  .tabela-recorrentes td.celula-principal,
  .tabela-parcelamentos td.celula-principal{ min-width:0; overflow-wrap:break-word; hyphens:auto; }
}

/* Formulario compacto de edicao de valor de uma parcela, embutido na tabela do cronograma. */
.form-parcela{ display:flex; gap:var(--esp-2); align-items:center; flex-wrap:wrap; }
.form-parcela input[type="text"]{ max-width:140px; }

/* Bloco "Gerar lançamentos previstos do mês" (ajuste 5 do Lucas, 05/09): menor, abaixo
   da lista, com a ultima geracao e mes/ano em portugues. */
.card-gerar-previstos{ padding-top:0.85rem; padding-bottom:0.85rem; }
.card-gerar-previstos::before{ background:var(--line); }
.card-gerar-previstos h2{ font-size:var(--texto-md); }
.card-gerar-previstos > .texto-apoio{ margin-top:0; }
.gerar-previstos-ultima{ margin:0.5rem 0 0; font-size:var(--texto-sm); color:var(--muted); }
.gerar-previstos-ultima strong{ color:var(--muted); }
.form-gerar-previstos{
  display:flex;
  flex-wrap:wrap;
  align-items:flex-end;
  gap:0.6rem;
  margin-top:0.75rem;
}
.form-gerar-previstos .campo{ flex:1 1 120px; }
.form-gerar-previstos .botao{ flex:1 1 100%; }
@media (min-width:640px){
  .form-gerar-previstos .campo{ flex:0 1 160px; }
  .form-gerar-previstos .botao{ flex:0 0 auto; }
}

/* == gastos == */
/* #116: o caminho até Lançamentos, que saiu do menu. */
.gastos-link-lancamentos{ margin-top:var(--esp-3); }
.hero-rotulo-apoio{ font-weight:400; color:var(--muted); }
.gastos-filtros{ display:flex; flex-direction:column; gap:0.6rem; margin-bottom:0.25rem; }

/* Ajuste 3 do Lucas (05/09): a lista de categorias e o conteudo principal; o grafico
   e um <details> recolhido no celular e um bloco compacto e fixo ao lado no desktop.
   Altura calculada por gastos.js conforme o numero de categorias. */
.gastos-corpo{ display:flex; flex-direction:column; gap:var(--esp-3); }
.gastos-grafico{
  order:-1;
  border:1px solid var(--line);
  border-radius:var(--radius);
  padding:0 0.75rem;
}
.gastos-grafico > summary{
  list-style:none;
  cursor:pointer;
  display:flex;
  align-items:center;
  gap:var(--esp-2);
  min-height:var(--alvo-toque);
  font-size:var(--texto-sm);
  font-weight:600;
  color:var(--muted);
}
.gastos-grafico > summary::-webkit-details-marker{ display:none; }
.gastos-grafico > summary .icone{ width:18px; height:18px; }
.gastos-grafico[open] > summary{ color:var(--ink); }
.gastos-grafico .grafico-legenda{ padding-bottom:0.6rem; }
.gastos-grafico-envelope{ position:relative; width:100%; min-height:160px; }

.lista-categorias-gasto{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:var(--esp-2); }
.categoria-gasto-link{
  display:block;
  padding:0.65rem 0.8rem;
  border:1px solid var(--line);
  border-radius:var(--radius);
  color:inherit;
  text-decoration:none;
  transition:border-color var(--dur-rapida) var(--ease);
}
.categoria-gasto-link:hover{ border-color:var(--muted); text-decoration:none; }
.categoria-gasto-item-ativo .categoria-gasto-link{
  border-color:var(--prumo);
  background:var(--prumo-soft);
  border-bottom-left-radius:0;
  border-bottom-right-radius:0;
}
.categoria-gasto-cabecalho{ display:flex; align-items:baseline; gap:var(--esp-2); font-weight:var(--peso-medio); }
.categoria-gasto-nome{ flex:1 1 auto; min-width:0; overflow-wrap:anywhere; }
.categoria-gasto-valor{ font-variant-numeric:tabular-nums; white-space:nowrap; }
.categoria-gasto-seta{ align-self:center; color:var(--muted-2); }
.categoria-gasto-seta .icone{ width:16px; height:16px; transition:transform var(--dur-rapida) var(--ease); }
.categoria-gasto-item-ativo .categoria-gasto-seta .icone{ transform:rotate(180deg); color:var(--prumo); }
.categoria-gasto-meta{ display:flex; flex-wrap:wrap; align-items:center; gap:0.35rem 0.45rem; margin-top:0.35rem; font-size:var(--texto-xs); }
.categoria-gasto-delta{ color:var(--muted); }
.categoria-gasto-delta-alta{ color:var(--amber); }
.categoria-gasto-delta-baixa{ color:var(--prumo); }

/* Drill-down inline: colado embaixo do item ativo, mesma borda verde. */
.categoria-gasto-drilldown{
  border:1px solid var(--prumo);
  border-top:none;
  border-radius:0 0 var(--radius) var(--radius);
  padding:0.6rem 0.8rem 0.75rem;
  background:var(--bg-2);
}
.categoria-gasto-drilldown-cabecalho{ display:flex; align-items:baseline; justify-content:space-between; gap:var(--esp-2); }
.categoria-gasto-drilldown-titulo{ margin:0; font-size:var(--texto-sm); color:var(--ink); }
.categoria-gasto-drilldown .texto-apoio{ margin-top:0.1rem; }
.categoria-gasto-drilldown .tabela{ margin-top:0.5rem; font-size:var(--texto-sm); }
.categoria-gasto-fechar{
  display:inline-flex;
  align-items:center;
  min-height:36px;
  margin-top:0.35rem;
  font-size:var(--texto-sm);
  font-weight:600;
}

.card-investido .card-titulo{ margin-bottom:0.25rem; }
/* Previa da estimativa do mes (#85) e bloco da fatura ainda nao aberta (B9). */
.card-previa-baseline .alerta{ margin:0 0 var(--esp-2); }
.card-previa-baseline .lista-linhas li > span{ min-width:0; overflow-wrap:anywhere; }
.card-previa-baseline .lista-linhas-apoio{ display:block; white-space:normal; }
.card-previa-baseline .form-acoes{ margin-top:var(--esp-4); }
.card-fatura-agregada .card-titulo{ margin-bottom:var(--esp-1); }

@media (min-width:1024px){
  .gastos-corpo{
    display:grid;
    grid-template-columns:minmax(0, 1fr) 300px;
    gap:1.25rem;
    align-items:start;
  }
  .gastos-grafico{
    order:0;
    position:sticky;
    top:calc(var(--topbar-altura) + 1rem);
    padding:0.5rem 0.75rem 0.25rem;
  }
  .gastos-grafico > summary{ display:none; }
}
/* == classificar == */
/* Mesma gramática de triagem de /revisao: .grupo-revisao-*, .item-revisao-*, .revisao-topo,
   .revisao-grupos, .card-triagem, .card-vazio-festa, .chips-filtro moram em app.css. */
.subtitulo-bloco{ font-size:var(--texto-md); margin:0 0 0.15rem; }
.bloco-identificar, .bloco-outros{ display:flex; flex-direction:column; gap:var(--esp-4); }
.bloco-outros{ margin-top:var(--esp-5); }
.revisao-grupos-lista{ display:flex; flex-direction:column; gap:var(--esp-4); }
.card-triagem .chips-filtro + .chips-filtro{ margin-top:var(--esp-2); }
.form-categoria-grupo .campo{ flex:1 1 160px; margin:0; }
.form-categoria-grupo select,
.form-categoria-grupo input[type="text"]{ width:100%; }
.form-categoria-grupo .botao-primario{ flex:0 0 auto; }
.classificar-retro{ display:block; margin-top:var(--esp-3); }
.classificar-retro .botao{ white-space:normal; text-align:left; max-width:100%; }
.chips-mais{ display:inline-flex; flex-wrap:wrap; align-items:center; gap:var(--esp-2); }
.chips-mais > summary{ min-height:var(--alvo-toque); }
/* Lote (#85): o select de categoria mora no cartao fechado; o formulario unico fica preso
   ao pe da tela (acima da barra inferior no celular), sem sombra — superficie + linha.
   Nao reusa .form-rodape (app.css): aquele e sticky DENTRO do card do formulario e so
   gruda enquanto o card e alto; aqui o formulario e um card proprio sob #conteudo, e e o
   miolo inteiro (a lista de cartoes) que precisa rolar por baixo dele. */
.grupo-lote{ margin-top:var(--esp-3); }
.grupo-lote-pista{ margin:0 0 var(--esp-2); font-size:var(--texto-sm); color:var(--muted); overflow-wrap:anywhere; }
.grupo-lote-pista .badge{ vertical-align:middle; }
.grupo-lote select{ width:100%; min-width:0; }
.grupo-lote + .grupo-revisao-itens,
.grupo-sem-comerciante + .grupo-revisao-itens{ margin-top:var(--esp-1); }
.grupo-sem-comerciante{ margin:var(--esp-3) 0 0; }
.classificar-lote{
  position:sticky;
  bottom:calc(var(--bottombar-altura) + var(--esp-2) + env(safe-area-inset-bottom, 0px));
  z-index:var(--z-flutuante);
  display:flex;
  flex-direction:column;
  gap:var(--esp-2);
  margin-top:var(--esp-4);
  border-color:var(--borda-campo);
}
/* No celular a barra presa cobre a lista: fica so o botao; a frase volta a partir de 640. */
.classificar-lote-texto{ display:none; margin:0; font-size:var(--texto-sm); color:var(--muted); }
.classificar-lote .botao{ width:100%; }
@media (min-width:640px){
  .classificar-lote-texto{ display:block; }
  .classificar-lote{ flex-direction:row; align-items:center; justify-content:space-between; gap:var(--esp-4); }
  .classificar-lote .botao{ width:auto; flex:0 0 auto; }
}
@media (min-width:1024px){
  .classificar-lote{ bottom:var(--esp-4); }
}
.card-micro-vazamentos .card-titulo{ display:flex; align-items:center; gap:0.4rem; }
.card-micro-vazamentos .card-titulo .icone{ width:20px; height:20px; color:var(--amber); }
/* == configuracoes == */
/* Parametros (auditoria configuracoes-parametros #1, #6, #9). A chave crua do banco saiu
   do texto visivel: o que se le e o rotulo humano, e a chave vive em <code> atras de
   "nome tecnico", junto da descricao que vem do servico. */
.parametro-usado{ font-size:var(--texto-xs); color:var(--muted); }
.parametro-tecnico{ margin-top:0.15rem; }
.parametro-tecnico > summary{ font-size:var(--texto-xs); }
.parametro-tecnico code{
  font-family:var(--font-mono);
  font-size:var(--texto-xs);
  color:var(--muted-2);
  overflow-wrap:anywhere;
}
/* A linha do parametro fixo tem so rotulo + valor + cadeado: o <details> da chave nao
   pode empurrar a coluna do valor. */
.parametro-fixo .parametro-texto{ min-width:0; }
.parametro-descricao{ font-size:var(--texto-xs); color:var(--muted); }

/* Linha de link para /alertas (B13): e outra tela, nao uma aba. */
.config-alertas{ margin:var(--esp-2) 0 var(--esp-4); }

/* == login == */
/* U16: a tela de entrada nao tinha marca nenhuma. O logo fica ACIMA do card, que
   continua sendo o unico foco da tela. */
.login-moldura{
  display:flex;
  flex-direction:column;
  align-items:center;
  gap:var(--esp-4);
  width:100%;
  max-width:380px;
  margin:0 auto;
}
.login-marca{ display:flex; align-items:center; gap:var(--esp-2); }
.login-marca-nome{ font-size:var(--texto-lg); font-weight:800; letter-spacing:-0.01em; }
.login-moldura .card-login{ width:100%; margin:0; }

/* == so-pelo-agente == */
/* Front enxuto (#116, D57): aviso no topo do painel depois de uma rota que saiu da tela, e
   a linha que fica no lugar de uma ação nas telas só leitura. Informação, não erro: azul. */
.so-pelo-agente-aviso{ background:var(--blue-soft); color:var(--ink); border-left:3px solid var(--blue); }
.so-pelo-agente-nota{ margin-top:var(--esp-2); }
.so-pelo-agente-pagina h2{ margin:var(--esp-2) 0 0; }

/* == em-breve == */
/* O card e uma coluna flex: sem isto o badge estica na largura toda. */
.card-em-breve .badge{ align-self:flex-start; }

/* == erro == */
/* Auditoria erro-404 #4: o codigo vinha antes do titulo na ordem do DOM, e o leitor de
   tela lia "404" sem saber do que se tratava. No DOM o titulo vem primeiro; o codigo
   volta para cima visualmente, como decoracao (aria-hidden no template). */
.card-erro{ display:flex; flex-direction:column; }
.card-erro .erro-codigo{ order:-1; }

/* == importar == */
/* Tela /importar (Sprint 2, D28). So classes proprias desta tela: nada aqui redefine
   .card, .tabela, .badge ou .alerta de app.css — a .tabela ja vira cartoes abaixo de
   640px sozinha, entao a lista da previa nao precisa de layout mobile proprio. */

/* Linha a linha da previa (issue #66). Acima de 640px a tabela tem layout fixo e cada
   coluna uma largura conhecida (<colgroup>), para os selects de natureza e ambito nunca
   ficarem mais estreitos que o texto ("Transfe", "Operaci"); a descricao fica com o que
   sobra. Cabe em 1280px com a barra lateral aberta; abaixo disso rola dentro do
   .tabela-scroll. Abaixo de 640px o app.css transforma a tabela em cartoes e os campos
   ocupam a largura toda. */
@media (min-width:640px){
  .linhas-importacao{ min-width:930px; table-layout:fixed; }
  .linhas-importacao th{ white-space:nowrap; }
  .importar-col-marcar{ width:36px; }
  .importar-col-data{ width:100px; } /* "01/08/2026" a 0.9rem + padding: 88px (issue #70) */
  .importar-col-valor{ width:100px; }
  .importar-col-acao{ width:150px; }
  .importar-col-categoria{ width:150px; } /* select de categoria + select de cliente (issue #75) */
  .importar-col-natureza{ width:170px; } /* rotulos explicados, ex. "Operacional (venda/serviço)" */
  .importar-col-ambito{ width:70px; }
  .importar-cel-data{ white-space:nowrap; font-variant-numeric:tabular-nums; }
  /* Nada de uma celula invade a vizinha (issue #75, item 3): o que nao couber quebra
     dentro da propria coluna. */
  .linhas-importacao td{ overflow:hidden; }
}
.linhas-importacao th,
.linhas-importacao td{ padding:0.5rem 0.4rem; vertical-align:top; }
.linhas-importacao input[type="text"],
.linhas-importacao select{
  min-width:0;
  width:100%;
  min-height:36px;
  font-size:var(--texto-sm);
  padding:0.3rem 0.45rem;
}
.linhas-importacao select{ text-overflow:ellipsis; }
.linhas-importacao input[type="checkbox"]{ width:1.15rem; height:1.15rem; }
.linhas-importacao .texto-apoio{ display:block; margin-top:0.15rem; }
.linhas-importacao .badge{ margin-right:0.3rem; margin-bottom:0.2rem; }
/* (0,2,0) para vencer o `.tabela td{ white-space:normal }` dos cartões do celular. */
.linhas-importacao .importar-cel-valor{ font-variant-numeric:tabular-nums; white-space:nowrap; }

/* Descricao em hierarquia: nome do favorecido/estabelecimento em destaque, a operacao
   ("Transferência recebida pelo Pix") como apoio e CNPJ/banco/agencia/conta atras de um
   toggle — nada se perde (o texto bruto tambem esta no title). */
.importar-descricao-principal{
  display:block;
  font-weight:600;
  color:var(--ink);
  overflow-wrap:anywhere;
}
.importar-cel-descricao .texto-apoio{ margin-top:0.1rem; }
.importar-descricao-detalhe{ margin-top:0.2rem; font-size:var(--texto-xs); }
.importar-descricao-detalhe summary{
  cursor:pointer;
  color:var(--blue);
  list-style:none;
  padding:0.2rem 0;
}
.importar-descricao-detalhe summary::-webkit-details-marker{ display:none; }
.importar-descricao-detalhe summary:hover{ text-decoration:underline; }
.importar-descricao-detalhe span{ display:block; color:var(--muted); overflow-wrap:anywhere; }

@media (max-width:639.98px){
  /* Nos cartoes do celular, descricao, acao e campos ficam com o rotulo em cima e o
     conteudo em largura total (o padrao do app.css poe rotulo e valor lado a lado). */
  .linhas-importacao td.importar-cel-descricao,
  .linhas-importacao td.importar-cel-acao,
  .linhas-importacao td.importar-cel-campo{
    flex-direction:column;
    align-items:stretch;
    text-align:left;
  }
  .linhas-importacao td.importar-cel-descricao::before,
  .linhas-importacao td.importar-cel-acao::before,
  .linhas-importacao td.importar-cel-campo::before{ margin-bottom:0.2rem; }
  .linhas-importacao input[type="text"],
  .linhas-importacao select{ min-height:var(--alvo-toque); font-size:var(--texto-md); }
  .linhas-importacao input[type="checkbox"]{ width:1.5rem; height:1.5rem; }
}

/* Linha ja importada antes: presente para conferencia, mas fora da decisao. */
.linha-repetida{ opacity:0.55; }

/* Linha em competencia fechada (issue #70): vem desmarcada e com selo vermelho; a
   linha inteira fica um pouco apagada para o olho pular direto para o que esta aberto. */
.linha-fechada .importar-cel-descricao,
.linha-fechada .importar-cel-valor,
.linha-fechada .importar-cel-data{ opacity:0.7; }

/* "Por quê?" (issue #70, item 4): motivo e observacao saem do fluxo da tabela e ficam
   atras de um <details>, no mesmo desenho do "Ver dados completos" da descricao. */
.importar-motivo{ margin-top:0.2rem; font-size:var(--texto-xs); }
.importar-motivo summary{
  cursor:pointer;
  color:var(--blue);
  list-style:none;
  padding:0.2rem 0;
}
.importar-motivo summary::-webkit-details-marker{ display:none; }
.importar-motivo summary:hover{ text-decoration:underline; }
.importar-motivo span{ display:block; color:var(--muted); overflow-wrap:anywhere; }
.importar-motivo span + span{ margin-top:0.15rem; }

/* Origem da sugestao de categoria (issue #70, item 2). */
.importar-origem{ font-size:var(--texto-xs); color:var(--muted); }

/* Select de cliente embaixo da categoria nas linhas de receita (issue #75, item 2), com
   um rotulo curto porque o cabecalho da coluna diz so "Categoria". */
.importar-rotulo-campo{
  display:block;
  margin:0.45rem 0 0.15rem;
  font-size:var(--texto-xs);
  font-weight:600;
  text-transform:uppercase;
  letter-spacing:0.03em;
  color:var(--muted);
}

/* Dica "cadastrar cliente" (issue #75, item 3): nos cartoes do celular e um texto curto
   embaixo do campo; a partir de 641px vira um "?" com o texto no title, para nao alongar
   a linha nem invadir a coluna vizinha. O texto continua no DOM (leitor de tela). */
.importar-dica{
  display:block;
  margin-top:0.3rem;
  font-size:var(--texto-xs);
  line-height:1.4;
  color:var(--amber);
  overflow-wrap:anywhere;
}
.importar-dica-icone{
  display:none;
  align-items:center;
  justify-content:center;
  width:1.25rem;
  height:1.25rem;
  border-radius:var(--radius-pill);
  border:1px solid var(--amber);
  font-size:var(--texto-xs);
  font-weight:800;
  line-height:1;
  cursor:help;
}
@media (min-width:640px){
  .importar-dica{ display:inline-flex; }
  .importar-dica-icone{ display:inline-flex; }
  .importar-dica-texto{
    position:absolute;
    width:1px; height:1px;
    overflow:hidden;
    clip:rect(0 0 0 0);
    white-space:nowrap;
  }
}

/* Links de "Reabrir <mês>" dentro do aviso de competencia fechada. */
.importar-alerta-links{ display:inline-flex; flex-wrap:wrap; gap:0.25rem 0.75rem; margin-left:0.25rem; }
.importar-alerta-links a{ font-weight:600; text-decoration:underline; }

/* Filtro "só o que precisa de mim" (issue #70, item 3): .interruptor mora em app.css. */
.importar-filtro{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  justify-content:space-between;
  gap:0.4rem 1rem;
  margin:0.6rem 0 0.2rem;
}
.importar-filtro-contagem{ margin:0; font-size:var(--texto-sm); color:var(--muted); }
.importar-filtro-contagem strong{ color:var(--ink); }
/* Com o filtro ligado, as linhas resolvidas somem da tela (continuam no formulario). */
.importar-so-atencao .linhas-importacao tr[data-atencao="resolvida"]{ display:none; }
.importar-filtro-nota{ display:none; }
.importar-so-atencao .importar-filtro-nota{ display:block; }

/* Entrada de dinheiro na previa, para o sinal aparecer sem depender so do texto. */
.valor-entrada{ color:var(--prumo); }

/* Barra de confirmacao no fim da previa (fora do .card, colada na lista). Confirmar e
   o unico primario da tela; Cancelar fica ao lado dele, secundario (issue #70, item 4).
   No celular o Confirmar ocupa a largura toda. */
.acoes-importar{ margin:0 0 1.5rem; }
.acoes-importar .botao-primario{ flex:1 1 100%; }
.acoes-importar .texto-apoio{ flex-basis:100%; margin:0; }
.acoes-importar .texto-apoio a{ text-decoration:underline; }
@media (min-width:640px){
  .acoes-importar .botao-primario{ flex:0 0 auto; }
}

/* Etapas (issue #66): .passos mora em app.css; aqui só o envelope com a nota à direita. */
/* Moldura do indicador de etapas (.passos, app.css §6.5). Compartilhada por importar,
   fiscal e patrimonio: vive aqui porque app.css esta congelado nesta frente — o lugar
   dela e app.css, junto de .passos (anotado no relatorio). */
/* Controle de arquivo em PT-BR (auditoria importar #2): o <input type=file> nativo
   escreve "Choose File / No file chosen" no idioma do navegador e tem ~28px de altura.
   O input fica visualmente oculto e quem aparece e o <label for>, que ja abre o seletor
   sem JS. O nome do arquivo escolhido so voltaria com JS (fora do escopo): a confirmacao
   fica na tela de previa, que lista linha a linha o que o arquivo trouxe. */
.importar-escolher{ align-self:flex-start; }
/* B24: nome do arquivo escolhido, logo abaixo do rotulo-botao. */
.importar-arquivo-nome{ margin:0; font-size:var(--texto-sm); color:var(--muted); overflow-wrap:anywhere; }
.importar-arquivo-escolhido{ color:var(--ink); font-weight:var(--peso-medio); }
/* Histórico: nome do arquivo em cima, tipo embaixo; no cartão do celular a célula vira
   coluna (ao lado do rótulo "Arquivo" sobravam 70 px para "NU_41582715_01AGO2026…"). */
.importar-arquivo{ display:block; overflow-wrap:anywhere; }
.importar-cel-arquivo .texto-apoio{ display:block; margin-top:0.1rem; }
@media (max-width:639.98px){
  .tabela td.importar-cel-arquivo{ display:block; text-align:left; }
  .tabela td.importar-cel-arquivo::before{ display:block; padding:0 0 var(--esp-1); }
}
/* B15: o que ja entrou, por conta e mes — dois blocos lado a lado a partir de 640 px. */
.importar-feitas{ display:grid; grid-template-columns:minmax(0, 1fr); gap:var(--esp-4); }
.importar-feitas-mes{ min-width:0; }
.importar-aceita{ margin-top:var(--esp-3); }
.importar-feitas-titulo{ display:flex; flex-wrap:wrap; align-items:center; gap:var(--esp-2); margin:0 0 var(--esp-1); font-size:var(--texto-sm); font-weight:var(--peso-forte); color:var(--ink); }
.importar-feitas .lista-linhas li > span:first-child{ min-width:0; overflow-wrap:anywhere; }
.importar-feitas-arquivos{ display:block; white-space:normal; }
@media (min-width:640px){
  .importar-feitas{ grid-template-columns:repeat(2, minmax(0, 1fr)); gap:var(--esp-6); }
}
/* input[type="file"] (0,1,1) vence .visualmente-oculto (0,1,0) em app.css e devolvia
   width:100% + min-height a um elemento absoluto, estourando a pagina (1757px em 1280).
   Este seletor (0,2,1) desempata sem tocar na classe publica. */
input[type="file"].visualmente-oculto{
  width:1px;
  height:1px;
  min-height:0;
  padding:0;
  border:0;
}

.passos-bloco{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  justify-content:space-between;
  gap:0.35rem 1rem;
  margin:0 0 0.9rem;
}

/* Resumo compacto da previa e do resultado: e passo intermediario, nao painel. O numero
   grande e menor que o .hero-valor do painel, e so os contadores que decidem a acao
   viram tiles; o resto e uma linha de apoio. */
.importar-hero-rotulo{
  margin:0;
  font-size:var(--texto-xs);
  font-weight:600;
  color:var(--muted);
  overflow-wrap:anywhere;
}
.importar-hero-valor{
  margin:0.15rem 0 0.8rem;
  font-size:clamp(var(--texto-xl), 5vw, 1.75rem);
  font-weight:800;
  letter-spacing:-0.02em;
  line-height:1.15;
}
.importar-hero-de{
  font-size:var(--texto-sm);
  font-weight:600;
  letter-spacing:0;
  color:var(--muted);
  white-space:nowrap;
}
.importar-resumo{
  display:grid;
  grid-template-columns:minmax(0, 1fr);
  gap:var(--esp-2);
}
.importar-resumo .tile{ background:var(--surface-2); }
/* Texto corrido, não flex: o "·" fica preso ao fim da frase anterior (espaço inseparável
   antes dele) e nunca começa uma linha órfão. */
.importar-resumo-apoio{
  margin:0.7rem 0 0;
  font-size:var(--texto-xs);
  line-height:var(--linha-md);
  color:var(--muted);
}
.importar-resumo-apoio span + span::before{
  content:"\00a0· ";
  color:var(--muted-2);
}
.importar-snapshot{ font-size:var(--texto-xs); overflow-wrap:anywhere; }

/* Acao principal repetida na barra superior. No celular so "Gravar N" cabe ao lado do
   titulo; o "Cancelar" do topo some (existe outro no fim da lista). */
.importar-acao-rotulo{ display:none; }

@media (min-width:640px){
  .importar-resumo{ grid-template-columns:repeat(auto-fit, minmax(150px, 1fr)); gap:0.6rem; }
  .importar-acao-rotulo{ display:inline; }
}

/* == patrimonio == */
/* Sprint 3 (#23, #25); refeito na refundacao de UX (auditoria patrimonio #1, #2, #4, #5,
   #7). O cartao de instituicao era um .tile reimplementado com outro nome
   (.patrimonio-conta, DESIGN §6.1 marcava como duplicado): agora e o proprio .tile de
   app.css, como <a> para o formulario de registrar saldo. */
.patrimonio-contas{
  display:grid;
  grid-template-columns:minmax(0, 1fr);
  gap:0.6rem;
  margin-top:0.8rem;
}
/* Valor ausente no lugar do saldo: mesmo ambar de "a confirmar" (R9.3). */
.tile-valor-confirmar{ color:var(--amber); font-size:var(--texto-md); }
/* Total real de zero movimento vira palavra: R$ 0,00 lia igual a valor desconhecido. */
.tile-valor-nenhum{ color:var(--muted); font-size:var(--texto-sm); font-weight:600; }
/* Badge dentro do apoio do tile (consolidacao .tile + .tile-badge do DESIGN §6.1). */
.tile-badge{ margin-left:0.35rem; vertical-align:middle; }
/* "Calculado R$ 33.701,58" nao quebra entre o "R$" e a cifra (R3.1, auditoria #4). */
.patrimonio-valor{ white-space:nowrap; font-variant-numeric:tabular-nums; }
/* B20: o tile da instituicao escolhida (?conta_id=) se distingue dos outros. */
.patrimonio-contas .tile[aria-current]{ border-color:var(--prumo); }

/* Previa: o numero que vai ser gravado em destaque, antes de qualquer botao. */
.patrimonio-previa-valor{
  margin:0.2rem 0 0.1rem;
  font-size:clamp(var(--texto-xl), 6vw, 2rem);
  font-weight:800;
  letter-spacing:-0.02em;
  font-variant-numeric:tabular-nums;
}
.patrimonio-variacao-positiva{ color:var(--prumo); }
.patrimonio-variacao-negativa{ color:var(--amber); }

/* /patrimonio/movimentos: no celular a lista do mes vem antes do formulario — quem chega
   pelo link "Ver e registrar movimentos" quer ver o que ja existe antes de digitar
   (auditoria movimentos #2). Acima de 640px a ordem do DOM volta a valer. */
.patrimonio-movimentos-corpo{ display:flex; flex-direction:column; gap:var(--esp-3); }
.patrimonio-movimentos-lista{ order:-1; }

@media (min-width:640px){
  .patrimonio-contas{ grid-template-columns:repeat(auto-fit, minmax(220px, 1fr)); }
  .patrimonio-movimentos-lista{ order:0; }
}

/* == fechamento == */
/* #116: item do checklist que agora é do agente — texto, não link. */
.fechamento-com-agente{ grid-column:2; }
/* Sprint 3 (#27, #28). O hero repete o padrao do painel em escala menor: a competencia e
   o estado (aberta / fechada / reaberta) precisam ser a primeira coisa que se le. */
.fechamento-hero{ padding:1.15rem 1.1rem 1.1rem 1.4rem; }
.fechamento-hero .hero-valor{ margin:0.1rem 0 0.4rem; }
.fechamento-hero form{ margin-top:0.9rem; }

/* Prazo do MAED no hero do Contabilix (auditoria contabilix #1): em dia fica ambar,
   vencido fica em --red-texto. A data nunca quebra entre "10/" e "09". */
.contabilix-prazo{ color:var(--amber); }
.contabilix-filtros{ margin-bottom:var(--esp-3); }
.contabilix-a-definir{ color:var(--amber); }
.contabilix-definir{ display:inline-flex; flex-wrap:wrap; align-items:center; gap:var(--esp-1) var(--esp-2); min-width:0; }
.contabilix-definir .texto-apoio{ margin:0; min-width:0; overflow-wrap:anywhere; }
/* Descrição + "no extrato: …" num bloco só (o mesmo remédio da categoria): no cartão do
   celular o texto solto virava item de flex e quebrava letra por letra. */
.contabilix-descricao{ display:block; min-width:0; overflow-wrap:anywhere; }
.contabilix-descricao .texto-apoio{ display:block; margin:0.1rem 0 0; }
/* "Marcar as N pendentes como lançadas": o rótulo quebra em vez de estourar os 390 px. */
.contabilix-botao-lote{ white-space:normal; text-align:center; max-width:100%; }
/* Chip de filtro sem linha nenhuma: nao e link (levaria a uma lista vazia). */
.chip-vazio{ color:var(--muted); border-color:var(--line); cursor:default; }
/* No cartao do celular a frase "sem equivalente no Contabilix" ocupa a largura toda,
   embaixo do rotulo, em vez de uma coluna de 85 px ao lado dele. */
@media (max-width:639.98px){
  .tabela td.contabilix-cel-definir,
  .tabela td.contabilix-cel-descricao{ display:block; text-align:left; }
  .tabela td.contabilix-cel-definir::before,
  .tabela td.contabilix-cel-descricao::before{ display:block; padding:0 0 var(--esp-1); }
}
.contabilix-prazo-vencido{ color:var(--red-texto); font-weight:600; }
.contabilix-prazo strong,
.contabilix-prazo-vencido strong{ white-space:nowrap; font-variant-numeric:tabular-nums; }

/* "23 de 23 ainda por lancar": o numero e o hero, o resto e leitura. */
.hero-valor-apoio{ font-size:var(--texto-md); font-weight:600; color:var(--muted); }

.fechamento-checklist-contas{
  display:flex;
  flex-wrap:wrap;
  gap:0.3rem;
  margin:0.4rem 0 0;
}
/* Texto vermelho é sempre --red-texto (R2.1): --red dá 4,3:1 sobre o card. */
.fechamento-diferenca{ color:var(--red-texto); font-variant-numeric:tabular-nums; white-space:nowrap; }
/* Instituição + "em DD/MM/AAAA" num bloco só (mesmo remédio da descrição do Contabilix). */
.fechamento-instituicao{ display:block; min-width:0; }
.fechamento-instituicao .texto-apoio{ display:block; margin:0.1rem 0 0; white-space:nowrap; }
@media (max-width:639.98px){
  .fechamento-instituicao .texto-apoio{ text-align:right; }
}

/* "Explicar diferenca" e "Reabrir" ficam atras de um <details>: sao acoes que exigem
   texto escrito e nao cabem inline na tabela do celular. */
.fechamento-explicar{ margin-top:0.4rem; }
.fechamento-explicar > summary{ list-style:none; cursor:pointer; display:inline-flex; }
.fechamento-explicar > summary::-webkit-details-marker{ display:none; }
.fechamento-explicar > form{ margin-top:0.6rem; }

/* Linha ja lancada no Contabilix: continua legivel, mas sai do primeiro plano. */
.contabilix-lancada td{ color:var(--muted); }
.contabilix-lancada td:first-child{ border-left:2px solid var(--prumo); }
/* == fiscal == */
/* Sprint 3b (issues #29, #33, #34). Mobile-first: tudo nasce em coluna a 390px e so
   ganha duas colunas a partir de 640px. Nada aqui redefine classe de app.css. */
.fiscal-provisao{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:0.4rem;
  margin:0.6rem 0 0.2rem;
  font-size:var(--texto-sm);
  font-variant-numeric:tabular-nums;
}

.fiscal-avisos{ display:grid; gap:0.45rem; margin:0 0 1rem; }


.fiscal-tabela .col-valor{ text-align:right; white-space:nowrap; font-variant-numeric:tabular-nums; }
/* Nº da nota: único link da linha. 44 px no celular (R4.3); na tabela, a altura da
   linha (36 px). */
.fiscal-nota-link{
  display:inline-flex;
  align-items:center;
  min-height:var(--alvo-toque);
  min-width:var(--alvo-toque);
  font-weight:var(--peso-medio);
}
@media (min-width:640px){
  .fiscal-nota-link{ min-height:var(--alvo-toque-compacto); }
}

/* Chave de acesso (50 digitos) e ID da DPS (45 chars) nunca cabem numa linha no celular. */
.fiscal-chave,
.fiscal-id-dps code{
  font-family:var(--font-mono);
  font-size:var(--texto-xs);
  overflow-wrap:anywhere;
  word-break:break-all;
}
.fiscal-id-dps{ margin:0 0 0.8rem; font-size:var(--texto-xs); color:var(--muted); }

/* Pix: QR e copia-e-cola. O SVG vem inline (sem imagem remota, CSP-safe) e o fundo
   branco e obrigatorio — QR escuro sobre grafite nao e lido por leitor nenhum. */
.fiscal-pix{ display:grid; gap:0.9rem; }
.fiscal-pix-qr{
  background:var(--branco-qr);
  border-radius:var(--radius);
  padding:0.6rem;
  width:max-content;
  max-width:100%;
}
.fiscal-pix-qr svg{ display:block; width:180px; height:180px; }
.fiscal-pix-codigo{ display:grid; gap:var(--esp-2); min-width:0; }
.fiscal-pix-payload{
  width:100%;
  font-family:var(--font-mono);
  font-size:var(--texto-xs);
  word-break:break-all;
  resize:vertical;
}

@media (min-width:640px){
  .fiscal-pix{ grid-template-columns:auto minmax(0, 1fr); align-items:start; }
}


/* Auditoria fiscal #3: as linhas de "Receita sem NF" eram so navegacao e mediam 43px de
   altura (390) e 22px (1280). O link ocupa a linha inteira e passa dos 44px. Vincular a
   nota a partir da linha depende de rota nova (anotado no relatorio). */
.lista-linhas a{
  flex:1 1 12rem;
  min-width:0;
  display:flex;
  align-items:center;
  min-height:var(--alvo-toque);
  overflow-wrap:anywhere;
}
/* Frase explicativa dentro da lista: ao contrario de .lista-linhas-apoio (que e nowrap
   de proposito, para "12/09 · R$ 1.234"), esta quebra normalmente. */
.fiscal-lista-nota{
  flex:1 1 14rem;
  min-width:0;
  color:var(--muted);
  font-size:var(--texto-xs);
}

/* == orcamento == */
/* Bloco "Orcamento do mes" (issue #78, D42), compartilhado pelo painel e por /gastos
   (templates/partials/orcamento.html). Mesma gramatica visual do bloco de meta do painel:
   <progress class="progresso"> (sem style inline, CSP) + badges de app.css. */
.lista-orcamento{ list-style:none; margin:0.5rem 0 0; padding:0; display:flex; flex-direction:column; gap:0.6rem; }
.orcamento-item{
  padding:0.6rem 0.8rem;
  border:1px solid var(--line);
  border-radius:var(--radius);
}
.orcamento-item-estourado{ border-color:var(--red); }
.orcamento-cabecalho{ display:flex; align-items:baseline; gap:var(--esp-2); }
.orcamento-categoria{ flex:1 1 auto; min-width:0; font-weight:var(--peso-medio); overflow-wrap:anywhere; }
.orcamento-valores{ white-space:nowrap; font-variant-numeric:tabular-nums; }
.orcamento-previsto{ color:var(--muted); font-size:var(--texto-sm); margin-left:0.25rem; }
.progresso-orcamento{ margin:0.45rem 0 0.35rem; }
.progresso-estourada::-webkit-progress-value{ background:var(--red); }
.progresso-estourada::-moz-progress-bar{ background:var(--red); }
.orcamento-meta{ display:flex; flex-wrap:wrap; align-items:center; gap:0.35rem 0.45rem; font-size:var(--texto-xs); }
.orcamento-projecao{ color:var(--muted); font-variant-numeric:tabular-nums; white-space:nowrap; }
/* Todo dinheiro em negrito no bloco (título, projeção, rodapé) é número: tabular + nowrap. */
.card-orcamento strong{ font-variant-numeric:tabular-nums; white-space:nowrap; }
.orcamento-fonte{ color:var(--muted); }
/* Rodape das categorias sem previsto (B3) e o "usar o realizado do mes anterior" (#85). */
.orcamento-rodape{ margin-top:var(--esp-3); padding-top:var(--esp-3); border-top:1px solid var(--line); }
.orcamento-rodape strong{ color:var(--ink); font-variant-numeric:tabular-nums; white-space:nowrap; }
.orcamento-sugestao{ margin-top:var(--esp-3); align-items:flex-start; gap:var(--esp-2); }
.orcamento-sugestao .texto-apoio{ margin:0; }
/* O rotulo nomeia o mes ("Usar o realizado de setembro/2026 como estimativa"): em 390 px
   ele quebra em duas linhas em vez de estourar a pagina. */
.orcamento-sugestao .botao{ white-space:normal; text-align:left; max-width:100%; }
/* == a-pagar == */
/* Tela /a-pagar (issue #77): a "planilha" do em aberto. Mobile-first: cada linha e um
   grid de 3 colunas (data · descricao · valor) com o <details> do "marcar pago" ocupando
   a linha de baixo; a partir de 640px o botao vai para a 4a coluna e o formulario, quando
   aberto, ocupa a largura toda embaixo da linha. Nada de JS: <details>/<summary> abrem e
   fecham sozinhos e o htmx troca so o <li> ao confirmar. */
.a-pagar-topo{ margin-bottom:1rem; }
.hero-a-pagar .hero-valor{ margin-bottom:0.35rem; }
.hero-meta-a-pagar{ display:flex; flex-wrap:wrap; align-items:center; gap:0.4rem 0.75rem; font-size:var(--texto-sm); color:var(--muted); }
.hero-meta-a-pagar .badge{ text-decoration:none; }
.hero-rodape-a-pagar{ display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:0.6rem; margin-top:0.9rem; }
.hero-rodape-a-pagar .hero-secundario{ text-decoration:none; }

.grupo-a-pagar{ margin-bottom:1rem; }
.grupo-a-pagar-vazio{ padding-top:0.7rem; padding-bottom:0.7rem; }
.grupo-a-pagar-vazio .texto-vazio{ margin-top:0.15rem; }
.grupo-a-pagar-vencidos .card-titulo h2{ color:var(--red-texto); }
.grupo-a-receber .card-titulo-valor-receita{ color:var(--prumo); }
/* Aportes programados (B8): mesmo cartao de grupo, com a frase que explica por que esta
   fora do total. */
.grupo-aportes > .texto-apoio{ margin:0 0 var(--esp-1); }
.cabecalho-a-pagar .card-titulo-apoio{ margin-left:0.35rem; font-weight:600; }
.cabecalho-a-pagar-confirmar{ display:block; font-size:var(--texto-xs); font-weight:var(--peso-medio); color:var(--amber); }

.lista-a-pagar{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; }
.linha-a-pagar{
  display:grid;
  /* 4.25rem: "em 34 dias" (xs) cabe sem vazar para a descrição. */
  grid-template-columns:4.25rem minmax(0, 1fr) auto;
  /* #116: a linha e so leitura — o "marcar pago" (area `acao`) saiu: o agente marca. */
  grid-template-areas:
    "data descricao valor";
  gap:0.25rem 0.75rem;
  align-items:start;
  padding:0.65rem 0;
  border-bottom:1px solid var(--line);
  font-size:var(--texto-sm);
}
.linha-a-pagar:last-child{ border-bottom:none; }
.linha-a-pagar-data{ grid-area:data; display:flex; flex-direction:column; gap:0.05rem; }
.linha-a-pagar-dia{ font-weight:800; font-variant-numeric:tabular-nums; white-space:nowrap; }
.linha-a-pagar-relativo{ font-size:var(--texto-xs); color:var(--muted); white-space:nowrap; }
.linha-a-pagar-vencida .linha-a-pagar-dia,
.linha-a-pagar-vencida .linha-a-pagar-relativo{ color:var(--red-texto); }
/* break-word, nao anywhere: "Poupança/investimento" quebrava no meio da palavra em 390 px
   so porque a coluna podia encolher; com break-word a palavra inteira ganha a linha. */
.linha-a-pagar-descricao{ grid-area:descricao; min-width:0; display:flex; flex-direction:column; gap:0.1rem; overflow-wrap:break-word; }
/* Subtitulo do grupo "Depois" (#85): a parte ate a data-limite do hero fica a vista. */
.a-pagar-subtitulo{ display:flex; justify-content:space-between; gap:var(--esp-3); margin:var(--esp-2) 0 0; font-size:var(--texto-sm); font-weight:var(--peso-medio); color:var(--muted); }
.a-pagar-subtitulo-valor{ font-variant-numeric:tabular-nums; white-space:nowrap; color:var(--ink); }
.linha-a-pagar-titulo{ font-weight:600; color:var(--ink); }
/* O link do lançamento é o alvo de toque da linha: 44 px no celular, 36 px (altura da
   linha densa) a partir de 640 px (R4.3). `flex` + `min-width:0` + `anywhere`: como
   inline-flex, o conteúdo anônimo não encolhia e "Poupança/investimento" invadia a coluna
   do valor em 390 px. */
.linha-a-pagar-titulo{ hyphens:auto; }
a.linha-a-pagar-titulo{
  display:flex;
  align-items:center;
  min-height:var(--alvo-toque);
  min-width:0;
  max-width:100%;
  overflow-wrap:anywhere;
}
/* #116: sem o botão ao lado, entre 640 e 1023 px o título-link é o alvo da linha e volta a
   44 px; a 36 px só no desktop (R4.3, linha densa com mouse). */
@media (min-width:1024px){
  a.linha-a-pagar-titulo{ min-height:var(--alvo-toque-compacto); }
}
.grupo-a-pagar-depois > summary{ margin:0.25rem 0; }
.linha-a-pagar-acao{ scroll-margin-top:calc(var(--topbar-altura) + var(--esp-4)); }
.linha-a-pagar-apoio{ font-size:var(--texto-xs); color:var(--muted); display:flex; flex-wrap:wrap; align-items:center; gap:0.3rem; }
.badge-ambito{ padding:0 0.4rem; font-size:var(--texto-xs); background:var(--surface-2); color:var(--muted); }
.linha-a-pagar-valor{ grid-area:valor; font-weight:var(--peso-medio); font-variant-numeric:tabular-nums; white-space:nowrap; text-align:right; }
.linha-a-pagar-receita .linha-a-pagar-valor{ color:var(--prumo); }
.linha-a-pagar-valor-confirmar{ color:var(--amber); font-size:var(--texto-xs); font-weight:600; }
.linha-a-pagar-mensagem{ font-size:var(--texto-xs); color:var(--amber); }

/* O "marcar pago em um clique": <details> com o botao no <summary> */
.linha-a-pagar-acao{ grid-area:acao; min-width:0; }
.linha-a-pagar-acao > summary{ list-style:none; display:inline-flex; width:100%; justify-content:center; }
.linha-a-pagar-acao > summary::-webkit-details-marker{ display:none; }
.linha-a-pagar-acao > summary .rotulo-abrir,
.linha-a-pagar-acao > summary .rotulo-fechar{ display:inline-flex; align-items:center; gap:0.35rem; }
.linha-a-pagar-acao > summary .rotulo-fechar{ display:none; }
.linha-a-pagar-acao[open] > summary .rotulo-abrir{ display:none; }
.linha-a-pagar-acao[open] > summary .rotulo-fechar{ display:inline-flex; }
.form-pagar-inline{
  display:grid;
  grid-template-columns:repeat(2, minmax(0, 1fr));
  gap:0.6rem 0.75rem;
  align-items:end;
  margin-top:0.6rem;
  padding:0.75rem;
  border:1px solid var(--line);
  border-radius:var(--radius);
  background:var(--surface-2);
}
.form-pagar-inline .campo{ min-width:0; }
.form-pagar-inline .botao,
.form-pagar-inline .form-pagar-erro{ grid-column:1 / -1; }
.form-pagar-inline .form-pagar-erro{ margin:0; }
.form-pagar-inline .botao{ width:100%; justify-content:center; }

/* Linha ja paga (resposta do htmx) e linha de erro sem item */
.linha-a-pagar-paga{
  grid-template-columns:auto minmax(0, 1fr);
  grid-template-areas:"check descricao";
  align-items:center;
  background:var(--prumo-soft);
  border-radius:var(--radius);
  padding:0.6rem 0.75rem;
  margin:0.2rem 0;
}
.linha-a-pagar-paga .linha-a-pagar-descricao{ color:var(--ink); }
.linha-a-pagar-check{ grid-area:check; color:var(--prumo); display:inline-flex; }
.linha-a-pagar-check .icone{ width:20px; height:20px; }
.linha-a-pagar-erro{ grid-template-columns:minmax(0, 1fr); grid-template-areas:"descricao"; background:var(--red-soft); border-radius:var(--radius); padding:0.6rem 0.75rem; }

/* Painel: tile e aviso de vencidos (o R$ 0,00 nunca esconde vencido, R9.3) */
.tile-vencido{ border-color:var(--red); }
.tile-valor-vencido{ color:var(--red-texto); }
.painel-link-a-pagar{ margin-top:var(--esp-3); }

@media (min-width:640px){
  .linha-a-pagar{
    grid-template-columns:4.25rem minmax(0, 1fr) auto;
    grid-template-areas:
      "data descricao valor";
    align-items:center;
  }
  /* Aberto, o <details> desce para a linha de baixo com a largura toda; fechado, e so
     o botao na 4a coluna. */
  .linha-a-pagar-acao[open]{ grid-area:auto; grid-column:1 / -1; }
  .linha-a-pagar-acao > summary{ width:auto; }
  .form-pagar-inline{ grid-template-columns:minmax(0, 1fr) minmax(0, 1fr) auto; }
  .form-pagar-inline .botao{ grid-column:auto; width:auto; }
  .form-pagar-inline .form-pagar-erro{ grid-column:1 / -1; }
}
/* == revisao == */
/* #116: o cartão só lê — o que falta decidir e a sugestão, no lugar do formulário. */
.grupo-revisao-leitura{ margin:var(--esp-2) 0 0; font-size:var(--texto-sm); color:var(--muted); }
.grupo-revisao-leitura strong{ color:var(--ink); }
/* Issue #85: a acao principal do grupo mora no cartao (fora do <details>). Celular: o
   interruptor, o select (quando a conta e perguntada) e o botao empilham; a partir de
   640 px ficam numa linha, com o botao a direita. */
.grupo-revisao-resolver{
  display:flex;
  flex-direction:column;
  gap:var(--esp-2);
  margin-top:var(--esp-3);
  padding-top:var(--esp-2);
  border-top:1px solid var(--line);
}
.grupo-revisao-resolver select{ width:100%; min-width:0; }
.grupo-revisao-resolver .botao{ width:100%; white-space:normal; justify-content:flex-start; text-align:left; }
.grupo-revisao-sentido{ font-size:var(--texto-xs); font-weight:var(--peso-normal); color:var(--muted); }
.grupo-revisao-sem-conta{ align-self:flex-start; }
.grupo-revisao-itens .grupo-revisao-acoes .botao{ white-space:normal; }
.grupo-revisao-resolver + .grupo-revisao-itens{ margin-top:var(--esp-1); }
/* Cartao que decide a categoria (ou quem pagou) — ultimo item da #85: o select vem com a
   sugestao escolhida e o primario diz o que grava; "Marcar como revisado" e secundario,
   num formulario proprio logo abaixo, alinhado a direita (hierarquia: um botao cheio so). */
.grupo-revisao-sem-decidir{ display:flex; justify-content:flex-end; margin-top:var(--esp-2); }
.grupo-revisao-sem-decidir .botao{ width:100%; white-space:normal; text-align:center; }
.grupo-revisao-sem-decidir + .grupo-revisao-itens{ margin-top:var(--esp-1); }
@media (min-width:640px){
  .grupo-revisao-resolver{ flex-direction:row; flex-wrap:wrap; align-items:center; gap:var(--esp-3); }
  .grupo-revisao-lembrar{ flex:1 1 auto; }
  .grupo-revisao-resolver select{ flex:1 1 220px; width:auto; }
  .grupo-revisao-resolver .botao{ flex:0 0 auto; width:auto; margin-left:auto; justify-content:center; text-align:center; }
  /* Com select de decisao, o interruptor ocupa a linha de cima e o select divide a de
     baixo com o primario (dois selects — conta e categoria — cabem lado a lado). */
  .grupo-revisao-decide .grupo-revisao-lembrar{ flex:1 1 100%; }
  .grupo-revisao-decide select{ flex:1 1 200px; }
  .grupo-revisao-sem-decidir .botao{ width:auto; }
}
/* Regras aprendidas (issue #83, D45): card-disclosure recolhido no fim de /revisao. A
   lista reusa .lista-linhas; aqui so o miolo de cada linha (texto que quebra + botao). */
.regras-aprendidas{ margin-top:var(--esp-5); }
.regras-aprendidas-corpo{ padding:var(--esp-2) var(--esp-4) var(--esp-4) var(--esp-6); }
.regras-aviso{ color:var(--amber); font-weight:600; }
.regra-numero{ font-variant-numeric:tabular-nums; white-space:nowrap; }
.regras-aprendidas-corpo > .texto-apoio{ margin:0 0 var(--esp-2); }
.regras-lista .regra-linha{ align-items:center; flex-wrap:nowrap; }
.regra-texto{ display:flex; flex-direction:column; gap:var(--esp-1); min-width:0; flex:1 1 auto; }
.regra-nome{ font-weight:600; color:var(--ink); overflow-wrap:anywhere; }
.regra-decisao{ color:var(--muted); overflow-wrap:anywhere; }
.regra-apoio{ color:var(--muted); font-size:var(--texto-xs); }
.regra-problema{ margin:0; overflow-wrap:anywhere; }
.regra-linha .form-embutido{ flex:0 0 auto; }

/* == metas == */
/* Tela /metas, detalhe da meta e bloco "Metas em foco" do painel (issue #84, D46).
   Mobile-first: cada meta e uma coluna (prioridade/categoria/prazo, titulo, barra, leitura
   e o <details> do check-in). A barra e o .progresso de app.css, o check-in e um .revelar
   com .form-inline e os badges sao os publicos: aqui so o arranjo da linha. Sem JS: o
   <details> abre sozinho e o htmx troca so o <li> ao registrar. Valores so por token. */
.lista-metas{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; }
.meta-item{
  display:flex;
  flex-direction:column;
  gap:var(--esp-1);
  min-width:0;
  padding:var(--esp-3) 0;
  border-top:1px solid var(--line);
  /* ancora #meta-N (detalhe e painel apontam para a linha): nao fica atras da barra */
  scroll-margin-top:calc(var(--topbar-altura) + var(--esp-4));
}
.meta-item:first-child{ border-top:none; padding-top:0; }
.meta-item:last-child{ padding-bottom:0; }
.meta-item-topo{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:var(--esp-1) var(--esp-2);
  font-size:var(--texto-xs);
  line-height:var(--linha-xs);
  color:var(--muted);
}
.meta-item-categoria{ font-weight:var(--peso-medio); }
.meta-item-prazo{ margin-left:auto; white-space:nowrap; font-variant-numeric:tabular-nums; }
/* O titulo e o link para o detalhe: alvo de toque de 44px em toda largura (R4.3). */
.meta-item-titulo{
  display:flex;
  align-items:center;
  min-height:var(--alvo-toque);
  font-weight:var(--peso-medio);
  line-height:var(--linha-lg);
  color:var(--ink);
  /* Texto do usuario: pode trazer cifra ("R$10.000+/mes") e precisa quebrar (R9.18). */
  font-variant-numeric:tabular-nums;
  overflow-wrap:anywhere;
}
.meta-leitura{
  display:flex;
  flex-direction:column;
  gap:var(--esp-1);
  font-size:var(--texto-sm);
  line-height:var(--linha-sm);
  color:var(--muted);
  font-variant-numeric:tabular-nums;
  overflow-wrap:anywhere;
}
.meta-leitura strong{ color:var(--ink); }
.meta-item-aviso{ margin:var(--esp-2) 0 0; }
.meta-checkin{ margin-top:var(--esp-2); }
.form-checkin{ padding-bottom:var(--esp-3); }
.form-checkin .form-checkin-linha{ flex:1 1 100%; margin:0; }
.form-checkin .botao{ flex:1 1 100%; }
/* .card-disclosure nao tem padding proprio: a lista recolhida usa o do card. */
.lista-metas-encerradas{ padding:var(--card-padding); }
.meta-link-todas{ margin-top:var(--esp-2); }

/* Detalhe da meta */
.meta-titulo{ overflow-wrap:anywhere; }
.meta-historico-titulo{
  margin:var(--esp-4) 0 var(--esp-1);
  font-size:var(--texto-sm);
  font-weight:var(--peso-medio);
  color:var(--muted);
}
.meta-checkin-texto{ flex:1 1 60%; min-width:0; overflow-wrap:anywhere; }

@media (min-width:640px){
  .form-checkin .botao{ flex:0 0 auto; }
}
