/* Identidade Moratta: verde oliva escuro #22372B, creme #F3EEE3, dourado #C2A15E
   Tipografia de documento oficial (PLT/POP/INT/REG/MAN): Playfair Display (titulo) + Inter (corpo).
   Fonte da regra: 03 Projects/moratta-gastronomia/identidade-visual/aplicacao-identidade-visual-documentos-oficiais.md

   Fontes servidas localmente, nunca por CDN: o CSS do Google bloqueia a renderizacao
   e entrega o IP do morador a um terceiro. Os dois arquivos sao variaveis, um por familia.

   Inter    - SIL Open Font License 1.1, Copyright 2020 The Inter Project Authors
   Playfair - SIL Open Font License 1.1, Copyright 2017 The Playfair Display Project Authors,
              with Reserved Font Name "Playfair Display"
   Texto integral das duas licencas em assets/fonts/OFL-*.txt */

@font-face{
  font-family:'Inter';
  src:url('/assets/fonts/inter-var-6585.woff2') format('woff2');
  font-weight:400 700; font-style:normal; font-display:swap;
}
@font-face{
  font-family:'Playfair Display';
  src:url('/assets/fonts/playfair-var-6da2.woff2') format('woff2');
  font-weight:500 700; font-style:normal; font-display:swap;
}

/* Fallback calibrado, uma face por peso. O line-height do portal e numerico (1.5),
   entao o que desloca o layout e a LARGURA do texto, nao a metrica vertical: o
   size-adjust sai da razao entre a largura da mesma frase nas duas fontes, medida
   em canvas a 100px. Sem declarar o peso, uma face so cobre 400 e o navegador
   sintetiza o negrito do corte regular, o que erra a largura em 14%.
   ascent/descent-override escalados pelo mesmo fator, para o baseline nao andar. */
@font-face{ font-family:'Inter Fallback'; font-weight:400;
  src:local('Arial'), local('Helvetica'), local('Liberation Sans');
  size-adjust:106.7%; ascent-override:90.9%; descent-override:22.5%; line-gap-override:0%; }
@font-face{ font-family:'Inter Fallback'; font-weight:600 700;
  src:local('Arial Bold'), local('Helvetica Bold'), local('Liberation Sans Bold');
  size-adjust:101.9%; ascent-override:95.2%; descent-override:23.5%; line-gap-override:0%; }

@font-face{ font-family:'Playfair Fallback'; font-weight:500;
  src:local('Georgia'), local('Times New Roman'), local('Liberation Serif');
  size-adjust:102.1%; ascent-override:105.8%; descent-override:24.5%; line-gap-override:0%; }
@font-face{ font-family:'Playfair Fallback'; font-weight:600;
  src:local('Georgia Bold'), local('Times New Roman Bold'), local('Liberation Serif Bold');
  size-adjust:88.3%; ascent-override:122.3%; descent-override:28.3%; line-gap-override:0%; }
@font-face{ font-family:'Playfair Fallback'; font-weight:700;
  src:local('Georgia Bold'), local('Times New Roman Bold'), local('Liberation Serif Bold');
  size-adjust:89.0%; ascent-override:121.4%; descent-override:28.1%; line-gap-override:0%; }
@font-face{
  font-family:'Playfair Fallback';
  src:local('Georgia'), local('Times New Roman'), local('Liberation Serif');
  size-adjust:89.0%; ascent-override:121.4%; descent-override:28.1%; line-gap-override:0%;
}

:root{
  /* ---- Camada 1: tintas. Unico lugar do arquivo com valor hexadecimal. ----
     As oito primeiras sao a paleta de documento oficial da Moratta, documentada em
     identidade-visual/aplicacao-identidade-visual-documentos-oficiais.md no vault.
     Verde Oliva Escuro e Dourado sao cores de MARCA, nao invencao do padrao de documento. */
  --moratta-verde-oliva:#22372B;   /* Verde Oliva Escuro, cor de marca */
  --moratta-creme:#F3EEE3;
  --moratta-areia:#EAE2CE;
  --moratta-dourado:#C2A15E;       /* Dourado, cor de marca */
  --moratta-oliva:#8f9d81;
  --moratta-terracota:#CC6B49;     /* Terracota Suave, cor de apoio */
  --moratta-marrom:#8a7d5e;
  --moratta-linha:#ded4bd;

  /* Estas cinco NAO estao na paleta documentada: nasceram aqui no portal.
     Se a marca publicar valores oficiais para estes papeis, e aqui que se troca. */
  --local-branco:#ffffff;          /* fundo de cartao, tabela e indicador */
  --local-verde-hover:#2c4636;     /* botao pressionavel, so no hover */
  --local-pedra:#cfc7b4;           /* etiqueta de lote encerrado */
  --local-terracota-fraca:#f6e2db; /* fundo do aviso de erro */
  --local-oliva-fraca:#e6ebe1;     /* fundo do aviso de sucesso */
  --local-verde-mov:#4e623e;       /* Verde Sage #87A96B a 58%: 6,69:1 no branco, 5,18:1 na areia */
  --local-vermelho-mov:#934d35;    /* Terracota Suave escurecido ate passar em contraste */

  /* ---- Camada 2: papel na interface. Toda regra deste arquivo usa SO estes. ----
     Definidos em pares superficie/conteudo: o token base e o fundo, o -foreground e a
     cor de texto e de icone validada para ficar sobre ele. Convencao do shadcn/ui.
     A razao ao lado de cada par foi medida em 30/08/2026, nao conferida no olho.
     Validar aqui, uma vez, torna impossivel a combinacao errada la na frente. */
  --background:var(--moratta-creme);          --foreground:var(--moratta-verde-oliva);        /* 11,00:1  ok */
  --card:var(--local-branco);                 --card-foreground:var(--moratta-verde-oliva);   /* 12,73:1  ok */
  --primary:var(--moratta-verde-oliva);       --primary-foreground:var(--moratta-creme);      /* 11,00:1  ok */
  --primary-hover:var(--local-verde-hover);                                                   /*  8,91:1  ok */
  --accent:var(--moratta-dourado);            --accent-foreground:var(--moratta-verde-oliva); /*  5,19:1  ok */
  --neutral:var(--local-pedra);               --neutral-foreground:var(--moratta-verde-oliva);/*  7,57:1  ok */

  /* Os quatro pares abaixo reprovam no minimo de 4,5:1 e ficam assim POR DECISAO
     do Gabriel em 30/08/2026: sao a paleta Moratta, e trocar a tinta diverge do
     padrao de documento. Revisao adiada, nao esquecida. Nao reabrir sem decisao nova. */
  --muted:var(--moratta-areia);               --muted-foreground:var(--moratta-marrom);       /*  3,51:1 sobre background · 4,06:1 sobre card · 3,14:1 sobre muted  REPROVA */
  --success:var(--moratta-oliva);             --success-foreground:var(--local-branco);       /*  2,87:1  REPROVA */
  --destructive:var(--moratta-terracota);     --destructive-foreground:var(--local-branco);   /*  3,64:1  REPROVA */

  /* Fundos fracos de aviso: o texto sobre eles e o --foreground, nao um -foreground proprio */
  --success-subtle:var(--local-oliva-fraca);                                                  /* 10,51:1  ok */
  --destructive-subtle:var(--local-terracota-fraca);                                          /* 10,20:1  ok */

  --border:var(--moratta-linha);   /* divisor decorativo: o minimo de 3:1 vale para componente de interface, nao para ornamento */
  --input:var(--moratta-marrom);   /* contorno de campo, que E componente de interface: 4,06:1  ok */
  --entrada:var(--local-verde-mov);        /* + no extrato: 6,69:1 no branco, 5,18:1 na areia */
  --saida:var(--local-vermelho-mov);      /* - no extrato: Terracota a 72%   6,26:1 no branco, 4,85:1 na areia */
  --ring:var(--moratta-verde-oliva);

  --radius:8px; --radius-sm:6px; --radius-lg:10px; --radius-pill:20px;

  --fonte-corpo:'Inter','Inter Fallback',sans-serif;
  --fonte-titulo:'Playfair Display','Playfair Fallback',Georgia,serif;

  /* ---- Cores de grafico ----
     A paleta de documento e terrosa de proposito, e por isso reprova como paleta
     categorica: o verde oliva e o dourado ficam abaixo do piso de croma e leem como
     cinza em marca pequena. Estes dois sao o MESMO verde e o MESMO dourado da marca
     com saturacao suficiente, e so existem no grafico. Validados em 13/09/2026 com
     o validador da skill de visualizacao, sobre o branco do cartao: faixa de
     luminosidade, piso de croma, separacao para daltonismo (protan 10,1) e
     contraste, todos aprovados. Verde e sempre o que ENTROU; dourado, o que foi
     CONSUMIDO, em qualquer grafico do painel. */
  --local-grafico-verde:#2b7a4f;
  --local-grafico-dourado:#b8862f;
  --serie-entrada:var(--local-grafico-verde);
  --serie-consumo:var(--local-grafico-dourado);
}

/* ---- Tema escuro · so o backoffice liga ----
   Os MESMOS tokens de papel, redefinidos. Nenhuma regra do arquivo muda: todas ja
   usam so a camada 2, conferido em 13/09/2026 (zero tinta de camada 1 e zero hex
   fora do :root). E a convencao do shadcn/ui, que sobrescreve os tokens dentro de
   .dark em vez de escrever regra nova por componente.

   O fundo e o verde oliva da marca escurecido, e nao preto: preto sobre creme
   parece outra empresa. Texto e botao primario sao o creme da marca; o dourado vira
   o anel de foco, que no tema claro reprova sobre toda superficie clara.

   Razoes medidas em 13/09/2026 pela formula WCAG, cada par contra a superficie onde
   aparece. Os quatro pares que reprovam no tema claro por decisao de marca (texto
   secundario, etiqueta de ativo e de vencimento) PASSAM aqui, porque no escuro nao
   houve paleta anterior a respeitar. */
:root[data-tema="escuro"]{
  color-scheme:dark;
  --local-escuro-fundo:#141E18;
  --local-escuro-cartao:#1B2821;
  --local-escuro-campo:#25352B;
  --local-escuro-linha:#34473A;
  --local-escuro-pedra:#4A5A4F;
  --local-escuro-texto2:#BDB49D;
  --local-escuro-oliva:#9DB08A;
  --local-escuro-terracota:#E0876A;
  --local-escuro-oliva-fraca:#213428;
  --local-escuro-terracota-fraca:#3B2620;
  --local-escuro-borda-campo:#8A8069;
  --local-escuro-verde-mov:#9FC28A;
  --local-escuro-vermelho-mov:#E79A7F;

  --background:var(--local-escuro-fundo);     --foreground:var(--moratta-creme);          /* 14,77:1  ok */
  --card:var(--local-escuro-cartao);          --card-foreground:var(--moratta-creme);     /* 13,23:1  ok */
  --primary:var(--moratta-creme);             --primary-foreground:var(--moratta-verde-oliva); /* 11,00:1 ok */
  --primary-hover:var(--moratta-areia);                                                   /*  9,86:1  ok */
  --accent:var(--moratta-dourado);            --accent-foreground:var(--local-escuro-fundo); /* 6,96:1 ok · 6,23:1 no cartao */
  --neutral:var(--local-escuro-pedra);        --neutral-foreground:var(--moratta-creme);  /*  6,33:1  ok */
  --muted:var(--local-escuro-campo);          --muted-foreground:var(--local-escuro-texto2); /* 7,42 cartao · 8,28 fundo · 6,27 campo */
  --success:var(--local-escuro-oliva);        --success-foreground:var(--local-escuro-fundo); /* 7,33:1 ok */
  --destructive:var(--local-escuro-terracota); --destructive-foreground:var(--local-escuro-fundo); /* 6,38:1 ok */
  --success-subtle:var(--local-escuro-oliva-fraca);                                       /* 11,44:1  ok */
  --destructive-subtle:var(--local-escuro-terracota-fraca);                               /* 12,23:1  ok */
  --border:var(--local-escuro-linha);                                                     /*  1,54:1  linha recessiva */
  --input:var(--local-escuro-borda-campo);                                                /*  3,92:1  ok, nao texto */
  --entrada:var(--local-escuro-verde-mov);                                                /*  7,69:1  ok */
  --saida:var(--local-escuro-vermelho-mov);                                               /*  6,80:1  ok */
  --ring:var(--moratta-dourado);                                                          /*  6,23 cartao · 6,96 fundo */

  /* Grafico no escuro: passos proprios, validados contra o cartao escuro, e nao
     os do claro invertidos. Todas as checagens aprovadas, protan 9,5. */
  --local-grafico-verde:#2a8155;
  --local-grafico-dourado:#be892d;
}
*{box-sizing:border-box}
body{margin:0;background:var(--background);color:var(--foreground);
  font-family:var(--fonte-corpo);font-size:16px;line-height:1.5}
/* 14px de respiro, o mesmo do .topo-centro: as duas barras, a da entrada e a do
   portal, ficam com 68px e a passagem de uma para a outra nao pula. */
.topo{background:var(--primary);color:var(--primary-foreground);padding:14px 20px;display:flex;align-items:center;justify-content:space-between;gap:18px;flex-wrap:wrap}
.marca{display:flex;align-items:center}
/* Logo servido como MASCARA, nao como <img>. SVG carregado por <img> e documento
   isolado e nao herda currentColor, entao sairia preto sobre o verde. Como mascara,
   o arquivo vira recorte e a cor vem do background-color: um arquivo so, cacheavel,
   servindo o cabecalho escuro e o fundo claro.
   O nome do arquivo carrega o hash do conteudo, que e o que torna seguro o
   Cache-Control immutable do .htaccess.
   Marca de uma linha desde 15/09/2026, a que o empreendimento usa hoje: a caixa
   passou de 1860x838 para 1150x361, proporcao 3,184. O arquivo e a versao preta
   do lockup, nao a currentColor: SVG em mask e documento isolado, e preto opaco
   deixa o recorte explicito em vez de depender do valor inicial de color.
   115px de LARGURA e o que preserva a legibilidade da assinatura, nao os 52px de
   altura de antes: o bloco "by MORATTA GASTRONOMIA" e a mesma peca ancorada em
   1150, entao o tamanho dele na tela sai da largura do logo e nao da altura.
   Medido nos dois arquivos renderizados a 1150px: assinatura de 33px no antigo e
   34px no novo. Mantendo a largura, a altura cai para 36px. */
.logo-garden{-webkit-mask:url("/assets/marca/the-garden-3236.svg") no-repeat center/contain;
  mask:url("/assets/marca/the-garden-3236.svg") no-repeat center/contain;
  background-color:currentColor;display:block;flex:0 0 auto;height:36px;width:115px}

/* Marca-mae, so na barra da tela de entrada. Recortada do "Ativo de Marca 02" do
   conjunto oficial (a versao limpa, sem as ondas), que vinha numa tela de 9375px
   com o desenho perdido no meio: recortado no bbox e reduzido a 1200px de largura.
   Vale como mascara pelo mesmo motivo do The Garden: o PNG e off-white sobre
   transparencia, entao o que a mascara usa e o canal alfa, e a cor vem do CSS.
   40px e onde "GASTRONOMIA" ainda se le. Medido em 30, 40 e 52px; a variante com
   as ondas so funciona a partir de 52 e ali competiria com o The Garden acima. */
.logo-moratta{-webkit-mask:url("/assets/marca/moratta-c1fe.png") no-repeat center/contain;
  mask:url("/assets/marca/moratta-c1fe.png") no-repeat center/contain;
  background-color:currentColor;display:block;flex:0 0 auto;height:40px;width:169px}
.topo-centro{justify-content:center;padding:14px 20px}

/* The Garden acima do cartao de entrada: ali ele e o assunto da tela, nao um
   acessorio. O logo tem tamanho proprio e nao acompanha mais a largura do cartao. Acompanhando,
   ele saia com 384px na entrada e 600px no cadastro, 56% maior, e as duas telas da
   mesma marca pareciam de projetos diferentes quando vistas uma depois da outra.
   384px e a medida da entrada, que e a tela que o morador ve primeiro. */
.entrada-marca{display:block;width:100%;max-width:384px;aspect-ratio:1150/361;height:auto;
  margin:0 auto 24px;color:var(--primary)}
/* logo de um lado, acoes do outro. O space-between vive na declaracao base do .topo
   la em cima: aqui embaixo ele venceria o .topo-centro da tela de entrada por ordem
   de arquivo, e a marca voltaria para a esquerda. */
.topo nav{display:flex;gap:16px;margin-left:auto;flex-wrap:wrap}
.topo .acoes{display:flex;align-items:center;gap:14px;margin-left:auto}
.topo .acoes nav{margin-left:0}
.topo nav a{color:var(--primary-foreground);text-decoration:none;font-size:14px;opacity:.85;border-bottom:1px solid transparent;padding-bottom:2px}
.topo nav a:hover{opacity:1;border-color:var(--accent)}
.topo .sair{color:var(--accent);flex:0 0 auto}
main{max-width:960px;margin:0 auto;padding:24px 20px 60px}
h1{font-family:var(--fonte-titulo);font-weight:700;font-size:26px;letter-spacing:.5px;margin:8px 0 4px}
h2{font-family:var(--fonte-titulo);font-weight:600;font-size:19px;margin:26px 0 8px;letter-spacing:.3px}
.sub{color:var(--muted-foreground);margin:0 0 18px;font-size:14px}
footer{border-top:1px solid var(--border);color:var(--muted-foreground);font-size:12px;text-align:center;padding:16px}

