/* ══════════════════════════════════════════════════════════════
   TEMA F — "Tipografia"
   Carregado DEPOIS de app.css, sobrescrevendo os tokens e acrescentando os
   componentes de lista da Etapa 6.

   Por que camada de tema e não reescrita do app.css: o design ainda está em
   avaliação (seis variantes). Mantendo o tema num arquivo à parte, trocar de
   proposta — ou voltar ao verde original — é remover uma linha do <head>, e
   não refazer a folha inteira.

   Os nomes de variável do app.css são reaproveitados de propósito: como todo
   componente já lê `var(--g)`, `var(--gd)` etc., redefinir o token aqui
   repinta a aplicação inteira sem tocar em nenhum seletor de componente.

   ── ATENÇÃO ──
   Este arquivo deixou de ser o tema padrão. Ele passou a ser a CAMADA BASE:
   por cima dele vem `tema-institucional.css`, que repinta os tokens quando o
   <html> traz data-tema="institucional" — hoje o padrão. Sem esse atributo, o
   que se vê é exatamente este arquivo, e é isso que mantém os dois temas
   disponíveis a custo de uma requisição.

   Componente novo continua entrando AQUI e lendo token. Cor fixa em
   componente quebra os dois temas de uma vez.
   ══════════════════════════════════════════════════════════════ */