.cartao{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:18px;margin:0 0 16px}
.saldo{background:var(--primary);color:var(--primary-foreground);border-radius:var(--radius-lg);padding:24px;margin-bottom:18px}
/* a margem de baixo do ultimo paragrafo nao colapsa contra o padding do cartao:
   somava 13px aos 24, e o vazio embaixo do valor ficava maior que o de cima */
.saldo>:last-child{margin-bottom:0}
.saldo .rotulo{font-size:11px;letter-spacing:2px;text-transform:uppercase;color:var(--accent)}
.saldo .valor{font-family:var(--fonte-titulo);font-weight:500;font-size:40px;line-height:1.1;margin-top:6px}
.saldo .nota{font-size:13px;opacity:.8;margin-top:8px}

table{width:100%;border-collapse:collapse;font-size:14px;background:var(--card)}
/* Conteudo e titulos de coluna centralizados. Duas excecoes, e as duas tem motivo:
   .num continua a direita, porque valor alinhado pela virgula e o que permite
   comparar um com o outro de relance; e .esq fica a esquerda onde a celula carrega
   uma etiqueta ao lado do dado, que empurraria o dado para fora do centro. */
th{background:var(--primary);color:var(--primary-foreground);text-align:center;padding:8px 10px;font-weight:600;font-size:13px}
td{padding:8px 10px;border-bottom:1px solid var(--border);vertical-align:middle;text-align:center}
th.esq,td.esq{text-align:left}
/* titulo de coluna sempre centralizado, inclusive o das colunas de dinheiro: o
   numero continua a direita, mas o rotulo centraliza sobre a coluna */
/* O titulo da coluna de dinheiro centraliza sobre a CAIXA do valor, nao sobre a
   celula: a caixa vai de ponta a ponta com o R$ na esquerda e o numero na direita,
   e o padding da celula desloca o centro dela. Com a mesma caixa flex no <th>, o
   rotulo assenta exatamente sobre o conteudo que ele nomeia. */
th.num{text-align:center;padding:0}
th.num>span{display:flex;width:100%;align-items:center;justify-content:center;
  padding:8px 10px;box-sizing:border-box}
/* entrada e saida no extrato. Verde e vermelho derivados da propria paleta, nao
   cores de semaforo genericas: Verde Sage a 64% e Terracota Suave a 72%, os dois
   escurecidos ate passar em contraste sobre o branco E sobre a faixa areia. */
/* ---- Dinheiro empilhado ----
   O simbolo ancora na esquerda da celula e o numero na direita, entao numa coluna
   os R$ ficam todos na mesma vertical e os valores tambem. Com "R$ 100,00" e
   "R$ 57,50" numa string so, alinhar a direita casa os numeros e faz o R$ dancar.
   O tabular-nums e o espaco entre digitos existem para o empilhamento: sem eles,
   unidade, dezena e centena nao se distinguem de uma linha para a outra. */
/* A caixa ocupa a CELULA INTEIRA, nao um minimo. Com min-width, "R$ 100,00"
   estourava a largura e "R$ 57,50" nao, entao as caixas ficavam de tamanhos
   diferentes e o R$ dancava de linha para linha. Ocupando a celula, todas as
   caixas da coluna tem a mesma largura: o R$ ancora na esquerda e o valor na
   direita, e os dois alinham verticalmente sozinhos. */
/* Tres colunas de largura previsivel: sinal, simbolo e numero. O sinal reserva o
   proprio espaco mesmo quando esta vazio, entao "+ R$ 118,00" e "R$ 257,50"
   alinham o R$ na mesma vertical. O numero cresce para a esquerda a partir da
   direita, entao unidade, dezena e centena tambem se empilham. */
.mo{display:flex;width:100%;max-width:132px;margin-left:auto;align-items:baseline;
  gap:5px;font-variant-numeric:tabular-nums}
.mo-sinal{flex:0 0 9px;text-align:right}
.mo-s{flex:0 0 auto;opacity:.72;font-size:.92em}
.mo-v{flex:1 1 auto;text-align:right;letter-spacing:.055em}
.cartao-mobile .mo{width:auto;gap:6px}

td.entrada{color:var(--entrada);font-weight:600}
td.saida{color:var(--saida);font-weight:600}

/* Larguras de coluna da tabela de creditos: sem isso o navegador aperta as duas
   primeiras e sobra folga nas de dinheiro. */
.t-creditos{table-layout:fixed}
/* A etiqueta de vencimento tem COLUNA PROPRIA. Dentro da celula da data ela
   empurrava a data e as datas deixavam de empilhar uma sobre a outra; posicionada
   por cima, cobria a data, porque a coluna nao tem largura para as duas coisas.
   Numa coluna so dela, a data centraliza limpa e a etiqueta fica ao lado. */
.t-creditos th:nth-child(1),.t-creditos td:nth-child(1){width:16%}
.t-creditos th:nth-child(2),.t-creditos td:nth-child(2){width:18%}
.t-creditos th:nth-child(3),.t-creditos td:nth-child(3){width:19%}
.t-creditos th:nth-child(4),.t-creditos td:nth-child(4){width:13%;padding-left:0;padding-right:0}
.t-creditos th:nth-child(5),.t-creditos td:nth-child(5){width:15%}
.t-creditos th:nth-child(6),.t-creditos td:nth-child(6){width:16%}
.col-aviso{text-align:left}
/* Extrato: a descricao leva a folga, as datas e o dinheiro tem largura propria. */
.t-extrato{table-layout:fixed}
/* As colunas de dinheiro sao estreitas de proposito: com a caixa ocupando a celula
   inteira, coluna larga afasta o R$ do numero e "+ R$        118,00" deixa de ler
   como um valor so. O alinhamento vertical se mantem; o que muda e a distancia. */
.t-extrato th:nth-child(1),.t-extrato td:nth-child(1){width:24%}
.t-extrato th:nth-child(3),.t-extrato td:nth-child(3){width:15%}
.t-extrato th:nth-child(4),.t-extrato td:nth-child(4){width:16%}
tr:nth-child(even) td{background:var(--muted)}
/* A tabela ja estava dentro de um contêiner com overflow-x:auto, mas table{width:100%}
   impedia que ela passasse da largura dele, entao a rolagem nunca disparava e as
   celulas quebravam. Medido a 390px: os creditos pedem 541px e o extrato 685px.
   max-content evita numero magico e se ajusta ao conteudo real. */
.tabela-rolavel{overflow-x:auto;border:1px solid var(--border);border-radius:var(--radius)}
.tabela-rolavel table{min-width:max-content}
/* A regiao rolavel e alcancavel por teclado (tabindex no markup) e o anel de foco
   nao pode ficar escondido pelo overflow. */
.tabela-rolavel:focus-visible{outline:2px solid var(--ring);outline-offset:2px}
.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}

label{display:block;font-size:13px;color:var(--muted-foreground);margin:12px 0 4px;text-transform:uppercase;letter-spacing:.5px}
input,select{width:100%;padding:11px 12px;border:1px solid var(--input);border-radius:var(--radius-sm);font-size:16px;background:var(--card);color:var(--card-foreground)}
/* Foco de teclado. Medido em 30/08/2026: o dourado reprova em toda superficie
   clara (2,46:1 sobre o branco, 2,12:1 sobre o creme, 1,90:1 sobre a areia),
   abaixo do minimo de 3:1 para elemento de interface, e so passa sobre o verde
   (5,19:1), que e onde ele nao estava sendo usado. O verde da marca passa em tudo
   que e claro (12,7 / 11,0 / 9,9) e o creme passa sobre o verde (11,0).
   Botao e link nao tinham regra nenhuma: ficavam com o outline padrao do
   navegador, invisivel sobre o cabeçalho verde. Nenhum hex novo entra. */
:focus-visible{outline:2px solid var(--ring);outline-offset:2px;border-radius:4px}
.topo a:focus-visible,.saldo a:focus-visible{outline-color:var(--primary-foreground)}
input:focus-visible,select:focus-visible{outline:2px solid var(--ring);outline-offset:1px}
/* O botao dimensiona pelo conteudo. Largura total e padrao de celular: num cartao
   de 918px, "Filtrar" atravessando a tela inteira nao e enfase, e desequilibrio. */
button{margin-top:18px;width:auto;min-width:200px;padding:13px 28px;border:0;border-radius:var(--radius-sm);
  background:linear-gradient(to bottom, var(--primary), color-mix(in srgb, var(--primary) 82%, var(--card)));
  color:var(--primary-foreground);font-size:15px;letter-spacing:.5px;cursor:pointer;
  transition:background .18s}
/* Onde o proprio contêiner ja e estreito, ocupar tudo e o certo: o formulario de
   login tem 420px e cada coluna de acao da ficha do lote tem 240px. */
form.estreito button,.linha-campos button{width:100%}
button:hover{background:linear-gradient(to bottom, var(--primary-hover), color-mix(in srgb, var(--primary) 90%, var(--card)))}
button.secundario{background:transparent;color:var(--primary);border:1px solid var(--primary)}
form.estreito{max-width:420px}
/* Os campos alinham pela BASE, nao pelo topo.
   Antes era so flex com wrap, e a altura de cada coluna dependia do rotulo dela:
   "CPF de quem esta transferindo" quebrava em duas linhas e empurrava o proprio
   campo um degrau para baixo dos vizinhos, desenquadrando a linha inteira. Pendurar
   o campo no fim da coluna resolve na estrutura, e nao encurtando rotulo: rotulo
   volta a crescer na proxima tela, e em 400px todos eles quebram. */
.linha-campos{display:flex;gap:14px;flex-wrap:wrap;align-items:stretch}
.linha-campos>div{flex:1 1 200px;display:flex;flex-direction:column;min-width:0}
.linha-campos>div>label{flex:0 0 auto}
.linha-campos>div>.campo-ico{margin-top:auto}

/* Busca do caixa: campo e botao na mesma linha.
   O Buscar estava centralizado embaixo, dentro de .acoes-form, e abria uma faixa
   morta de cada lado do cartao. Ao lado do campo ele fecha o bloco em uma linha so
   e a ficha do lote sobe para dentro da primeira tela do balcao.
   As duas caixas ficam em 52px, que e a altura de botao pill do resto do sistema:
   o input cresce ate ela em vez de o botao encolher, para nao criar um segundo
   tamanho de botao. */
.busca-linha{display:flex;align-items:stretch;gap:12px}
.busca-linha .campo-ico{flex:1 1 auto;margin-bottom:0;min-width:0}
.busca-linha .campo-ico input{height:52px;padding-top:0;padding-bottom:0}
.busca-linha .btn-pill{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;
  margin:0;height:52px;width:172px;min-width:0;padding:0 22px;
  border:2px solid transparent;border-radius:26px;cursor:pointer;
  font-family:var(--fonte-corpo);font-size:15px;font-weight:600;letter-spacing:0;
  background:linear-gradient(to bottom, var(--primary), color-mix(in srgb, var(--primary) 82%, var(--card)));
  color:var(--primary-foreground);transition:background .18s}
.busca-linha .btn-pill:hover{background:linear-gradient(to bottom, var(--primary-hover),
  color-mix(in srgb, var(--primary) 90%, var(--card)))}
/* No celular o botao passa a ocupar a linha inteira embaixo: lado a lado, os dois
   ficariam estreitos demais para o dedo e o placeholder do lote sumiria. */
@media (max-width:560px){
  .busca-linha{flex-wrap:wrap}
  .busca-linha .campo-ico{flex:1 1 100%}
  .busca-linha .btn-pill{width:100%}
}

/* O select usa a mesma caixa dos inputs com icone. A regra existente so alcancava
   input, entao ele nascia branco e sem o recuo do icone.
   O appearance:none e o que conserta de verdade: sem ele o seletor nativo do macOS
   ignora o padding-esquerdo e escreve o texto POR CIMA do icone, e ainda desenha a
   propria seta dupla, que nao pertence a familia Phosphor. */
.campo-ico select{appearance:none;-webkit-appearance:none;
  background:var(--muted);border-color:transparent;
  padding-left:40px;padding-right:38px;cursor:pointer}
.campo-ico select:focus-visible{border-color:var(--ring)}
/* A seta e um <use> do sprite, como todo icone do portal. pointer-events:none deixa
   o clique passar para o select que esta atras dela. */
.seta-select{position:absolute;right:13px;top:50%;transform:translateY(-50%);
  display:flex;color:var(--muted-foreground);pointer-events:none}

/* Tres abas em vez de duas. Sem base minima elas se apertam em telas estreitas e o
   rotulo do meio, que e o mais longo, quebra no meio da palavra. */
.periodo-3 button{flex:1 1 150px}

.aviso{display:flex;gap:9px;align-items:flex-start;padding:12px 14px;border-radius:var(--radius-sm);margin:14px 0;font-size:14px;border-left:4px solid}
.aviso.erro{background:var(--destructive-subtle);border-color:var(--destructive)}
.aviso.ok{background:var(--success-subtle);border-color:var(--success)}
.aviso.atencao{background:var(--muted);border-color:var(--accent)}

.etiqueta{display:inline-flex;align-items:center;gap:4px;padding:2px 9px 2px 7px;border-radius:var(--radius-pill);font-size:11px;letter-spacing:.5px;font-weight:600}
/* Iconografia: Phosphor Icons, peso Regular, familia unica. A cor vem do CSS via
   currentColor, nunca chumbada no arquivo, para o mesmo desenho servir a etiqueta
   clara e a escura sem duplicar asset. Ver app/icones.php. */
.ico{fill:currentColor;flex:0 0 auto}
.etiqueta.ativo{background:var(--success);color:var(--success-foreground)}
.etiqueta.suspenso{background:var(--accent);color:var(--accent-foreground)}
.etiqueta.encerrado{background:var(--neutral);color:var(--neutral-foreground)}
.etiqueta.vence{background:var(--destructive);color:var(--destructive-foreground)}
/* Grade em vez de flex-wrap: com quatro indicadores numa coluna de 720px, o
   flex:1 1 170px estourava por 36px e a "Situacao" caia sozinha numa segunda linha,
   virando uma caixa larga com uma etiqueta perdida dentro. O auto-fit reparte o que
   existe e quebra em 2x2 quando nao couber em quatro. */
.indicadores{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));
  gap:14px;margin-bottom:18px}
.indicador{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:14px}
.indicador .rot{font-size:11px;text-transform:uppercase;letter-spacing:1px;color:var(--muted-foreground)}
.indicador .val{font-family:var(--fonte-titulo);font-weight:500;font-size:24px;margin-top:4px}
.dica{font-size:13px;color:var(--muted-foreground);margin-top:6px}
/* Link dentro de texto corrido. Nao existia regra nenhuma, entao "Cadastre o seu
   lote" e o link do termo saiam no azul padrao do navegador, fora da paleta, nas
   duas primeiras telas que o morador ve. O sublinhado fica: cor sozinha nao
   distingue link de texto para quem nao a enxerga. */
main a{color:var(--primary);text-decoration:underline;text-underline-offset:2px;text-decoration-thickness:1px}
main a:hover{text-decoration-thickness:2px}
a.voltar{color:var(--primary);font-size:14px;text-decoration:none}
/* ---- Portal do morador: tudo centralizado ----
   A identificacao do lote (h1 e responsavel) fica a esquerda e funciona como
   cabecalho da pagina; daqui para baixo tudo centraliza. Coluna mais estreita que
   os 960px do main, porque texto centralizado em linha longa fica dificil de ler. */
/* ---- Identificacao do lote ----
   O The Garden a esquerda e o numero do lote ao lado, os dois na mesma faixa. A
   altura do logo casa com a do bloco de texto (h1 de 39px mais sub de 21px, 64 ao
   todo), entao os dois leem como um cabecalho so e nao como dois elementos soltos.
   A largura sai da proporcao 115/52 do arquivo, para o desenho nao distorcer.
   No desktop o par inteiro centraliza, junto com o resto da pagina; no celular o
   logo encosta a esquerda e o texto centraliza no que sobra (ver a media query).
   A faixa repete o max-width do .portal para as bordas coincidirem: ela mora no
   <main>, que e mais largo, e sem isso passaria da borda do cartao de saldo. */
.ident{display:flex;align-items:center;justify-content:center;gap:18px;
  max-width:720px;margin:0 auto 18px}
.ident-marca{height:54px;width:173px;color:var(--primary)}
.ident-texto{min-width:0}
.ident h1{margin:0}
.ident .sub{margin:0}
/* 720px e o minimo que faz caber a mais larga das duas tabelas (o extrato pede
   685px): abaixo disso o "Saldo depois" volta a ser cortado na borda. */
.portal{max-width:720px;margin:0 auto;text-align:center}
.portal h2{text-align:center}
.portal .saldo{text-align:center}
.portal .dica{text-align:center}
.portal form.estreito{margin-left:auto;margin-right:auto;text-align:left}
.portal .cartao{text-align:left}
/* a tabela nao herda o centro do bloco: o conteudo dela e o item 4 */
.portal table{text-align:left}
.portal table .num{text-align:right}

/* ---- Tela do caixa ----
   Mesma coluna de 720px do portal do morador, para as duas telas de dentro terem a
   mesma medida. O texto dos campos fica a esquerda: formulario operacional se le
   linha a linha, e centralizar rotulo de campo atrapalha o preenchimento. Quem
   centraliza sao as acoes, como no pop-up de senha. */
.operacao{max-width:720px;margin:0 auto}
.operacao .cartao{text-align:left}
/* o nome do responsavel nao e numero: entra na escala de texto, nao na de destaque */
.indicador .val-nome{font-size:16px}
/* nota de rodape de formulario, justificada como as do pop-up */
.operacao .nota-rodape{margin-top:14px;font-size:12.5px;opacity:.85;text-align:left;hyphens:auto}
@media (min-width:901px){.operacao .nota-rodape{text-align:justify}}

/* ---- Botoes ----
   Vocabulario de variantes do shadcn/ui (default, outline, ghost, secondary,
   destructive) reimplementado em CSS puro. A classe .btn vale para <button> e para
   <a>: link com cara de botao continua sendo <a>, nunca <button role>, senao o
   leitor de tela perde que aquilo navega. */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;
  margin:0;width:auto;min-width:0;padding:9px 16px;height:auto;
  font-family:var(--fonte-corpo);font-size:14px;font-weight:600;letter-spacing:0;
  line-height:1.2;border-radius:10px;border:1px solid transparent;cursor:pointer;
  text-decoration:none;transition:background-color .16s, color .16s, border-color .16s}
.btn:disabled{opacity:.5;cursor:not-allowed}
.btn-sm{padding:6px 12px;font-size:13px;border-radius:8px}
.btn-lg{padding:12px 22px;font-size:15px;border-radius:12px}
.btn-icone{padding:8px;width:auto}

/* ---- Brilho de hover, um so para todo botao solido ----
   O gradiente vertical e o mesmo do botao Entrar: no hover ele clareia por cima,
   dando a impressao de luz passando. Estava so no submit da tela de entrada, e os
   outros botoes reagiam de formas diferentes. */
.btn-default,button.solido{background:linear-gradient(to bottom, var(--primary),
  color-mix(in srgb, var(--primary) 82%, var(--card)));color:var(--primary-foreground)}
.btn-default:hover,button.solido:hover{background:linear-gradient(to bottom,
  var(--primary-hover), color-mix(in srgb, var(--primary) 90%, var(--card)))}
.btn-outline{background:transparent;border-color:currentColor;color:inherit}
.btn-outline:hover{background:color-mix(in srgb, currentColor 14%, transparent)}
.btn-ghost{background:transparent;color:inherit}
.btn-ghost:hover{background:color-mix(in srgb, currentColor 12%, transparent)}
.btn-secondary{background:var(--muted);color:var(--foreground);border-color:var(--border)}
.btn-secondary:hover{background:var(--border)}
.btn-destructive{background:var(--destructive);color:var(--destructive-foreground)}

/* ---- Atalhos do portal ---- */
.atalhos{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:20px 0 8px}
.atalho{display:flex;flex-direction:column;align-items:center;gap:8px;
  margin:0;width:auto;min-width:0;padding:20px 14px;text-align:center;
  background:var(--card);color:var(--foreground);border:1px solid var(--border);
  border-radius:var(--radius);cursor:pointer;font-size:15px;letter-spacing:0;
  transition:border-color .18s, transform .18s}
.atalho:hover{background:var(--card);border-color:var(--primary);transform:translateY(-2px)}
.atalho .ico{color:var(--accent)}
.atalho-nome{font-weight:600}
.atalho-nota{font-size:12.5px;color:var(--muted-foreground)}
.atalho[aria-expanded=true]{border-color:var(--primary);background:var(--muted)}

/* Painel das duas credenciais, aberto pelo atalho Senhas.
   grid-template-rows de 0fr para 1fr anima altura que o CSS nao conhece de antemao,
   sem JavaScript medir o conteudo. O minmax(0,0fr) e necessario: sem ele o item
   nunca encolhe abaixo do proprio tamanho minimo e o painel fica sempre aberto. */
/* Acoes dentro da celula de uma tabela: cada uma e um <form> proprio, porque sao
   POST distintos, e sem isto cada form quebraria a linha por ser bloco. */
/* Fechamento do caixa: cinco indicadores, nao quatro, desde que o credito vendido
   entrou na Revisao 01. O auto-fit do padrao comporta quatro numa coluna de 720px e
   jogava o quinto sozinho para a linha de baixo, do tamanho dos outros, parecendo um
   numero esquecido no canto. Cinco em linha tambem nao serve: sobrariam 124px por
   caixa e "Lotes atendidos" quebraria no meio.
   A grade de seis frações resolve por divisao exata: tres caixas de 2 na primeira
   linha, duas de 3 na segunda, as duas linhas cheias de ponta a ponta. A classe e
   propria porque a ficha do lote usa .indicadores na mesma pagina, com quatro itens
   e outra necessidade. */
.indicadores-fechamento{grid-template-columns:repeat(6,1fr)}
.indicadores-fechamento>.indicador{grid-column:span 2}
.indicadores-fechamento>.indicador:nth-child(4),
.indicadores-fechamento>.indicador:nth-child(5){grid-column:span 3}
/* Em tela estreita a divisao em seis nao ajuda ninguem: volta para duas colunas. */
@media (max-width:640px){
  .indicadores-fechamento{grid-template-columns:repeat(2,1fr)}
  .indicadores-fechamento>.indicador,
  .indicadores-fechamento>.indicador:nth-child(4),
  .indicadores-fechamento>.indicador:nth-child(5){grid-column:auto}
}

/* Acoes dentro da celula de uma tabela: cada uma e um <form> proprio, porque sao
   POST distintos. Empilhadas e nao lado a lado: em linha, "desativar" mais o campo
   de senha mais "redefinir" pediam uns 300px de coluna, a tabela passava da largura
   da pagina e o ultimo botao ficava atras da borda, alcancavel so por rolagem
   horizontal. Empilhar cabe na coluna e dispensa a rolagem. */
/* ---- Navegação da janela do relatório ----
   Seta, intervalo escrito, seta. O intervalo no meio é o ponto da barra: ele responde
   "de que data é este número" sem o operador ter que deduzir do nome do filtro. */
.navega-janela{display:flex;align-items:center;justify-content:center;gap:10px;
  margin:10px 0 18px}
.navega-seta{display:inline-flex;align-items:center;justify-content:center;
  width:38px;height:38px;flex:0 0 auto;border-radius:50%;
  background:var(--card);color:var(--foreground);border:1px solid var(--border);
  text-decoration:none;cursor:pointer;
  transition:background-color .16s, color .16s, transform .12s, border-color .16s}
.navega-seta:hover{background:var(--primary);color:var(--primary-foreground);border-color:var(--primary)}
.navega-seta:active{transform:scale(.92)}
/* main a{text-decoration:underline} alcançaria a seta, que é um <a> com ícone dentro */
main a.navega-seta{text-decoration:none}
.navega-seta.desligada{opacity:.3;cursor:default;pointer-events:none}
.navega-rotulo{font-size:14.5px;font-weight:600;color:var(--foreground);
  text-align:center;min-width:220px;font-variant-numeric:tabular-nums}
@media (max-width:520px){
  .navega-rotulo{min-width:0;flex:1;font-size:13.5px}
}

/* ---- Troca de período: o conteúdo desliza ----
   Sai para um lado e o novo entra do outro, como um swipe que as setas comandam.
   As distâncias são curtas de propósito: o bloco é alto, e um deslocamento grande
   faria a página inteira parecer que saiu do lugar. */
/* A mesma transicao vale para a tabela do historico, que desliza pelas setas dele.
   Os dois seletores na mesma regra porque e a mesma interacao: so muda o que anda. */
[data-conteudo-relatorio],
[data-lista] .tabela-rolavel{transition:transform .18s ease, opacity .18s ease}
.sai-esquerda{transform:translateX(-26px);opacity:0}
.sai-direita{transform:translateX(26px);opacity:0}
.entra-esquerda{animation:entra-da-esquerda .26s cubic-bezier(.2,.8,.2,1)}
.entra-direita{animation:entra-da-direita .26s cubic-bezier(.2,.8,.2,1)}
@keyframes entra-da-esquerda{from{transform:translateX(-26px);opacity:0}}
@keyframes entra-da-direita{from{transform:translateX(26px);opacity:0}}
@media (prefers-reduced-motion:reduce){
  [data-conteudo-relatorio],
  [data-lista] .tabela-rolavel{transition:none}
  .entra-esquerda,.entra-direita{animation:none}
}

/* No celular os botoes de acao empilham, e empilhados precisam ter a MESMA largura:
   "Cancelar" com 172px em cima de "Dar baixa no saldo" com 230px desenhava dois
   degraus no meio do formulario. Largura cheia nos dois, e a ordem visual coloca o
   confirmar em cima, que e o que a pessoa vai tocar. */
@media (max-width:560px){
  .acoes-form{flex-direction:column-reverse;align-items:stretch;gap:10px}
  .acoes-form .btn-ghost,
  .acoes-form .btn-pill,
  .acoes-form .confirmar,
  .acoes-form .salvar,
  .entrada-cartao .acoes-form button[type=submit]{width:100%;min-width:0}
  /* o confirmar vira pilula de largura cheia; o circulo do estado giratorio some */
  .acoes-form .confirmar[data-estado="idle"]{width:100%}
}

.acao-linha{display:flex;align-items:center;gap:6px;margin:0 0 6px}
.acao-linha:last-child{margin-bottom:0}
.acao-linha .btn-sm{flex:0 0 auto;white-space:nowrap}
.campo-inline{width:auto;min-width:0;max-width:118px;padding:6px 10px;font-size:13px}

.credenciais{display:grid;grid-template-rows:minmax(0,0fr);
  transition:grid-template-rows .26s ease, opacity .2s ease, margin .26s ease;
  opacity:0;margin:0}
.credenciais.aberto{grid-template-rows:minmax(0,1fr);opacity:1;margin:0 0 8px}
.credenciais-lista{overflow:hidden;display:flex;flex-direction:column;gap:8px}
.credenciais.aberto .credenciais-lista{padding-top:4px}

.credencial{display:flex;align-items:center;gap:14px;width:auto;margin:0;
  padding:12px 14px;text-align:left;cursor:pointer;font-size:15px;letter-spacing:0;
  background:var(--card);color:var(--foreground);border:1px solid var(--border);
  border-radius:var(--radius);transition:border-color .18s, background .18s}
.credencial:hover{border-color:var(--primary);background:var(--muted)}
.credencial>.ico:last-child{color:var(--muted-foreground);flex:0 0 auto}
.credencial-ico{display:flex;align-items:center;justify-content:center;
  width:40px;height:40px;flex:0 0 auto;border-radius:50%;background:var(--muted)}
.credencial-ico .ico{color:var(--accent)}
.credencial-texto{display:flex;flex-direction:column;gap:1px;flex:1;min-width:0}
.credencial-titulo{font-weight:600;line-height:1.25}
.credencial-sub{font-size:13px;color:var(--muted-foreground);line-height:1.3}

/* Quem desligou animacao no sistema recebe a troca direta, sem transicao. */
@media (prefers-reduced-motion:reduce){
  .credenciais{transition:none}
}

/* ---- Pop-up ----
   <dialog> nativo: foco preso, Esc para fechar e fundo ja vem do navegador. */
dialog.pop{border:0;border-radius:var(--radius-lg);padding:0;max-width:min(760px,92vw);width:100%;
  background:var(--card);color:var(--card-foreground);
  box-shadow:0 18px 50px -12px color-mix(in srgb, var(--primary) 38%, transparent)}
dialog.pop:focus,dialog.pop:focus-visible{outline:none}
dialog.pop::backdrop{background:color-mix(in srgb, var(--primary) 55%, transparent)}
/* O cabecalho do pop-up nao rola junto. Sem isso, num extrato longo o botao de
   fechar sai da tela: medido no celular, ele ia para y=-82 ja com 6 movimentos, e
   no modo tela cheia nao sobra nada para tocar. Bloco fixo precisa de flex-shrink 0
   e a area elastica precisa de min-height 0, senao ela nao encolhe e nada rola. */
dialog.pop[open]{display:flex;flex-direction:column}
dialog.pop{max-height:min(86dvh,720px)}
/* O pop-up do extrato tem altura FIXA. Sem isso ele encolhe e cresce a cada troca
   de periodo, e a janela pulando embaixo do cursor atrapalha mais do que a sobra
   de espaco quando ha poucos movimentos. O miolo rola; a moldura fica parada. */
dialog#pop-extrato{height:min(78dvh,640px)}
.pop-topo{display:flex;align-items:center;gap:14px;padding:18px 20px 12px;
  border-bottom:1px solid var(--border);flex:0 0 auto;background:var(--card);
  border-radius:var(--radius-lg) var(--radius-lg) 0 0}
.pop-topo h2{margin:0;font-size:20px;flex:1;text-align:left}
/* mesma moldura das setas de pagina: 42px, raio 12, borda de 1px em --border */
.pop-x{margin:0;width:42px;height:42px;min-width:0;padding:0;border-radius:12px;
  display:inline-flex;align-items:center;justify-content:center;
  background:var(--card);color:var(--foreground);border:1px solid var(--border);
  cursor:pointer;flex:0 0 auto;
  transition:background-color .16s, color .16s, border-color .16s}
.pop-x:hover{background:var(--primary);color:var(--primary-foreground);border-color:var(--primary)}
.pop-corpo{padding:18px 20px 22px;text-align:left;flex:1 1 auto;overflow-y:auto;min-height:0;overscroll-behavior:contain}
.pop-corpo .dica{text-align:left}
/* As notas de rodape do pop-up sao texto corrido de duas ou tres linhas: justificadas
   elas fecham na mesma borda direita das tabelas acima. So as filhas DIRETAS do corpo,
   que sao as notas; recado de erro e regra de campo vivem dentro do <form> e seguem
   alinhados a esquerda, porque linha curta justificada vira buraco entre palavras.
   O hyphens evita justamente esse buraco quando a palavra final e longa. */
.pop-corpo>.dica{text-align:justify;hyphens:auto;text-wrap:pretty}
.pop-corpo form{max-width:none}

/* ---- Filtro de periodo do extrato ----
   Controle segmentado em vez do funil que abre lista: com seis opcoes curtas, ver
   todas de uma vez custa um toque em vez de dois, e e o padrao de extrato bancario,
   que e o modelo mental certo aqui.
   O estado vive no aria-pressed, entao o leitor de tela anuncia qual esta ativo sem
   precisar de texto escondido. */
/* filtro colado no topo e paginacao colada no pe: com 25 linhas na tela, os dois
   ficavam no meio da rolagem e era preciso percorrer a lista inteira para trocar de
   pagina. Os dois grudam sem tirar o miolo do fluxo. */
/* A faixa gruda no topo com o fundo do cartao. Dois cuidados que faltavam:
   1. o respiro de cima sai do .pop-corpo e vira padding DA faixa. Sticky com top:0
      gruda no topo da caixa de PADDING, nao da borda, entao os 18px de respiro
      viravam uma janela por onde as linhas passavam por tras.
   2. o espaco de baixo tambem e padding da faixa, nunca margem: margem e
      transparente, e a linha seguinte aparecia por ela. */
.pop-corpo:has(.periodo-fixo){padding-top:0}
/* O rodape fica sempre na mesma altura, com lista curta ou longa. Sticky sozinho
   so prende quando ha transbordo: com poucas linhas ele parava logo abaixo do
   conteudo, e paginacao e resumo pulavam de lugar a cada troca de periodo.
   Com a coluna flexivel e margin-top:auto, ele desce ate a base do pop-up. */
/* ---- Barra de rolagem sobreposta ----
   A barra classica do sistema ocupa largura real: quando ela aparece o conteudo
   encolhe e a tabela inteira anda para a esquerda; quando some, volta. Estilizar
   ::-webkit-scrollbar nao resolve, piora: estilizar desliga a barra flutuante do
   macOS e forca a classica, que passa a ocupar espaco em todo sistema.
   Aqui a nativa e escondida de vez e a barra e desenhada por cima (rolagem.js).
   Quem rola muda com a largura. No desktop e a .tabela-rolavel, e nao o .pop-corpo:
   overflow-x:auto faz o overflow-y computar para auto tambem, entao a tabela e o
   proprio scroller. No celular a tabela vira cartoes e quem rola e o .pop-corpo.
   A barra fica absoluta num elemento que NAO rola (o corpo para a tabela, o topo
   para o corpo) e a 7px da borda do pop-up, dentro da goteira de 20px do padding.
   Dentro do scroller ela encostaria nos numeros da coluna de saldo. */