:root{
  /* ── PALETA ÂMBAR sobre os tokens existentes ── */
  --g:#F97316; --gd:#EA580C; --gxd:#B4470D; --gl:#FFF2E8; --gm:#FDBA8C;
  --gold:#D97706; --gold-lt:#FDF3E3; --gold-dk:#B45309;

  /* Neutros quentes: cinza puro brigaria com o laranja */
  --bg:#FAF7F4; --sur:#FFFFFF; --bord:#EAE1D9; --blt:#F4EEE8;
  --tx:#4A423C; --tx2:#6A5C52; --tx3:#9B8B7F;
  --chumbo:#37413F;

  --red:#C2352B; --rlt:#FCECEA;
  --warn:#B45309; --wlt:#FDF3E3;
  --blue:#1D4ED8; --blt2:#EAF0FE;

  /* ── CINZAS DE FORMULÁRIO ──
     Deliberadamente fora da faixa do laranja. Num sistema de fiscalização a
     cor quente carrega significado (prazo, irregularidade); se a borda de
     foco de um campo usa a mesma faixa, o usuário aprende a ignorá-la e a
     cor perde força justamente onde precisa alertar. */
  --f-bord:#CFCAC4; --f-bord-foco:#6B6560; --f-anel:rgba(107,101,96,.14);
  --f-fundo:#FFFFFF; --f-fundo-ro:#F3F1EF; --f-rot:#7A736C;

  /* ── DEGRADÊ DE MARCA ──
     Começa no laranja médio (--gd) e não no queimado (--gxd): o tom escuro
     pesava demais numa barra que ocupa a largura inteira da tela. O --gxd
     continua existindo para superfícies pequenas (toast), onde a área é
     mínima e o contraste com o texto branco importa mais que a leveza. */
  --grad-topo: linear-gradient(135deg, var(--gd) 0%, var(--g) 100%);
  --grad-fundo: linear-gradient(150deg, var(--gd) 0%, var(--g) 55%, #FB9142 100%);
}

/* Cabeçalho do app no degradê mais claro (app.css usa --gxd → --gd). */
.topo{background:var(--grad-topo)}

/* ── MARCA NA BARRA SUPERIOR ──
   Sem moldura nem fundo: a marca tem um conjunto por tema (ver js/tema.js),
   então ela nunca fica da mesma cor da barra e não precisa de apoio.
   O miolo branco do desenho já é o contraste. */
.topo-marca{width:28px;height:28px;flex-shrink:0}
/* O bloco do título precisa poder encolher para o ellipsis funcionar: sem
   min-width:0 o flex respeita o tamanho do conteúdo e "Fiscalização de
   Obras" quebrava em três linhas dentro de uma barra de 56px. */
.topo > div{min-width:0}
.topo h1{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* O cabeçalho em tela estreita é tratado junto do .perfil-btn, mais abaixo:
   a media query precisa vir DEPOIS da regra base para vencer na cascata. */

/* ── CAMPOS EM CINZA ────────────────────────────────────────── */
.field{background:var(--f-fundo);border-color:var(--f-bord)}
.field:focus-within{border-color:var(--f-bord-foco);box-shadow:0 0 0 3px var(--f-anel)}
.field label{color:var(--f-rot)}
.field input[readonly],.field select:disabled{background:var(--f-fundo-ro)}
.data-hora-combo{border-color:var(--f-bord)}
.data-hora-combo:focus-within{border-color:var(--f-bord-foco);box-shadow:0 0 0 3px var(--f-anel)}
.chk-item.marcado{border-color:var(--f-bord-foco);background:#F4F2F0}
.chk-item input,.field input[type=checkbox]{accent-color:var(--f-bord-foco)}

/* ── TAGS "Modelo D" do AppPOSTURAS ─────────────────────────
   Fundo em gradiente do tom do status, ícone por máscara CSS pintado na cor
   do status, e TEXTO SEMPRE cinza-chumbo — nunca colorido. Só o fundo e o
   ícone carregam a cor, o que mantém a leitura quando há várias tags juntas. */
:root{
  --ic-clock: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20zm1 5v5.5l4 2.4-1 1.6-5-3V7h2z'/%3E%3C/svg%3E");
  --ic-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4z'/%3E%3C/svg%3E");
  --ic-alert: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2 1 21h22L12 2zm-1 7h2v6h-2V9zm0 8h2v2h-2v-2z'/%3E%3C/svg%3E");
  --ic-x: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M18.3 5.71 12 12l6.3 6.29-1.41 1.42L10.59 13.4 4.3 19.71 2.89 18.3 9.17 12 2.89 5.71 4.3 4.29l6.29 6.3 6.29-6.3z'/%3E%3C/svg%3E");
  --ic-dot: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='7'/%3E%3C/svg%3E");
  --ic-file: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6zm0 7V3.5L19.5 9H14z'/%3E%3C/svg%3E");
}
.badge{gap:5px;padding:4px 9px 4px 7px;border-radius:8px;color:var(--chumbo);
  border:1px solid var(--badge-border);box-shadow:0 1px 2px rgba(0,0,0,.05)}
.badge::before{width:11px;height:11px;border-radius:0;background:var(--badge-color);
  -webkit-mask-image:var(--badge-icon);mask-image:var(--badge-icon);
  -webkit-mask-size:contain;mask-size:contain;
  -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  -webkit-mask-position:center;mask-position:center}
.bd-ok  {background:linear-gradient(135deg,#E7F6EC,#D5F0DE);--badge-border:#C6EAD2;--badge-color:#2E7D32;--badge-icon:var(--ic-check)}
.bd-al  {background:linear-gradient(135deg,#FFF6DD,#FCECBE);--badge-border:#F2DE9C;--badge-color:#B8860B;--badge-icon:var(--ic-clock)}
.bd-pe  {background:linear-gradient(135deg,#FFF6DD,#FCECBE);--badge-border:#F2DE9C;--badge-color:#B8860B;--badge-icon:var(--ic-clock)}
.bd-er  {background:linear-gradient(135deg,#FCEAE9,#F8D6D2);--badge-border:#F2C4C0;--badge-color:#C62828;--badge-icon:var(--ic-alert)}
.bd-in  {background:linear-gradient(135deg,#F1F5F9,#E3E9EF);--badge-border:#E2E8F0;--badge-color:#6B7280;--badge-icon:var(--ic-dot)}
.bd-cx  {background:linear-gradient(135deg,#FCEAE9,#F5CDC8);--badge-border:#F0B8B3;--badge-color:#B71C1C;--badge-icon:var(--ic-x)}
.bd-tipo{background:linear-gradient(135deg,#F6F3F0,#EDE8E3);--badge-border:#E2DCD6;--badge-color:#8A8078;--badge-icon:var(--ic-file)}

/* ── ABAS ───────────────────────────────────────────────────── */
/* Rodapé: FLEX, não grid de N colunas fixas. Com grid o número de colunas
   precisa acompanhar a quantidade de abas — foi o que quebrou ao entrar a
   terceira aba num grid de 2: a última ficava fora da barra. Em flex, cada
   aba divide o espaço sozinha e acrescentar uma nova não exige tocar no CSS. */
/* Barra flutuante em pílula: descolada das bordas, com a aba ativa marcada
   por uma pílula interna em vez do traço no topo. O ícone fica sempre em
   cinza-chumbo — quem muda de cor é o RÓTULO (laranja quando ativo), então
   o realce vem da palavra, que é o que de fato se lê.
   Largura travada em 560px e centralizada em qualquer tela: esticada de
   ponta a ponta num monitor grande, cada aba virava um retângulo enorme. */
.abas{position:fixed;left:50%;right:auto;transform:translateX(-50%);z-index:950;
  width:min(560px, calc(100% - 24px));
  bottom:calc(10px + env(safe-area-inset-bottom));
  background:var(--sur);border:1px solid var(--bord);border-radius:999px;
  box-shadow:0 8px 26px rgba(74,66,60,.17), 0 2px 6px rgba(74,66,60,.08);
  display:flex;align-items:stretch;padding:6px;gap:3px}
.aba{flex:1 1 0;min-width:0;display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:2px;padding:7px 3px;border:none;background:none;cursor:pointer;
  border-radius:999px;font-size:10px;line-height:1.15;color:var(--chumbo);
  position:relative;text-align:center;transition:background .15s;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.aba svg{width:19px;height:19px;color:var(--chumbo)}
.aba:hover{background:var(--blt)}
.aba.at{background:var(--gl);color:var(--gd)}
.aba.at svg{color:var(--chumbo)}

.tela{display:none}
.tela.at{display:block}

/* ── LISTA DE DOCUMENTOS — padrão do módulo Autos do AppPOSTURAS ──
   Ficha de quatro linhas: a primeira carrega o peso (data · tipo · número em
   badge monoespaçado · status), as demais formam pares rótulo/valor. */
.mob-card{background:var(--sur);border:1.5px solid var(--bord);border-radius:var(--rl);
  padding:14px 16px;margin-bottom:10px;box-shadow:var(--sh);cursor:pointer}
.mob-card:hover{box-shadow:var(--shl);border-color:var(--gm)}
.mc-top{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:6px;gap:8px;flex-wrap:wrap}
.mc-top > :first-child{min-width:0;flex:1}
.mc-acoes{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.notif-card-l1{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.notif-card-data{font-size:12px;color:var(--tx3)}
.notif-card-tipo{font-size:14px;color:var(--chumbo)}
.notif-card-linhas{margin-top:10px;padding-top:10px;border-top:1px solid var(--blt);
  display:flex;flex-direction:column;gap:5px}
.notif-card-linhas>div{font-size:12.5px;color:var(--tx2);display:flex;gap:6px;line-height:1.4}
.notif-card-rot{flex-shrink:0;min-width:74px;font-size:10px;color:var(--tx3);
  text-transform:uppercase;letter-spacing:.04em;padding-top:1px}
.proto-badge{display:inline-flex;align-items:center;font-size:11px;padding:2px 8px;
  border-radius:6px;background:var(--blt);color:var(--chumbo);letter-spacing:.05em;
  border:1.5px solid var(--bord)}

.topo-lista{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.topo-lista .sec-simples{margin:0;flex:1}
.sec-simples{font-size:11px;text-transform:uppercase;letter-spacing:.1em;color:var(--chumbo);
  display:flex;align-items:center;gap:9px;margin:0 0 10px}
.sec-simples .cont{background:var(--gl);color:var(--gd);border-radius:999px;padding:2px 9px;
  font-size:10px;letter-spacing:0}
.linha-filtro{display:flex;gap:7px;margin-bottom:9px;flex-wrap:wrap}
.linha-filtro input,.linha-filtro select{font-size:13px;padding:8px 10px;
  border:1.5px solid var(--f-bord);border-radius:var(--r);background:#fff;
  color:var(--chumbo);outline:none}
.linha-filtro input{flex:2;min-width:150px}
.linha-filtro select{flex:1;min-width:130px;cursor:pointer}
.linha-filtro input:focus,.linha-filtro select:focus{border-color:var(--f-bord-foco);
  box-shadow:0 0 0 3px var(--f-anel)}
.lista-vazia{font-size:12.5px;color:var(--tx3);text-align:center;padding:22px 10px;
  border:1.5px dashed var(--bord);border-radius:var(--rl)}
.aviso-legal{background:var(--rlt);border:1.5px solid #F3CFCB;border-radius:var(--r);
  padding:11px 13px;font-size:12.5px;color:var(--tx2);margin-bottom:12px}
.aviso-legal b{color:var(--chumbo)}

#t-documentos,#t-protocolos{padding:14px;padding-bottom:80px}

/* ── PARÂMETROS (modal, só administrador) ──
   Modal largo para conteúdo tabular: 520px é confortável para
   um formulário, mas espremeria uma lista de usuários com e-mail e perfil. */
.modal.largo{max-width:860px}

/* Confirmação SEMPRE por cima: ela costuma ser aberta de dentro de outro
   modal (remover assinatura, excluir UPF) e, com o mesmo z-index, quem
   vencia era o último no DOM — a pergunta ficava atrás da tela que a pediu. */
#m-confirm{z-index:2200}

/* ── ABAS — DESENHO ÚNICO DA APLICAÇÃO ──
   Segmento sobre trilho: a aba ativa vira uma pastilha branca em relevo, as
   demais ficam rentes ao fundo. Era o desenho das abas de documento e agora
   vale para todas — ficha técnica, perfil, parâmetros. Dois desenhos de aba
   na mesma aplicação faziam parecer que uma delas era outra coisa.

   As regras estruturais são compartilhadas; o que muda entre um lugar e outro
   é só a margem, definida junto de cada modal. */
.sub-abas{display:flex;gap:2px;background:var(--bg);border-radius:var(--r);
  padding:3px;overflow-x:auto;margin:12px 0 10px}
.sub-abas button{flex:1 1 0;min-width:84px;padding:8px 6px;border:none;border-radius:6px;
  background:transparent;cursor:pointer;font-family:'Inter',sans-serif;font-size:12px;
  font-weight:700;color:var(--tx3);white-space:nowrap;transition:background .15s,color .15s}
.sub-abas button.at{background:var(--sur);color:var(--gd);box-shadow:var(--sh)}
/* Altura fixa e rolagem interna: sem isto cada aba esticava o modal ao
   tamanho do próprio conteúdo, e a janela pulava de tamanho a cada troca de
   aba. Com altura travada, todas as abas ocupam o mesmo container. */
.par-painel{display:none}
.par-painel.at{display:block;height:min(60vh, 540px);overflow-y:auto;padding-right:4px}

/* Linha de cadastro rápido (padrão .cad-row do AppPOSTURAS): o que cabe numa
   linha entra sem abrir janela — ano, valor, nome de lei. */
.cad-row{display:flex;gap:8px;margin-bottom:8px;flex-wrap:wrap;align-items:center}
.cad-row input,.cad-row select{flex:1;min-width:120px;font-size:13.5px;padding:9px 12px;
  border:1.5px solid var(--f-bord);border-radius:var(--r);background:#fff;
  color:var(--chumbo);font-family:inherit;outline:none}
.cad-row input:focus,.cad-row select:focus{border-color:var(--f-bord-foco);
  box-shadow:0 0 0 3px var(--f-anel)}
.cad-row .btn{flex-shrink:0}
.cad-dica{font-size:11px;color:var(--tx3);margin:2px 0 10px}

/* Topo das sub-telas (artigos da lei, feriados do ano) */
.sub-topo{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.sub-topo .titulo{flex:1;min-width:0;font-family:'Manrope',sans-serif;font-weight:700;
  font-size:14px;color:var(--gd);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* Sub-abas internas do detalhe da lei */
.leg-painel{display:none}
.leg-painel.at{display:block}

/* Linha que leva a um detalhe: ganha a seta e o realce de clique. */
.par-linha.clicavel{cursor:pointer;transition:border-color .13s,background .13s}
.par-linha.clicavel:hover{border-color:var(--gm);background:var(--gl)}
.par-linha .seta{flex-shrink:0;color:var(--tx3);font-size:20px;line-height:1}

/* Linha de dados simples (UPF/feriado): não é ficha, cabe numa linha. */
.par-linha{display:flex;align-items:center;gap:10px;background:var(--sur);
  border:1.5px solid var(--bord);border-radius:var(--rl);padding:11px 14px;margin-bottom:8px}
.par-linha .principal{flex:1;min-width:0}
.par-linha .principal b{font-size:13.5px;color:var(--chumbo);display:block}
.par-linha .principal span{font-size:11.5px;color:var(--tx3)}
.par-linha .acao-x{background:none;border:none;color:var(--tx3);cursor:pointer;padding:4px;flex-shrink:0}
.par-linha .acao-x:hover{color:var(--red)}

.par-secao{margin-bottom:18px}
.par-secao-tit{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}

/* Ficha do protocolo: pares rótulo/valor em coluna estreita à esquerda. */
.ficha-linha{display:flex;gap:8px;font-size:13px;color:var(--tx2);line-height:1.45;
  padding:7px 0;border-bottom:1px solid var(--blt)}
.ficha-linha:last-child{border-bottom:none}
.ficha-rot{flex-shrink:0;width:104px;font-size:10px;color:var(--tx3);
  text-transform:uppercase;letter-spacing:.04em;padding-top:2px}

/* Botão de GPS sobe para não colidir com a pílula flutuante. */
.acoes{bottom:calc(76px + env(safe-area-inset-bottom));background:none}

@media(min-width:1024px){
  #t-documentos,#t-protocolos{max-width:900px;margin:0 auto;padding:18px 20px 40px}
  .acoes{max-width:none}
}

/* ── AJUSTES DE TELA ESTREITA ──
   No celular o cabeçalho do cartão não cabe em uma linha: título e badges
   disputavam a mesma faixa e a data acabava cortada ("11/") com o tipo
   quebrando letra a letra. Aqui os badges descem para a própria linha. */
@media(max-width:560px){
  .mc-top{flex-direction:column;align-items:flex-start;gap:6px}
  .mc-top > :first-child{flex:1 1 auto;width:100%}
  .notif-card-rot{min-width:64px}
  /* Dois campos por linha em 375px só cabem com mínimos menores. */
  .linha-filtro input{min-width:0;flex:1 1 55%}
  .linha-filtro select{min-width:0;flex:1 1 40%}
  .ficha-rot{width:84px}
}

/* Com quatro abas o rótulo não cabe inteiro em telas de 360px. Reduzir a
   fonte e o ícone é preferível a cortar o texto: "Protocolos" e "Documentos"
   só se distinguem pelas letras, não pelos ícones. */
@media(max-width:400px){
  .aba{font-size:9px;padding:8px 1px}
  .aba svg{width:18px;height:18px}
}

/* ══════════════════════════════════════════════════════════════
   SISTEMA TIPOGRÁFICO — por último, de propósito.
   Peso de fonte é definido em dezenas de componentes no app.css; se estas
   regras viessem antes, cada componente sobrescreveria o peso e o sistema
   não valeria nada. Vindo depois, vence por ordem de cascata.
   ══════════════════════════════════════════════════════════════ */
body{font-family:'Inter',-apple-system,'Segoe UI',system-ui,sans-serif;font-weight:400}

/* Display — Manrope 800 */
.topo h1,.mc .n{font-family:'Manrope',sans-serif;font-weight:800;letter-spacing:-.025em}

/* Títulos — Manrope 700 (seções em 600) */
h1,h2,h3,h4,.modal h3,.notif-card-tipo,.item .t,.field .valor,.hist-data,
.login-logo h1{font-family:'Manrope',sans-serif;font-weight:700;letter-spacing:-.012em}
.sec-title,.sec-simples{font-family:'Manrope',sans-serif;font-weight:600}

/* Números e KPIs — Manrope, dígitos tabulares para alinhar coluna */
.sec-simples .cont,.mc .n{font-family:'Manrope',sans-serif;font-variant-numeric:tabular-nums;font-weight:700}

/* Corpo — Inter 400/500 */
.item .s,.hist-irr,.hist-obs,.modal .sub,.tl-x{font-family:'Inter',sans-serif;font-weight:400}

/* Rótulos — Inter 500 */
.field label,.notif-card-rot,.notif-card-data,.hist-meta,.chk-item .cod,
.aba{font-family:'Inter',sans-serif;font-weight:500}
/* Aba ativa em 600: o peso reforça o realce sem depender só da cor. */
.aba.at{font-weight:600}

/* Botões — Inter 600.
   `.sub-abas button` saiu daqui: por marcação é um <button>, mas por função é
   uma ABA, e o peso das abas vem do bloco de abas (700, como as de documento).
   Esta regra é posterior na folha e, com a mesma especificidade, vencia — as
   abas da ficha ficavam um grau mais leves que as do documento. */
.btn,.linha-filtro select,.linha-filtro input,.modal-x,
.badge{font-family:'Inter',sans-serif;font-weight:600}

/* Dado técnico — JetBrains Mono 500: número de documento, coordenada, chave.
   Monoespaçado alinha dígito com dígito, o que importa ao comparar dois
   protocolos na vertical. */
.proto-badge,.mono,#fi-chave,#fi-coord{font-family:'JetBrains Mono','Courier New',monospace;
  font-weight:500;letter-spacing:0}

/* ══════════════════════════════════════════════════════════════
   TELA DE LOGIN no tema F
   O gradiente e o cartão já vêm do app.css lendo os tokens, que esta folha
   redefiniu — então o verde virou âmbar sozinho. O que sobra aqui é o que o
   app.css fixou em verde por nome, mais o ajuste do selo para o ícone.
   ══════════════════════════════════════════════════════════════ */
body.login-bg{
  background:var(--grad-fundo);
}
.login-card{border-radius:22px;padding:36px 30px}
.login-seal{width:auto;height:auto;margin:0 auto 18px}
.login-logo h1{font-family:'Manrope',sans-serif;font-weight:700;color:var(--gd);
  font-size:18px;letter-spacing:-.02em}
.login-logo p{font-family:'Inter',sans-serif;font-weight:500;color:var(--tx3)}

/* Campos e botão do login também saem do laranja: formulário é cinza. */
.login-card .field{border-color:var(--f-bord)}
.login-card .field:focus-within{border-color:var(--f-bord-foco);box-shadow:0 0 0 3px var(--f-anel)}
.lembrar{font-family:'Inter',sans-serif;font-weight:500;color:var(--tx2)}
.lembrar input{accent-color:var(--f-bord-foco)}
.pass-olho{color:var(--tx3)}
.pass-olho:hover{color:var(--f-bord-foco)}
.login-rodape{font-family:'Inter',sans-serif;font-weight:400;color:var(--tx3)}
.alerta-erro{font-family:'Inter',sans-serif;font-weight:500}

/* ══════════════════════════════════════════════════════════════
   PAINEL, SINO E RÓTULOS DO MAPA
   ══════════════════════════════════════════════════════════════ */

/* O corpo do app rola só dentro da aba ativa; o mapa é a exceção (tela cheia) */
/* top:68px = altura do cabeçalho (56) + 12 de respiro. Estava em 96, que
   vinha de quando o cabeçalho ainda carregava a fileira de abas; sem elas,
   sobrava uma faixa vazia grande antes do primeiro filtro.
   Listas param acima da barra flutuante; o mapa corre por baixo dela, que é
   o ganho da pílula destacada — mais mapa visível na tela do celular. */
#t-painel, #t-documentos, #t-protocolos{position:fixed;top:68px;left:0;right:0;
  bottom:calc(80px + env(safe-area-inset-bottom));overflow-y:auto;padding:14px}
#t-mapa{position:fixed;top:68px;left:0;right:0;bottom:0}
#t-mapa #map{position:absolute;inset:0}

.painel-grid{display:flex;flex-direction:column;gap:14px}
.col{display:flex;flex-direction:column;gap:14px;min-width:0}
.bloco{background:var(--sur);border:1.5px solid var(--bord);border-radius:var(--rl);
  padding:14px;box-shadow:var(--sh)}

/* KPI: número e rótulo na mesma linha. `align-items:stretch` + altura mínima
   deixam todos os cards do mesmo tamanho, com ou sem linha de detalhe. */
.metricas{display:grid;grid-template-columns:1fr 1fr;gap:10px;align-items:stretch}
.mc{background:var(--sur);border:1.5px solid var(--bord);border-radius:var(--rl);
  padding:12px 14px;box-shadow:var(--sh);position:relative;overflow:hidden;
  min-height:70px;display:flex;align-items:center;gap:11px}
.mc::after{content:'';position:absolute;top:0;right:0;width:46px;height:46px;
  border-radius:0 0 0 46px;background:var(--g);opacity:.1}
.mc .n{font-size:26px;line-height:1;flex-shrink:0}
.mc .tx{min-width:0}
.mc .l{font-size:10px;text-transform:uppercase;letter-spacing:.06em;
  line-height:1.3;color:var(--tx3)}
.mc .dt{font-size:11px;color:var(--tx2);margin-top:3px}

/* Item acionável de "precisa de atenção".
   Sem borda e sem sombra próprias: agora vivem DENTRO de um .bloco, e card
   dentro de card criava duas molduras concêntricas fora do padrão do resto
   do painel. A afordância de clique fica no ícone e no fundo do hover. */
.item{border-radius:var(--r);padding:10px 8px;cursor:pointer;
  display:flex;gap:11px;align-items:flex-start;
  border-bottom:1px solid var(--blt);transition:background .13s}
.item:last-child{border-bottom:none}
.item:hover{background:var(--blt)}
.item .ic{width:34px;height:34px;border-radius:10px;flex-shrink:0;display:flex;
  align-items:center;justify-content:center;background:var(--gl)}
.item .ic svg{width:17px;height:17px;color:var(--g)}
.item .tx{flex:1;min-width:0}
.item .t{font-size:14px;line-height:1.35}
.item .s{font-size:12.5px;color:var(--tx2);margin-top:1px}
.item .m{font-size:11px;color:var(--tx3);margin-top:6px;display:flex;gap:9px;flex-wrap:wrap}

/* Feed de alterações (auditoria).
   Avatar · título · frase · data: a mesma anatomia de um registro de
   histórico de processo, que é o que esta lista é. */
.feed .fd{display:flex;gap:11px;padding:11px 0;border-bottom:1px solid var(--blt);
  align-items:flex-start}
.feed .fd:last-child{border-bottom:none;padding-bottom:0}
.feed .fd:first-child{padding-top:0}
.fd .av{width:34px;height:34px;border-radius:50%;flex-shrink:0;
  display:flex;align-items:center;justify-content:center;
  font-family:'Inter',sans-serif;font-size:11px;font-weight:700;letter-spacing:.02em;
  background:var(--blt);color:var(--tx2);border:1px solid var(--bord)}
/* O próprio usuário sai em destaque: é dele a maior parte das linhas. */
.fd .av.eu{background:var(--gl);color:var(--gd);border-color:var(--gm)}
.fd .c{flex:1;min-width:0}
.fd .a{font-size:13px;line-height:1.35;color:var(--chumbo);font-weight:700}
.fd .b{font-size:12px;line-height:1.4;color:var(--tx2);margin-top:2px}
.fd .b b{color:var(--chumbo)}
.fd .h{font-size:11px;color:var(--tx3);white-space:nowrap;margin-top:2px}

/* ── BOTÃO DE PERFIL (avatar + identificação) ──
   Um alvo só: avatar e nome levam ao mesmo lugar, e dois botões colados
   fazendo a mesma coisa só criam dúvida sobre qual clicar. */
.perfil-btn{display:flex;align-items:center;gap:9px;cursor:pointer;
  background:rgba(255,255,255,.12);border:1.5px solid rgba(255,255,255,.28);
  border-radius:999px;padding:3px 12px 3px 3px;color:#fff;font-family:inherit;
  transition:background .13s;max-width:230px;min-width:0}
.perfil-btn:hover{background:rgba(255,255,255,.26)}
.perfil-btn .ident{display:flex;flex-direction:column;min-width:0;text-align:right}
.perfil-btn .nome,.perfil-btn .cargo{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* Os três botões da direita com a MESMA caixa: estavam em 36, 32 e 29 px de
   altura, o que desalinhava a fileira. O avatar manda no tamanho porque é
   redondo — quadrado desigual em círculo aparece na hora. */
.avatar,.sino,.btn-sair{width:36px;height:36px;border-radius:50%;flex-shrink:0;
  display:flex;align-items:center;justify-content:center;padding:0}
.avatar{font-family:'Inter',sans-serif;font-size:12px;font-weight:700;letter-spacing:.02em;
  background:rgba(255,255,255,.24);border:1.5px solid rgba(255,255,255,.4);color:#fff}
.btn-sair svg{width:16px;height:16px}

/* As media queries do cabeçalho ficam no FIM desta folha: `.sino` é
   redefinido mais abaixo e, com a mesma especificidade, venceria a regra
   responsiva por vir depois na cascata. */
/* Mesmo âmbar do avatar da lista de usuários: é a mesma identidade vista de
   dois lugares, e trocar de cor no caminho faz parecer outra pessoa. */
.avatar.grande{width:52px;height:52px;font-size:17px;cursor:default;
  background:var(--gold-lt);border-color:var(--gold);color:var(--gold-dk)}
.perfil-cabeca{display:flex;align-items:center;gap:13px;margin-bottom:6px}

/* ── ASSINATURA EM CANVAS ── */
.assina-caixa{position:relative;border:1.5px dashed var(--f-bord);border-radius:var(--rl);
  background:#fff;padding:1px;overflow:hidden}
#pf-canvas{display:block;touch-action:none;cursor:crosshair}
/* Linha e dica ficam ATRÁS do traço: são guia de onde assinar, e sumiriam
   sob a tinta se fossem desenhadas no próprio canvas. */
.assina-linha{position:absolute;left:22px;right:22px;bottom:38px;height:1px;
  background:var(--bord);pointer-events:none}
.assina-dica{position:absolute;left:0;right:0;bottom:16px;text-align:center;
  font-size:10.5px;color:var(--tx3);pointer-events:none;letter-spacing:.02em}
.assina-salva{border:1.5px solid var(--bord);border-radius:var(--rl);padding:10px 12px;
  margin-bottom:10px;background:var(--sur)}
.assina-salva .rot{display:block;font-size:10px;text-transform:uppercase;
  letter-spacing:.05em;color:var(--tx3);margin-bottom:6px}
.assina-salva img{max-height:70px;max-width:100%;display:block}

/* Barras proporcionais */
.barra{margin-bottom:9px}
.barra:last-child{margin-bottom:0}
.barra .lin{display:flex;justify-content:space-between;font-size:12px;margin-bottom:4px;gap:10px}
.barra .lin span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.barra .tr{height:6px;background:var(--blt);border-radius:999px;overflow:hidden}
.barra .pr{height:100%;background:linear-gradient(90deg,var(--g),var(--gd));border-radius:999px}

/* Sino de avisos */
.sino{position:relative;background:rgba(255,255,255,.16);border:none;width:36px;height:36px;
  border-radius:11px;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.sino svg{width:18px;height:18px;color:#fff}
.sino .n{position:absolute;top:-4px;right:-4px;background:#fff;color:var(--gd);font-size:10px;
  font-weight:700;min-width:18px;height:18px;border-radius:999px;display:flex;align-items:center;
  justify-content:center;padding:0 5px;box-shadow:0 2px 6px rgba(90,40,10,.3)}
.notif{display:flex;gap:11px;padding:12px 4px;border-bottom:1px solid var(--blt);cursor:pointer}
.notif:last-child{border-bottom:none}
.notif .ic{width:34px;height:34px;border-radius:10px;background:var(--gl);flex-shrink:0;
  display:flex;align-items:center;justify-content:center}
.notif .ic svg{width:17px;height:17px;color:var(--g)}
.notif .c{flex:1;min-width:0}
.notif .t{font-size:13.5px;line-height:1.35}
.notif .b{font-size:12px;color:var(--tx2);margin-top:2px}
.notif .h{font-size:10.5px;color:var(--tx3);margin-top:4px}

/* Controle de cores: ícone recolhido, empilhado pelo próprio Leaflet no
   canto superior direito (ver ancorarControleCores). Sem position own: quem
   posiciona é o container de controles. */
.ctrl-mapa{display:flex;flex-direction:column;align-items:flex-end;gap:6px;
  clear:both}
.ctrl-btn{width:34px;height:34px;border-radius:var(--r);cursor:pointer;flex-shrink:0;
  background:#fff;border:2px solid rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.4);
  display:flex;align-items:center;justify-content:center;padding:0}
.ctrl-btn svg{width:19px;height:19px;color:var(--chumbo)}
.ctrl-btn:hover{background:var(--blt)}
.ctrl-btn.aberto{background:var(--gl);border-color:var(--gm)}
.ctrl-btn.aberto svg{color:var(--gd)}
.ctrl-corpo{background:rgba(255,255,255,.96);border:1.5px solid var(--bord);
  border-radius:var(--r);padding:9px 11px;box-shadow:var(--sh);max-width:220px}
.ctrl-corpo[hidden]{display:none}
.ctrl-corpo b{display:block;font-size:9.5px;text-transform:uppercase;letter-spacing:.08em;
  margin-bottom:6px;color:var(--chumbo)}
.ctrl-corpo .seg{display:flex;gap:4px;margin-bottom:8px}
.ctrl-corpo .seg button{flex:1;border:1.5px solid var(--f-bord);background:#fff;border-radius:999px;
  font-family:'Inter',sans-serif;font-size:11px;font-weight:600;color:var(--tx2);
  padding:4px 8px;cursor:pointer}
.ctrl-corpo .seg button.at{background:var(--gl);border-color:var(--gm);color:var(--gd)}
.ctrl-corpo .leg{font-size:10.5px;color:var(--tx2);line-height:1.5}
.ctrl-corpo .cor{display:flex;align-items:center;gap:6px;margin-top:4px;font-size:10.5px}
.ctrl-corpo .cor i{width:12px;height:12px;border-radius:3px;display:block;flex-shrink:0}

/* Rótulos do mapa, por faixa de zoom */
.leaflet-tooltip.rot{background:none;border:none;box-shadow:none;padding:0;
  font-family:'JetBrains Mono','Courier New',monospace;font-weight:500;white-space:nowrap}
.leaflet-tooltip.rot::before{display:none}
.leaflet-tooltip.rot.rot-lote{font-size:10.5px;color:var(--chumbo);display:none;
  text-shadow:0 0 3px #fff,0 0 3px #fff,0 0 3px #fff}
/* Repetir `.leaflet-tooltip.rot` é necessário: sozinha, a classe do rótulo
   perde para a regra de reset acima e a pastilha sai sem fundo. */
.leaflet-tooltip.rot.rot-quadra{font-size:11.5px;color:var(--chumbo);display:none;
  background:rgba(255,255,255,.92);border:1.5px solid var(--bord);padding:1px 8px;
  border-radius:999px;box-shadow:0 1px 4px rgba(60,40,25,.14)}
.leaflet-tooltip.rot.rot-bairro{font-family:'Manrope',sans-serif;font-weight:700;font-size:12.5px;
  color:var(--chumbo);text-transform:uppercase;letter-spacing:.08em;display:none;
  text-shadow:0 0 4px #fff,0 0 4px #fff,0 0 4px #fff,0 0 8px #fff}
body.z-lote .leaflet-tooltip.rot.rot-lote{display:block}
body.z-quadra .leaflet-tooltip.rot.rot-quadra{display:block}
body.z-bairro .leaflet-tooltip.rot.rot-bairro{display:block}

@media(min-width:1024px){
  /* A pílula continua no rodapé também aqui, então as listas seguem parando
     antes dela; só o mapa passa por baixo. */
  #t-mapa{bottom:0}
  #t-painel{padding:16px 20px}
  /* Três colunas: o painel cabe inteiro numa tela grande. A densidade
     compacta só no desktop é o que faz caber — sem dedo mirando, o alvo de
     44 px deixa de ser requisito e o espaço vertical vale mais. */
  .painel-grid{display:grid;grid-template-columns:minmax(280px,1fr) minmax(320px,1.15fr) minmax(300px,1fr);
    gap:16px;align-items:start}
  .item{padding:8px 11px;margin-bottom:6px}
  .item .ic{width:30px;height:30px}
  .item .t{font-size:13.5px}
  .mc{padding:11px 13px}
  .mc .n{font-size:23px}
  .bloco{padding:12px 13px}
  .feed .fd{padding:8px 0}
}

/* ══════════════════════════════════════════════════════════════
   CABEÇALHO EM TELA ESTREITA — por último, depois de .sino e .avatar
   ══════════════════════════════════════════════════════════════ */

/* O texto do usuário sai já em 820px, e não só no celular: entre 600 e 800
   ele cabia por 14 px de folga, e qualquer nome real de servidor ("Maria
   Aparecida dos Santos Oliveira") estourava a barra. Some o texto, fica o
   avatar — que continua identificando quem está logado e abrindo o perfil. */
@media(max-width:820px){
  .perfil-btn{padding:0;background:none;border:none;max-width:none}
  .perfil-btn .ident{display:none}
}

/* Abaixo disto sai também a contagem de lotes: já aparece no chip sobre o
   mapa, então aqui é repetição ocupando espaço que falta. */
@media(max-width:600px){
  .topo{gap:9px;padding:0 11px}
  .topo h1{font-size:14px}
  .topo .sub{display:none}
  .usuario-topo{gap:7px}
  .avatar,.sino,.btn-sair{width:33px;height:33px}
  .sino svg{width:17px;height:17px}
}

/* ══════════════════════════════════════════════════════════════
   BALÃO DO LOTE — resposta rápida no mapa, ficha completa a um toque
   ══════════════════════════════════════════════════════════════ */
.popup-lote .leaflet-popup-content-wrapper{border-radius:var(--rl);box-shadow:var(--shl);
  border:1.5px solid var(--bord);padding:0}
.popup-lote .leaflet-popup-content{margin:0;width:auto!important}
.popup-lote .leaflet-popup-tip{border:1.5px solid var(--bord);border-top:none;border-left:none}
.balao{padding:12px 14px;font-family:'Inter',sans-serif;min-width:170px}
.balao-tit{font-family:'Manrope',sans-serif;font-weight:700;font-size:14px;color:var(--chumbo);
  line-height:1.25}
.balao-sub{font-size:11.5px;color:var(--tx3);text-transform:uppercase;letter-spacing:.05em;
  margin-top:2px}
.balao-chip{display:inline-flex;align-items:center;font-family:'JetBrains Mono',monospace;
  font-size:11px;padding:3px 9px;border-radius:6px;background:var(--blt);color:var(--chumbo);
  border:1.5px solid var(--bord);margin-top:8px}
.balao-area{font-size:12px;color:var(--tx2);margin-top:6px}
.balao-btn{width:100%;margin-top:10px;justify-content:center}

/* ── IMAGEM AÉREA AMPLIADA ──
   Aplicado só quando o zoom passa do que o acervo tem (ver
   ajustarNitidezSatelite). Contraste e saturação leves devolvem definição
   de borda que a interpolação achata: telhado e muro ficam mais legíveis.
   Não cria detalhe — o pixel não fotografado não existe. */
/* O className do L.tileLayer vai no CONTAINER da camada, não em cada
   <img> do tile — daí o seletor mirar o container. */
#map.sat-ampliado .leaflet-layer.tile-satelite{
  filter:contrast(1.12) saturate(1.08) brightness(1.02);
  image-rendering:auto;
}

/* ══════════════════════════════════════════════════════════════
   FICHA DO IMÓVEL — abas, dados, mídias e linha do tempo
   ══════════════════════════════════════════════════════════════ */

/* Modal ~30% mais alto que o natural do conteúdo, crescendo para os dois
   lados (o `margin:auto` do .modal mantém a centralização vertical). A
   linha do tempo é o que pedia espaço: com a altura antiga, dois eventos
   já obrigavam a rolar. */
#m-ficha .modal{min-height:min(78vh, 820px);max-width:620px}
#m-ficha .sub-abas{margin:12px 0 10px}

.fi-painel{display:none}
.fi-painel.at{display:block}

.fi-bloco{margin-bottom:10px}
.fi-rot{font-size:10px;text-transform:uppercase;letter-spacing:.06em;
  color:var(--tx3);margin-bottom:3px}
.fi-val{font-size:13.5px;color:var(--chumbo);font-weight:600}
/* Endereço como texto, não como campo: aqui ninguém edita, só lê. */
.fi-endereco{font-size:14px;line-height:1.4;color:var(--chumbo)}

/* Data da última consulta ao cadastro, no cabeçalho.
   `margin-left:auto` a empurra para a direita do título; o `padding-right`
   do próprio h3 já reserva os 34px do botão de fechar, então ela para antes
   do X em vez de passar por baixo dele. */
.fi-integracao-topo{margin-left:auto;font-size:10.5px;font-weight:500;
  color:var(--tx3);text-transform:none;letter-spacing:0;white-space:nowrap}
.fi-integracao-topo b{color:var(--tx2);font-weight:700}

/* ── DADOS DO IMÓVEL EM FAIXAS ──
   Antes cada dado era um bloco de rótulo em cima e valor embaixo, com folga
   entre eles: quatro dados ocupavam a altura de meia tela e a leitura ficava
   picotada. Depois virou grade de duas colunas, e aí apareceu outro defeito.

   O TRAÇO É DA FAIXA, NÃO DO CAMPO — e é essa a diferença que importa. Na
   grade anterior o `border-bottom` ficava em cada célula: dois campos lado a
   lado desenhavam DOIS traços independentes, com uma falha de 14px no meio, e
   faixa com número ímpar de campos terminava com meia linha, um traço à
   esquerda e nada à direita. Com a faixa sendo o elemento, o traço atravessa a
   linha inteira, quantos campos ela tiver. */
.fi-linhas{margin-bottom:12px;border-top:1px solid var(--bord)}
.fi-linha{display:flex;flex-wrap:wrap;align-items:center;gap:6px 14px;
  padding:7px 0;border-bottom:1px solid var(--bord)}
.fi-linha:last-child{border-bottom:0}

/* O campo cede a largura pelo VALOR, nunca pelo rótulo: o rótulo é a etiqueta
   e, partido em duas, dobra a altura da faixa inteira. */
/* `flex:0 1 auto` — o campo NÃO cresce. Crescer distribuiria a sobra entre
   os três e nenhum ficaria alinhado com nada; encolher ele pode, e é o valor
   que cede (o rótulo tem `white-space:nowrap`). */
.fi-campo{display:flex;align-items:center;gap:7px;min-width:0;flex:0 1 auto}
.fi-campo .fi-rot{margin-bottom:0;flex:0 0 auto;white-space:nowrap;
  font-size:9.5px;letter-spacing:.04em}
.fi-campo .fi-val{min-width:0;overflow-wrap:anywhere}
/* Meio ponto a menos no monoespaçado da faixa, e só nele: com 13.5px a
   inscrição e a coordenada juntas mediam 589px numa faixa de 578, e a
   Situação caía sozinha para a linha de baixo. Medido no modal de 620px. */
.fi-linha .fi-val.mono{font-size:12.5px}

/* Campo que ocupa a faixa sozinho — para o dado largo que não deve dividir
   espaço com ninguém. */
.fi-linha .fi-largo{flex:1 1 100%}

/* Fachada e croqui lado a lado: as duas imagens que respondem "como é o
   imóvel" antes de o fiscal sair para a rua. */
.fi-midias{display:grid;grid-template-columns:1fr 1fr;gap:10px}
@media(max-width:520px){ .fi-midias{grid-template-columns:1fr} }
.fi-midia{margin:0;border:1.5px solid var(--bord);border-radius:var(--rl);
  overflow:hidden;background:var(--sur)}
.fi-midia figcaption{font-size:10px;text-transform:uppercase;letter-spacing:.06em;
  color:var(--tx3);padding:8px 10px 6px}
.fi-midia img{display:block;width:100%;height:150px;object-fit:cover}
.fi-vazio{height:150px;display:flex;align-items:center;justify-content:center;
  text-align:center;padding:10px;font-size:11.5px;color:var(--tx3);background:var(--blt)}

/* ── LINHA DO TEMPO ──
   O traço vertical ligando os marcos é o que transforma uma lista em
   sequência — e é a sequência que conta a história do processo. */
.linha-tempo{position:relative;padding-left:6px}
.lt-item{position:relative;display:flex;gap:12px;padding:0 0 16px 0}
.lt-item::before{content:'';position:absolute;left:15px;top:30px;bottom:0;
  width:2px;background:var(--blt)}
.lt-item:last-child::before{display:none}
.lt-marca{width:32px;height:32px;border-radius:50%;flex-shrink:0;z-index:1;
  display:flex;align-items:center;justify-content:center;
  background:var(--sur);border:2px solid var(--bord)}
.lt-marca svg{width:16px;height:16px}
.lt-vistoria .lt-marca{border-color:var(--gm);background:var(--gl)}
.lt-vistoria .lt-marca svg{color:var(--gd)}
.lt-documento .lt-marca{border-color:#C7D2E4;background:#EEF3FA}
.lt-documento .lt-marca svg{color:#1D4ED8}
.lt-protocolo .lt-marca{border-color:#F2DE9C;background:#FFF6DD}
.lt-protocolo .lt-marca svg{color:#B8860B}
.lt-corpo{flex:1;min-width:0;padding-top:2px}
.lt-topo{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:2px}
.lt-data{font-size:11px;color:var(--tx3)}
.lt-tit{font-family:'Manrope',sans-serif;font-weight:700;font-size:13.5px;
  color:var(--chumbo);line-height:1.3}
.lt-det{font-size:12px;color:var(--tx2);margin-top:2px}
.lt-itens{font-size:12px;color:var(--tx2);margin-top:5px;line-height:1.5}
.lt-obs{font-size:12px;color:var(--tx2);margin-top:5px;font-style:italic}

/* ══════════════════════════════════════════════
   FICHA DO DOCUMENTO E MENU DE OPÇÕES
   Só classes novas (.df-*) — não redefine nada acima, por isso pode ficar
   depois das media queries do cabeçalho sem entrar em disputa de cascata.
   ══════════════════════════════════════════════ */

/* Modal em coluna: cabeçalho e rodapé fixos, miolo rolante. Sem isso o botão
   Opções do rodapé rolava junto com o conteúdo e sumia da tela. */
.df-modal{display:flex;flex-direction:column;max-height:88vh}

/* padding-right reserva o espaço do × (posicionado no canto): sem ele a
   última tag fica por baixo do botão de fechar. */
.df-cab{display:flex;align-items:flex-start;gap:12px;padding-right:34px;
  margin-bottom:10px;flex-shrink:0}
.df-ident{flex:1;min-width:0}
.df-ident h3{margin:0}

/* Tags na mesma linha do número, empurradas para a direita. */
.df-tags{display:flex;flex-wrap:wrap;gap:6px;justify-content:flex-end;
  align-items:center;flex-shrink:0;max-width:52%}

.df-rolagem{flex:1;min-height:0;overflow-y:auto;padding-right:2px}

.df-rodape{display:flex;align-items:center;justify-content:space-between;gap:10px;
  border-top:1px solid var(--bord);padding-top:12px;margin-top:12px;flex-shrink:0}

/* ── MENU DE OPÇÕES ──
   Visibilidade por classe, NUNCA pelo atributo `hidden`: o menu é um flex
   container, e `display:flex` numa classe vence o `display:none` que o
   `hidden` traz do navegador — foi assim que ele nasceu aberto. */
.df-opcoes{position:relative;flex-shrink:0}
#df-btn-opcoes{display:inline-flex;align-items:center;gap:6px}

.df-menu{display:none;position:absolute;right:0;top:calc(100% + 6px);z-index:30;
  min-width:206px;background:var(--sur);border:1px solid var(--bord);
  border-radius:var(--r);box-shadow:0 8px 26px rgba(74,66,60,.16);
  padding:5px;flex-direction:column}
.df-menu.open{display:flex}
/* No rodapé o menu abre para CIMA — para baixo não há tela, é o fim do modal. */
.df-menu-cima{top:auto;bottom:calc(100% + 6px);left:0;right:auto}

.df-item{border:0;background:none;text-align:left;padding:9px 11px;
  border-radius:6px;font:inherit;font-size:13.5px;color:var(--tx);cursor:pointer}
.df-item:hover{background:var(--blt)}
.df-item.perigo{color:var(--red)}
.df-item.perigo:hover{background:var(--rlt)}

/* ── MENU DE OPÇÕES NO CARTÃO DA LISTA ── */
.card-opcoes-btn{width:28px;height:28px;display:inline-flex;align-items:center;
  justify-content:center;border:1px solid var(--bord);border-radius:var(--r);
  background:var(--sur);color:var(--tx2);cursor:pointer;padding:0}
.card-opcoes-btn:hover{border-color:var(--gm);color:var(--gd);background:var(--blt)}
/* O cartão inteiro é clicável (abre a ficha); o menu não pode herdar isso,
   senão escolher "Anular" também abriria a ficha por baixo. O
   stopPropagation está no JavaScript; aqui fica só o empilhamento. */
.card-opcoes .df-menu{z-index:40}

.df-anulado{background:var(--rlt);border:1px solid var(--red);
  border-radius:var(--r);padding:10px 12px;margin-bottom:12px;
  font-size:13px;color:var(--tx)}
.df-anulado div{margin-top:4px;color:var(--tx2)}

.df-grade{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));
  gap:8px 18px;margin-bottom:4px}
.df-rot{display:block;font-size:10px;text-transform:uppercase;letter-spacing:.05em;
  color:var(--tx3)}
.df-val{font-size:13.5px;color:var(--tx)}

.df-texto{font-size:13.5px;color:var(--tx2);line-height:1.55;margin:0 0 6px;
  text-align:justify}

.df-artigos{width:100%;border-collapse:collapse;font-size:12.5px;margin-bottom:6px}
.df-artigos th{background:var(--blt);color:var(--tx3);font-size:9.5px;
  text-transform:uppercase;letter-spacing:.05em;text-align:left;
  padding:5px 7px;border:1px solid var(--bord)}
.df-artigos td{padding:5px 7px;border:1px solid var(--bord);vertical-align:top;
  color:var(--tx2)}
.df-artigos .df-dir{text-align:right;white-space:nowrap}
.df-artigos tr.df-total td{background:var(--blt);font-weight:700;color:var(--tx)}
.df-reais{font-weight:400;font-size:11px;color:var(--tx3)}

/* ══════════════════════════════════════════════
   CONTROLES DO MAPA E TELA DE BUSCA
   ══════════════════════════════════════════════ */

/* ── BOTÕES DA COLUNA DE CONTROLES ──
   Mesmas medidas e mesmo acabamento do seletor de camadas do Leaflet, logo
   acima. Os valores saem do próprio leaflet.css: 36x36, raio 5px, borda 2px
   rgba(0,0,0,.2) e sombra 0 1px 5px rgba(0,0,0,.4) — que o .leaflet-touch
   troca por só a borda, para não somar sombra sobre sombra no toque. */
.ctrl-btn{width:36px;height:36px;border-radius:5px;cursor:pointer;flex-shrink:0;
  background:#fff;border:2px solid rgba(0,0,0,.2);background-clip:padding-box;
  box-shadow:0 1px 5px rgba(0,0,0,.4);
  display:flex;align-items:center;justify-content:center;padding:0}
.leaflet-touch .ctrl-btn{width:44px;height:44px;box-shadow:none}
.ctrl-btn svg{width:19px;height:19px;color:var(--chumbo)}

.ctrl-input{width:100%;border:1.5px solid var(--f-bord);border-radius:var(--r);
  padding:7px 9px;font-size:13px;font-family:inherit;background:var(--f-fundo);
  color:var(--tx);box-sizing:border-box}
.ctrl-input:focus{outline:none;border-color:var(--f-bord-foco);
  box-shadow:0 0 0 3px var(--f-anel)}

/* ── AÇÕES SOBRE O MAPA ──
   Mesma largura e mesmo centro da barra de abas: soltos de ponta a ponta,
   os botões passavam das extremidades da pílula do rodapé e a composição
   ficava desalinhada. O valor acompanha o .abas. */
.acoes{left:50%;right:auto;transform:translateX(-50%);
  width:min(560px, calc(100% - 24px));padding-left:0;padding-right:0}

/* No tema institucional em desktop o rodapé é barra cheia (ver
   tema-institucional.css), então as ações voltam a acompanhar a largura
   toda — continuam alinhadas ao rodapé, que é o que se pediu. */
@media (min-width: 900px){
  html[data-tema="institucional"] .acoes{
    left:0;right:0;transform:none;width:100%;padding-left:12px;padding-right:12px;
  }
}

/* ── TELA DE BUSCA ── */
#t-busca{padding:14px;padding-bottom:80px}
.busca-form{background:var(--sur);border:1.5px solid var(--bord);
  border-radius:var(--rl);padding:14px 16px;margin-bottom:12px;box-shadow:var(--sh)}
.busca-campos{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));
  gap:0 12px}

.bs-cabecalho{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
  margin-bottom:8px;font-size:12.5px;color:var(--tx2)}
.bs-aviso{color:var(--warn)}

/* A tabela rola dentro do próprio container: a página nunca rola de lado. */
.bs-tabela-rolagem{overflow-x:auto;background:var(--sur);
  border:1.5px solid var(--bord);border-radius:var(--rl);box-shadow:var(--sh)}
.bs-tabela{width:100%;border-collapse:collapse;font-size:13px;min-width:560px}
.bs-tabela th{background:var(--blt);color:var(--tx3);font-size:9.5px;
  text-transform:uppercase;letter-spacing:.05em;text-align:left;
  padding:8px 10px;border-bottom:1px solid var(--bord);white-space:nowrap}
.bs-tabela td{padding:9px 10px;border-bottom:1px solid var(--bord);color:var(--tx2)}
.bs-tabela tbody tr{cursor:pointer}
.bs-tabela tbody tr:hover{background:var(--blt)}
.bs-tabela tbody tr:last-child td{border-bottom:none}
.bs-tabela .bs-c{text-align:center}
.bs-tabela .bs-d{text-align:right;white-space:nowrap}

.bs-ficha{background:var(--sur);border:1.5px solid var(--bord);
  border-radius:var(--rl);padding:16px 18px;box-shadow:var(--sh)}
.bs-ficha-topo{display:flex;align-items:flex-start;justify-content:space-between;
  gap:12px;flex-wrap:wrap;margin-bottom:4px}
.bs-ficha-topo h3{margin:0;font-size:16px}

/* ── Pendência de identificação (quadra em branco) ──
   Tom de AVISO, não de erro: o dado não está errado, está incompleto — e a
   própria caixa traz a correção. Vermelho aqui acusaria o usuário de algo que
   veio do desenho do loteamento. */
.qp-caixa{margin-top:14px;padding:12px 14px;border-radius:var(--rl);
  background:var(--wlt);border:1.5px solid var(--warn);border-left-width:4px}
.qp-tit{font-weight:700;font-size:13px;color:var(--warn);margin-bottom:4px}
.qp-txt{margin:0 0 8px;font-size:13px;line-height:1.5;color:var(--tx)}
.qp-txt:last-child{margin-bottom:0}
.qp-linha{display:flex;align-items:center;gap:10px;flex-wrap:wrap}

.bs-linha{display:flex;align-items:center;gap:9px;flex-wrap:wrap;
  padding:9px 0;border-bottom:1px solid var(--bord);font-size:13px}
.bs-linha:last-child{border-bottom:none}
.bs-linha[onclick]{cursor:pointer}
.bs-linha[onclick]:hover{background:var(--blt)}
.bs-linha-tit{font-weight:600;color:var(--tx)}
.bs-linha-sub{color:var(--tx2)}
.bs-linha-data{margin-left:auto;color:var(--tx3);font-size:12px}

/* ── AJUSTES DA TELA DE BUSCA E DOS CONTROLES DO MAPA ──
   Este bloco vem DEPOIS das regras acima de propósito: refina o que já foi
   definido (largura de campo, tamanho de botão) e precisa vencer na cascata. */

/* #t-busca faltava nesta lista — por isso a tela nascia por baixo do
   cabeçalho fixo e os campos apareciam cortados. */
#t-busca{position:fixed;top:68px;left:0;right:0;
  bottom:calc(80px + env(safe-area-inset-bottom));overflow-y:auto;padding:14px}
@media(min-width:1024px){
  #t-busca{max-width:1100px;margin:0 auto;padding:18px 20px 40px}
}

/* Uma linha só. As larguras são proporcionais ao conteúdo real: quadra e lote
   têm dois ou três dígitos, a inscrição tem formato fixo, e o que sobra vai
   para o bairro — o único campo com texto longo. */
.busca-campos{display:flex;flex-wrap:wrap;gap:0 10px;align-items:stretch}
.busca-campos .field{margin-bottom:9px}
.bc-bairro{flex:1 1 200px;min-width:0}
.bc-num{flex:0 0 64px}   /* 1/3 dos 190px originais — cabem 3 dígitos e o rótulo */
.bc-insc{flex:0 0 184px}   /* 10% sobre os 167px, que ainda apertavam a inscrição */

/* ── FILTRO: O RÓTULO FICA FORA DO CAMPO ──
   Só nos FILTROS do sistema, e só onde já existe rótulo. Nos formulários o
   rótulo continua dentro da moldura: lá o campo é preenchido uma vez e a
   moldura junta rótulo e valor num objeto só.

   No filtro o uso é outro — corre-se o olho pela linha inteira procurando
   onde digitar. Com o rótulo dentro, ele divide a moldura com o valor e os
   dois competem pelo mesmo espaço estreito: "INSCRIÇÃO IMOBILIÁRIA" e
   "01.000.024.0009.000" empilhados em 184px espremem os dois. Fora, o rótulo
   fica leve por cima, e a moldura passa a ser só a área de digitação — que é
   o que a pessoa está procurando. */
.busca-campos .field{background:none;border:none;padding:0;box-shadow:none;
  display:flex;flex-direction:column;gap:4px}
.busca-campos .field:focus-within{border-color:transparent;box-shadow:none}
.busca-campos .field label{overflow:hidden;text-overflow:ellipsis}
.busca-campos .field input,.busca-campos .field select{
  height:42px;padding:0 11px;border:1.5px solid var(--f-bord);border-radius:var(--r);
  background:var(--f-fundo);color:var(--tx)}
.busca-campos .field input:focus,.busca-campos .field select:focus{
  border-color:var(--f-bord-foco);box-shadow:0 0 0 3px var(--f-anel)}
/* A moldura sumiu do contêiner, então o estado de erro passa a viver no
   próprio campo — senão "campo obrigatório" deixaria de ter marca visível. */
.busca-campos .field:has(.campo-invalido){background:none}
.busca-campos .field input[readonly],.busca-campos .field select:disabled{
  background:var(--f-fundo-ro)}

/* Hamburger de mais filtros: mesma altura de um campo e alinhado pela BASE.
   Com o rótulo fora, o campo ficou mais alto que o botão; alinhar pelo topo
   deixaria o botão flutuando na altura dos rótulos. */
.bs-mais{flex:0 0 42px;height:42px;margin-bottom:9px;align-self:flex-end;border:1.5px solid var(--f-bord);
  border-radius:var(--r);background:var(--f-fundo);color:var(--tx2);cursor:pointer;
  display:flex;align-items:center;justify-content:center;padding:0}
.bs-mais:hover{border-color:var(--gm);color:var(--gd)}
.bs-mais.aberto{background:var(--gl);border-color:var(--gm);color:var(--gd)}

.busca-avancado{border-top:1px solid var(--bord);margin-top:2px;padding-top:12px}
.busca-avancado[hidden]{display:none}
.bs-chks{display:flex;flex-wrap:wrap;gap:8px}
.bs-chks .chk-item{flex:1 1 220px}

/* Filtro ignorado pela precedência: fica visível mas apagado — some por
   completo e o usuário não entende para onde foi o que digitou. */
.bs-ignorado{opacity:.42}
.bs-precedencia{background:var(--gl);border:1px solid var(--gm);border-radius:var(--r);
  padding:8px 11px;margin-bottom:10px;font-size:12px;color:var(--tx2);line-height:1.45}
.bs-precedencia[hidden]{display:none}
.bs-selo{font-size:11px;color:var(--tx3)}

/* ── COLUNA DE CONTROLES DO MAPA ──
   Fechado mostra o ícone; aberto, o ícone dá lugar ao painel — o mesmo
   comportamento do seletor de camadas do Leaflet logo acima (que aplica
   .leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}). */
.ctrl-grupo .ctrl-corpo{display:none}
.ctrl-grupo.aberto .ctrl-btn{display:none}
.ctrl-grupo.aberto .ctrl-corpo{display:block}

/* 40px, e não 36: o controle de camadas do Leaflet tem 36px de conteúdo MAIS
   2px de borda de cada lado, e a borda entra na conta porque o reset do app
   usa box-sizing:border-box. Com 36px totais os botões saíam ~10% menores que
   o de camadas — foi exatamente o que se via na tela. */
.ctrl-btn{width:40px;height:40px}
.leaflet-touch .ctrl-btn{width:48px;height:48px}

.ctrl-chk{display:flex;align-items:center;gap:7px;font-size:11px;color:var(--tx2);
  margin-bottom:5px;cursor:pointer}
.ctrl-chk input{accent-color:var(--gd);flex-shrink:0}

.pin-balao b{display:block;margin-bottom:2px}
.pin-balao button{margin-top:7px;border:1px solid var(--bord);border-radius:var(--r);
  background:var(--gl);color:var(--gd);font:inherit;font-size:12px;font-weight:600;
  padding:5px 10px;cursor:pointer}

/* As medidas vêm do próprio controle de camadas, copiadas em tempo de
   execução por igualarAoControleDeCamadas(). Os valores aqui são só o
   fallback para o instante antes de o mapa existir. */
.ctrl-btn{width:var(--ctrl-lado-l, 40px);height:var(--ctrl-lado-a, 36px)}
.leaflet-touch .ctrl-btn{width:var(--ctrl-lado-l, 48px);height:var(--ctrl-lado-a, 48px)}

/* Hamburger com a mesma altura da CAIXA DE DIGITAÇÃO vizinha, alinhado pela
   base. Antes ele esticava com `stretch` para acompanhar o campo inteiro — o
   que estava certo enquanto o rótulo morava dentro da moldura. Com o rótulo
   fora, esticar deixava o botão 19px mais alto que a caixa ao lado dele. */
.bs-mais{height:42px;align-self:flex-end}

/* ── PAINEL DE CORREÇÃO CADASTRAL ──
   Notas curtas empilhadas dentro do controle do mapa. Três pesos: neutra
   (o que vai acontecer), aviso (o que o sistema desconfia) e erro (o que ele
   recusa). A cor vem da barra lateral, não do fundo inteiro — mesmo desenho
   do toast, pela mesma razão: bloco colorido grita igual para "3 lotes mudam"
   e para "isto criaria identificação duplicada". */
.cad-nota{margin:6px 0;padding:6px 8px;border-left:3px solid var(--bord);
  background:var(--blt);border-radius:0 var(--r) var(--r) 0;font-size:11.5px;
  line-height:1.45;color:var(--tx)}
.cad-nota.cad-aviso{border-left-color:var(--warn);background:var(--wlt)}
.cad-nota.cad-erro{border-left-color:var(--red);background:var(--rlt);color:var(--red)}
/* Lista de "de → para": rolagem própria, senão uma correção de 300 lotes
   estica o controle para fora da tela. */
.cad-lista{display:flex;flex-direction:column;gap:2px;max-height:132px;overflow-y:auto;
  margin:6px 0;font-size:11px;color:var(--tx2)}
#cad-previa .btn{width:100%;margin-top:8px}
#grupo-cadastro .ctrl-corpo{max-width:262px}
#grupo-cadastro .field{margin-bottom:0}
#cad-modo.at{background:var(--gl);border-color:var(--gm);color:var(--gd)}
#des-iniciar.at{background:var(--gl);border-color:var(--gm);color:var(--gd)}
#des-previa .btn{width:100%;margin-top:8px}
/* Separa as duas ferramentas do painel: corrigir quadra e desenhar lote sao
   coisas diferentes e nao devem parecer passos de um mesmo formulario. */
.cad-risco{border:0;border-top:1px solid var(--bord);margin:12px 0 8px}

/* ── ATO CADASTRAL DENTRO DA LINHA DO TEMPO ──
   Aparece embaixo do evento de vistoria. Dois estados: liberado (o ato pode
   ser executado) e travado (existe o processo, mas falta alguma condicao — e
   o texto diz qual). Mostrar o motivo em vez de esconder o botao e o que
   evita o chamado "por que nao aparece a opcao de unificar?". */
.lt-ato{display:flex;align-items:center;justify-content:space-between;gap:10px;
  flex-wrap:wrap;margin-top:8px;padding:8px 10px;border-radius:var(--r);
  background:var(--gl);border:1.5px solid var(--gm);font-size:12px;color:var(--gxd)}
.lt-ato .btn{flex-shrink:0}
.lt-ato-travado{display:block;background:var(--blt);border-color:var(--bord);
  color:var(--tx2);line-height:1.45}

/* ── PARTES DO DESMEMBRAMENTO ──
   Uma linha por parte desenhada: numero de ordem, numero do lote, sufixo da
   inscricao e o botao de remover. A ultima aparece marcada como "resto"
   porque ela nao e desenhada — sai do que sobra do lote. */
.desm-parte{display:flex;align-items:center;gap:5px;margin:4px 0}
.desm-parte input{min-width:0;flex:1 1 auto;border:1.5px solid var(--f-bord);
  border-radius:var(--r);background:var(--f-fundo);padding:5px 7px;font-size:12px}
.desm-num{flex:0 0 18px;height:18px;border-radius:50%;background:var(--gd);color:#fff;
  font-size:10px;font-weight:700;display:flex;align-items:center;justify-content:center}
.desm-x{flex:0 0 auto;border:0;background:none;color:var(--tx3);cursor:pointer;font-size:12px;padding:2px 4px}
.desm-x:hover{color:var(--red)}
.desm-derivada{opacity:.9}
.desm-derivada .desm-num{background:var(--tx3)}
.desm-tag{flex:0 0 auto;font-size:9.5px;text-transform:uppercase;letter-spacing:.04em;
  color:var(--tx3);padding:0 3px}
#desm-previa .btn{width:100%;margin-top:8px}
/* Cursor de mira enquanto desenha: o mapa deixa de ser algo que se arrasta e
   passa a ser superficie de desenho, e o ponteiro tem de dizer isso. */
.desenhando .leaflet-container{cursor:crosshair}
.desenho-captura{cursor:crosshair}

/* ── SELO DE FILTRO ATIVO NOS CONTROLES DO MAPA ──
   Recolhido, o botão não diz o que está aplicado: um mapa com pinos filtrados
   ou pintado por quadra parece um mapa comum para quem chegou depois. */
.ctrl-btn{position:relative}
.ctrl-selo{position:absolute;top:-5px;right:-5px;min-width:16px;height:16px;
  padding:0 4px;border-radius:999px;background:var(--gd);color:#fff;
  font-size:9.5px;font-weight:700;line-height:16px;text-align:center;
  box-shadow:0 0 0 2px #fff;font-family:'Inter',sans-serif}
.ctrl-btn.com-filtro{border-color:var(--gd)}

/* ── MODAIS COM ABAS: TAMANHO ESTÁVEL ──
   Altura e largura não podem depender da aba escolhida. Sem isto o modal
   encolhe na aba curta e cresce na longa, e a caixa "pula" a cada troca — o
   usuário perde a referência de onde estavam os botões, que ficam no rodapé.

   A receita é a mesma dos três: coluna com cabeçalho e rodapé fixos, e o miolo
   como única área rolante. `min-height:0` no miolo é obrigatório — sem ele o
   item flex se recusa a encolher abaixo do próprio conteúdo e a rolagem
   simplesmente não acontece. */
#m-perfil .modal,
#m-ficha .modal{
  display:flex;flex-direction:column;
  height:min(86vh, 760px);
}
#m-perfil .sub-abas,
#m-ficha .sub-abas{flex-shrink:0}
#m-perfil .pf-painel.at,
#m-ficha .fi-painel.at{
  flex:1;min-height:0;overflow-y:auto;
}
/* A ficha do documento já nasce assim (.df-modal); aqui só fixa a altura para
   ela também não variar entre um documento curto e um com muitos artigos. */
.df-modal{height:min(86vh, 760px);max-height:none}

/* ══════════════════════════════════════════════
   FORMULÁRIO DE DOCUMENTO — padrão do AppPOSTURAS
   Cabeçalho e rodapé fixos, corpo rolável, ALTURA TRAVADA: a caixa não pode
   mudar de tamanho ao trocar de aba, ou o usuário perde a referência de onde
   estão os botões do rodapé.
   ══════════════════════════════════════════════ */

.modal.modal-flex{
  display:flex;flex-direction:column;
  height:min(90vh, 760px);max-height:calc(100vh - 28px);
  max-width:820px;padding:0;overflow:hidden;
}

/* padding-right maior reserva o espaço do × (position:absolute), para ele não
   cair em cima do selo de status. */
.doc-head{flex-shrink:0;padding:16px 52px 0 18px;border-bottom:1.5px solid var(--bord)}
.doc-head-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.doc-head-doc{font-family:'Manrope',sans-serif;font-weight:800;font-size:16px;color:var(--gd)}
.doc-head-num-wrap{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.doc-head-num{height:30px;box-sizing:border-box;display:inline-flex;align-items:center;
  font-size:13px;padding:0 12px}
.doc-head-top .badge{height:30px;box-sizing:border-box;display:inline-flex;align-items:center;
  font-size:12px;padding:0 12px 0 9px}
#m-doc .modal-x{top:18px;right:16px;height:30px;box-sizing:border-box;
  display:flex;align-items:center;justify-content:center;padding:0 11px;font-size:15px}
.doc-head-meta{display:flex;flex-wrap:wrap;gap:4px 16px;font-size:12px;color:var(--tx);
  margin:10px 0 12px}
.doc-head-lbl{color:var(--tx3);font-weight:700;text-transform:uppercase;font-size:10px;
  letter-spacing:.04em;margin-right:3px}

.doc-tabs{display:flex;gap:2px;background:var(--bg);border-radius:var(--r) var(--r) 0 0;
  padding:3px;overflow-x:auto}
.doc-tab{flex:1;min-width:84px;padding:8px 6px;border:none;border-radius:6px;
  background:transparent;cursor:pointer;font-family:'Inter',sans-serif;font-size:12px;
  font-weight:700;color:var(--tx3);white-space:nowrap;transition:background .15s,color .15s}
.doc-tab.ativa{background:var(--sur);color:var(--gd);box-shadow:var(--sh)}

.doc-body{flex:1;min-height:0;overflow-y:auto;padding:16px 18px}
.doc-painel{display:none}
.doc-painel.ativa{display:block}

.doc-foot{flex-shrink:0;display:flex;align-items:center;gap:8px;padding:12px 18px;
  border-top:1.5px solid var(--bord);background:var(--sur)}
.doc-foot .btn.sm{padding:7px 10px;font-size:13px}
.doc-foot .btn:disabled{opacity:.4;cursor:default}
.doc-foot [hidden]{display:none !important}

/* Editar em verde de contorno e Lavrar em âmbar: são atos de peso diferente e
   a cor separa os dois à distância, como no AppPOSTURAS. */
.btn.edit-verde{background:var(--gl);border-color:var(--gm);color:var(--gd)}
.btn.edit-verde:hover{background:var(--gm);color:var(--gxd)}
.btn.atencao{background:var(--gold);border-color:var(--gold-dk);color:#fff}
.btn.atencao:hover{background:var(--gold-dk)}

/* Modo leitura: campo travado precisa PARECER travado, senão o usuário tenta
   digitar e conclui que o sistema está com defeito. */
#m-doc.so-leitura .field{background:var(--f-fundo-ro)}
#m-doc.so-leitura .chk-item{opacity:.85}

/* ── RESUMO ──
   Mostra o documento como ele sai no papel: mesmo cabeçalho, mesmas seções
   numeradas, mesmas linhas de assinatura. Conferir num layout diferente do
   impresso não serve para conferir nada. */
.doc-resumo{border:1.5px solid var(--bord);border-radius:var(--r);padding:16px;
  background:var(--sur)}
.rs-cab{display:flex;align-items:center;gap:12px;padding-bottom:12px;
  border-bottom:1px dashed var(--bord);margin-bottom:12px}
.rs-brasao{height:46px;width:auto;flex-shrink:0}
.rs-cab-tit{flex:1;text-align:center}
.rs-cab-doc{font-family:'Manrope',sans-serif;font-weight:800;font-size:15px;
  color:var(--gxd);letter-spacing:.02em}
.rs-cab-org{font-size:11px;color:var(--tx2);margin-top:1px}
.rs-cab-meta{font-size:11px;color:var(--tx2);margin-top:4px}

.rs-sec{display:flex;align-items:center;gap:7px;font-size:10px;font-weight:700;
  text-transform:uppercase;letter-spacing:.06em;color:var(--tx3);
  margin:14px 0 6px;padding-bottom:4px;border-bottom:1px solid var(--bord)}
.rs-num{width:17px;height:17px;border-radius:4px;background:var(--gl);color:var(--gd);
  font-size:10px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}
.rs-linha{font-size:13px;color:var(--tx);padding:4px 0;display:flex;gap:8px}
.rs-linha > span{color:var(--tx3);min-width:120px;flex-shrink:0}
.rs-linha.rs-total{border-top:1px solid var(--bord);margin-top:4px;padding-top:7px}
.rs-texto{font-size:12.5px;color:var(--tx);line-height:1.5;text-align:justify;margin:4px 0 0}
.rs-artigos{display:flex;flex-direction:column;gap:6px;margin-top:4px}
.rs-artigo{font-size:13px;color:var(--tx);line-height:1.4;text-align:justify}
.rs-artigo strong{color:var(--gd)}
.rs-nota{font-size:11px;color:var(--tx3);margin:6px 0 0}
.rs-assinaturas{display:flex;gap:20px;margin-top:28px}
.rs-assinaturas > div{flex:1;text-align:center;font-size:11px;color:var(--tx2)}
.rs-assina-linha{border-top:1px solid var(--tx2);margin-bottom:4px}

/* ══════════════════════════════════════════════
   PARÂMETROS — USUÁRIOS E LEIS
   Desenho do painel administrativo do AppPOSTURAS: seção numerada, cartão por
   registro e as ações à direita. O mesmo cartão serve aos dois cadastros — o
   que muda é o que ocupa a coluna da esquerda.
   ══════════════════════════════════════════════ */

.par-sec{display:flex;align-items:center;gap:8px;font-size:11px;font-weight:700;
  text-transform:uppercase;letter-spacing:.06em;color:var(--tx3);
  margin:0 0 12px;padding-bottom:7px;border-bottom:1px solid var(--bord)}
.par-num{width:19px;height:19px;border-radius:5px;background:var(--gl);color:var(--gd);
  font-size:11px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}
.par-sec .cont{margin-left:auto}

/* Busca e criação na mesma linha. O campo cresce; o botão fica do tamanho do
   próprio texto. */
.par-busca{display:flex;gap:10px;align-items:stretch;margin-bottom:8px}
.par-busca input{flex:1;min-width:0;border:1.5px solid var(--f-bord);border-radius:var(--r);
  padding:11px 13px;font-family:inherit;font-size:14px;background:var(--f-fundo);color:var(--tx)}
.par-busca input:focus{outline:none;border-color:var(--f-bord-foco);box-shadow:0 0 0 3px var(--f-anel)}
.par-busca .btn{flex-shrink:0;white-space:nowrap}

.par-card{background:var(--sur);border:1.5px solid var(--bord);border-radius:var(--rl);
  padding:12px 14px;margin-bottom:9px;display:flex;align-items:center;
  justify-content:space-between;gap:12px;flex-wrap:wrap;box-shadow:var(--sh)}
.par-card.clicavel{cursor:pointer}
.par-card.clicavel:hover{border-color:var(--gm)}
.par-card-ident{display:flex;align-items:center;gap:10px;min-width:0;flex:1}
.par-card-txt{min-width:0;flex:1}
.par-card-nome{font-size:14px;font-weight:700;color:var(--tx);line-height:1.3}
.par-card-meta{font-size:12px;color:var(--tx3);margin-top:2px;
  display:flex;align-items:center;gap:5px;flex-wrap:wrap}
.par-card-cargo{font-size:10.5px;color:var(--tx3)}
.par-card-acoes{display:flex;gap:6px;flex-shrink:0}

/* Avatar: UM âmbar, igual para todo mundo — o mesmo do AppPOSTURAS.
   Antes cada perfil tinha a sua cor (azul-marinho para o administrador,
   laranja para os demais), e a lista virava um mostruário: as cores brigavam
   entre si e ainda repetiam, em código de cor, o que a etiqueta de perfil já
   diz por escrito ao lado. Quem é quem se lê no texto; o avatar só ancora a
   linha. */
.par-av{width:38px;height:38px;border-radius:50%;display:flex;align-items:center;
  justify-content:center;font-family:'Manrope',sans-serif;font-size:15px;font-weight:800;
  flex-shrink:0;color:var(--gold-dk);background:var(--gold-lt);
  border:1.5px solid var(--gold)}

/* Pílula de situação: verde para ativo, vermelha para inativo. Menor que a
   tag de status dos documentos, porque aqui é qualificação, não estado de
   processo — e as duas não podem competir na mesma tela. */
.pil{font-size:10px;font-weight:700;padding:2px 8px;border-radius:10px;line-height:1.5}
.pil-ok{background:var(--gl);color:var(--gd)}
.pil-off{background:var(--rlt);color:var(--red)}
.par-card-meta .badge{font-size:10px;padding:2px 8px 2px 6px}
.par-card-meta .badge::before{width:9px;height:9px}

/* Botões de contorno: criar e excluir não são a ação principal do cartão,
   então não competem com o Editar, que é cheio. */
.btn.out-verde{background:var(--sur);border-color:var(--g);color:var(--gd)}
.btn.out-verde:hover{background:var(--gl)}
.btn.out-vermelho{background:var(--sur);border-color:var(--red);color:var(--red)}
.btn.out-vermelho:hover{background:var(--rlt)}
/* O ícone padrão do app tem 18px; num botão pequeno ele domina o rótulo. */
.btn.sm svg{width:14px;height:14px}

/* ── AÇÕES DIRETAS NA COLUNA DE CONTROLES ──
   GPS e "Ver tudo" são botões soltos (sem painel), então não estão dentro de
   .ctrl-grupo — mas herdam a mesma caixa dos demais por .ctrl-btn. */
.ctrl-mapa > .ctrl-btn{align-self:flex-end}
/* Posição capturada: o botão fica verde. Sem rótulo visível, a cor é o aviso
   imediato de que há GPS ativo — o texto foi para o title. */
.ctrl-btn.gps-ativo{background:var(--gd);border-color:var(--gd)}
.ctrl-btn.gps-ativo svg{color:#fff}

/* A barra .acoes saiu do mapa; a regra de largura que a acompanhava deixou de
   ter alvo, mas fica inofensiva. O que importa é que o mapa voltou a usar a
   faixa inteira até o rodapé. */


/* ── DOCUMENTO SEM IMÓVEL ── */
.doc-sem-imovel{background:var(--wlt);border:1px solid var(--warn);border-radius:var(--r);
  padding:10px 12px;font-size:12.5px;color:var(--tx2);line-height:1.45}
.doc-sem-imovel b{display:block;color:var(--warn)}
.doc-imovel-op{display:block;width:100%;text-align:left;padding:9px 11px;margin-bottom:6px;
  border:1.5px solid var(--bord);border-radius:var(--r);background:var(--sur);
  cursor:pointer;font:inherit;font-size:12.5px;color:var(--tx2)}
.doc-imovel-op:hover{border-color:var(--gd);background:var(--gl)}
.doc-imovel-op b{display:block;font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--tx)}

/* ── MENU "NOVO" ANCORADO ──
   Padrão único para qualquer botão de criar com mais de uma opção. Nasce do
   próprio botão, e não no centro da tela, para não perder a relação entre o
   que foi clicado e o que abriu. */
.menu-novo-fundo{position:fixed;inset:0;z-index:1400;background:rgba(22,33,28,.28)}
.menu-novo{position:fixed;z-index:1401;display:flex;flex-direction:column;gap:8px;
  width:min(300px, calc(100vw - 24px))}
.menu-novo-op{display:flex;align-items:center;gap:11px;width:100%;text-align:left;
  background:var(--sur);border:1.5px solid var(--bord);border-radius:var(--rl);
  padding:12px 16px;cursor:pointer;font-family:inherit;font-size:14px;font-weight:600;
  color:var(--tx);box-shadow:var(--shl);
  opacity:0;transform:translateY(-6px);animation:menuNovoEntra .18s ease forwards}
.menu-novo-op:hover{border-color:var(--gd);background:var(--gl)}
.menu-novo-ico{width:22px;height:22px;flex-shrink:0;display:flex;align-items:center;
  justify-content:center;color:var(--gd)}
.menu-novo-ico svg{width:20px;height:20px}
@keyframes menuNovoEntra{to{opacity:1;transform:translateY(0)}}
@media (prefers-reduced-motion: reduce){
  .menu-novo-op{animation:none;opacity:1;transform:none}
}
/* O botão que abriu fica marcado enquanto o menu está no ar. */
.menu-aberto{background:var(--gd);border-color:var(--gd);color:#fff}

/* ── SUB-CABEÇALHO ──
   De quem é o sistema à esquerda, onde se está à direita. Fixo logo abaixo do
   cabeçalho, então as telas (que são position:fixed com top:68px) precisam
   descer o equivalente à altura dele. */
.subcab{position:fixed;top:68px;left:0;right:0;z-index:940;
  height:42px;box-sizing:border-box;
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:0 14px;background:var(--sur);border-bottom:1px solid var(--bord)}
.subcab-entidade{display:flex;align-items:center;gap:9px;min-width:0}
/* Sem moldura nem fundo: o PNG do brasão já vem com o fundo removido (ver o
   tratamento no upload), então qualquer caixa em volta criaria a borda branca
   que se quis eliminar. */
.subcab-brasao{height:28px;width:auto;flex-shrink:0;display:block}
.subcab-nome{font-size:12px;font-weight:600;color:var(--tx2);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.subcab-modulo{display:flex;align-items:center;gap:7px;flex-shrink:0;
  font-family:'Manrope',sans-serif;font-size:13px;font-weight:700;color:var(--gd)}
.subcab-ico{display:flex;align-items:center;justify-content:center}
.subcab-ico svg{width:17px;height:17px}

/* As telas descem 42px: o sub-cabeçalho ocupa a faixa que era delas. */
#t-painel, #t-busca, #t-documentos, #t-protocolos, #t-mapa{top:110px}

/* Em tela estreita o nome da entidade some e fica só o brasão — o módulo é a
   informação que muda, então é ela que tem prioridade no espaço. */
@media (max-width: 560px){
  .subcab-nome{display:none}
}

/* ── BRASÃO NOS PARÂMETROS ──
   Xadrez de fundo na prévia: sem ele não dá para saber se a transparência
   funcionou — brasão sobre branco parece igual com ou sem fundo removido. */
.brasao-caixa{display:flex;align-items:center;gap:16px;flex-wrap:wrap;
  background:var(--sur);border:1.5px solid var(--bord);border-radius:var(--rl);
  padding:14px 16px;box-shadow:var(--sh)}
.brasao-previa{width:96px;height:96px;flex-shrink:0;display:flex;align-items:center;
  justify-content:center;border:1px solid var(--bord);border-radius:var(--r);
  background-color:var(--blt);
  background-image:linear-gradient(45deg,rgba(0,0,0,.05) 25%,transparent 25%,transparent 75%,rgba(0,0,0,.05) 75%),
                   linear-gradient(45deg,rgba(0,0,0,.05) 25%,transparent 25%,transparent 75%,rgba(0,0,0,.05) 75%);
  background-size:14px 14px;background-position:0 0,7px 7px}
.brasao-previa img{max-width:84px;max-height:84px;display:block}
.brasao-vazio{font-size:11px;color:var(--tx3);text-align:center;padding:0 8px;line-height:1.35}
.brasao-acoes{display:flex;gap:8px;flex-wrap:wrap}

/* ══════════════════════════════════════════════
   AVISOS DO SISTEMA
   Cor na barra lateral e no ícone; texto sempre escuro. É a mesma regra das
   tags de status ("Modelo D"): só o realce carrega a cor, o que mantém a
   leitura quando a mensagem é longa e evita que "salvo" grite tão alto quanto
   "campo obrigatório".
   ══════════════════════════════════════════════ */

#toast{
  position:fixed;left:50%;bottom:calc(84px + env(safe-area-inset-bottom));
  transform:translateX(-50%) translateY(14px);
  z-index:3000;opacity:0;pointer-events:none;transition:opacity .2s, transform .2s;
  display:flex;align-items:flex-start;gap:10px;
  width:max-content;max-width:min(420px, calc(100vw - 32px));
  padding:11px 15px 11px 13px;
  background:var(--sur);border:1px solid var(--bord);border-left:3px solid var(--tx3);
  border-radius:var(--r);box-shadow:0 8px 26px rgba(22,33,28,.18);
  font-size:13px;line-height:1.45;color:var(--tx);text-align:left;cursor:pointer;
}
#toast.show{opacity:1;transform:translateX(-50%) translateY(0);pointer-events:auto}
#toast .toast-ico{flex-shrink:0;display:flex;align-items:center;justify-content:center;
  width:18px;height:18px;margin-top:1px}
#toast .toast-ico svg{width:18px;height:18px}
#toast .toast-txt{min-width:0}

#toast.toast-ok{border-left-color:var(--gd)}
#toast.toast-ok .toast-ico{color:var(--gd)}
#toast.toast-err{border-left-color:var(--red)}
#toast.toast-err .toast-ico{color:var(--red)}
#toast.toast-aviso{border-left-color:var(--warn)}
#toast.toast-aviso .toast-ico{color:var(--warn)}

/* Campo que impediu a ação. O anel é o mesmo do foco, em vermelho: quem
   acabou de ser levado até o campo precisa reconhecê-lo de imediato. */
.campo-invalido{border-color:var(--red) !important;
  box-shadow:0 0 0 3px rgba(178,38,30,.14) !important}
.field:has(.campo-invalido){border-color:var(--red);background:var(--rlt)}

/* ── CHIP DE ESTADO DO MAPA ──
   Passou a ficar por baixo do sub-cabeçalho quando ele entrou. Desceu o
   equivalente à altura dele, em vez de ir para o rodapé: lá disputaria lugar
   com o aviso do sistema, que é transitório e mais importante. O canto
   superior esquerdo segue livre — os controles do Leaflet ficam à direita. */
.chip-estado{top:118px;left:12px;z-index:880;max-width:calc(100vw - 24px)}

/* ══════════════════════════════════════════════
   ABA "CADASTRO IMOBILIÁRIO" (cópia local do BCI)

   Requisito de origem: TUDO CABE NA ABA. São quatro seções e, no BCI de
   Primavera, 22 características. Por isso as características vão em grade de
   duas colunas com fonte de 11px, e nenhuma seção rola por dentro — quem rola
   é o painel, e só se precisar.
   ══════════════════════════════════════════════ */
.bci-sec{margin-bottom:9px}
.bci-sec:last-child{margin-bottom:0}
.bci-sec-t{
  font-size:9.5px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;
  color:var(--tx3);margin-bottom:5px;
}

/* Faixas mais apertadas aqui do que na aba Dados: são quatro seções na mesma
   altura de tela, e cada 2px por faixa é uma característica que cabe. */
.bci-sec .fi-linha{padding:5px 0}

/* Proprietário: nome em destaque, documento ao lado, endereço abaixo em
   corpo menor. É a hierarquia com que se lê um ofício. */
.bci-prop{padding:6px 0;border-bottom:1px solid var(--bord)}
.bci-prop:last-child{border-bottom:0}
.bci-prop-n{font-size:12.5px;font-weight:700;color:var(--chumbo);line-height:1.35}
.bci-doc{font-size:11px;font-weight:600;color:var(--tx2)}
.bci-prop-e{font-size:11.5px;color:var(--tx2);line-height:1.35;margin-top:1px}

/* Duas colunas de pares. `auto-fit` com mínimo largo faz virar uma coluna
   sozinha quando o modal estreita, sem media query. */
/* TRÊS colunas, medidas e não estimadas: com duas, as 22 características do
   BCI de Primavera davam 594px de conteúdo numa aba de 507px — a seção rolava
   por dentro, que é justamente o que não pode. Com três, o conteúdo fecha em
   499px numa tela de 1280×800, a menor em uso. `auto-fit` faz cair para duas e
   para uma sozinho quando a janela estreita. */
.bci-carac{display:grid;grid-template-columns:repeat(auto-fit,minmax(165px,1fr));
  gap:0 20px}
.bci-par{display:flex;align-items:baseline;justify-content:space-between;gap:8px;
  font-size:11px;padding:2px 0;border-bottom:1px solid var(--bord);min-width:0}
.bci-par span{color:var(--tx3);white-space:nowrap}
/* `break-word`, não `anywhere`: com `anywhere` o navegador parte a PALAVRA na
   coluna estreita — "PARTICULAR" saía como "PARTICUL AR". Quebrar entre
   palavras é o suficiente, e o que sobrar de largura o texto pode ocupar. */
.bci-par b{color:var(--chumbo);font-weight:700;text-align:right;overflow-wrap:break-word}

/* Unidades: tabela porque são linhas comparáveis entre si — o olho corre a
   coluna do ano e a da área. */
.bci-tab{width:100%;border-collapse:collapse;font-size:11.5px}
.bci-tab th{font-size:9.5px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;
  color:var(--tx3);text-align:left;padding:3px 8px 3px 0;border-bottom:1px solid var(--bord)}
.bci-tab td{padding:4px 8px 4px 0;border-bottom:1px solid var(--bord);color:var(--chumbo)}
.bci-tab tr:last-child td{border-bottom:0}
.bci-tab .num{text-align:right;font-variant-numeric:tabular-nums;padding-right:14px}

/* Vazio EXPLICADO: diz que falta o acesso ao cadastro, não que falta o
   imóvel. Campo em branco deixaria o fiscal em dúvida sobre qual dos dois é. */
.bci-vazio{padding:14px;border:1px solid var(--bord);border-radius:10px;
  background:var(--bg);max-width:520px}
.bci-vazio-t{font-size:12.5px;font-weight:800;color:var(--chumbo);margin-bottom:5px}
.bci-vazio p{font-size:11.5px;color:var(--tx2);line-height:1.5;margin:0 0 6px}
.bci-vazio p:last-child{margin-bottom:0}
.bci-vazio-p{color:var(--tx3)}

/* Linha de topo da aba de cadastro: de quando é o dado, e o botão de buscar de
   novo. A data fica À ESQUERDA do botão porque ela é a pergunta que o usuário
   faz antes de decidir apertá-lo. */
.bci-topo{display:flex;align-items:center;justify-content:space-between;gap:12px;
  font-size:11px;color:var(--tx3);margin-bottom:10px}
.bci-topo b{color:var(--tx2);font-weight:700}
.bci-vazio .btn{margin-top:10px}