/* a nativa sai so dentro do pop-up, que e onde existe barra desenhada para
   substitui-la; tabela de tela cheia continua com a barra do sistema */
.pop-corpo,.pop-corpo .tabela-rolavel{scrollbar-width:none}
.pop-corpo::-webkit-scrollbar,.pop-corpo .tabela-rolavel::-webkit-scrollbar{width:0;height:0}
/* A ancora e sempre o cabecalho, nunca o corpo: dentro do corpo, que tem overflow,
   a barra desliza com o conteudo e ainda estica o scrollHeight dele, criando uma
   segunda barra de rolagem. O cabecalho nao rola nunca. */
.pop-topo{position:relative}
.rolagem{position:absolute;right:7px;width:6px;z-index:6;
  opacity:0;transition:opacity .18s;pointer-events:none}
.rolagem.vis{opacity:1;pointer-events:auto}
.rolagem-alca{width:100%;border-radius:99px;cursor:grab;touch-action:none;
  background:color-mix(in srgb, var(--primary) 30%, transparent);
  transition:background-color .16s}
.rolagem-alca:hover{background:color-mix(in srgb, var(--primary) 52%, transparent)}
.rolagem.arrastando .rolagem-alca{cursor:grabbing;
  background:color-mix(in srgb, var(--primary) 62%, transparent)}
@media (prefers-reduced-motion:reduce){.rolagem{transition:none}}

.pop-corpo:has(.pop-pe){display:flex;flex-direction:column}
.pop-corpo>[data-lista]{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}
.periodo-fixo{position:sticky;top:0;z-index:3;background:var(--card);
  margin:0 -20px;padding:18px 20px 14px}
.periodo{display:flex;flex-wrap:wrap;gap:4px;padding:4px;margin:0;
  background:var(--muted);border-radius:var(--radius);border:1px solid var(--border)}
/* o corpo perde o respiro de baixo quando ha rodape fixo: sticky se posiciona pela
   caixa de padding, entao os 22px sobravam por baixo e deixavam uma linha aparecendo */
.pop-corpo:has(.pop-pe){padding-bottom:0}
/* margin-top:auto empurra o rodape ate a base quando a lista e curta; o sticky
   segura ele quando a lista transborda. O auto vive AQUI e nao numa regra a parte:
   como declaracao separada ele perdia para o atalho margin desta mesma regra. */
.pop-pe{position:sticky;bottom:0;z-index:2;background:var(--card);
  border-top:1px solid var(--border);margin:auto -20px 0;padding:12px 20px 14px}
.pop-pe .dica{margin:8px 0 0;text-align:center}
/* A observacao usa a largura inteira do rodape. Antes tinha max-width:64ch e vinha
   centrada: dentro de um pop-up de 760px sobrava margem visivel dos dois lados e a
   ultima linha morria no meio. Agora vai de borda a borda como o resto do pop-up.
   Duas condicoes para isso funcionar, e as duas sao deliberadas:
   1. o texto foi encurtado ate caber em UMA linha na largura cheia (659px de 718
      medidos, 8% de folga). Com duas linhas, justificar a ultima abriria buracos
      entre as palavras, que e exatamente o defeito que se estava corrigindo;
   2. text-align-last:justify vale so acima de 900px, que e onde o pop-up esta em
      760px. Em tela estreita a frase quebra e volta ao alinhamento a esquerda. */
/* o seletor repete .pop-pe de proposito: .pop-pe .dica vale 0,2,0 e ganharia de
   .pop-obs sozinho, deixando o alinhamento decidido por acidente */
.pop-pe .pop-obs{margin-left:0;margin-right:0;font-size:12.5px;opacity:.85;
  text-align:left;hyphens:auto}
@media (min-width:901px){.pop-pe .pop-obs{text-align:justify;text-align-last:justify}}
.pop-pe .paginas{margin-top:0}
.pop-pe .paginas[hidden]{display:none}
.periodo button{margin:0;flex:1 1 auto;min-width:0;padding:8px 10px;font-size:13px;
  letter-spacing:0;border:0;border-radius:calc(var(--radius) - 4px);cursor:pointer;
  background:transparent;color:var(--muted-foreground);font-weight:500;
  transition:background-color .16s, color .16s}
.periodo button:hover{background:color-mix(in srgb, var(--card) 60%, transparent);color:var(--foreground)}
.periodo button[aria-pressed="true"]{background:var(--card);color:var(--foreground);font-weight:600;
  box-shadow:0 1px 2px color-mix(in srgb, var(--primary) 14%, transparent)}

/* ---- Paginacao ----
   Desenho adaptado do componente Pagination (21st.dev), React com motion/react.
   Reimplementado: as setas, a contagem e o giro do numero ao trocar de pagina. */
.paginas{display:flex;align-items:center;justify-content:center;gap:10px;margin-top:16px}
.paginas button{margin:0;width:42px;height:42px;min-width:0;padding:0;border-radius:12px;
  display:inline-flex;align-items:center;justify-content:center;cursor:pointer;
  background:var(--card);color:var(--foreground);border:1px solid var(--border);
  transition:background-color .16s, color .16s, transform .12s}
.paginas button:hover:not(:disabled){background:var(--primary);color:var(--primary-foreground);border-color:var(--primary)}
.paginas button:active:not(:disabled){transform:scale(.92)}
.paginas button:disabled{opacity:.4;cursor:not-allowed}
.paginas-conta{font-size:14px;color:var(--muted-foreground);font-variant-numeric:tabular-nums;
  min-width:74px;text-align:center}
.paginas-conta #pag-atual{display:inline-block;font-weight:700;color:var(--foreground)}
.paginas-conta #pag-atual.gira{animation:gira-numero .34s cubic-bezier(.2,.8,.2,1)}
@keyframes gira-numero{
  from{transform:translateY(9px);opacity:0;filter:blur(2px)}
  to{transform:none;opacity:1;filter:none}
}
#extrato-linhas[aria-busy="true"]{opacity:.45;transition:opacity .12s}
@media (prefers-reduced-motion:reduce){
  .paginas button,.periodo button,#extrato-linhas{transition:none}
  .paginas-conta #pag-atual.gira{animation:none}
}
@media (max-width:520px){
  .periodo button{flex:1 1 30%;padding:9px 6px;font-size:12.5px}
}

/* ---- Botao de salvar com estado ----
   Desenho adaptado do SaveToggle (21st.dev), que e React com motion/react e
   react-use-measure. Reimplementado com CSS mais um data-attribute de estado:
   nenhuma dependencia entra. O original simula o salvamento com setTimeout; aqui
   o estado acompanha a requisicao de verdade. */
.salvar{position:relative;display:inline-flex;align-items:center;justify-content:center;
  margin-top:14px;height:52px;width:172px;min-width:0;padding:0;overflow:hidden;
  border:2px solid transparent;border-radius:26px;cursor:pointer;
  background:linear-gradient(to bottom, var(--primary), color-mix(in srgb, var(--primary) 82%, var(--card)));
  color:var(--primary-foreground);font-weight:600;
  transition:width .42s cubic-bezier(.2,.8,.2,1), background-color .2s, border-color .2s, color .2s}
.salvar[data-estado="loading"],.salvar[data-estado="success"]{width:52px}
.salvar[data-estado="saved"]{background:var(--card);color:var(--muted-foreground);border-color:var(--border)}
.salvar>span{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;gap:9px;
  opacity:0;transform:translateY(14px);transition:opacity .18s, transform .24s}
.salvar[data-estado="idle"] .salvar-idle{opacity:1;transform:none}
.salvar[data-estado="loading"] .salvar-fiar{opacity:1;transform:none}
.salvar[data-estado="success"] .salvar-ok,.salvar[data-estado="saved"] .salvar-ok{opacity:1;transform:none}
.salvar[data-estado="success"] .salvar-ok{transform:scale(1.12)}
.salvar[data-estado="success"] .salvar-ok-texto{display:none}
.salvar-fiar::before{content:"";width:26px;height:26px;border-radius:50%;
  border:3px solid color-mix(in srgb, var(--primary-foreground) 32%, transparent);
  border-top-color:var(--primary-foreground);animation:girar .7s linear infinite}
@keyframes girar{to{transform:rotate(360deg)}}
@media (prefers-reduced-motion:reduce){
  .salvar,.salvar>span,.atalho{transition:none}
  .salvar-fiar::before{animation:none;border-top-color:var(--primary-foreground)}
}

/* ---- Tela de entrada ----
   Desenho adaptado do auth-01 do Watermelon UI (ui.watermelon.sh), lido do registry
   em 30/08/2026. O registry NAO declara licenca em nenhum dos 1.074 itens, e os
   metadados dele sao furados (aponta dependencia de um item 'auth' que nao existe).
   Por isso o padrao foi REIMPLEMENTADO em HTML e CSS, nunca instalado nem copiado:
   nada de React, Tailwind ou shadcn entra aqui. Decisao registrada no LEIA-ME.md.

   O que veio de la: cartao dentro de cartao, tudo centralizado na tela, icone dentro
   do campo, campo com fundo em vez de branco, olho para ver a senha, botao com
   gradiente vertical, e o prompt no rodape fora do cartao interno.
   O que ficou de fora: os tres botoes de login social e o separador. */
main.entrada{display:flex;flex-direction:column;align-items:center;justify-content:center;
  min-height:calc(100vh - 120px);padding:32px 20px}
.entrada-moldura{width:100%;max-width:384px}
/* o cadastro tem duas colunas de campo, entao a moldura dele e mais larga que a da
   entrada; o logo continua acompanhando a largura do cartao */
.entrada-larga{max-width:600px}
.entrada-larga .entrada-cartao form{padding:0 22px 24px}
.entrada-larga label{text-align:left}
.termo{display:flex;gap:9px;align-items:flex-start;margin-top:16px;
  text-transform:none;letter-spacing:0;color:var(--foreground);font-size:14px}
.termo input{width:auto;margin-top:3px;flex:0 0 auto}

/* a moldura de areia com folga, e o cartao branco por dentro: e o traco do original */
.entrada-cartao{background:var(--muted);border:1px solid var(--border);border-radius:32px;padding:8px}
.entrada-cartao>*{background:var(--card)}
.entrada-cartao{display:block}
.entrada-cartao .entrada-cabeca,.entrada-cartao form,.entrada-cartao .aviso{background:none}
.entrada-cartao{position:relative}
.entrada-cartao::before{content:"";position:absolute;inset:8px;background:var(--card);
  border-radius:24px;box-shadow:0 2px 4px color-mix(in srgb, var(--primary) 12%, transparent)}
.entrada-cabeca,.entrada-cartao form,.entrada-cartao .aviso{position:relative;z-index:1}
.entrada-cabeca{text-align:center;padding:26px 22px 14px}
.entrada-cabeca h1{margin:0 0 6px;font-size:23px;letter-spacing:0}
.entrada-cabeca .sub{margin:0;font-size:14px}
.entrada-cartao form{padding:0 22px 26px;max-width:none}
.entrada-cartao .aviso{margin:0 22px 12px}

/* campo com o icone dentro, no lugar do rotulo visivel */
.campo-ico{position:relative;margin-bottom:10px}
.campo-ico>.ico{position:absolute;left:13px;top:50%;transform:translateY(-50%);
  color:var(--muted-foreground);pointer-events:none;z-index:1}
.campo-ico input{background:var(--muted);border-color:transparent;padding-left:40px}
.campo-ico input:focus-visible{border-color:var(--ring)}
.campo-ico input::placeholder{color:var(--muted-foreground)}
.olho{position:absolute;right:6px;top:50%;transform:translateY(-50%);
  margin:0;width:auto;min-width:0;padding:8px;background:none;color:var(--muted-foreground);
  border:0;border-radius:8px;cursor:pointer}
.olho:hover{color:var(--foreground);background:none}
.campo-ico input[type=password],.campo-ico input[type=text]{padding-right:42px}

/* rotulo que o leitor de tela le e a tela nao mostra: o original nao tem label
   nenhum, so placeholder, e ai o campo nao e anunciado */
.oculto{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* botao com gradiente vertical. O original usa primary/70, que daria 4,31:1 com o
   creme por cima e reprovaria; a 78% da 5,50:1. Medido, nao estimado. */
.entrada-cartao button[type=submit]{margin-top:14px;width:100%;height:46px;padding:0;
  font-weight:600;border-radius:12px;
  background:linear-gradient(to bottom, var(--primary), color-mix(in srgb, var(--primary) 78%, var(--card)))}
.entrada-cartao button[type=submit]:hover{
  background:linear-gradient(to bottom, var(--primary-hover), color-mix(in srgb, var(--primary) 85%, var(--card)))}

/* Cancelar e confirmar lado a lado, centralizados. O cancelar vem primeiro na
   ordem visual e na de tabulacao: a saida sem consequencia fica antes da acao. */
.acoes-form{display:flex;align-items:center;justify-content:center;gap:12px;margin-top:16px;flex-wrap:wrap}
.acoes-form .salvar{margin-top:0}
/* cancelar com a mesma caixa do salvar: menor, ele parecia acessorio de um botao
   que na verdade e a saida sem consequencia */
.acoes-form .btn-ghost{min-width:172px;height:52px;border-radius:26px;font-size:15px;
  border:1px solid var(--border)}
.acoes-form .btn-ghost:hover{background:var(--muted)}
/* os pop-ups de credencial usam a largura do cartao de entrada: tres campos curtos
   numa caixa de 760px ficavam perdidos. Os DOIS entram na mesma regra: sao a mesma
   interacao vista de duas portas, e deixar um de fora fazia a contrassenha abrir com
   quase o dobro da largura da senha. */
dialog#pop-senha,
dialog#pop-contrassenha{max-width:min(432px,92vw)}

/* ---- Correcoes de escopo do cadastro ----
   Estas regras precisam vir DEPOIS das da tela de entrada: as duas miram os mesmos
   elementos com a mesma especificidade, entao quem decide e a ordem no arquivo.
   Foi o que colapsou os campos de senha e jogou o botao para a linha de baixo. */

/* campo com o olho mas SEM icone a esquerda: o rotulo ja esta acima do campo */
.campo-ico-nu input{padding-left:12px;background:var(--card);border-color:var(--input)}
/* Select sem ícone à esquerda: mesma caixa dos campos de texto ao lado, com a seta
   Phosphor no lugar do controle nativo, que no macOS desenha duas setas empilhadas
   e ignora o resto do desenho. */
.campo-ico-nu select{padding-left:12px;background:var(--card);border-color:var(--input)}
.campo-select select{width:100%}
/* o olho encolhe para o proprio conteudo: sem left e com largura explicita ele para
   de herdar a largura minima dos botoes e deixa de cobrir o campo inteiro */
.campo-ico .olho{left:auto;right:6px;width:34px;height:34px;padding:0}
/* o submit dentro de .acoes-form nao ocupa a largura toda: ali ele divide a linha
   com o cancelar, e usa a MESMA caixa dele. O cancelar ja e pill de 52px por
   .acoes-form .btn-ghost; o submit vinha com o border-radius:12px da regra de cima e
   os dois apareciam lado a lado com cantos diferentes. */
.entrada-cartao .acoes-form button[type=submit]{width:auto;min-width:172px;height:52px;
  margin-top:0;padding:0 26px;border-radius:26px}

/* Mesma caixa do .salvar do pop-up de senha, sem o estado: acao que recarrega a
   pagina nao tem o que animar, mas nao pode ter outro desenho. Um botao pill de
   52px de altura em todas as frentes. */
.acoes-form .btn-pill{display:inline-flex;align-items:center;justify-content:center;
  margin:0;height:52px;width:172px;min-width:0;padding:0 22px;
  border:2px solid transparent;border-radius:26px;cursor:pointer;
  font-family:var(--fonte-corpo);font-size:15px;font-weight:600;letter-spacing:0;
  background:linear-gradient(to bottom, var(--primary), color-mix(in srgb, var(--primary) 82%, var(--card)));
  color:var(--primary-foreground);transition:background .18s}
.acoes-form .btn-pill:hover{background:linear-gradient(to bottom, var(--primary-hover),
  color-mix(in srgb, var(--primary) 90%, var(--card)))}
/* rotulo longo pede caixa maior, e nao texto espremido */
.acoes-form .btn-pill-largo{width:auto;min-width:230px}

/* ---- Botao de entrar com estado ----
   Mesmo desenho do botao de salvar: pilula -> circulo com giro -> ramo da marca.
   Reimplementado do SaveToggle (21st.dev) em CSS mais data-attribute, sem
   dependencia. O que muda do original: aqui o giro acompanha a requisicao de
   verdade, e o ultimo estado nao e um "salvo", e a marca acompanhando a entrada. */
.entrada-cartao button[type=submit].entrar{position:relative;overflow:hidden;
  /* flex, e nao o inline-block padrao do <button>: em elemento inline-block o
     margin:auto computa como ZERO por especificacao, e o circulo encolhia pela
     esquerda em vez de centralizar. */
  display:flex;align-items:center;justify-content:center;
  transition-property:width,min-width,background-color,border-radius;
  transition:width .42s cubic-bezier(.2,.8,.2,1), background-color .2s, border-radius .3s}
/* especificidade tem que bater a de .entrada-cartao button[type=submit], que fixa
   width:100%: sem os tres seletores juntos o botao nao encolhe para circulo */
.entrada-cartao button[type=submit].entrar[data-estado="girando"],
.entrada-cartao button[type=submit].entrar[data-estado="entrando"]{
  width:52px;min-width:0;height:52px;border-radius:26px;padding:0;
  margin-left:auto;margin-right:auto}
.entrar>span{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  opacity:0;transform:translateY(12px);transition:opacity .18s, transform .26s}
.entrar[data-estado="idle"] .entrar-idle{opacity:1;transform:none}
.entrar[data-estado="girando"] .entrar-fiar{opacity:1;transform:none}
.entrar[data-estado="entrando"] .entrar-ramo{opacity:1;transform:scale(1.08)}
.entrar-fiar::before{content:"";width:26px;height:26px;border-radius:50%;
  border:3px solid color-mix(in srgb, var(--primary-foreground) 32%, transparent);
  border-top-color:var(--primary-foreground);animation:girar .7s linear infinite}
/* o ramo da marca, recortado do Ativo de Marca 05 do conjunto oficial. Serve como
   mascara pelo mesmo motivo dos outros: o PNG e off-white sobre transparencia,
   entao a mascara usa o alfa e a cor vem do CSS. */
.entrar-ramo::before{content:"";width:28px;height:29px;
  -webkit-mask:url("/assets/marca/ramo-259c.png") no-repeat center/contain;
  mask:url("/assets/marca/ramo-259c.png") no-repeat center/contain;
  background-color:var(--primary-foreground)}

/* a tela se apaga com o ramo ainda visivel, em vez de piscar e so depois trocar */
body.saindo main.entrada>*:not(.entrada-moldura),
body.saindo .entrada-cabeca,
body.saindo .entrada-cartao form>.campo-ico,
body.saindo .entrada-rodape,
body.saindo .entrada-marca{opacity:0;transition:opacity .34s ease}
body.saindo .entrada-cartao{transform:scale(.985);transition:transform .38s ease}
@media (prefers-reduced-motion:reduce){
  .entrada-cartao button[type=submit].entrar,.entrar>span,
  body.saindo .entrada-cartao,body.saindo .entrada-marca{transition:none}
  .entrar-fiar::before{animation:none}
}

.entrada-rodape{text-align:center;margin-top:18px;color:var(--muted-foreground);font-size:14px}
.entrada-rodape p{margin:0 0 5px}
.entrada-rodape a{color:var(--primary);font-weight:600;text-decoration:none}
.entrada-rodape a:hover{text-decoration:underline;text-underline-offset:4px}

@media (max-width:520px){ main{padding:16px 14px 26px}
  .topo .logo-garden{height:28px;width:89px}
  .logo-moratta{height:32px;width:135px}
  /* O logo ancora a esquerda e o bloco do lote centraliza no que sobra. Em 362px de
     largura util o logo leva 142 e o texto fica com 208: "Ana Beatriz Camargo" pede
     140px em 14px, entao ainda ha folga para nome mais longo antes de quebrar. */
  .ident{gap:12px;justify-content:flex-start}
  .ident-marca{height:45px;width:142px}
  .ident-texto{flex:1 1 auto;text-align:center}
  .ident h1{font-size:20px}
  .entrada-marca{margin-bottom:18px}
  .atalhos{grid-template-columns:1fr;gap:9px}
  .atalho{flex-direction:row;justify-content:flex-start;text-align:left;padding:14px 16px;gap:12px}
  .atalho-nome{flex:1}
  .atalho-nota{display:none}
  /* Tela cheia so no extrato, que e lista longa e usa toda a altura que houver. O
     pop-up de senha tem tres campos e dois botoes: esticado ate 100dvh ele virava um
     cartao com dois tercos de vazio embaixo. Os curtos ficam do tamanho do conteudo,
     centrados, com a moldura preservada. */
  dialog.pop{max-width:calc(100vw - 26px);width:calc(100vw - 26px);max-height:calc(100dvh - 36px)}
  dialog#pop-extrato{width:100vw;max-width:100vw;height:100dvh;max-height:100dvh;border-radius:0}
  h1{font-size:22px} .saldo .valor{font-size:34px}
  button{width:100%}
}

/* ---- Tabela vira cartao empilhado ----
   O ponto de virada nao e "celular": e a largura em que a tabela deixa de caber.
   Medido nas duas tabelas do morador, com o pop-up em 92vw: a partir de 760px de
   viewport as duas cabem inteiras; em 730 ja sobra rolagem lateral e em 533 as
   colunas Valor e Saldo depois ficam INTEIRAS fora da tela, sem nenhum aviso,
   porque a barra horizontal nativa esta escondida. 779 deixa 20px de folga para
   fonte aumentada.
   Vale so para as tabelas: tela cheia do pop-up, atalhos em coluna e o resto do
   arranjo de celular continuam em 520px, que e outro problema. */
@media (max-width:779px){
  /* Rolar de lado esconde as colunas de dinheiro atras da borda, e nao existe
     aviso confiavel em CSS puro:
     a sombra de rolagem sai listrada pela faixa zebrada. Empilhar elimina a rolagem
     em vez de sinaliza-la. O backoffice continua tabela, porque e usado no desktop.

     A regra e generica e serve as duas tabelas, com 4 e com 5 colunas: toda celula
     menos as duas ultimas ganha linha propria, e as duas ultimas dividem a ultima
     linha, com o valor a esquerda e o acumulado a direita. */
  /* As larguras percentuais das colunas continuavam valendo depois que o <td> virou
     item de grid, e passavam a ser calculadas sobre a COLUNA do cartao, nao sobre a
     tabela: os 16% da competencia viravam 51px e "2026-06" quebrava em duas linhas;
     os 16% do disponivel viravam 13px, e o valor saia por cima do rotulo.
     O seletor repete as duas classes de proposito: .t-creditos td:nth-child(1) vale
     0,2,1 e ganharia de .cartao-mobile td. Aqui empata e vence por vir depois. */
  .cartao-mobile .t-creditos td,.cartao-mobile .t-creditos th,
  .cartao-mobile .t-extrato td,.cartao-mobile .t-extrato th{width:auto}
  .cartao-mobile{overflow:visible;border:0;border-radius:0}
  .cartao-mobile table{min-width:0;background:transparent}
  .cartao-mobile table,.cartao-mobile tbody{display:block}
  .cartao-mobile thead{display:none}

  .cartao-mobile tr{display:grid;grid-template-columns:1fr auto;gap:3px 12px;
    background:var(--card);border:1px solid var(--border);border-radius:var(--radius);
    padding:12px 14px;margin-bottom:9px}
  .cartao-mobile tr:nth-child(even) td{background:transparent}
  .cartao-mobile td{display:block;grid-column:1/-1;border:0;padding:0;text-align:left}

  /* primeira celula e a data ou a competencia: identifica o cartao, nao e o assunto */
  .cartao-mobile td:first-child{font-size:12.5px;color:var(--muted-foreground);letter-spacing:.3px}
  /* as duas ultimas dividem a linha do dinheiro */
  .cartao-mobile td:nth-last-child(2){grid-column:1;font-weight:600}
  .cartao-mobile td:last-child{grid-column:2;text-align:right}
  .cartao-mobile td:nth-last-child(2),.cartao-mobile td:last-child{margin-top:4px}
  /* rotulo da coluna que sumiu com o thead, so onde o valor sozinho seria ambiguo */
  /* no cartao empilhado a etiqueta volta ao fluxo: nao ha coluna para ancorar */
  .cartao-mobile .t-creditos td:nth-child(3) .etiqueta{position:static;transform:none}
  .cartao-mobile td[data-rotulo]::before{content:attr(data-rotulo) " ";
    color:var(--muted-foreground);font-weight:400;font-size:12.5px}

  /* ---- Creditos: tres linhas em vez de seis ----
     Uma celula por linha empilhava competencia, lancado, vence, etiqueta, valor e
     disponivel: seis linhas para tres informacoes. Aqui elas se emparelham por
     assunto, cada par dividindo uma linha, o que corta a altura do cartao pela
     metade e deixa a etiqueta de vencimento ao lado da competencia, que e o que
     ela qualifica. */
  .cartao-mobile .t-creditos td:nth-child(1){grid-column:1;grid-row:1}
  .cartao-mobile .t-creditos td:nth-child(4){grid-column:2;grid-row:1;justify-self:end;
    margin-top:0}
  .cartao-mobile .t-creditos td:nth-child(2){grid-column:1;grid-row:2}
  .cartao-mobile .t-creditos td:nth-child(3){grid-column:2;grid-row:2;justify-self:end}
  .cartao-mobile .t-creditos td:nth-child(5){grid-column:1;grid-row:3}
  .cartao-mobile .t-creditos td:nth-child(6){grid-column:2;grid-row:3}
  .etiqueta{white-space:nowrap}

  /* A caixa de dinheiro e uma coluna de 132px que alinha o numero a direita: certo
     numa tabela, onde as linhas se alinham entre si, e errado no cartao, onde nao ha
     linha de baixo com que casar. Ali ela vira caixa de largura natural, inline, para
     ficar na mesma linha do rotulo: "disponivel" e "R$ 57,50" estavam em duas. */
  .cartao-mobile td .mo{display:inline-flex;width:auto;max-width:none;margin-left:0;
    gap:4px;vertical-align:baseline}
  .cartao-mobile td .mo-sinal{flex:0 0 auto}
  .cartao-mobile td .mo-v{flex:0 0 auto;text-align:left;letter-spacing:.02em}
  /* o valor abre a linha do dinheiro e o acumulado fecha, um em cada ponta. O .num
     das duas celulas alinhava as duas a direita e sobrava um vao a esquerda. */
  .cartao-mobile td:nth-last-child(2){text-align:left}
}

/* ================= Telas do caixa ================= */

/* ---- Menu em abas ----
   Desenho adaptado do FluidTabs (21st.dev), React com motion/react. O layoutId que
   faz a pilula deslizar entre as abas vira uma transition de left e width; o pulso
   de blur do original vira uma animacao curta na aba que acabou de receber a pilula.
   Cada aba e um <a>: sao tres telas com URL propria. A pilula anda no clique, antes
   da pagina trocar, entao o movimento e o mesmo do original sem fingir navegacao.
   Sem JavaScript a pilula nao aparece e a aba ativa se marca sozinha pelo
   aria-current, que e o estado que o leitor de tela ja anuncia. */
.abas{position:relative;display:inline-flex;align-items:center;gap:4px;margin:0 auto 18px;
  padding:5px;border-radius:var(--radius-pill);
  background:var(--muted);border:1.6px solid var(--border)}
.operacao .abas{display:flex;width:fit-content}
.abas-pilula{position:absolute;top:5px;bottom:5px;left:0;width:0;border-radius:var(--radius-pill);
  background:linear-gradient(to bottom, var(--card), color-mix(in srgb, var(--card) 86%, var(--muted)));
  border:1px solid color-mix(in srgb, var(--primary) 12%, transparent);
  box-shadow:0 1px 2px color-mix(in srgb, var(--primary) 12%, transparent);
  opacity:0;transition:left .38s cubic-bezier(.2,.8,.2,1), width .38s cubic-bezier(.2,.8,.2,1)}
.abas.com-pilula .abas-pilula{opacity:1}
.aba{position:relative;z-index:1;display:inline-flex;align-items:center;gap:8px;
  padding:11px 18px;border-radius:var(--radius-pill);text-decoration:none;
  font-size:14px;font-weight:600;letter-spacing:0;color:var(--muted-foreground);
  transition:color .2s;white-space:nowrap}
.aba:hover{color:var(--foreground)}
.aba[aria-current]{color:var(--foreground);font-weight:700}
/* sem a pilula a aba ativa precisa do proprio fundo, senao nada a distingue */
.abas:not(.com-pilula) .aba[aria-current]{background:var(--card);
  box-shadow:0 1px 2px color-mix(in srgb, var(--primary) 12%, transparent)}
.aba[aria-current] .ico{animation:aba-foco .3s ease-out}
@keyframes aba-foco{
  0%{filter:blur(0);transform:scale(1)}
  45%{filter:blur(3px);transform:scale(1.06)}
  100%{filter:blur(0);transform:scale(1.03)}
}
@media (prefers-reduced-motion:reduce){
  .abas-pilula{transition:none}
  .aba[aria-current] .ico{animation:none}
}
/* No celular fica só o ícone, e a caixa encolhe para o conteúdo: três rótulos em
   360px espremeriam "Lançamento" a ponto de cortar. Compacto e centralizado ele lê
   como um seletor, que é o que é, e não como uma barra de navegação.
   O width:fit-content vem da regra .operacao .abas lá em cima e vale aqui também:
   escrever width:100% neste bloco não teria efeito nenhum, porque .operacao .abas
   vale 0,2,0 contra os 0,1,0 de .abas, e media query não muda especificidade. */
@media (max-width:520px){
  .aba{justify-content:center;padding:11px 14px;gap:0}
  .aba span{display:none}
  .aba .ico{width:22px;height:22px}
}

/* ---- Filtro de tipo em disclosure ----
   Desenho adaptado do FilterDisclosure (21st.dev). Aqui e um <details> nativo: ele
   ja traz aberto/fechado, foco e teclado de graca, e funciona sem JavaScript.
   Escolha deliberada de par: o periodo fica no controle segmentado, porque sao seis
   opcoes trocadas o tempo todo e ve-las juntas custa um toque; o tipo fica recolhido,
   porque sao quatro e quase sempre fica em "Todos". */
.filtros{display:flex;align-items:center;gap:10px;margin-bottom:14px;flex-wrap:wrap}
.filtros .periodo{flex:1 1 320px;margin:0}
.disclosure{position:relative;flex:0 0 auto}
.disclosure>summary{display:inline-flex;align-items:center;gap:9px;cursor:pointer;
  padding:6px 14px 6px 6px;border-radius:var(--radius-pill);list-style:none;
  background:var(--card);border:1.6px solid var(--border);
  font-size:13px;font-weight:600;color:var(--foreground);
  transition:border-color .16s, background-color .16s}
.disclosure>summary::-webkit-details-marker{display:none}
.disclosure>summary:hover{border-color:color-mix(in srgb, var(--primary) 34%, var(--border))}
.disclosure-funil{display:inline-flex;align-items:center;justify-content:center;
  width:34px;height:34px;border-radius:50%;background:var(--muted);color:var(--foreground)}
.disclosure-atual{display:inline-flex;align-items:center;gap:6px;color:var(--muted-foreground)}
.disclosure[open]>summary{border-color:var(--primary)}
.disclosure-lista{position:absolute;right:0;top:calc(100% + 8px);z-index:20;
  min-width:236px;display:flex;flex-direction:column;gap:3px;padding:8px;
  background:var(--card);border:1.6px solid var(--border);border-radius:var(--radius-lg);
  box-shadow:0 14px 40px color-mix(in srgb, var(--primary) 22%, transparent);
  animation:disclosure-abre .26s cubic-bezier(.2,.8,.2,1)}
@keyframes disclosure-abre{from{opacity:0;transform:translateY(-8px) scale(.97)}}
.disclosure-lista button{display:flex;align-items:center;gap:14px;width:100%;margin:0;
  min-width:0;padding:9px 12px;border:0;border-radius:var(--radius);cursor:pointer;
  background:transparent;color:var(--foreground);font-size:14px;font-weight:600;
  letter-spacing:0;text-align:left;transition:background-color .16s}
.disclosure-lista button:hover{background:var(--muted)}
.disclosure-lista button>span:first-of-type{flex:1}
.disclosure-lista .ico{color:var(--muted-foreground)}
.disclosure-lista button[aria-pressed="true"] .ico{color:var(--primary)}
/* a marca de escolhido some por opacidade e nao por display: assim ela cresce no
   lugar quando a escolha muda, em vez de aparecer do nada */
.disclosure-marca{display:inline-flex;color:var(--primary);
  opacity:0;transform:scale(.4);transition:opacity .18s, transform .22s cubic-bezier(.2,.8,.2,1)}
.disclosure-lista button[aria-pressed="true"] .disclosure-marca{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){
  .disclosure-lista{animation:none}
  .disclosure-marca{transition:none}
}
@media (max-width:520px){
  .disclosure{flex:1 1 100%}
  .disclosure>summary{width:100%;justify-content:flex-start}
  .disclosure-lista{left:0;right:0;min-width:0}
}

/* ---- Escolha entre baixa e transferencia ----
   Mesmo controle segmentado do filtro de periodo: duas acoes do mesmo lote, uma de
   cada vez, sem tirar a ficha da tela. */
.periodo [role="tab"]{display:inline-flex;align-items:center;justify-content:center;gap:7px}
.periodo [role="tab"][aria-selected="true"]{background:var(--card);color:var(--foreground);
  font-weight:600;box-shadow:0 1px 2px color-mix(in srgb, var(--primary) 14%, transparent)}
.painel-acao{margin-top:16px}
.painel-acao[hidden]{display:none}

/* ---- Botao que confirma mostrando o ramo ----
   Mesmo desenho do botao de entrar: gira enquanto grava e mostra o ramo da marca
   antes de a pagina trocar. Aqui ele confirma dinheiro saindo de um saldo, que e
   onde o operador mais precisa ver que deu certo antes de a tela mudar.
   A largura sai do data-largura para o rotulo caber: "Dar baixa no saldo" nao entra
   nos 172px do botao de salvar. */
.confirmar{position:relative;display:inline-flex;align-items:center;justify-content:center;
  margin:0;height:52px;width:230px;min-width:0;padding:0;overflow:hidden;
  border:2px solid transparent;border-radius:26px;cursor:pointer;
  background:linear-gradient(to bottom, var(--primary), color-mix(in srgb, var(--primary) 82%, var(--card)));
  color:var(--primary-foreground);font-family:var(--fonte-corpo);font-size:15px;font-weight:600;
  letter-spacing:0;
  transition:width .42s cubic-bezier(.2,.8,.2,1), background-color .2s}
.confirmar[data-estado="girando"],.confirmar[data-estado="entrando"]{width:52px}
.confirmar>span{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  opacity:0;transform:translateY(14px);transition:opacity .18s, transform .24s}
.confirmar[data-estado="idle"] .confirmar-idle{opacity:1;transform:none}
.confirmar[data-estado="girando"] .confirmar-fiar{opacity:1;transform:none}
.confirmar[data-estado="entrando"] .confirmar-ramo{opacity:1;transform:scale(1.08)}
.confirmar-fiar::before{content:"";width:26px;height:26px;border-radius:50%;
  border:3px solid color-mix(in srgb, var(--primary-foreground) 32%, transparent);
  border-top-color:var(--primary-foreground);animation:girar .7s linear infinite}
.confirmar-ramo::before{content:"";width:28px;height:29px;
  -webkit-mask:url("/assets/marca/ramo-259c.png") no-repeat center/contain;
  mask:url("/assets/marca/ramo-259c.png") no-repeat center/contain;
  background-color:var(--primary-foreground)}
/* a tela se apaga com o ramo ainda visivel, igual a da entrada */
body.saindo .operacao>*:not(.cartao),
body.saindo .operacao .indicadores,
body.saindo .operacao .linha-campos,
body.saindo .operacao .periodo,
body.saindo .operacao .nota-rodape{opacity:0;transition:opacity .34s ease}
@media (prefers-reduced-motion:reduce){
  .confirmar,.confirmar>span{transition:none}
  .confirmar-fiar::before{animation:none;border-top-color:var(--primary-foreground)}
  body.saindo .operacao>*{transition:none}
}

/* ---- Tabela de lancamentos ----
   Quatro colunas: quando, lote, o que foi, quanto. O lote leva o responsavel na
   mesma celula porque conferir "de quem" e a pergunta seguinte a "qual lote". */
.t-lancamentos{table-layout:fixed}
.t-lancamentos th:nth-child(1),.t-lancamentos td:nth-child(1){width:19%}
.t-lancamentos th:nth-child(2),.t-lancamentos td:nth-child(2){width:31%}
.t-lancamentos th:nth-child(4),.t-lancamentos td:nth-child(4){width:17%}
.t-lancamentos td .dica{display:block;margin-top:1px}
.operacao h2{text-align:left;margin-top:24px}

/* ---- Fechamento ----
   Uma conta, nao quatro numeros soltos: baixado mais a cobrar e o que a mesa
   consumiu, e e essa soma que o operador confere no fim do turno. A linha do total
   ganha regua em cima, como em qualquer fechamento escrito a mao. */
.fechamento{margin:0 0 18px;font-variant-numeric:tabular-nums}
.fechamento>div{display:flex;align-items:baseline;gap:12px;padding:9px 0}
.fechamento dt{flex:1;margin:0;color:var(--muted-foreground);font-size:14px}
.fechamento dd{margin:0;font-family:var(--fonte-titulo);font-size:21px;font-weight:500;
  white-space:nowrap}
.fechamento .fechamento-soma{border-top:1px solid var(--border);margin-top:2px;padding-top:12px}
.fechamento .fechamento-soma dt{color:var(--foreground);font-weight:600}
/* Segundo bloco do fechamento: dinheiro que ENTROU no caixa, separado por forma de
   pagamento. Vem depois do consumo, com uma linha de separação mais forte, porque as
   duas contas não se somam: uma é saldo que saiu, a outra é dinheiro que chegou. */
.fechamento-entrada{border-top:2px solid var(--border);padding-top:16px;margin-top:2px}
.fechamento-entrada dt .dica{display:block;margin-top:1px;font-size:12px}
.fechamento .fechamento-soma dd{font-size:26px;color:var(--primary)}

/* ---- Grafico de barras ----
   Barras em CSS, sem biblioteca: qualquer pacote de grafico traria dezenas de KB e um
   segundo sistema de cores para desenhar isto. A tabela equivalente vai no HTML com
   a classe .oculto, porque grafico e imagem e imagem nao se le em leitor de tela. */
/* O overflow-x:clip existe por causa da dica: ela e absoluta, tem 165px de largura e
   estoura a direita do grafico, e um elemento absoluto invisivel ainda conta para o
   scrollWidth. Medido em 390px: a pagina inteira rolava de lado. O clip corta so no
   eixo X e deixa o Y livre, entao a dica continua aparecendo por cima das barras
   (hidden nao serviria: com hidden num eixo, o outro deixa de ser visible). */
.grafico{display:flex;align-items:flex-end;gap:3px;height:190px;margin-bottom:6px;
  padding-top:10px;overflow-x:clip;overflow-y:visible}
.barra-caixa{flex:1 1 0;min-width:0;display:flex;flex-direction:column;
  justify-content:flex-end;align-items:center;height:100%;gap:6px}
.barra{position:relative;width:100%;max-width:38px;border-radius:5px 5px 2px 2px;
  background:linear-gradient(to top, color-mix(in srgb, var(--primary) 62%, transparent), var(--primary));
  transition:background .16s}
.barra.vazia{background:var(--border)}
.barra-caixa:hover .barra:not(.vazia){background:var(--accent)}
.barra-rotulo{font-size:11px;color:var(--muted-foreground);white-space:nowrap;
  font-variant-numeric:tabular-nums;height:14px}
/* Valor escrito no topo da barra. Altura reservada mesmo quando vazio, senao a barra
   sem etiqueta cresceria 16px a mais que a vizinha e a linha de base do grafico
   deixaria de ser uma linha. O padding-top do .grafico ja abre o espaco. */
.barra-valor{font-size:11px;font-weight:600;color:var(--foreground);white-space:nowrap;
  font-variant-numeric:tabular-nums;height:15px;line-height:15px}
.barra-caixa:not(:has(.barra-valor)){padding-top:15px}
/* No celular a coluna fica estreita demais para o numero: a partir de quatro barras
   a etiqueta encostava na vizinha e a da ponta saia da moldura. Ali o valor fica no
   toque, pela dica que ja existe. Medido em 400px, nao estimado. */
@media (max-width:640px){
  .barra-valor{font-size:10px}
  .grafico-estreito .barra-valor{display:none}
  .grafico-estreito .barra-caixa{padding-top:15px}
}
/* o valor aparece no hover e no foco de teclado, nunca so no hover */
.barra-dica{position:absolute;bottom:calc(100% + 8px);left:50%;transform:translateX(-50%);
  padding:6px 10px;border-radius:var(--radius-sm);white-space:nowrap;font-size:12px;
  background:var(--primary);color:var(--primary-foreground);
  opacity:0;pointer-events:none;transition:opacity .14s;z-index:5}
.barra-caixa:hover .barra-dica,.barra-caixa:focus-within .barra-dica{opacity:1}
@media (prefers-reduced-motion:reduce){.barra,.barra-dica{transition:none}}
@media (max-width:520px){
  .grafico{height:150px;gap:2px}
  .barra{border-radius:4px 4px 1px 1px}
  .barra-rotulo{font-size:10px}
}

/* o filtro do topo nao mora dentro de uma lista: precisa do proprio respiro */
.filtros-topo{margin-bottom:4px}
/* no relatorio o disclosure leva links, e nao botoes: cada operador e uma URL */
.disclosure-lista a{display:flex;align-items:center;gap:14px;width:100%;
  padding:9px 12px;border-radius:var(--radius);text-decoration:none;
  color:var(--foreground);font-size:14px;font-weight:600;transition:background-color .16s}
.disclosure-lista a:hover{background:var(--muted)}
.disclosure-lista a>span:first-of-type{flex:1}
.disclosure-lista a[aria-current="true"] .ico{color:var(--primary)}
.disclosure-lista a[aria-current="true"] .disclosure-marca{opacity:1;transform:none}

.t-ranking{table-layout:fixed}
.t-ranking th:nth-child(1),.t-ranking td:nth-child(1){width:18%}
.t-ranking th:nth-child(3),.t-ranking td:nth-child(3){width:14%}
.t-ranking th:nth-child(4),.t-ranking td:nth-child(4){width:20%}

/* ================= Ajustes de 01/09/2026, telas do caixa ================= */

/* 1. A barra de abas acompanha a largura da coluna, como os cartoes abaixo dela.
      Antes ela encolhia para o conteudo e ficava boiando no meio de uma faixa
      vazia. As tres abas dividem o espaco por igual. */
.operacao .abas{width:100%;max-width:720px;justify-content:stretch}
.operacao .aba{flex:1 1 0;justify-content:center}

/* 2. Nas telas do caixa o logo ancora a esquerda e o titulo centraliza no que
      sobra. No portal do morador o par inteiro centraliza, que e o que ele aprovou
      la; aqui a faixa e mais larga e o par centralizado deixava o logo no meio do
      nada. Mesma peca, dois arranjos, cada um decidido na tela onde vive. */
.ident-lado{justify-content:flex-start;max-width:720px}
.ident-lado .ident-texto{flex:1 1 auto;text-align:center;min-width:0}

/* 3 e 4. Indicador centralizado, e todos com a mesma altura de rotulo e de valor.
      Sem a altura fixa, "SALDO DISPONIVEL" quebra em duas linhas e desalinha os
      valores da fileira; com ela, os quatro numeros ficam na mesma linha de base. */
.indicador{text-align:center;display:flex;flex-direction:column;justify-content:center}
.indicador .rot{min-height:2.6em;display:flex;align-items:center;justify-content:center;
  text-align:center;line-height:1.3}
/* altura em px e nao em em: o nome do responsavel tem 16px e os numeros tem 24, e
   1.5em daria 24px numa caixa e 36 na outra, deixando um valor 6px abaixo dos tres */
.indicador .val{display:flex;align-items:center;justify-content:center;min-height:34px}
.indicador .etiqueta{margin:0 auto}

/* 5. Cancelar ao lado da acao. Mesma caixa do confirmar, como no pop-up de senha:
      menor, ele pareceria acessorio de um botao que e a saida sem consequencia. */
.acoes-form .btn-ghost{min-width:172px;height:52px;border-radius:26px;font-size:15px;
  border:1px solid var(--border);color:var(--foreground)}
.acoes-form .btn-ghost:hover{background:var(--muted)}

/* 7. O disclosure tem largura fixa. Sem ela, trocar "Baixas" (130px) por
      "Transferencias" (183px) empurrava o controle segmentado ao lado, e a barra
      inteira dancava a cada escolha. 200px cabe o maior rotulo de tipo com folga;
      248px cabe "Todos os operadores", que e o maior do relatorio. */
.disclosure{flex:0 0 200px;width:200px}
.filtros-topo .disclosure{flex:0 0 248px;width:248px}
.disclosure>summary{width:100%}
.disclosure-atual{flex:1;min-width:0}
.disclosure-atual>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.filtros .periodo{flex:1 1 auto;min-width:0}

/* 8. Segundo nivel do filtro, com o espaco reservado sempre.
      A faixa existe mesmo vazia: se ela aparecesse e sumisse conforme a janela,
      tudo abaixo pularia a cada clique, que e exatamente o que se quer evitar. */
/* Altura FIXA, e nao min-height: com min-height os doze meses quebravam em duas
   linhas e a faixa ia de 14 para 65px, empurrando a tabela 65px para baixo a cada
   clique. Reservar espaco so funciona se o espaco reservado nao mudar de tamanho.
   Por isso os botoes ficam em uma linha so (nowrap) e a faixa rola de lado quando
   nao couberem, em vez de crescer. */
.subfiltro{height:44px;margin-bottom:14px;overflow-x:auto;overflow-y:hidden;
  scrollbar-width:none}
.subfiltro::-webkit-scrollbar{display:none}
.periodo-sub{background:transparent;border:0;padding:0;gap:5px;flex-wrap:nowrap}
.periodo-sub button{flex:0 0 auto;padding:7px 13px;font-size:12.5px;
  border:1px solid var(--border);background:var(--card);border-radius:var(--radius-pill)}
.periodo-sub button:hover{background:var(--muted)}
.periodo-sub button[aria-pressed="true"]{background:var(--primary);color:var(--primary-foreground);
  border-color:var(--primary);box-shadow:none}
@media (max-width:520px){
  .disclosure,.filtros-topo .disclosure{flex:1 1 100%;width:auto}
  /* A regra de celular do .periodo estica os botoes para preencher a linha, o que e
     certo nas seis janelas e errado nos oito meses: um mes sozinho ocupando a tela
     inteira parece um botao, e nao um filtro. Aqui eles ficam do tamanho do texto e
     a faixa rola de lado, como qualquer fileira de chips no celular.
     A dupla classe existe para vencer .periodo button, que vale 0,1,1 igual.
     O width:auto tambem e obrigatorio: a regra button{width:100%} deste mesmo bloco
     esticava cada chip ate a largura da faixa, e o flex:0 0 auto sozinho nao desfaz
     largura declarada. */
  .periodo.periodo-sub button{flex:0 0 auto;width:auto;min-width:0;
    padding:7px 13px;font-size:12.5px}
}

/* ==========================================================================
   BACKOFFICE · moldura com sidebar, painel e tema escuro. 13/09/2026.
   Desenho adaptado do sidebar-07 do shadcn/ui, reimplementado em CSS. Tudo aqui
   usa só tokens de papel, então o tema escuro vale sem uma regra a mais.
   ========================================================================== */
.app{display:flex;min-height:100vh;background:var(--background)}

/* ---- Sidebar ---- */
.lateral{position:sticky;top:0;height:100vh;width:256px;flex:0 0 256px;z-index:30;
  display:flex;flex-direction:column;background:var(--card);border-right:1px solid var(--border);
  transition:width .22s ease, flex-basis .22s ease}
.lateral-topo{padding:12px 10px 6px}
.unidade{display:flex;align-items:center;gap:10px;padding:6px;border-radius:10px;
  color:var(--foreground);text-decoration:none}
main a.unidade,.unidade:hover{text-decoration:none}
.unidade:hover{background:var(--muted)}
.unidade-marca{flex:0 0 34px;height:34px;border-radius:9px;background:var(--primary);
  display:flex;align-items:center;justify-content:center}
.ramo-marca{width:22px;height:22px;background:var(--primary-foreground);
  -webkit-mask:url("/assets/marca/ramo-259c.png") no-repeat center/contain;
  mask:url("/assets/marca/ramo-259c.png") no-repeat center/contain}
.unidade-texto{display:flex;flex-direction:column;min-width:0;line-height:1.25}
.unidade-texto strong{font-size:14px;white-space:nowrap}
.unidade-texto span{font-size:12px;color:var(--muted-foreground)}

.lateral-nav{flex:1;overflow-y:auto;padding:4px 10px}
.lateral-grupo{margin-top:14px}
.lateral-grupo ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}
.lateral-rotulo{margin:0 0 4px;padding:0 10px;font-size:11.5px;font-weight:500;
  color:var(--muted-foreground);white-space:nowrap}
.lateral-item{position:relative;display:flex;align-items:center;gap:10px;height:36px;padding:0 10px;
  border-radius:8px;font-size:14px;color:var(--foreground);text-decoration:none;white-space:nowrap}
main a.lateral-item{text-decoration:none}
.lateral-item>.ico{color:var(--muted-foreground);flex:0 0 auto}
.lateral-item>.ico:last-child:not(:first-child){margin-left:auto;width:12px;height:12px}
.lateral-item:hover{background:var(--muted)}
.lateral-item[aria-current="page"]{background:var(--muted);font-weight:600}
.lateral-item[aria-current="page"]>.ico:first-child{color:var(--accent)}

.lateral-pe{padding:10px;border-top:1px solid var(--border)}
.usuario{display:flex;align-items:center;gap:10px;padding:6px;border-radius:10px;position:relative}
.avatar{flex:0 0 34px;height:34px;border-radius:9px;background:var(--muted);color:var(--foreground);
  display:flex;align-items:center;justify-content:center;font-size:12.5px;font-weight:700}
.usuario-texto{display:flex;flex-direction:column;min-width:0;line-height:1.25}
.usuario-texto strong{font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.usuario-texto span{font-size:12px;color:var(--muted-foreground)}

/* Recolhida: só os ícones. O texto some e a etiqueta volta ao lado do ícone no
   hover, lida do data-dica; sem ela seria preciso decorar o que cada ícone é. */
:root[data-lateral="recolhida"] .lateral{width:62px;flex-basis:62px}
:root[data-lateral="recolhida"] .lateral-nav{overflow:visible}
:root[data-lateral="recolhida"] .unidade-texto,
:root[data-lateral="recolhida"] .usuario-texto,
:root[data-lateral="recolhida"] .lateral-item>span,
:root[data-lateral="recolhida"] .lateral-item>.ico:last-child:not(:first-child){display:none}
:root[data-lateral="recolhida"] .lateral-rotulo{height:1px;margin:0 8px 8px;padding:0;
  background:var(--border);color:transparent;overflow:hidden}
:root[data-lateral="recolhida"] .lateral-item{justify-content:center;padding:0}
:root[data-lateral="recolhida"] [data-dica]:hover::after,
:root[data-lateral="recolhida"] [data-dica]:focus-visible::after{
  content:attr(data-dica);position:absolute;left:calc(100% + 12px);top:50%;transform:translateY(-50%);
  padding:5px 9px;border-radius:6px;font-size:12.5px;font-weight:500;white-space:nowrap;z-index:50;
  background:var(--primary);color:var(--primary-foreground);pointer-events:none}
:root[data-lateral="recolhida"] .unidade,
:root[data-lateral="recolhida"] .usuario{position:relative;justify-content:center}

.lateral-fundo{display:none}

/* ---- Barra do topo ---- */
.principal{flex:1;min-width:0;display:flex;flex-direction:column}
/* barra-app e nao "barra": .barra ja e a coluna do grafico do caixa, com
   max-width:38px, e a barra do topo encolhia para 38px de largura */
.barra-app{position:sticky;top:0;z-index:20;display:flex;align-items:center;gap:10px;height:58px;
  padding:0 24px;background:var(--background);border-bottom:1px solid var(--border)}
.barra-alterna{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;
  min-width:0;margin:0;padding:0;border:0;border-radius:8px;background:transparent;
  color:var(--foreground);cursor:pointer}
.barra-alterna:hover{background:var(--muted)}
.barra-divisor{width:1px;height:18px;background:var(--border)}
.migalhas{display:flex;align-items:center;gap:6px;font-size:14px;min-width:0}
.migalhas a{color:var(--muted-foreground);text-decoration:none}
main .migalhas a,.migalhas a:hover{text-decoration:none}
.migalhas a:hover{color:var(--foreground)}
.migalhas>.ico{color:var(--muted-foreground)}
.migalhas [aria-current]{color:var(--foreground);font-weight:500;white-space:nowrap}
.barra-acoes{margin-left:auto;display:flex;align-items:center;gap:12px}
.barra-app .sair{color:var(--foreground);border-color:var(--border)}
.barra-app .sair:hover{background:var(--muted)}

/* ---- Switch de tema ----
   Desenho adaptado do SwitchMode (Watermelon UI), React com motion/react e
   next-themes no original. Aqui é um <button role="switch">: o botão desliza com
   uma curva que passa um pouco do ponto e volta, que é o que dá a sensação de mola
   do original, e o ícone ativo acende enquanto o outro apaga. */
.tema{position:relative;display:inline-flex;align-items:center;justify-content:space-between;
  width:62px;height:32px;min-width:0;margin:0;padding:0 3px;border-radius:999px;cursor:pointer;
  background:var(--muted);border:1px solid var(--border);transition:background-color .3s}
.tema-botao{position:absolute;top:2px;left:2px;width:26px;height:26px;border-radius:50%;
  background:var(--card);box-shadow:0 1px 3px color-mix(in srgb, var(--primary) 30%, transparent);
  transition:transform .42s cubic-bezier(.34,1.56,.64,1)}
.tema[aria-checked="true"] .tema-botao{transform:translateX(30px)}
.tema-ico{position:relative;z-index:1;width:26px;height:26px;display:flex;align-items:center;
  justify-content:center;color:var(--muted-foreground);transition:color .25s, transform .45s ease}
.tema[aria-checked="false"] .tema-sol{color:var(--accent)}
.tema[aria-checked="true"] .tema-lua{color:var(--accent)}
.tema[aria-checked="true"] .tema-sol{transform:rotate(45deg)}
.tema[aria-checked="false"] .tema-lua{transform:rotate(15deg)}
.tema:focus-visible{outline:2px solid var(--ring);outline-offset:2px}

/* ---- Conteúdo ---- */
/* margin:0 auto: a coluna centraliza na área que sobra depois da sidebar. Com
   margin:0 ela nascia colada à esquerda e deixava uma faixa vazia à direita em tela
   larga, que foi o primeiro defeito apontado na validação. */
main.conteudo{width:100%;max-width:1320px;margin:0 auto;padding:26px 28px 56px}
.conteudo-cabeca h1{margin:0 0 4px}
.conteudo-cabeca .sub{margin:0 0 22px}
/* as telas antigas do backoffice tinham 960px por causa do main global; dentro da
   moldura elas continuam legíveis com a largura cheia, só as tabelas crescem */

/* ---- Painel: indicadores ---- */
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:16px;
  margin-bottom:18px}
.kpi{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:18px 20px}
.kpi p{margin:0}
.kpi-rot{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--muted-foreground)}
.kpi-rot .ico{color:var(--accent)}
.kpi-val{font-family:var(--fonte-titulo);font-size:30px;font-weight:600;margin:8px 0 4px!important;
  color:var(--foreground);font-variant-numeric:lining-nums}
.kpi-nota{font-size:12.5px;color:var(--muted-foreground)}

.conciliacao{display:flex;align-items:flex-start;gap:10px;margin:16px 0 22px;padding:12px 16px;
  border-radius:var(--radius);font-size:14px;border-left:3px solid}
.conciliacao p{margin:0;line-height:1.5}
.conciliacao.fecha{background:var(--success-subtle);border-color:var(--success)}
.conciliacao.nao-fecha{background:var(--destructive-subtle);border-color:var(--destructive)}
.conciliacao>.ico{margin-top:2px}

/* ---- Painel: grade de cartões ---- */
.painel-grade{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}
.painel-largo{grid-column:span 2}
.painel-cartao{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);
  padding:18px 20px;display:flex;flex-direction:column;gap:14px;min-width:0}
.painel-cabeca{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;flex-wrap:wrap}
.painel-cabeca h2{margin:0;font-size:17px}
.painel-sub{margin:2px 0 0;font-size:12.5px;color:var(--muted-foreground)}
.painel-vazio{display:flex;align-items:center;gap:8px;margin:0;color:var(--muted-foreground);font-size:14px}
.painel-vazio .ico{color:var(--success)}
/* Tela larga: áreas nomeadas. Os movimentos descem pela lateral direita em duas
   linhas, e o gráfico ocupa o que sobra da primeira. Sem isso a lista, mais alta,
   esticava o cartão do gráfico e deixava um vazio grande embaixo das barras. */
@media (min-width:1181px){
  .painel-grade{grid-template-areas:"mensal mensal trans" "origem adesao trans" "top top expira"}
  .area-mensal{grid-area:mensal} .area-trans{grid-area:trans} .area-origem{grid-area:origem}
  .area-adesao{grid-area:adesao} .area-top{grid-area:top} .area-expira{grid-area:expira}
}
@media (max-width:1180px){
  .painel-grade{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-flow:row dense}
}
/* O gráfico enche o cartão: o contêiner cresce e o admin.js desenha no tamanho que
   ele tiver. A altura mínima segura o gráfico quando o cartão está sozinho na linha. */
.area-mensal .grafico-caixa{flex:1;min-height:250px;position:relative}
/* O SVG fica ABSOLUTO dentro do contêiner, e isso não é detalhe: o gráfico é
   desenhado na altura do contêiner, e se o SVG entrasse no fluxo ele passaria a
   definir essa altura. O observador de tamanho via o contêiner crescer, redesenhava
   mais alto, e o gráfico subia sem parar até 2.600px. Fora do fluxo, quem manda na
   altura é só o cartão. */
.area-mensal .grafico-caixa svg.grafico{position:absolute;inset:0;width:100%;height:100%}
@media (max-width:760px){
  .painel-grade{grid-template-columns:minmax(0,1fr)}
  .painel-largo{grid-column:auto}
}

/* ---- Gráfico em SVG (assets/graficos.js) ---- */
.grafico-caixa svg.grafico{display:block;width:100%;height:auto;overflow:visible}
.grafico-grade{stroke:var(--border);stroke-width:1}
.grafico-eixo{fill:var(--muted-foreground);font-size:13px;font-family:var(--fonte-corpo);
  font-variant-numeric:tabular-nums}
.grafico-rotulo,.grafico-valor{fill:var(--foreground);font-size:13px;font-family:var(--fonte-corpo)}
.grafico-trilho{fill:var(--muted)}
.grafico-marca{outline:none;transition:opacity .15s}
.grafico-marca:hover,.grafico-marca:focus-visible{opacity:.82}
.grafico-legenda{display:flex;flex-wrap:wrap;gap:6px 16px;font-size:12.5px;color:var(--muted-foreground)}
.grafico-legenda-item{display:inline-flex;align-items:center;gap:6px}
.grafico-legenda-item i{width:10px;height:10px;border-radius:3px;display:inline-block}
.grafico-dica{position:fixed;z-index:100;pointer-events:none;opacity:0;transition:opacity .12s;
  padding:7px 10px;border-radius:8px;font-size:12.5px;line-height:1.45;
  background:var(--primary);color:var(--primary-foreground);
  box-shadow:0 6px 18px -6px color-mix(in srgb, var(--primary) 50%, transparent)}
.grafico-dica.visivel{opacity:1}

/* ---- Lista de linhas (origem do dinheiro, lotes que mais consumiram) ----
   Cada linha é um alvo do tamanho da faixa de seleção, com o texto centralizado
   nela, no mesmo desenho dos últimos movimentos. A barra proporcional que existia
   aqui saiu em 13/09/2026: nunca chegou a aparecer em tela, e a proporção já está
   escrita na linha, em percentual ou em número de baixas. */
ul.barras-lista{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}
.barras-linha{display:flex;justify-content:space-between;align-items:center;gap:8px;font-size:13.5px}
.barras-linha>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.barras-linha>strong{white-space:nowrap;font-variant-numeric:tabular-nums}

/* ---- Medidor de adesão ----
   Trilho num passo mais claro da MESMA cor, e não cinza: o estado se lê na barra
   inteira, cheio e vazio na mesma família. */
/* O número e o medidor sobem um pouco para pagar a margem que a lista ganhou
   embaixo deles: o vão do cartão é o mesmo para todos os cartões, e sem isto a
   folga nova só empurraria o cartão para baixo. */
.adesao-numero{margin:-4px 0 0;font-size:14px;color:var(--muted-foreground)}
.adesao-numero strong{font-family:var(--fonte-titulo);font-size:30px;color:var(--foreground);margin-right:4px}
.medidor{height:10px;border-radius:5px;overflow:hidden;
  background:color-mix(in srgb, var(--serie-entrada) 18%, var(--card))}
.medidor span{display:block;height:100%;border-radius:5px;background:var(--serie-entrada)}
.adesao-dados{margin:10px 0 0;font-size:13.5px}
.adesao-dados div{display:flex;justify-content:space-between;padding:8px 0;border-top:1px solid var(--border)}
.adesao-dados dt{color:var(--muted-foreground)}
.adesao-dados dd{margin:0;font-weight:600;font-variant-numeric:tabular-nums}

.lista-simples{list-style:none;margin:0;padding:0}
.lista-simples li{display:flex;justify-content:space-between;align-items:center;gap:12px;
  padding:9px 0;border-bottom:1px solid var(--border);font-size:13.5px}
.lista-simples li:last-child{border-bottom:0}
.lista-simples a{display:flex;flex-direction:column;color:var(--foreground);text-decoration:none}
main .lista-simples a{text-decoration:none}
.lista-valor{display:flex;flex-direction:column;align-items:flex-end;font-weight:600;
  font-variant-numeric:tabular-nums}
.lista-simples .dica{margin:0;font-weight:400;font-size:12px}

/* ---- Últimos movimentos ----
   Desenho adaptado do TransactionList (Watermelon UI). A altura do cartão anima
   entre a lista e o detalhe, e o ícone, o nome e o valor voam da linha até o lugar
   deles no detalhe: em admin.js, Web Animations API, sem motion/react. */
.transacoes{justify-content:stretch}
.transacoes-dentro{flex:1;overflow:hidden;transition:height .45s cubic-bezier(.2,.8,.2,1)}
/* A lista ocupa a altura inteira do cartão, espalhando as linhas em vez de terminar
   no meio e deixar um vazio embaixo. O espaço entre linhas cresce até 16px; passando
   disso vira buraco, e aí o cartão simplesmente termina antes. */
.transacoes-lista{display:flex;flex-direction:column;gap:12px;height:100%}
.trans-lista{flex:1;justify-content:space-between;gap:2px}
.trans-lista>li+li{margin-top:2px}
/* O hidden do HTML vale display:none na folha do navegador, e qualquer display
   declarado aqui ganha dele. Sem esta linha a lista continuava na tela e o detalhe
   abria embaixo dela, em vez de no lugar dela. */
.transacoes-lista[hidden],.trans-detalhe[hidden]{display:none}
.trans-lista{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}
.trans{display:flex;align-items:center;gap:12px;width:100%;min-width:0;margin:0;padding:8px;
  border:0;border-radius:10px;background:transparent;color:var(--foreground);
  font:inherit;letter-spacing:0;text-align:left;cursor:pointer;transition:background-color .15s}
.trans:hover,.trans:focus-visible{background:var(--muted)}
.trans-ico{flex:0 0 40px;width:40px;height:40px;border-radius:12px;
  display:flex;align-items:center;justify-content:center;background:var(--muted)}
.trans-ico.entrada{color:var(--entrada);background:color-mix(in srgb, var(--entrada) 14%, var(--card))}
.trans-ico.saida{color:var(--saida);background:color-mix(in srgb, var(--saida) 12%, var(--card))}
.trans-ico.grande{flex-basis:50px;width:50px;height:50px;border-radius:14px}
.trans-texto{flex:1;min-width:0;display:flex;flex-direction:column}
.trans-nome{margin:0;font-size:13.5px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.trans-cat{margin:0;font-size:12.5px;color:var(--muted-foreground)}
.trans-valor{margin:0;font-size:13.5px;font-weight:600;white-space:nowrap;font-variant-numeric:tabular-nums}
.trans-valor.entrada{color:var(--entrada)}
.trans-valor.saida{color:var(--saida)}
.trans-valor.grande{font-size:17px}
.transacoes-todas{display:flex;align-items:center;justify-content:center;gap:6px;padding:9px;
  border-radius:8px;font-size:13px;color:var(--foreground)}
main a.transacoes-todas{text-decoration:none}
.transacoes-todas:hover{background:var(--muted)}

.trans-detalhe-topo{display:flex;justify-content:space-between;align-items:flex-start}
.trans-fecha{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;
  min-width:0;margin:0;padding:0;border:0;border-radius:50%;background:var(--muted);
  color:var(--foreground);cursor:pointer}
.trans-fecha:hover{background:var(--border)}
/* O foco vai para este botão assim que o detalhe abre, e foco movido por código não
   dispara :focus-visible em todo navegador: sem a regra explícita o anel aparecia e
   sumia conforme o caminho de entrada. Aqui ele é sempre visível. */
.trans-fecha:focus-visible{outline:2px solid var(--ring);outline-offset:2px}
.trans-detalhe-cabeca{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;margin:14px 0 10px}
.trans-detalhe-cabeca>div{min-width:0}
.trans-detalhe-cabeca .trans-nome{white-space:normal;font-size:15px}
.trans-dados{margin:0;display:flex;flex-direction:column;gap:9px;font-size:13px}
.trans-dados>div:not(.trans-separa){display:flex;justify-content:space-between;gap:14px}
.trans-dados dt{color:var(--muted-foreground)}
.trans-dados dd{margin:0;text-align:right;font-weight:500}
.trans-separa{border-top:1px dashed var(--border)}
.trans-dados.revela{animation:revela .4s cubic-bezier(.19,1,.22,1) .1s both}
@keyframes revela{from{opacity:0}}

/* ---- Celular: a sidebar vira gaveta ---- */
@media (max-width:900px){
  .lateral{position:fixed;left:0;top:0;bottom:0;height:auto;width:272px!important;
    transform:translateX(-102%);transition:transform .26s cubic-bezier(.2,.8,.2,1);
    box-shadow:0 0 40px -10px color-mix(in srgb, var(--primary) 45%, transparent)}
  :root[data-lateral-movel="aberta"] .lateral{transform:none}
  :root[data-lateral-movel="aberta"] .lateral-fundo{display:block;position:fixed;inset:0;z-index:25;
    background:color-mix(in srgb, var(--primary) 40%, transparent)}
  /* recolhida não existe no celular: a gaveta sempre abre inteira */
  :root[data-lateral="recolhida"] .unidade-texto,
  :root[data-lateral="recolhida"] .usuario-texto,
  :root[data-lateral="recolhida"] .lateral-item>span{display:flex}
  :root[data-lateral="recolhida"] .lateral-item{justify-content:flex-start;padding:0 10px}
  :root[data-lateral="recolhida"] .lateral-rotulo{height:auto;margin:0 0 4px;padding:0 10px;
    background:none;color:var(--muted-foreground)}
  .barra-app{padding:0 14px;gap:8px}
  .migalhas>a,.migalhas>.ico{display:none}
  main.conteudo{padding:18px 16px 44px}
  /* Indicadores em 2x2 no celular: empilhados, os quatro ocupavam a primeira tela
     inteira e a conciliação, que é o que diz se a conta fecha, ficava para baixo. */
  .kpis{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
  .kpi{padding:13px 14px}
  .kpi-rot{font-size:12px;gap:6px;align-items:flex-start}
  .kpi-val{font-size:20px;margin:6px 0 3px!important}
  .kpi-nota{font-size:11.5px}
}
@media (prefers-reduced-motion:reduce){
  .lateral,.tema-botao,.tema-ico,.transacoes-dentro{transition:none}
  .trans-dados.revela{animation:none}
}

/* ---- Filtro de período do painel ----
   Desenho adaptado do FilterDisclosure (Watermelon UI). O funil abre a lista; a opção
   marcada mostra o tique; "Um mês" e "Período" abrem um segundo nível dentro do mesmo
   painel, porque escolher mês ou duas datas não cabe numa linha de lista. */
.painel-cabeca-acoes{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.filtro-painel{position:relative}
.filtro-botao{display:inline-flex;align-items:center;gap:8px;margin:0;min-width:0;
  padding:6px 12px 6px 6px;border-radius:var(--radius-pill);cursor:pointer;
  background:var(--card);color:var(--foreground);border:1px solid var(--border);
  font-family:var(--fonte-corpo);font-size:13px;font-weight:500;letter-spacing:0;
  transition:border-color .16s, background-color .16s}
.filtro-botao:hover{border-color:var(--primary)}
.filtro-funil{display:flex;align-items:center;justify-content:center;width:26px;height:26px;
  border-radius:50%;background:var(--muted);color:var(--foreground);flex:0 0 auto}
.filtro-painel.carregando .filtro-funil{animation:filtro-gira 1s linear infinite}
@keyframes filtro-gira{to{transform:rotate(360deg)}}
.filtro-menu{position:absolute;right:0;top:calc(100% + 8px);z-index:40;width:250px;
  padding:6px;border-radius:var(--radius-lg);background:var(--card);
  border:1px solid var(--border);box-shadow:0 16px 40px -12px color-mix(in srgb, var(--primary) 40%, transparent);
  animation:filtro-abre .22s cubic-bezier(.2,.8,.2,1)}
@keyframes filtro-abre{from{opacity:0;transform:translateY(-6px) scale(.98)}}
.filtro-opcao,.filtro-voltar,.filtro-mes{display:flex;align-items:center;justify-content:space-between;
  gap:8px;width:100%;min-width:0;margin:0;padding:9px 10px;border:0;border-radius:8px;background:transparent;
  color:var(--foreground);font:inherit;font-size:13.5px;letter-spacing:0;text-align:left;cursor:pointer}
.filtro-opcao:hover,.filtro-voltar:hover,.filtro-mes:hover{background:var(--muted)}
.filtro-opcao .ico,.filtro-voltar .ico{color:var(--muted-foreground);flex:0 0 auto}
/* O tique só aparece na opção escolhida; a caixa fica sempre, para a linha não pular */
/* o tique herda a cor da caixa: `.filtro-opcao .ico` pinta todo ícone de dentro do
   item, e sem o inherit o tique aparecia apagado em cima da opção não escolhida */
.filtro-marca{display:flex;align-items:center;justify-content:center;width:20px;height:20px;
  flex:0 0 auto;border-radius:6px;border:1.6px solid var(--border);color:transparent}
.filtro-opcao .filtro-marca .ico{color:inherit}
.filtro-opcao[aria-pressed="true"] .filtro-marca{background:var(--primary);border-color:var(--primary);
  color:var(--primary-foreground)}
.filtro-voltar{justify-content:flex-start;gap:8px;font-weight:600;
  border-bottom:1px solid var(--border);border-radius:8px 8px 0 0;margin-bottom:4px}
.filtro-meses{display:grid;grid-template-columns:repeat(3,1fr);gap:2px}
.filtro-mes{justify-content:center;padding:9px 4px;font-variant-numeric:tabular-nums}
.filtro-mes[aria-pressed="true"]{background:var(--primary);color:var(--primary-foreground)}
.filtro-datas{display:flex;gap:8px;padding:4px 6px 8px}
.filtro-datas label{display:flex;flex-direction:column;gap:4px;flex:1;min-width:0;
  font-size:11.5px;text-transform:uppercase;letter-spacing:.6px;color:var(--muted-foreground)}
.filtro-datas input{padding:7px 8px;font-size:13px;background:var(--muted);border-color:transparent}
.filtro-aplica{width:calc(100% - 12px);margin:0 6px 4px}

/* ---- Cartão com detalhe (origem, adesão, ranking, movimentos) ---- */
.cartao-dentro{flex:1;overflow:hidden;transition:height .45s cubic-bezier(.2,.8,.2,1)}
.cartao-det[hidden],[data-cartao-lista][hidden]{display:none}
.det-topo{display:flex;align-items:center;gap:10px;margin-bottom:12px;min-width:0}
.det-titulo strong,.det-titulo span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* min-width:0 em todo botão novo: a regra base `button` do projeto impõe 200px de
   largura mínima, pensada para botão de formulário. Sem zerar, o de voltar virava uma
   elipse de 200px e os meses do filtro estourariam o menu. */
.det-voltar{display:inline-flex;align-items:center;justify-content:center;
  flex:0 0 32px;width:32px;height:32px;min-width:0;
  margin:0;padding:0;border:0;border-radius:50%;background:var(--muted);
  color:var(--foreground);cursor:pointer}
.det-voltar:hover{background:var(--border)}
.det-voltar:focus-visible{outline:2px solid var(--ring);outline-offset:2px}
.det-titulo{display:flex;flex-direction:column;min-width:0;line-height:1.3}
.det-titulo strong{font-size:14px}
.det-titulo span{font-size:12.5px;color:var(--muted-foreground)}
.det-valor{margin-left:auto;font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}
.cartao-det{display:flex;flex-direction:column;height:100%;min-height:0;overflow-y:auto}
.cartao-det>*{flex:0 0 auto}
.cartao-det>.lista-simples{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;
  padding-right:8px}   /* folga para a barra de rolagem não encostar no valor */
/* O rodapé do detalhe (o atalho para a ficha do lote) fica parado embaixo da lista
   que rola. O traço separa os dois: sem ele a última linha parece cortada pelo texto. */
.cartao-det>p.dica{margin:0;padding-top:10px;border-top:1px solid var(--border)}
.lista-nome{display:flex;flex-direction:column;min-width:0;color:var(--foreground);text-decoration:none}
main .lista-nome{text-decoration:none}
.lista-nome strong{font-size:13.5px}

/* Linha da lista de barras que abre detalhe: o botão ocupa a linha inteira */
.barras-botao{display:block;width:100%;min-width:0;margin:0;padding:9px 6px;border:0;border-radius:10px;
  background:transparent;color:var(--foreground);font:inherit;letter-spacing:0;text-align:left;
  cursor:pointer;transition:background-color .15s}
.barras-botao:hover,.barras-botao:focus-visible{background:var(--muted)}
.barras-botao .barras-linha{display:flex;justify-content:space-between;align-items:center;
  gap:8px;font-size:13.5px}
.barras-botao .barras-linha>span:first-child{display:flex;align-items:center;gap:6px;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.barras-botao .barras-linha .ico{color:var(--muted-foreground);flex:0 0 auto}
.barras-botao .barras-linha>strong{display:flex;align-items:center;gap:4px;white-space:nowrap;
  font-variant-numeric:tabular-nums}
.barras-botao .barras-linha>strong>.ico{color:var(--muted-foreground)}

/* Linha da adesão que abre a lista de quem ela conta */
.adesao-linha{display:flex;justify-content:space-between;align-items:center;gap:12px;width:100%;
  min-width:0;margin:0;padding:8px 6px;border:0;border-radius:8px;background:transparent;color:var(--foreground);
  font:inherit;letter-spacing:0;text-align:left;cursor:pointer}
.adesao-linha:hover,.adesao-linha:focus-visible{background:var(--muted)}
.adesao-linha dt{color:var(--muted-foreground);font-size:13.5px}
.adesao-linha dd{display:flex;align-items:center;gap:6px;margin:0;font-weight:600;
  font-variant-numeric:tabular-nums}
.adesao-linha dd .ico{color:var(--muted-foreground)}
.adesao-dados div{padding:0;border-top:1px solid var(--border)}

@media (max-width:560px){
  .filtro-menu{width:min(92vw,270px)}
  .painel-cabeca-acoes{width:100%;justify-content:space-between}
}

/* ---- Lista com linha que abre ----
   A linha inteira é o alvo, com a mesma reação de toque dos outros itens clicáveis
   do backoffice. tabindex + role deixam o teclado abrir igual ao mouse. */
tr.linha-abre{cursor:pointer;transition:background-color .14s}
tr.linha-abre:hover>td{background:var(--muted)}
tr.linha-abre:focus-visible{outline:2px solid var(--ring);outline-offset:-2px}

/* ---- Ficha do lote dentro do pop-up ---- */
.pop-largo{max-width:min(1040px,94vw)}
.ficha-cabeca{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;
  margin-bottom:14px}
.ficha-cabeca h2{margin:0}
.ficha-lote h2{margin-top:22px;font-size:17px}
.ficha-lote .indicadores{margin-bottom:14px}

/* ---- Tabela do extrato: toda linha com a mesma altura ----
   O motivo entra na mesma célula do tipo e é cortado com reticências. Antes ele
   abria uma segunda linha dentro da célula, e cada linha da tabela tinha uma altura,
   o que faz a tabela inteira parecer desalinhada. */
/* table-layout:fixed é o que faz a largura ser da COLUNA e não do conteúdo. Sem
   ele, o `white-space:nowrap` das células de texto cortado empurrava a tabela até
   14.120px de largura, e a rolagem horizontal escondia tudo depois da data: as
   larguras por classe abaixo eram simplesmente ignoradas. */
.tabela-extrato table{table-layout:fixed;width:100%}
.tabela-extrato th.col-data{width:150px}
.tabela-extrato th.col-valor{width:130px}
.tabela-extrato th.col-operador{width:150px}
/* 92px, e não 58: além do botão de três pontos, esta coluna mostra a palavra
   "estornado" nas linhas que já foram desfeitas, e em 58px ela saía cortada. */
.tabela-extrato th.col-acao{width:92px}
.tabela-extrato td.col-acao .dica{font-size:11.5px;white-space:nowrap}
.tabela-extrato td{height:46px;padding-top:6px;padding-bottom:6px;vertical-align:middle}
.celula-corta{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tabela-extrato td.col-data{white-space:nowrap}
.tabela-extrato td.col-acao{position:relative;text-align:right}
.tabela-extrato td.mv-entrada{color:var(--entrada);font-weight:600}
.tabela-extrato td.mv-saida{color:var(--saida);font-weight:600}

/* ---- Menu de ação da linha ----
   Desenho adaptado do InlineDisclosureMenu (Watermelon UI). A ação destrutiva não
   acontece no menu: ela abre o pop-up onde o motivo é escrito e a senha assina. */
.acao-menu-botao{display:inline-flex;align-items:center;justify-content:center;
  width:32px;height:32px;min-width:0;margin:0;padding:0;border:1px solid transparent;
  border-radius:8px;background:transparent;color:var(--muted-foreground);cursor:pointer;
  transition:background-color .15s, color .15s}
.acao-menu-botao:hover,.acao-menu-botao[aria-expanded="true"]{background:var(--muted);color:var(--foreground)}
.acao-menu{position:absolute;right:8px;top:calc(100% - 6px);z-index:40;width:224px;padding:6px;
  text-align:left;border-radius:var(--radius-lg);background:var(--card);border:1px solid var(--border);
  box-shadow:0 16px 40px -12px color-mix(in srgb, var(--primary) 40%, transparent);
  animation:filtro-abre .2s cubic-bezier(.2,.8,.2,1)}
.acao-menu[hidden]{display:none}
.acao-menu-topo{margin:0 0 4px;padding:6px 10px 8px;border-bottom:1px solid var(--border);
  font-size:12px;color:var(--muted-foreground)}
.acao-menu-item{display:flex;align-items:center;gap:10px;width:100%;min-width:0;margin:0;
  padding:9px 10px;border:0;border-radius:8px;background:transparent;color:var(--foreground);
  font:inherit;font-size:13.5px;letter-spacing:0;text-align:left;cursor:pointer}
.acao-menu-item:hover{background:var(--muted)}
.acao-menu-item .ico{color:var(--muted-foreground);flex:0 0 auto}
.acao-menu-item.perigo{color:var(--destructive)}
.acao-menu-item.perigo .ico{color:var(--destructive)}
.acao-menu-item.perigo:hover{background:var(--destructive-subtle)}

.estorno-resumo{margin:0 0 14px;padding:10px 12px;border-radius:var(--radius);
  background:var(--muted);font-size:13.5px}
#pop-estorno textarea{width:100%;padding:11px 12px;border:1px solid var(--input);
  border-radius:var(--radius-sm);font-family:var(--fonte-corpo);font-size:15px;
  background:var(--card);color:var(--foreground);resize:vertical}
#pop-estorno textarea:focus-visible{outline:2px solid var(--ring);outline-offset:1px}

/* ---- Parâmetros e formulários do backoffice ---- */
.form-parametros{max-width:760px}
.form-parametros .linha-campos>div{flex:1 1 300px}
.form-parametros button[type=submit]{margin-top:18px}

/* ---- Ficha do lote em tela estreita ----
   O contato tem e-mail longo, que empurrava o cartão para fora da moldura. */
.ficha-lote .indicador,.indicador{min-width:0;overflow-wrap:anywhere}
@media (max-width:760px){
  .ficha-lote .indicadores{grid-template-columns:repeat(2,minmax(0,1fr))}
  .pop-largo{max-width:100vw;width:100vw;height:100dvh;max-height:100dvh;border-radius:0}
}

/* ---- Crédito mensal: escolher os lotes ----
   A caixa de seleção nativa não aceita desenho, então ela fica escondida e quem
   aparece é o quadrado ao lado, que segue o estado dela. O clique continua sendo no
   <label>, que é o que dá o alvo grande e o suporte a teclado de graça. */
.escolha-topo{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-bottom:6px}
.busca-lotes{flex:1 1 260px;margin-bottom:0}
.escolha-acoes{display:flex;gap:6px}
.escolha-lista{list-style:none;margin:8px 0 0;padding:4px;display:flex;flex-direction:column;gap:2px;
  max-height:360px;overflow-y:auto;border:1px solid var(--border);border-radius:var(--radius)}
.escolha-item[hidden]{display:none}
.escolha-item label{display:flex;align-items:center;gap:12px;padding:9px 10px;border-radius:8px;
  cursor:pointer;text-transform:none;letter-spacing:0;color:var(--foreground);font-size:14px}
.escolha-item label:hover{background:var(--muted)}
.escolha-item input{position:absolute;opacity:0;width:0;height:0}
.escolha-marca{display:flex;align-items:center;justify-content:center;width:22px;height:22px;
  flex:0 0 auto;border-radius:7px;border:1.8px solid var(--border);color:transparent;
  transition:background-color .15s, border-color .15s}
.escolha-item input:checked~.escolha-marca{background:var(--primary);border-color:var(--primary);
  color:var(--primary-foreground)}
.escolha-item input:focus-visible~.escolha-marca{outline:2px solid var(--ring);outline-offset:2px}
.escolha-texto{display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex:1;min-width:0}
.escolha-nome{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.escolha-saldo{white-space:nowrap;font-size:13px;color:var(--muted-foreground);
  font-variant-numeric:tabular-nums}
.escolha-item.bloqueado label{cursor:not-allowed;opacity:.55}
.escolha-item.bloqueado label:hover{background:none}
#pagantes{width:100%;padding:11px 12px;border:1px solid var(--input);border-radius:var(--radius-sm);
  font-family:var(--fonte-corpo);font-size:15px;background:var(--card);color:var(--foreground);resize:vertical}
#pagantes:focus-visible{outline:2px solid var(--ring);outline-offset:1px}

/* Caixa: quem pode usar o crédito do lote (contrato do The Garden, Cláusula III, §2º e §8º), para a
   conferência do documento com foto. Mesmo rótulo dos indicadores logo acima. 16/10/2026. */
.autorizados{margin-top:16px;padding-top:14px;border-top:1px solid var(--border)}
.autorizados-rot{font-size:11px;text-transform:uppercase;letter-spacing:1px;color:var(--muted-foreground)}
.autorizados-nomes{margin-top:6px;font-size:15px;line-height:1.5}
