/* ===========================================================================
   propostas.css — TODA a aparência do Propostas mora aqui.
   ---------------------------------------------------------------------------
   Antes de 02/set/2026 a aparência do app estava em três lugares: 154 linhas
   dentro do index.html, 190 injetadas por 11 arquivos js (cada um com o seu
   pedaço) e 54 atributos style= soltos no meio do código. Qualquer folha de
   estilo nova brigava com o que os módulos injetavam.

   A regra daqui em diante: cor, tamanho e espaçamento se escrevem NESTE
   arquivo. Arquivo de comportamento cuida de comportamento.

   A base é a biblioteca comum do hub (/hub/v1/hub-ui.css), que já traz a
   paleta B do brandbook, Sora/Inter, a casca de cima, botões, campos, abas,
   avisos, selos e modais. Aqui fica só o que é do Propostas — e o que for
   genérico o bastante para servir ao Pipeline vai para lá, não para cá.
   =========================================================================== */

/* =====================================================================
   1. OS ESTADOS DA TELA
   O app é uma página só que troca de cara. `view-abrindo` é o estado
   neutro do carregamento: nunca mostra o login antes de conferir a
   sessão (ver o BOOT no index.html).
   ===================================================================== */
#abrindo,#loginScreen,#listScreen,#consultaScreen{ display:none; }
#editorWrap{ display:none; }

body.view-abrindo  #abrindo{ display:flex; }
body.view-login    #loginScreen{ display:block; }
body.view-list     #listScreen{ display:block; }
body.view-consulta #consultaScreen{ display:block; }
body.view-editor   #editorWrap{ display:block; }
body:not(.view-editor) .bar{ display:none; }
#editorWrap > header{ display:none; }

#abrindo{ align-items:center; justify-content:center;
          flex-direction:column; gap:16px; padding:24px; }

#abrindo .aviso-abrindo{ color:var(--texto-2); font-size:13px; }

/* =====================================================================
   2. ENTRAR
   Igual à do hub e à do Pipeline, de propósito: é a mesma casa, e a
   tela de entrada é onde isso se percebe primeiro.
   ===================================================================== */
/* a margem da logo vem da biblioteca (.marca-entrar) -- a copia local daqui
   zerava o respiro de baixo e o cartao ficava 6px diferente dos outros dois */
/* .nome-sistema mora na biblioteca desde 05/set/2026 -- a copia local daqui
   dizia a mesma coisa e podia divergir na proxima mudanca. */
/* O ERRO DO LOGIN SO OCUPA ESPACO QUANDO EXISTE.
   O `min-height:18px` reservava a linha mesmo vazia, e com as margens o cartao
   do Propostas ficava 16px mais alto que o do Pipeline e o do Contratos --
   diferenca que nao se explica olhando, so medindo a estrutura. */
#loginErr{ margin:0 0 12px; }
#loginErr:empty{ display:none; margin:0; }

/* =====================================================================
   3. LISTA DE PROPOSTAS — a tela principal
   ===================================================================== */

/* As abas usam a barra da biblioteca. A classe .tabs continua no
   container e .on continua marcando a aba atual: três módulos
   (listagem, clonar, simulador) leem exatamente isso para saber onde a
   pessoa está. Trocar por outro nome apagaria o menu ⋮ da lista. */
.tabs{ padding-left:20px; padding-right:20px; }
.tabs > button{ appearance:none; background:none; border:0; border-bottom:2px solid transparent;
  padding:12px 14px; font:600 14px Inter,sans-serif; color:var(--texto-2); cursor:pointer;
  white-space:nowrap; }
.tabs > button:hover{ color:var(--texto); }
.tabs > button.on{ color:var(--roxo); border-bottom-color:var(--roxo); }
.badge{ margin-left:6px; background:var(--destaque); color:#fff;
  border-radius:20px; padding:1px 7px; font-size:11px; font-weight:700; }
.tabs .aba.on .badge{ background:var(--roxo); }

#listWrap{ max-width:1180px; margin:0 auto; padding:22px 20px 90px; }

/* A contagem ao lado do título: "148 propostas · 34 aprovadas". */
.barra-pagina .sub b{ color:var(--texto); font-weight:600; }
.f-conta{ color:var(--texto-3); font-size:13px; white-space:nowrap; }

/* ---- a linha da proposta -------------------------------------------------
   Em tela grande é linha de tabela; no celular é cartão. É o MESMO html nos
   dois: .prop > .pn + .pc + .pm, com .pill dentro de .pm. Essa forma é
   contrato — o menu ⋮ (listagem.js), o escopo (escopo.js) e a marca da
   ligação com o Pipeline (virar-processo.js) procuram por ela pelo nome. */
#listRows{ display:block; }
.prop{ position:relative; background:var(--papel); border:1px solid var(--borda);
  border-radius:11px; margin-bottom:7px; padding:13px 58px 13px 15px;
  cursor:pointer; transition:border-color .12s, background .12s; }
.prop:hover{ border-color:var(--roxo-claro); }
.prop.sel{ border-color:var(--roxo); background:var(--roxo-tenue); box-shadow:inset 3px 0 0 var(--roxo); }
.prop .pn{ color:var(--roxo); font-weight:600; font-size:13px; font-variant-numeric:tabular-nums; }
.prop .pc{ font-size:15px; font-weight:600; margin:2px 0; color:var(--texto); }
.prop .pm{ font-size:12.5px; color:var(--texto-2); display:flex; gap:9px;
  flex-wrap:wrap; align-items:center; }
.pesc{ color:var(--texto-3); font-weight:500; }

/* as etiquetas de situação */
.pill{ display:inline-block; padding:2px 10px; border-radius:20px; font-size:11.5px;
  font-weight:600; text-transform:capitalize; white-space:nowrap; }
.st-rascunho { background:var(--inerte-bg); color:var(--texto-2); }
.st-enviada  { background:var(--espera-bg); color:var(--espera); }
.st-fechada  { background:var(--ok-bg);     color:var(--ok); }
.st-cancelada{ background:var(--atraso-bg); color:var(--atraso); }

/* Em tela grande as três partes viram colunas, e o cabeçalho da tabela
   fica em cima com os mesmos trilhos. */
@media (min-width:1101px){
  .prop, .cab-tabela{ display:grid; grid-template-columns:132px minmax(0,1.3fr) minmax(0,1.3fr);
    gap:14px; align-items:center; }
  /* ESTA LINHA É O QUE FAZ O FILTRO FUNCIONAR NA TELA GRANDE.
     `[hidden]{display:none}` é regra do NAVEGADOR, e qualquer regra do AUTOR
     a vence — inclusive a de cima. O filtro da lista esconde linha com
     `el.hidden = true` (index.html, aplicarFiltros); daqui para cima de
     1101px isso deixava de ter efeito: o contador dizia "0 de 155" e as 155
     linhas continuavam na tela.
     Estava assim desde o Bloco 1 (c55c71a), que trouxe a grade e o filtro no
     mesmo commit. Ninguém viu porque o celular funcionava — lá não há grade —
     e porque os testes conferiam a PROPRIEDADE `hidden`, que estava certa, em
     vez da tinta. O Sidney achou digitando "155" e não vendo nada mudar.
     Vale para TODOS os filtros da lista, não só a busca: situação, vendedor e
     modelo escondem pelo mesmo caminho. */
  .prop[hidden], .cab-tabela[hidden]{ display:none; }
  /* Na aba "Minhas" o vendedor e sempre a mesma pessoa: a coluna nao informa
     nada e o espaco vai para o nome do cliente. Na aba "Todas" ela volta, e
     a linha se reorganiza para o nome caber inteiro. */
  #areaLista[data-aba="minhas"] .p-dono{ display:none; }
  #areaLista[data-aba="todas"] .prop,
  #areaLista[data-aba="todas"] .cab-tabela{ grid-template-columns:132px minmax(0,1fr) minmax(0,1.75fr); }
  /* Linha que carrega o botao "criar processo" tem um campo a mais e o nome do
     vendedor sobrava em duas letras. Ali o botao vale mais: e uma pendencia
     para resolver, e o vendedor esta a um clique no painel do lado. Navegador
     antigo que nao entenda :has() apenas mantem o nome cortado -- nada quebra. */
  .prop:has(.vp-falta) .p-dono{ display:none; }
  .prop{ padding:10px 52px 10px 15px; }
  .prop .pn{ white-space:nowrap; }
  .prop .pc{ margin:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  /* A terceira coluna e uma linha so: situacao, modelo, vendedor e data.
     A ETIQUETA DE SITUACAO E A DATA NUNCA ENCOLHEM: sao o que a pessoa
     procura correndo o olho, e "Ra..." no lugar de "Rascunho" nao informa
     nada. Quem cede espaco sao o modelo e o nome do vendedor, que a pessoa
     le inteiros no painel do lado. */
  .prop .pm{ justify-content:flex-end; flex-wrap:nowrap; gap:11px; min-width:0; }
  .prop .pm > span{ white-space:nowrap; }
  .prop .pm > .pill, .prop .pm > .vp-selo, .prop .pm > .vp-falta, .prop .pm > .p-data{ flex:none; }
  .prop .pm > .p-data{ font-variant-numeric:tabular-nums; }
  .prop .pm > .p-dono{ overflow:hidden; text-overflow:ellipsis; }
  /* O modelo (Locação + Venda, Só venda...) sai da linha em tela grande.
     Cabiam quatro campos no espaço de tres, e o resultado era duas colunas
     cortadas no meio -- "Loca..." e "Patricia P...". Duas reticencias por
     linha, 148 vezes, leem como tela quebrada. O modelo continua inteiro no
     painel do lado e no cartao do celular, que e onde ele e consultado. */
  .prop .pm > .p-modo{ display:none; }
  .cab-tabela{ padding-right:52px; }
  .cab-tabela span:last-child{ text-align:right; }
}
@media (max-width:1100px){
  /* alvo de toque: a linha inteira, com folga */
  .prop{ min-height:66px; padding:14px 60px 14px 15px; }
}

/* ---- o painel do lado (só em tela grande) -------------------------------- */
#painelProp .painel-linha{ display:flex; justify-content:space-between; gap:12px;
  padding:8px 0; border-bottom:1px solid var(--borda); font-size:13.5px; }
#painelProp .painel-linha:last-of-type{ border-bottom:0; }
#painelProp .painel-linha span{ color:var(--texto-3); }
#painelProp .painel-linha b{ font-weight:600; text-align:right; }
#painelProp .painel-num{ color:var(--roxo); font-weight:600; font-size:13px;
  font-variant-numeric:tabular-nums; }
#painelProp h2{ font-size:17px; margin:2px 0 3px; line-height:1.3; }

/* O painel, o cabeçalho de colunas e a barra de filtros só existem nas abas
   que listam PROPOSTAS. Em autorizações, usuários e CNPJ/CPF eles não querem
   dizer nada.

   ESCRITO AO CONTRÁRIO DE PROPÓSITO. Antes esta regra listava as abas que
   deviam ESCONDER, e por isso ela nasceu certa e envelheceu errada: quando a
   aba de CNPJ/CPF chegou, ninguém a acrescentou aqui e ela herdou a barra de
   filtros sem que nada acusasse. O estrago não foi estético -- o `oninput` da
   busca continua ligado, e digitar uma letra reescrevia o subtítulo com o total
   de LINHAS, que naquela aba está vazio: a tela passava a dizer "Nenhuma
   proposta ainda" com 154 propostas no banco. Frase falsa, e assustadora.
   Listando quem MOSTRA, a aba nova nasce protegida e o esquecimento passa a
   custar uma barra a menos, nunca uma mentira a mais.

   O PREÇO DE ESCREVER AO CONTRÁRIO: o `:not()` também casa quando o atributo
   ESTÁ AUSENTE -- ausência e "outra aba" viram a mesma coisa. Hoje isso não
   morde porque o atributo vem escrito no HTML (`<div id="areaLista"
   data-aba="minhas">`), não só pelo setTab. Se um dia alguém tirar o atributo
   de lá, a barra de filtros some para sempre e sem erro nenhum. Ele é parte da
   regra, não enfeite. */
#areaLista:not([data-aba="minhas"]):not([data-aba="todas"]) #painelProp,
#areaLista:not([data-aba="minhas"]):not([data-aba="todas"]) #cabTabela,
#areaLista:not([data-aba="minhas"]):not([data-aba="todas"]) #filtros{ display:none; }
#areaLista:not([data-aba="minhas"]):not([data-aba="todas"]) .dupla{ grid-template-columns:minmax(0,1fr); }

.empty{ text-align:center; color:var(--texto-2); padding:44px 14px; font-size:14px; }

/* =====================================================================
   4. AUTORIZAÇÕES — o dono aprova ou nega quem pediu para editar
   ===================================================================== */
.solrow{ border:1px solid var(--borda); border-radius:12px; padding:15px;
  margin-bottom:9px; background:var(--papel); }
.solrow .pn{ color:var(--roxo); font-weight:600; font-size:14.5px; }
.solrow .pm{ font-size:13px; color:var(--texto-2); }
.solrow .sb{ display:flex; gap:9px; margin-top:12px; }
.solrow .sb button{ flex:1; min-height:40px; border-radius:9px; border:1px solid transparent;
  font:600 14px Inter,sans-serif; cursor:pointer; }
.apv{ background:var(--ok); color:#fff; }
.neg{ background:var(--atraso-bg); color:var(--atraso); border-color:transparent; }

/* =====================================================================
   5. USUÁRIOS (admin) — quem vê custo, quem cria, quem vê todas
   ===================================================================== */
.urow{ background:var(--papel); border:1px solid var(--borda); border-radius:12px;
  padding:15px; margin-bottom:9px; }
.urow .un{ font-weight:600; font-size:15.5px; color:var(--texto); }
.urow .admtag{ background:var(--roxo-tenue); color:var(--roxo); font-size:10.5px;
  font-weight:700; padding:2px 8px; border-radius:20px; vertical-align:middle; margin-left:4px; }
.urow .ue{ font-size:12.5px; color:var(--texto-3); margin:2px 0 11px; }
.urow .usw{ display:flex; gap:8px; flex-wrap:wrap; }
.urow .sw{ display:flex; align-items:center; gap:7px; font-size:13.5px; color:var(--texto);
  background:var(--fundo); border:1px solid var(--borda); border-radius:9px;
  padding:8px 12px; font-weight:500; cursor:pointer; }
.urow .sw input{ width:18px; height:18px; flex:none; accent-color:var(--roxo); }
.urow .usave{ margin-top:13px; appearance:none; border:none; border-radius:9px; cursor:pointer;
  background:var(--roxo); color:#fff; font:600 14px Inter,sans-serif; padding:9px 18px; }
.urow .usave:hover{ background:var(--roxo-escuro); }
.urow .usave:disabled{ opacity:.5; cursor:not-allowed; }
/* Em tela grande a lista de gente vira duas colunas: sao fichas curtas, e
   uma ficha esticada em 1180px fica com o campo de telefone do tamanho de
   um paragrafo. */
@media (min-width:1101px){
  #areaLista[data-aba="usuarios"] #listRows{ display:grid; grid-template-columns:1fr 1fr;
    gap:10px; align-items:start; }
  #areaLista[data-aba="usuarios"] #listRows .empty{ grid-column:1 / -1; }
  .urow{ margin-bottom:0; }
}
.urow .uhint{ margin-top:9px; font-size:12.5px; color:var(--texto-3); }

/* vindo de js/perfis.js (nome completo, telefone e cargo de cada pessoa) */
.uCad{ display:grid; grid-template-columns:1fr 1fr; gap:9px; margin:12px 0 4px; }
.uCad .full{ grid-column:1 / -1; }
.uCad label{ display:block; font-size:11.5px; color:var(--texto-3); font-weight:600; margin-bottom:3px; }
.uCad input{ width:100%; padding:9px 11px; border:1px solid var(--borda); border-radius:8px;
  font-size:14px; background:var(--papel); }
.uCad input.falta{ border-color:var(--espera); background:var(--espera-bg); }
.uFalta{ display:inline-block; margin-left:8px; padding:2px 9px; border-radius:20px; font-size:11px;
  font-weight:600; color:var(--espera); background:var(--espera-bg); vertical-align:middle; }
.uCadHint{ font-size:12px; color:var(--texto-2); margin-top:3px; }
@media (max-width:560px){ .uCad{ grid-template-columns:1fr; } }

/* =====================================================================
   6. CONSULTAR PREÇOS — só leitura, não cria proposta
   ===================================================================== */
#consultaWrap{ max-width:1180px; margin:0 auto; padding:22px 20px 80px; }
#cresultados{ display:grid; gap:9px; }
@media (min-width:1101px){ #cresultados{ grid-template-columns:1fr 1fr; align-items:start; } }
.cprod{ background:var(--papel); border:1px solid var(--borda); border-radius:12px; padding:14px 16px; }
.cprod .cd{ font-size:15px; font-weight:600; color:var(--texto); line-height:1.35; }
.cprod .cc{ font-size:12px; color:var(--texto-3); margin-top:2px; font-variant-numeric:tabular-nums; }
.cprod .ctiers{ display:flex; gap:8px; margin-top:10px; flex-wrap:wrap; }
.cprod .tier{ padding:4px 12px; border-radius:20px; font-size:13px; font-weight:600; }
.cprod .tcusto{ background:var(--inerte-bg); color:var(--texto-2); }
.cprod .tvenda{ background:var(--roxo-tenue); color:var(--roxo); }
.cprod .cloc{ margin-top:11px; border-top:1px dashed var(--borda); padding-top:9px; }
.cprod .cloc .ct{ font-size:11px; color:var(--texto-3); font-weight:600; text-transform:uppercase;
  letter-spacing:.05em; margin-bottom:5px; }
.cprod .cloc .selo{ background:var(--espera-bg); color:var(--espera); border-radius:20px;
  padding:2px 8px; font-size:10.5px; font-weight:600; margin-left:8px; }
.cprod .ltab{ width:100%; border-collapse:collapse; font-size:12.5px; }
.cprod .ltab th{ text-align:left; color:var(--texto-3); font-weight:600; font-size:11px;
  padding:4px 6px; border-bottom:1px solid var(--borda); }
.cprod .ltab th:not(:first-child){ text-align:right; }
.cprod .ltab td{ padding:5px 6px; border-bottom:1px solid var(--fundo); color:var(--texto-2);
  font-variant-numeric:tabular-nums; }
.cprod .ltab td:not(:first-child){ text-align:right; }
.cprod .ltab td:last-child{ color:var(--roxo); font-weight:600; }
.cprod .soven{ font-size:12.5px; color:var(--texto-3); margin-top:9px; }

/* =====================================================================
   7. O EDITOR — ainda no formato antigo; o Bloco 2 refaz esta parte.
   Aqui ele só passa a usar as cores e as fontes da casa, para não
   parecer outro sistema enquanto espera a vez.
   ===================================================================== */
/* ESCOPADO AO EDITOR, e nao ao elemento nu (05/set/2026).
   `header{...}` alcancava tambem a BARRA DO HUB, que e um <header> -- o menu
   dela saia em Sora no Propostas e em Inter no Pipeline e no Contratos, numa
   barra que vem da mesma biblioteca e deveria ser identica nos tres. O fundo
   nao vazava porque `.hub-topo` tem mais peso; a fonte vazava porque ninguem
   mais a declarava.
   O alcance foi conferido antes de mexer: existe UM <header> proprio no app,
   o do editor antigo (index.html:163), e ele vive escondido por
   `#editorWrap > header{display:none}` logo acima. Ou seja, esta regra so
   tinha efeito visivel na barra que ela nao deveria alcancar. */
#editorWrap > header{ background:var(--roxo); color:#fff; padding:16px 18px; font-weight:600;
  font-size:18px; position:sticky; top:0; z-index:5; font-family:Sora,Inter,sans-serif; }
#editorWrap > header small{ display:block; font-weight:400; font-size:12px; opacity:.85; margin-top:2px; }
main{ max-width:680px; margin:0 auto; padding:18px 14px 120px; }

/* O BOTAO NAO HERDA FONTE SOZINHO (05/set/2026).
   `<button>` nasce com a fonte do sistema operacional, e nao com a do corpo da
   pagina: sem alguem declarar, ele sai em Arial. Quem declarava era a classe
   `.btn` -- e doze botoes do editor nao a tem: os seis modos, o Pessoa
   juridica/fisica, o Buscar CNPJ, o Salvar e o Gerar proposta em PDF. Eles
   saiam em Arial no meio de uma tela inteira em Inter.
   `inherit` e nao `Inter` de proposito: assim o botao segue o corpo, e o dia
   em que a fonte da casa mudar, muda junto. E `.btn` continua mandando onde
   existe, porque classe pesa mais que elemento. */
button, input, select, textarea{ font-family: inherit; }
main h2{ font-size:12.5px; color:var(--roxo); margin:2px 0 10px; text-transform:uppercase;
  letter-spacing:.06em; font-family:Inter,sans-serif; font-weight:700; }
.card{ background:var(--papel); border:1px solid var(--borda); border-radius:12px;
  padding:15px; margin-bottom:14px; }
main label{ display:block; font-size:13px; font-weight:600; color:var(--roxo); margin:12px 0 5px; }
main label:first-child{ margin-top:0; }
main input,main select,main textarea{ font-size:16px; padding:11px 12px; }
main textarea{ min-height:64px; resize:vertical; }
.row2{ display:flex; gap:9px; }
.row2>div{ flex:1; }
.seg{ display:flex; gap:6px; flex-wrap:wrap; }
.seg button{ flex:1 1 30%; padding:11px 6px; border:1.5px solid var(--roxo); background:var(--papel);
  color:var(--roxo); border-radius:9px; font-weight:600; font-size:13px; cursor:pointer; }
.seg button.on{ background:var(--roxo); color:#fff; }
.resultados{ border:1px solid var(--borda); border-radius:9px; margin:6px 0 4px;
  max-height:280px; overflow:auto; display:none; background:var(--papel); }
.resultados.on{ display:block; }
.res{ padding:11px 13px; border-bottom:1px solid var(--fundo); cursor:pointer; }
.res:last-child{ border-bottom:none; }
.res:hover{ background:var(--roxo-tenue); }
.res .rd{ color:var(--texto); font-size:14px; line-height:1.35; }
.res .rp{ color:var(--roxo); font-weight:600; font-size:12.5px; margin-top:3px; }
.res .rg{ color:var(--texto-3); font-size:11.5px; margin-top:1px; }
.item{ border:1px solid var(--borda); border-radius:10px; padding:11px; margin-bottom:10px;
  position:relative; background:var(--fundo); }
.item .desc{ margin-bottom:8px; }
/* A ORDEM DOS ITENS (08/out/2026, js/ordem-itens.js): uma faixa fina no alto de
   cada linha, com as setas de subir e descer. Setas com 34px de lado: é com o
   dedo que elas são usadas. A pega (⠿) só aparece onde há mouse -- no celular
   não se arrasta, e mostrá-la prometeria um gesto que não existe. */
.item .ord-ctl{ display:flex; align-items:center; gap:6px; margin:-3px 0 7px; min-height:34px; padding-right:38px; }
.item .ord-ctl button{ width:34px; height:34px; min-height:34px; padding:0; border:1px solid var(--borda); border-radius:8px;
  background:var(--papel,#fff); color:var(--roxo); font-size:12px; line-height:1; cursor:pointer; }
.item .ord-ctl button:hover{ background:#f7f0f9; }
.item .ord-ctl button.ord-ponta, .item .ord-ctl button:disabled{ opacity:.3; cursor:default; }
.item .ord-n{ font-size:11.5px; color:var(--texto-3); margin-left:2px; }
.item .ord-pega{ display:none; color:var(--texto-3); font-size:16px; cursor:grab; padding:0 4px; user-select:none; }
@media (hover:hover) and (pointer:fine){ .item .ord-pega{ display:inline-block; } }
.item.ord-indo{ opacity:.45; outline:2px dashed var(--roxo); }
.grid3{ display:grid; grid-template-columns:64px 1fr 1fr; gap:8px; }
.grid3 .lbl{ display:block; font-size:11px; color:var(--texto-3); margin-bottom:2px; font-weight:600; }
.grid3 input{ padding:10px; }

/* =====================================================================
   A TABELA DOS MODOS — quem aparece em cada um. NÃO EXISTE OUTRA.
   ---------------------------------------------------------------------
   Até 02/set/2026 esta tabela estava partida em três: js/torres.js,
   js/servicos.js e js/facevision.js escreviam, cada um, a sua fatia — e
   cada um escondia cartões que pertenciam aos OUTROS. Três tabelas
   parciais, nenhuma completa, nenhuma sabendo da outra. É a mesma doença
   que deixou duas abas marcadas ao mesmo tempo: dois donos do mesmo
   pedaço de tela. Agora o dono é este bloco.

   REGRA: o padrão é APARECER. Cada modo diz o que ele tira. Os quatro
   cartões de modo próprio são a exceção: ficam fora e só entram no modo
   deles.

                          ambas  locação  venda  torres  serviços  face
     O que mostrar          ✓       ✓       ✓      ✓        ✓        ✓
     Cliente                ✓       ✓       ✓      ✓ (a)    ✓        ✓
     Contrato (locação)     ✓       ✓       ·      ·        ·        ·
     Itens                  ✓       ✓       ✓      ·        ·        ·
     Cabos                  ✓       ✓       ✓      ·        ·        ·
     Serviços mensais       ✓       ✓       ✓      ·        ·        ·
     Infraestrutura         ✓       ✓       ✓      ·        ·        ·
     Serviços               ✓       ✓       ✓      ·        ·        ·
     Observações            ✓       ✓       ✓      ·        ✓        ✓
     Totais parciais        ✓       ✓ (b)   ✓ (c)  ·        ·        ·
     Valor final locação    ✓       ✓       ·      ·        ·        ·
     Pagamentos             ✓       ✓       ✓      ·        ✓        ·
     Textos do documento    ✓       ✓       ✓      ·        ✓        ✓
     Cópias arquivadas      ✓       ✓       ✓      ✓        ✓        ✓
     Torres                 ·       ·       ·      ✓        ·        ·
     Serviços (do modo)     ·       ·       ·      ·        ✓        ·
     FaceVision             ·       ·       ·      ·        ·        ✓

     (a) sem endereço — a proposta Torres não leva endereço
     (b) sem a linha de venda      (c) sem a linha de locação
   ===================================================================== */

/* os de modo próprio: fora por padrão, dentro só no modo deles */
#cardTorres, #cardServUnicos, #cardServMensaisSrv, #cardFv,
#cardPacote, #cardDescPeriodo, #cardEscopo{ display:none; }
/* Contrato de manutenção (07/out/2026) — ele NÃO esconde quase nada: o modo
   existe para JUNTAR os cartões que os outros modos já usam. Entram os dois
   cartões próprios (o pacote e o desconto por período) e sai o fechamento da
   locação, porque o valor do pacote é o total e não a soma de mensalidades. */
body.modo-manutencao #cardPacote,
body.modo-manutencao #cardEscopo,
body.modo-manutencao #cardDescPeriodo{ display:block; }
/* A TORRE DO PACOTE É O CARTÃO DO MODO TORRES (07/out/2026): o mesmo cartão,
   os mesmos campos. Dois deles só valem no modo Torres (contrato mínimo e
   validade) e a dica do PDF de marketing também; a dica do pacote só no pacote.
   As classes são postas pelo js/manutencao.js, sem tocar no js/torres.js. */
body.modo-manutencao #cardTorres{ display:block; }
body.modo-manutencao #cardTorres .so-modo-torres{ display:none; }
/* a escolha Condomínio/Empresa e os campos do formato empresa são do DOCUMENTO
   de torres (js/torres-empresa.js); o pacote imprime outro documento.
   `!important` porque o bloco da empresa é mostrado por estilo inline. */
body.modo-manutencao #teFormatoBox,
body.modo-manutencao #teEmpresa{ display:none !important; }
#cardTorres .so-modo-pacote{ display:none; }
body.modo-manutencao #cardTorres .so-modo-pacote{ display:block; }
body.modo-manutencao #cardLocFinal,
body.modo-manutencao #totVenRow{ display:none; }
/* AS DUAS COLUNAS FICAM, e isto é o ponto: `mensal` é o preço de LOCAÇÃO do
   catálogo (por período) e `venda` é a FRANQUIA que vai para o Anexo. Eu tinha
   escondido a de venda copiando o modo locação, e com ela escondida a franquia
   não podia ser conferida nem corrigida na tela -- justamente o número que
   limita a indenização. A busca do catálogo preenche as duas. */
body.modo-torres     #cardTorres{ display:block; }
body.modo-servicos   #cardServUnicos,
body.modo-servicos   #cardServMensaisSrv{ display:block; }
body.modo-facevision #cardFv{ display:block; }

/* locação + venda juntas: nada sai */

/* só locação — a coluna de venda sai dos itens e da soma */
body.modo-locacao .grid3{ grid-template-columns:64px 1fr; }
body.modo-locacao .cell-v{ display:none; }
body.modo-locacao #totVenRow{ display:none; }

/* só venda — sai o contrato, a coluna mensal e o fechamento da locação */
body.modo-venda .grid3{ grid-template-columns:64px 1fr; }
body.modo-venda .cell-m{ display:none; }
body.modo-venda #cardPeriodo,
body.modo-venda #cardLocFinal,
body.modo-venda #totLocRow{ display:none; }

/* Torres — proposta de marketing: fica só o cliente (sem endereço) e o cartão do modo */
body.modo-torres #cardPeriodo,
body.modo-torres #cardItens,
body.modo-torres #cardCabos,
body.modo-torres #cardServMensais,
body.modo-torres #cardInfraW,
body.modo-torres #cardServicosW,
body.modo-torres #cardObs,
body.modo-torres #cardTotais,
body.modo-torres #cardDesconto,
body.modo-torres #cardLocFinal,
body.modo-torres #cardPagamentos,
body.modo-torres #cardTextos,
/* 18/set/2026: o endereço do cliente volta a aparecer no Torres (o contrato
   precisa dele; js/dados-cliente.js). Só a dica "obrigatório" continua
   escondida, porque no Torres ele não é. */
body.modo-torres #endHint{ display:none; }

/* Serviços — sem produto, sem catálogo, sem locação */
body.modo-servicos #cardPeriodo,
body.modo-servicos #cardItens,
body.modo-servicos #cardCabos,
body.modo-servicos #cardServMensais,
body.modo-servicos #cardInfraW,
body.modo-servicos #cardServicosW,
body.modo-servicos #cardTotais,
body.modo-servicos #cardDesconto,
body.modo-servicos #cardLocFinal{ display:none; }

/* FaceVision — o caderno institucional monta o investimento por dentro */
body.modo-facevision #cardPeriodo,
body.modo-facevision #cardItens,
body.modo-facevision #cardCabos,
body.modo-facevision #cardServMensais,
body.modo-facevision #cardInfraW,
body.modo-facevision #cardServicosW,
body.modo-facevision #cardTotais,
body.modo-facevision #cardDesconto,
body.modo-facevision #cardLocFinal,
body.modo-facevision #cardPagamentos{ display:none; }
/* ---- Card "Desconto" (14/set/2026) -------------------------------------
   O desconto deixou de acontecer escondido dentro do valor arredondado e
   ganhou campo proprio. Fica visivel em locacao, venda e locacao+venda; os
   modos acima nao tem preco de tabela para descontar. Dentro do card, cada
   lado se esconde sozinho pelo atributo `hidden` (js/melhorias-ui.js), porque
   quem sabe se ha locacao ou venda e o MODO, nao a folha de estilo. */
#cardDesconto .descLinha + .descLinha{ margin-top:14px; }
/* 28/out/2026 — o modo Servicos ganhou a MESMA linha de desconto, dentro dos
   dois cartoes dele (js/servicos.js). Mesmas regras, nenhum desenho novo. */
#cardServUnicos .descLinha, #cardServMensaisSrv .descLinha{ margin-top:14px; }
#cardDesconto .descCampos, #cardServUnicos .descCampos, #cardServMensaisSrv .descCampos{ display:flex; gap:8px; align-items:stretch; }
#cardDesconto .descValor, #cardServUnicos .descValor, #cardServMensaisSrv .descValor{ flex:1; min-width:0; }
#cardDesconto .descSeg, #cardServUnicos .descSeg, #cardServMensaisSrv .descSeg{ flex:0 0 auto; }
#cardDesconto .descSeg button, #cardServUnicos .descSeg button, #cardServMensaisSrv .descSeg button{ min-width:52px; }
#cardDesconto .descResumo, #cardServUnicos .descResumo, #cardServMensaisSrv .descResumo{ font-size:12.5px; color:var(--texto-2); margin-top:6px; line-height:1.5; }
#cardDesconto .descResumo:empty, #cardServUnicos .descResumo:empty, #cardServMensaisSrv .descResumo:empty{ display:none; }

/* ============================ fim da tabela dos modos ================ */

.rm{ position:absolute; top:8px; right:8px; width:28px; height:28px; border-radius:50%;
  border:none; background:var(--roxo-tenue); color:var(--roxo); font-size:18px; line-height:1;
  font-weight:700; z-index:2; cursor:pointer; }
.add{ width:100%; padding:12px; border:1.5px dashed var(--roxo); background:var(--papel);
  color:var(--roxo); border-radius:9px; font-weight:600; font-size:15px; cursor:pointer; }
.chk{ display:flex; align-items:center; gap:10px; margin:9px 0; font-size:15px; }
.chk input{ width:22px; height:22px; flex:none; accent-color:var(--roxo); }
.hint{ font-size:12.5px; color:var(--texto-2); margin-top:6px; }

/* A BARRA DO EDITOR CABE EM UMA LINHA SÓ, INCLUSIVE NO PIOR CASO.
   O pior caso não é a proposta comum: é a de OUTRA pessoa, onde aparecem
   CINCO controles ao mesmo tempo — Voltar, o título, o status, Histórico e
   Solicitar edição (index.html:1051 e 1064 acendem os dois juntos). Com
   `flex-wrap:wrap` e um título que empurra, o último controle caía para
   uma segunda linha no celular, e quem caía era justamente o Histórico.
   Quem cede espaço é o TÍTULO, que é o único elemento aqui que continua
   legível cortado — os outros são botões, e botão pela metade não serve. */
#editTop{ background:var(--roxo); color:#fff; padding:11px 14px; position:sticky; top:0; z-index:6;
  display:flex; align-items:center; gap:9px; flex-wrap:nowrap; }
#editTop .back{ background:rgba(255,255,255,.18); border:none; color:#fff; border-radius:8px;
  padding:8px 11px; font-weight:600; font-size:14px; cursor:pointer; }
/* `min-width:0` é o que permite ao título encolher: item de flex não passa
   do próprio conteúdo sem isso, e era ele que empurrava os botões para fora. */
#editTop .et-ttl{ font-weight:600; font-size:14px; flex:1 1 auto; min-width:0;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
  font-family:Sora,Inter,sans-serif; }
#editTop select{ width:auto; padding:7px 9px; font-size:13px; border-radius:8px; }
#editTop .et-act{ background:rgba(255,255,255,.2); border:none; color:#fff; border-radius:8px;
  padding:8px 11px; font-weight:500; font-size:13px; cursor:pointer; }
#editTop .et-act:disabled{ opacity:.65; }
/* botão não encolhe e não quebra: ou cabe inteiro, ou não é botão */
#editTop .back, #editTop .et-act{ flex:0 0 auto; white-space:nowrap; }

@media (max-width:760px){
  #editTop{ gap:6px; padding:9px 11px; }
  #editTop .et-ttl{ font-size:13px; }
  #editTop .back{ padding:8px 9px; font-size:13px; }
  #editTop .et-act{ padding:8px 9px; font-size:12.5px; }
  #editTop select{ padding:6px 7px; font-size:12px; max-width:96px; }
  /* Em modo leitura o status já está desabilitado (index.html:1075): num
     celular ele é um controle morto ocupando o espaço de que os dois botões
     vivos precisam. Sai da tela pequena, e o status continua visível na
     lista de propostas. */
  body.readonly #editTop select{ display:none; }
}
#roBanner{ display:none; background:var(--espera-bg); color:var(--espera); border-radius:10px;
  padding:11px 13px; margin:14px auto 0; max-width:652px; font-size:13.5px; }
body.readonly #roBanner{ display:block; }
body.readonly main input, body.readonly main select, body.readonly main textarea{ background:var(--fundo); }
.bar{ position:fixed; left:0; right:0; bottom:0; padding:12px 14px calc(12px + env(safe-area-inset-bottom));
  background:var(--papel); border-top:1px solid var(--borda); display:flex; gap:10px; }
.bar button{ flex:1; max-width:340px; margin:0 auto; padding:15px; border:none; border-radius:11px;
  background:var(--roxo); color:#fff; font-size:16px; font-weight:600; cursor:pointer; }
.bar #salvar{ background:var(--papel); color:var(--roxo); border:1.5px solid var(--roxo); }

/* =====================================================================
   8. JANELAS
   ---------------------------------------------------------------------
   TODAS as janelas do Propostas usam agora o modal da biblioteca do hub:
   `.modal-fundo` é o fundo escuro, `.modal` é a caixa branca. São quatro,
   e não sobrou nenhuma no formato antigo:

     #histModal   histórico da proposta      (index.html)
     #menuModal   o menu ⋮ da linha          (js/listagem.js)
     #excModal    confirmar exclusão         (js/listagem.js)
     #vpModal     criar processo no Pipeline (js/virar-processo.js)

   Até o Bloco 3 as três primeiras usavam o formato antigo do Propostas,
   onde `.modal` era o FUNDO e `.sheet` a caixa — o oposto da biblioteca.
   Enquanto os dois conviviam, elas precisavam estar nomeadas aqui uma a
   uma para que `.modal` pudesse significar "caixa" para todo o resto.
   Convertidas, a lista de exceções sumiu: o que sobrou vale por CLASSE e
   serve para qualquer janela que venha depois, sem precisar ser batizada.

   O QUE MUDA PARA QUEM USA: no celular elas eram folhas que subiam pelo
   pé da tela; agora são caixas centradas, como as do hub e do Pipeline.
   É a mesma janela com o mesmo conteúdo e os mesmos botões — muda onde
   ela aparece, não o que ela faz.
   ===================================================================== */

/* A biblioteca declara `.modal-fundo{display:grid}`, ou seja, VISÍVEL. Quem
   diz quando aparece é o app, e aqui a regra é uma só, por classe. Esta
   folha carrega depois da biblioteca (index.html:12 e 13), então ela vence. */
.modal-fundo{ display:none; }
.modal-fundo.on{ display:grid; }

.modal h3{ font-family:Sora,Inter,sans-serif; color:var(--roxo); margin:0 0 14px; font-size:17px; }
/* o botão de fechar de largura cheia, que as três traziam do formato antigo */
.modal .close{ width:100%; margin-top:15px; padding:13px;
  border:none; border-radius:10px; background:var(--roxo-tenue); color:var(--roxo);
  font-weight:600; cursor:pointer; }
.modal .close:hover{ filter:brightness(.97); }

/* o histórico pode ser longo; a caixa da biblioteca já rola sozinha */
.logrow{ border-bottom:1px solid var(--borda); padding:11px 0; }
.logrow .la{ font-weight:500; color:var(--texto); font-size:14px; }
.logrow .lt{ color:var(--texto-2); font-size:12.5px; margin-top:2px; }

#toast{ position:fixed; left:50%; bottom:90px; transform:translateX(-50%); background:var(--texto);
  color:#fff; padding:11px 20px; border-radius:30px; font-size:14px; opacity:0;
  transition:opacity .25s; z-index:80; pointer-events:none; }
#toast.on{ opacity:.95; }

/* =====================================================================
   9. RECOLHIDO DOS MÓDULOS
   Estas regras estavam dentro de arquivos de comportamento, injetadas em
   tempo de execução. Vieram para cá sem mudar de sentido. Cada bloco diz
   de onde veio, para quem for procurar.
   ===================================================================== */

/* ---- de js/listagem.js: o menu ⋮ da linha e a janela de excluir ---- */
.pmenu{ position:absolute; right:11px; top:50%; transform:translateY(-50%);
  width:40px; height:40px; border:1px solid var(--borda); border-radius:10px;
  background:var(--fundo); color:var(--roxo); font-size:19px; font-weight:700;
  line-height:1; cursor:pointer; }
.pmenu:hover{ background:var(--roxo-tenue); border-color:var(--roxo-claro); }
#menuModal .modal h3{ padding-right:8px; }
.modal .m-sub{ font-size:13px; color:var(--texto-2); margin:-8px 0 14px; }
.mopt{ display:block; width:100%; text-align:left; min-height:46px; padding:12px 15px;
  margin-bottom:8px; border:1px solid var(--borda); border-radius:10px;
  background:var(--papel); color:var(--texto); font-size:14.5px; font-weight:500; cursor:pointer; }
.mopt:hover{ background:var(--roxo-tenue); border-color:var(--roxo-claro); }
.mopt.danger{ border-color:var(--atraso-bg); color:var(--atraso); }
.m-stlbl{ font-size:11.5px; font-weight:700; color:var(--texto-3); text-transform:uppercase;
  letter-spacing:.05em; margin:12px 0 7px; }
.m-sts{ display:grid; grid-template-columns:1fr 1fr; gap:8px; margin-bottom:8px; }
.m-sts button{ min-height:42px; border-radius:10px; border:1px solid var(--borda);
  background:var(--papel); font-weight:600; font-size:13.5px; color:var(--texto-2); cursor:pointer; }
.m-sts button.atual{ background:var(--roxo-tenue); border-color:var(--roxo); color:var(--roxo); }
.m-sts button:disabled{ opacity:.9; }
#excModal .modal p{ margin:0 0 16px; font-size:14.5px; line-height:1.5; color:var(--texto); }
#excModal .modal p b{ color:var(--roxo); }
.modal .exc-acts{ display:flex; gap:10px; }
.modal .exc-acts button{ flex:1; min-height:46px; border-radius:10px; border:none;
  font-weight:600; font-size:14.5px; cursor:pointer; }
#excCancelar{ background:var(--fundo); color:var(--texto); }
#excConfirmar{ background:var(--atraso); color:#fff; }

/* ---- o contador da fila pos-aprovacao (js/fila-pos-aprovacao.js) ----
   Serve aos DOIS modais, e por isso nao vive dentro de #eiModal nem de
   #vpModal: a fila pode ganhar uma terceira pergunta, e um estilo por janela
   seria mais um lugar para esquecer. */
.ei-passo{ display:inline-block; font-size:10.5px; font-weight:700; letter-spacing:.08em;
  text-transform:uppercase; color:var(--roxo); background:var(--roxo-tenue);
  border:1px solid var(--borda); border-radius:20px; padding:2px 10px; margin-bottom:10px; }

/* ---- de js/endereco-instalacao.js: a pergunta de onde instalar (15/set) ----
   REUSA as classes do virar-processo onde elas já servem (.vp-intro, .vp-t) e
   só acrescenta o que é próprio. O selo segue a mesma forma do "criar
   processo", porque é a mesma natureza de aviso: proposta aprovada devendo uma
   resposta. Duas formas diferentes para o mesmo tipo de pendência fariam a
   pessoa aprender duas linguagens onde uma basta. */
.ei-falta{ background:var(--espera-bg); color:var(--espera); border:1px solid transparent;
  cursor:pointer; font:inherit; font-size:11.5px; font-weight:600; padding:2px 9px;
  border-radius:20px; margin-left:2px; white-space:nowrap; }
.ei-falta:hover{ border-color:var(--espera); }
.prop:has(.ei-falta) .p-dono{ display:none; }
.prop .pm > .ei-falta{ flex:none; }
#eiModal .modal{ width:min(520px,100%); }
#eiModal .vp-intro{ font-size:14.5px; line-height:1.5; margin:0; color:var(--texto-2); }
#eiModal .vp-t{ font-size:11.5px; font-weight:700; color:var(--texto-3); text-transform:uppercase;
  letter-spacing:.05em; margin:18px 0 8px; }
#eiModal .ei-cad{ background:var(--roxo-tenue); border:1px solid var(--borda);
  border-radius:10px; padding:11px 13px; margin-top:14px; }
#eiModal .ei-rot{ font-size:10.5px; font-weight:700; letter-spacing:.08em;
  text-transform:uppercase; color:var(--roxo); margin-bottom:3px; }
#eiModal .ei-val{ font-size:14px; line-height:1.45; color:var(--texto-2); }
#eiModal .ei-esc{ display:flex; gap:8px; flex-wrap:wrap; }
/* A ESCOLHA DE ENDEREÇO (v78). Mesma forma das outras listas de opção do app
   (.vp-op), para a pessoa reconhecer o gesto: o círculo na primeira linha do
   texto, e o texto ao lado. */
#eiModal .ei-ops{ display:grid; gap:7px; margin-bottom:14px; }
#eiModal .ei-op{ display:grid; grid-template-columns:18px minmax(0,1fr); gap:11px;
  align-items:start; padding:11px 13px; border:1px solid var(--borda);
  border-radius:10px; cursor:pointer; background:var(--papel); }
#eiModal .ei-op:hover{ border-color:var(--roxo-claro); }
#eiModal .ei-op:has(input:checked){ border-color:var(--roxo); background:var(--roxo-tenue); }
#eiModal .ei-op > input{ width:18px; height:18px; margin:2px 0 0; accent-color:var(--roxo); }
#eiModal .ei-op-txt{ display:block; min-width:0; }
#eiModal .ei-op-txt strong{ display:block; font-size:14px; font-weight:600; line-height:1.3;
  color:var(--texto); }
#eiModal .ei-op-txt small{ display:block; color:var(--texto-2); font-size:12.5px;
  margin-top:2px; line-height:1.45; }
#eiModal .ei-nada{ font-size:13.5px; line-height:1.5; color:var(--texto-2);
  background:var(--fundo); border-radius:8px; padding:10px 12px; margin:0 0 14px; }
#eiModal .ei-lb{ display:block; font-size:12.5px; color:var(--texto-2); margin:12px 0 5px; }
#eiModal .ei-opc{ font-weight:400; color:var(--texto-3); }
#eiModal .ei-dupla{ display:flex; gap:10px; flex-wrap:wrap; }
#eiModal .ei-dupla > div{ flex:1; min-width:140px; }
#eiModal .ei-ok{ font-size:13.5px; color:var(--ok); margin:12px 0 0; }
#eiModal .ei-er{ font-size:13.5px; color:var(--erro,#a3283f); margin:12px 0 0; }

/* ---- de js/virar-processo.js: a marca da ligação com o Pipeline ---- */
.vp-selo{ display:inline-block; margin-left:2px; padding:2px 9px; border-radius:20px;
  font-size:11.5px; font-weight:600; white-space:nowrap; vertical-align:middle; }
.vp-ok{ background:var(--ok-bg); color:var(--ok); }
.vp-falta{ background:var(--espera-bg); color:var(--espera); border:1px solid transparent;
  cursor:pointer; font:inherit; font-size:11.5px; font-weight:600; padding:2px 9px;
  border-radius:20px; margin-left:2px; white-space:nowrap; }
.vp-falta:hover{ border-color:var(--espera); }
#vpModal .modal{ width:min(520px,100%); }
#vpModal .vp-intro{ font-size:14.5px; line-height:1.5; margin:0; color:var(--texto-2); }
#vpModal .vp-t{ font-size:11.5px; font-weight:700; color:var(--texto-3); text-transform:uppercase;
  letter-spacing:.05em; margin:18px 0 8px; }
#vpModal .vp-ops{ display:grid; gap:7px; }
#vpModal .vp-nada{ color:var(--texto-2); font-size:14px; margin:0; }
/* Cada opção: o círculo na primeira linha do texto, e o texto logo ao lado.
   Nada de vão maior que o conteúdo -- a coluna do círculo tem o tamanho do
   círculo, e o resto é do texto. */
#vpModal .vp-op{ display:grid; grid-template-columns:18px minmax(0,1fr); gap:11px;
  align-items:start; padding:11px 13px; border:1px solid var(--borda);
  border-radius:10px; cursor:pointer; background:var(--papel); }
#vpModal .vp-op:hover{ border-color:var(--roxo-claro); }
#vpModal .vp-op:has(input:checked){ border-color:var(--roxo); background:var(--roxo-tenue); }
#vpModal .vp-op > input{ width:18px; height:18px; margin:2px 0 0; accent-color:var(--roxo); }
#vpModal .vp-op-txt{ display:block; min-width:0; }
#vpModal .vp-op-txt strong{ display:block; font-size:14.5px; font-weight:600; line-height:1.3;
  color:var(--texto); }
#vpModal .vp-op-txt small{ display:block; color:var(--texto-2); font-size:12.5px; margin-top:2px; }
#vpModal .vp-op-txt .selo{ margin-top:6px; }
#vpModal #vpAlerta:not(:empty){ margin-top:12px; }
#vpModal .aviso{ font-size:13.5px; line-height:1.5; }
#vpModal select{ width:100%; }
#vpModal .modal-pe{ margin-top:20px; }
#vpModal .vp-erro{ background:var(--atraso-bg); color:var(--atraso); padding:11px 13px;
  border-radius:10px; font-size:14px; margin-top:12px; }
#vpModal .vp-feito{ background:var(--ok-bg); color:var(--ok); padding:13px;
  border-radius:10px; font-size:14.5px; line-height:1.5; }

/* =====================================================================
   10. A CASCA DO HUB DENTRO DO EDITOR
   O editor tem a própria barra roxa, grudada no topo. Duas barras
   grudadas no mesmo topo se sobrepõem, então no editor a do hub sai de
   cena. O Bloco 2 junta as duas numa só — quando isso acontecer, esta
   regra some.
   ===================================================================== */
body.view-editor .hub-topo{ display:none; }

/* O painel do lado fica abaixo da barra do hub, que tem 58px e é sticky. */
.painel{ top:74px; }

/* =====================================================================
   11. O EDITOR EM TELA GRANDE — duas colunas, sem mover nada
   ---------------------------------------------------------------------
   Dez módulos penduram cartão dentro do <main>, e cada um escolhe o lugar
   olhando o vizinho ("depois do card de observações"). Reorganizar o HTML
   em duas colunas faria os dez errarem o lugar de uma vez.

   Então as colunas saem daqui: o #editorWrap vira uma grade, o <main>
   continua sendo o <main> de sempre — mesma ordem, mesmos vizinhos — e o
   resumo entra ao lado como um irmão novo. Nenhum módulo precisa saber.
   ===================================================================== */
#resumoVivo{ display:none; }

@media (min-width:1101px){
  /* `body.view-editor #editorWrap{display:block}` (seção 1) tem especificidade
     maior que `#editorWrap`, então a grade precisa vir com o mesmo peso — senão
     a regra é escrita, lida e simplesmente perde. */
  body.view-editor #editorWrap{ display:grid; grid-template-columns:minmax(0,1fr) 340px;
    column-gap:24px; align-items:start; max-width:1180px; margin:0 auto;
    padding:0 20px 40px; }
  #editTop{ grid-column:1 / -1; margin:0 -20px; padding-left:20px; padding-right:20px; }
  #roBanner{ grid-column:1 / -1; max-width:none; }
  /* A folga de baixo tem que caber a barra fixa de Salvar/Gerar. O formato de
     uma coluna sempre teve 120px por isso; ao montar a grade eu deixei 40 e a
     barra passou a cobrir o topo do primeiro item -- so aparecia o "x" de
     remover, espiando por cima dela. */
  #editorWrap > main{ grid-column:1; max-width:none; padding:20px 0 120px; }

  #resumoVivo{ display:block; grid-column:2; position:sticky; top:80px;
    background:var(--papel); border:1px solid var(--borda); border-radius:13px;
    padding:18px; margin-top:20px; max-height:calc(100vh - 190px); overflow:auto; }
  /* a barra Salvar/Gerar é fixa no rodapé; o resumo não pode ficar embaixo dela */
  #editorWrap .bar{ padding-left:20px; padding-right:20px; }
}

.rv-rot{ font-size:11px; font-weight:700; color:var(--texto-3); text-transform:uppercase;
  letter-spacing:.06em; margin-bottom:8px; }
#resumoVivo h2{ font-size:17px; line-height:1.3; margin:0 0 3px; }
#resumoVivo .rv-escopo{ color:var(--texto-2); font-size:13px; margin-bottom:8px; }
#resumoVivo .rv-topo .selo{ margin:6px 6px 0 0; }
#resumoVivo .rv-vazio{ color:var(--texto-3); font-weight:400; font-size:13.5px; }
#resumoVivo .rv-bloco{ margin-top:20px; padding-top:16px; border-top:1px solid var(--borda); }
#resumoVivo .rv-bloco p{ margin:0; }
#resumoVivo .rv-linha{ display:flex; justify-content:space-between; gap:12px; align-items:baseline;
  padding:6px 0; font-size:13.5px; }
#resumoVivo .rv-linha span{ color:var(--texto-2); }
#resumoVivo .rv-linha b{ font-weight:600; font-variant-numeric:tabular-nums; white-space:nowrap; }
/* a divisão do pacote (Contrato de manutenção): detalhe, menor e recuado */
#resumoVivo .rv-linha.rv-det{ font-size:.86em; padding-left:10px; }
#resumoVivo .rv-linha.rv-det span, #resumoVivo .rv-linha.rv-det b{ color:var(--texto-3); font-weight:500; }
/* 28/out/2026 — as partes com nome (ValorFinal.partes): o título de cada opção,
   os totais e o desconto, com as mesmas cores do resumo da lista */
#resumoVivo .rv-sub{ font-size:10.5px; font-weight:700; letter-spacing:.09em; text-transform:uppercase;
  color:var(--texto-3); margin:10px 0 2px; }
#resumoVivo .rv-linha.rv-tot{ border-top:1px dashed var(--borda); }
#resumoVivo .rv-linha.rv-tot span{ color:var(--texto); font-weight:600; }
#resumoVivo .rv-linha.rv-tot b{ font-size:15px; }
#resumoVivo .rv-linha.rv-desc b{ color:#a11d2e; }
#resumoVivo .rv-bloco-item{ display:flex; align-items:center; gap:9px; padding:4px 0;
  font-size:13.5px; color:var(--texto-3); }
#resumoVivo .rv-bloco-item i{ width:7px; height:7px; border-radius:50%; flex:none;
  background:var(--inerte); }
#resumoVivo .rv-ok{ color:var(--texto); }
#resumoVivo .rv-ok i{ background:var(--ok); }

/* =====================================================================
   12. O EDITOR NO CELULAR — os blocos recolhem
   ---------------------------------------------------------------------
   Dezessete blocos em fila numa tela de 390px é uma rolagem longa. O
   título de cada cartão vira botão e fecha o bloco.

   Todos nascem ABERTOS de propósito: recolhido é decisão de quem está
   usando, nunca do sistema. Um campo que a pessoa não vê é um campo que
   ela não preenche, e o preço disso é uma proposta incompleta no cliente.
   Recolher esconde só na tela — o valor continua lá e continua saindo.
   ===================================================================== */
@media (max-width:1100px){
  #editorWrap main .card > h2.recolhivel{ cursor:pointer; display:flex; align-items:center;
    gap:8px; margin:0; padding:2px 0; user-select:none; }
  #editorWrap main .card > h2.recolhivel::after{ content:""; margin-left:auto; width:9px; height:9px;
    border-right:2px solid var(--texto-3); border-bottom:2px solid var(--texto-3);
    transform:rotate(45deg) translate(-2px,-2px); transition:transform .15s; }
  #editorWrap main .card.recolhido > h2.recolhivel::after{ transform:rotate(-45deg) translate(-1px,1px); }
  #editorWrap main .card.recolhido > *:not(h2){ display:none !important; }
  #editorWrap main .card.recolhido{ padding-bottom:13px; }
  #editorWrap main .card.recolhido > h2 .rv-tem{ margin-left:2px; }
}
.rv-tem{ background:var(--ok-bg); color:var(--ok); border-radius:20px; padding:1px 8px;
  font-size:10.5px; font-weight:600; text-transform:none; letter-spacing:0; }

/* O recado do resumo quando um valor não pode ser afirmado (ver precoPorOpcao
   em js/resumo-vivo.js). Tom de atenção, não de erro: não há nada quebrado,
   há um número que depende da opção. */
#resumoVivo .rv-nota{ margin-top:12px; background:var(--espera-bg); color:var(--espera);
  border-radius:10px; padding:10px 12px; font-size:12.5px; line-height:1.5; }
#resumoVivo .rv-bloco-item span{ display:block; }
#resumoVivo .rv-bloco-item em{ display:block; font-style:normal; font-size:12px;
  color:var(--texto-3); margin-top:1px; }

/* =====================================================================
   12. DIREÇÃO A — "ETAPAS" (rascunho para o Sidney comparar)
   ---------------------------------------------------------------------
   A coluna da esquerda deixa de ser uma pilha de 14 cartões iguais e vira
   um caminho de quatro paradas. Medido antes de mexer, na cópia da
   PROP-2026-0195 com 9 itens: 5.563px de rolagem, 5,9x a altura da
   janela, 64 campos, 40 botões, todos com o mesmo peso.

   ESTAS REGRAS SÓ ESCONDEM. Nenhuma delas manda um bloco APARECER — quem
   decide isso continua sendo a tabela dos modos, na seção 8, e ela é a
   única. Por isso elas vêm DEPOIS dela: mesma especificidade
   (body.classe #id), e a última palavra é "esconde". Bloco que o modo
   tirou continua fora em todas as etapas.
   ===================================================================== */

#etapasBarra{ display:none; }
#etapasPe{ display:none; }

body.editor-etapas #etapasBarra{
  display:grid; grid-template-columns:repeat(4,1fr); gap:8px;
  margin:0 0 20px; padding:0;
}
body.editor-etapas #etapasBarra:has(.etapa-passo:nth-child(2):last-child){ grid-template-columns:repeat(2,1fr); }
body.editor-etapas #etapasBarra:has(.etapa-passo:only-child){ grid-template-columns:1fr; }

.etapa-passo{
  display:flex; align-items:center; gap:9px; text-align:left; cursor:pointer;
  background:var(--papel); border:1px solid var(--borda); border-radius:11px;
  padding:10px 11px; font-family:Inter,sans-serif; color:var(--texto-3);
  border-bottom:3px solid var(--borda);
}
.etapa-passo:hover{ border-color:var(--roxo-suave); }
.etapa-num{
  flex:0 0 auto; width:23px; height:23px; border-radius:50%;
  background:var(--fundo); color:var(--texto-3);
  display:grid; place-items:center; font-size:12px; font-weight:700;
}
.etapa-txt{ display:block; min-width:0; }
.etapa-txt b{ display:block; font-size:13px; font-weight:700; color:var(--texto); line-height:1.2; }
.etapa-txt small{ display:block; font-size:11px; color:var(--texto-3); margin-top:1px;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }

.etapa-passo.on{ border-color:var(--roxo-suave); border-bottom-color:var(--roxo); background:var(--roxo-tenue); }
.etapa-passo.on .etapa-num{ background:var(--roxo); color:#fff; }
.etapa-passo.on .etapa-txt b{ color:var(--roxo); }

body.editor-etapas #etapasPe{
  display:flex; gap:10px; justify-content:space-between; margin:4px 0 0;
}
body.editor-etapas #etapasPe[hidden]{ display:none; }
.etapa-nav{
  padding:13px 18px; border-radius:11px; font-size:14px; font-weight:600;
  font-family:Inter,sans-serif; cursor:pointer; border:1.5px solid var(--roxo);
}
.etapa-nav.voltar{ background:var(--papel); color:var(--roxo); }
.etapa-nav.seguir{ background:var(--roxo); color:#fff; margin-left:auto; }
.etapa-nav:hover{ filter:brightness(1.06); }

/* ---- quem sai em cada etapa (só esconde, nunca mostra) ---- */
body.et-1 #cardItens, body.et-1 #cardCabos, body.et-1 #cardServMensais,
body.et-1 #cardInfraW, body.et-1 #cardServicosW, body.et-1 #cardTorres,
body.et-1 #cardServUnicos, body.et-1 #cardServMensaisSrv, body.et-1 #cardFv,
body.et-1 #cardPagamentos, body.et-1 #cardTotais, body.et-1 #cardDesconto, body.et-1 #cardLocFinal,
body.et-1 #cardTextos, body.et-1 #cardObs, body.et-1 #cardArquivo{ display:none; }

body.et-2 #cardModo, body.et-2 #cardCliente, body.et-2 #cardPeriodo,
body.et-2 #cardPagamentos, body.et-2 #cardTotais, body.et-2 #cardDesconto, body.et-2 #cardLocFinal,
body.et-2 #cardTextos, body.et-2 #cardObs, body.et-2 #cardArquivo{ display:none; }

body.et-3 #cardModo, body.et-3 #cardCliente, body.et-3 #cardPeriodo,
body.et-3 #cardItens, body.et-3 #cardCabos, body.et-3 #cardServMensais,
body.et-3 #cardInfraW, body.et-3 #cardServicosW, body.et-3 #cardTorres,
body.et-3 #cardServUnicos, body.et-3 #cardServMensaisSrv, body.et-3 #cardFv,
body.et-3 #cardTextos, body.et-3 #cardObs, body.et-3 #cardArquivo{ display:none; }

body.et-4 #cardModo, body.et-4 #cardCliente, body.et-4 #cardPeriodo,
body.et-4 #cardItens, body.et-4 #cardCabos, body.et-4 #cardServMensais,
body.et-4 #cardInfraW, body.et-4 #cardServicosW, body.et-4 #cardTorres,
body.et-4 #cardServUnicos, body.et-4 #cardServMensaisSrv, body.et-4 #cardFv,
body.et-4 #cardPagamentos, body.et-4 #cardTotais, body.et-4 #cardDesconto, body.et-4 #cardLocFinal{ display:none; }

/* ADESÃO (13/out/2026): só nos modos com mensalidade, e só na etapa 3.
   As regras de etapa vêm DEPOIS das de modo de propósito: mesma força, e a
   última escrita vence -- a etapa esconde o que o modo mostrou. */
#cardAdesao{ display:none; }
body.modo-locacao #cardAdesao, body.modo-ambas #cardAdesao, body.modo-servicos #cardAdesao,
body.modo-torres #cardAdesao, body.modo-manutencao #cardAdesao{ display:block; }
body.et-1 #cardAdesao, body.et-2 #cardAdesao, body.et-4 #cardAdesao{ display:none; }

/* No celular a barra vira duas linhas de dois, e o rodapé empilha. */
@media (max-width:820px){
  body.editor-etapas #etapasBarra{ grid-template-columns:repeat(2,1fr); }
  .etapa-txt small{ display:none; }
}


/* =====================================================================
   13. O QUE ERA INJETADO PELOS MÓDULOS
   ---------------------------------------------------------------------
   Até o Bloco 3, seis módulos criavam um <style> e o penduravam no <head>
   em tempo de execução. Isso tinha três custos: o estilo do app estava em
   sete lugares, ninguém conseguia ler a cascata inteira sem rodar o app, e
   a folha não podia declarar nada que os módulos fossem sobrescrever sem
   querer — porque estilo injetado vem sempre DEPOIS do arquivo linkado.

   Está tudo aqui agora, na MESMA ORDEM em que os módulos carregam
   (index.html: melhorias-ui, texto-ia, servicos, facevision, arquivo-pdf,
   simulador), para que a cascata entre eles continue exatamente a de
   antes. O texto não foi copiado à mão: foi extraído avaliando a própria
   expressão de cada arquivo, para não haver diferença de digitação.

   O QUE NÃO VEIO, E É DE PROPÓSITO: o CSS do PALCO do documento. O
   js/facevision.js tem um segundo <style> (o `stageCss`) e o
   js/proposta-novo.js monta o dele junto com a página impressa. Aquilo não
   é tela, é papel: mexer ali muda o que o cliente recebe, e o contrato
   deste bloco é que o documento não muda. Ficam onde estão.
   ===================================================================== */

/* ---- de melhorias-ui.js — o cartão de totais, o valor final e os textos do documento ---- */
.totrow{ display:flex; justify-content:space-between; align-items:center; padding:7px 2px; border-bottom:1px dashed #e4dcee; font-size:14px; }
.totrow b{ color:var(--roxo); font-size:15px; }
.pgrow select{ width:100%; }
.pgrow .pgOutro{ margin-top:8px; }
.pgrow .pgCond{ margin-top:8px; }
#locDelta{ margin-top:6px; font-size:13px; }
#locDelta .dpos{ color:#0a7a2f; font-weight:600; }
#locDelta .dneg{ color:#b00020; font-weight:600; }
.detBtn{ margin-top:8px; }
textarea.detalhe{ margin-top:6px; min-height:52px; }

/* ---- de texto-ia.js — o botão de gerar texto por IA e o aviso de revisão ---- */
.ia-aviso{ display:flex; gap:8px; align-items:flex-start; margin:0 0 14px; padding:10px 12px; border-radius:10px; background:#fff7e6; border:1px solid #f0d9a8; font-size:13px; line-height:1.45; color:#6b4e00; }
.ia-aviso b{ color:#5a4200; }
.ia-linha{ display:flex; align-items:center; justify-content:space-between; gap:10px; margin-top:10px; }
.ia-linha label{ margin:0; }
.ia-btn{ flex:0 0 auto; min-height:34px; padding:0 14px; border-radius:9px; border:1.5px solid #d9c6ea; background:#faf7fd; color:var(--roxo); font-size:13px; font-weight:700; }
.ia-btn:disabled{ opacity:.55; }
.ia-estado{ font-size:12.5px; line-height:1.5; margin-top:6px; color:var(--texto-3); }
.ia-estado.erro{ color:#b3261e; }
.ia-estado.ok{ color:#3a7d44; }
.ia-fontes{ font-size:12px; line-height:1.6; margin-top:4px; color:var(--texto-3); }
.ia-fontes a{ color:var(--roxo); }
.ia-fontes .cab{ display:block; font-weight:700; color:#555; }

/* ---- de servicos.js — o modo Serviços ---- */
.svGrid{ display:grid; grid-template-columns:64px 1fr 1fr; gap:8px; margin-top:8px; }
.svSub{ display:flex; align-items:center; min-height:38px; font-weight:700; color:var(--roxo); font-size:14px; }

/* ---- de facevision.js — o cartão do FaceVision (SÓ a tela; o palco do PDF continua em js/facevision.js) ---- */
#cardFv .fvSeg{ display:flex; gap:6px; margin-top:6px; }
#cardFv .fvSeg button{ flex:1; padding:10px 6px; border:1.5px solid var(--roxo); background:#fff; color:var(--roxo); border-radius:9px; font-weight:700; font-size:13px; }
#cardFv .fvSeg button.on{ background:var(--roxo); color:#fff; }
#cardFv .fvCampo{ margin-top:12px; }
#cardFv .fvGrid2{ display:grid; grid-template-columns:1fr 1fr; gap:10px; }
#cardFv .fvGrid3{ display:grid; grid-template-columns:1fr 90px 1fr; gap:8px; align-items:end; }
#cardFv .fvUnidade{ border:1.5px solid var(--roxo); border-radius:11px; padding:12px; margin-top:10px; position:relative; background:#fdfcfe; }
#cardFv .fvUnidade > .rm{ top:10px; right:10px; }
#cardFv .fvUniNome{ font-weight:700; }
#cardFv .fvEntrada{ background:#fff; border:1px solid var(--borda); border-radius:9px; padding:10px; margin-top:8px; position:relative; }
#cardFv .fvEntSub{ display:flex; align-items:center; min-height:36px; font-weight:700; color:var(--roxo); font-size:14px; }
#cardFv .fvUniTot{ display:flex; justify-content:space-between; align-items:center; margin-top:10px; padding-top:8px; border-top:1px dashed var(--borda); font-size:13px; font-weight:700; color:var(--roxo); }
#cardFv .fvFaixa{ position:relative; }
#cardFv .fvAviso{ margin-top:10px; padding:10px 12px; border-radius:9px; font-size:12.5px; line-height:1.55;  color:#7A5200; background:#FFEFC7; border:1px solid #F0D48A; }
#fvQtdWrap{ display:none; }
#cardFv.fvMesmo #fvQtdWrap{ display:block; }
#cardFv.fvMesmo #addFvUnidade{ display:none; }
#cardFv.fvFaixas #fvBlocoUnidade{ display:none; }
#cardFv:not(.fvFaixas) #fvBlocoFaixa{ display:none; }

/* ---- de arquivo-pdf.js — a lista de cópias arquivadas ---- */
#cardArquivo .arq-linha{ display:flex; align-items:center; gap:10px; justify-content:space-between; padding:9px 0; border-bottom:1px solid var(--borda); font-size:13.5px; }
#cardArquivo .arq-linha:last-child{ border-bottom:none; }
#cardArquivo .arq-quando{ font-weight:600; color:#222; }
#cardArquivo .arq-quem{ color:var(--texto-3); font-size:12.5px; }
#cardArquivo .arq-meta{ color:#999; font-size:12px; white-space:nowrap; }
#cardArquivo .arq-abrir{ flex:0 0 auto; min-height:32px; padding:0 12px; border-radius:8px; border:1.5px solid #d9c6ea; background:#faf7fd; color:var(--roxo); font-size:12.5px; font-weight:700; }
#cardArquivo .arq-vazio{ color:var(--texto-3); font-size:13px; line-height:1.6; }
.arq-aviso{ display:flex; gap:8px; align-items:flex-start; margin-top:10px; padding:10px 12px; border-radius:10px; font-size:13px; line-height:1.45; }
.arq-aviso.erro{ background:#fdeceb; border:1px solid #f0c2be; color:#7a1f18; }
.arq-aviso.ok{ background:#eef7ef; border:1px solid #c3e0c8; color:#245c2e; }
.arq-aviso button{ margin-left:auto; min-height:30px; padding:0 10px; border-radius:8px; border:1.5px solid currentColor; background:transparent; color:inherit; font-weight:700; font-size:12.5px; }

/* ---- de simulador.js — o simulador inteiro ---- */
#simWrap{ display:none; }
/* quem acende o painel é a classe, posta por js/simulador.js */
#simWrap.on{ display:block; }
#simAviso{ position:sticky; top:0; z-index:5; background:#fde8e8; border:1.5px solid #e7b6b3; color:#8f1d16; font-weight:700; font-size:13px; text-align:center; padding:10px 12px; border-radius:10px; margin-bottom:12px; }
.simBtns{ display:flex; gap:10px; }
.simBtns button{ flex:1; min-height:42px; border:1.5px dashed var(--roxo); background:#fff; color:var(--roxo); border-radius:9px; font-weight:700; font-size:13px; }
#simToggle{ width:100%; min-height:40px; margin-top:12px; border:1.5px solid #e2d7ec; background:#faf7fd; color:var(--roxo); border-radius:9px; font-weight:700; font-size:13px; }
#simLista{ margin-top:10px; display:none; }
.simRow{ border:1.5px solid #eee3f5; border-radius:10px; padding:10px 12px; margin-bottom:8px; background:#fff; }
.simRow.on{ border-color:var(--roxo); background:#faf7fd; }
.simRowHead{ display:flex; gap:10px; align-items:flex-start; }
.simRowHead input[type=checkbox]{ width:22px; height:22px; margin:0; flex:none; accent-color:var(--roxo); }
.simRowHead .sNome{ flex:1; font-weight:600; font-size:13.5px; line-height:1.35; color:#222; }
.simRowHead .sRm{ flex:none; width:30px; height:30px; border:none; background:#f6f0fa; color:#b3261e; border-radius:8px; font-weight:700; font-size:14px; }
.sInfo{ font-size:12px; color:var(--texto-3); margin:4px 0 0 32px; }
.simTag{ display:inline-block; background:#fde8e8; color:#b3261e; font-size:10.5px; font-weight:700; border-radius:20px; padding:1px 8px; margin-left:6px; vertical-align:middle; }
.simRowBody{ display:none; margin:10px 0 0 32px; }
.simRow.on .simRowBody{ display:block; }
.sGrid{ display:grid; grid-template-columns:1fr 1fr; gap:8px; }
.sGrid .lbl, .simCtl label{ display:block; font-size:10.5px; color:var(--texto-3); font-weight:700; margin-bottom:3px; }
.simCtl label{ font-size:12px; color:var(--roxo); }
.sGrid input, .simCtl input{ width:100%; padding:8px; }
.sGrid .sVal{ display:flex; align-items:center; min-height:37px; padding:0 2px; font-weight:700; color:var(--roxo); font-size:14px; font-variant-numeric:tabular-nums; }
.sRef{ font-size:12px; color:var(--texto-3); margin-top:6px; }
.simCtl{ display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-top:10px; }
#simPeriodoWrap{ margin-top:2px; }
#simPeriodoWrap label{ display:block; font-size:12px; font-weight:700; color:var(--roxo); margin-bottom:4px; }
.simCards{ display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-top:14px; }
.simCard{ background:#faf7fd; border:1.5px solid #e2d7ec; border-radius:10px; padding:10px 12px; }
.simCard .k{ font-size:11px; font-weight:700; color:#7a6e85; text-transform:uppercase; letter-spacing:.04em; }
.simCard .v{ font-size:17px; font-weight:700; color:#222; margin-top:2px; font-variant-numeric:tabular-nums; }
.simCard.neg .v{ color:#b3261e; }
.simCard.destaque{ grid-column:1 / -1; background:var(--roxo); border-color:var(--roxo); }
.simCard.destaque .k, .simCard.destaque .v{ color:#fff; }
.simCard.destaque .v{ font-size:22px; }
#simQuebra{ grid-column:1 / -1; font-size:12px; color:var(--texto-3); text-align:center; margin-top:-4px; }
#simQuebra .dpos{ color:#0a7a2f; font-weight:700; }
#simQuebra .dneg{ color:#b3261e; font-weight:700; }
#simEditWrap{ grid-column:1 / -1; }
.simMenRow{ display:grid; grid-template-columns:1fr 88px 88px 34px; gap:8px; align-items:end; margin-bottom:8px; }
.simMenRow .lbl{ display:block; font-size:10.5px; color:var(--texto-3); font-weight:700; margin-bottom:3px; }
.simMenRow input{ width:100%; padding:8px; }
.simMenRow .sRm{ width:34px; height:34px; border:none; background:#fde8e8; color:#b3261e; border-radius:8px; font-weight:700; }
#simBusca{ margin-top:12px; display:none; }

/* =====================================================================
   14. O SIMULADOR EM PAINEL DE DUAS COLUNAS
   ---------------------------------------------------------------------
   O simulador é um mini-sistema à parte (js/simulador.js, 429 linhas) e
   era a tela que mais sofria com a coluna estreita: três cartões
   empilhados, e o resultado — margem, imposto, lucro, ponto de equilíbrio
   — no fim de tudo. Quem mexia num item rolava até o pé para ver o efeito,
   e rolava de volta. O número e a alavanca ficavam longe um do outro.

   Aqui o "Fechamento da simulação" vira painel FIXO à direita, e os dois
   cartões de entrada ficam na esquerda: mexeu, viu. É o mesmo movimento do
   resumo vivo do editor, e de propósito — duas telas que fazem a mesma
   promessa devem fazê-la do mesmo jeito.

   COMO, E O QUE NÃO MUDA
   Só grade, por cima do DOM que já existia: nenhum bloco mudou de lugar no
   js/simulador.js, nenhum cálculo foi tocado, nenhum campo mudou de nome.
   Em tela estreita a grade não existe e tudo volta a ser uma coluna só, na
   ordem de sempre.

   PERMISSÃO NÃO É LAYOUT, E ESTA SEÇÃO NÃO ENCOSTA NISSO. Quem vê custo
   continua sendo decidido em `perfis.ve_custo` e na RPC do catálogo; a aba
   inteira nasce escondida (js/simulador.js) e a folha não a acende. Uma
   regra de CSS não pode virar porta de entrada para número de custo.
   ===================================================================== */

@media (min-width:1080px){
  #simWrap.on{
    display:grid; grid-template-columns:minmax(0,1fr) 420px;
    gap:18px; align-items:start;
  }
  /* o aviso de uso interno atravessa as duas colunas: ele vale para a tela
     toda, e encolhido numa coluna pareceria rodapé de um cartão só */
  #simWrap > #simAviso{ grid-column:1 / -1; }
  /* entrada à esquerda, na ordem em que já estavam */
  /* `nth-child`, e nao `nth-of-type`: TODOS os filhos aqui são <div>, e
     `nth-of-type` conta por TIPO, não por classe. `.card:nth-of-type(1)`
     pedia "o 1º div, que também seja .card" — e o 1º div é o #simAviso, que
     não é cartão. A regra não casava com ninguém, as outras casavam
     deslocadas de um, e o fechamento ficava sem lugar: a grade existia e a
     tela continuava numa coluna só, sem erro nenhum a reclamar. */
  #simWrap > .card:nth-child(2){ grid-column:1; grid-row:2; }
  #simWrap > .card:nth-child(3){ grid-column:1; grid-row:3; }
  /* o fechamento à direita, acompanhando a rolagem.
     `align-self:start` é o que permite o sticky funcionar dentro da grade:
     sem ele o item estica na altura da linha e nunca há o que grudar. */
  #simWrap > .card:nth-child(4){
    grid-column:2; grid-row:2 / span 2; align-self:start;
    position:sticky; top:74px; max-height:calc(100vh - 96px); overflow:auto;
  }
  /* no painel os cartões de número ficam mais estreitos; duas colunas ainda
     cabem, e o destaque continua atravessando */
  #simWrap > .card:nth-child(4) .simCards{ gap:8px; }
}

/* Em tela muito larga o painel pode respirar um pouco mais. */
@media (min-width:1440px){
  #simWrap.on{ grid-template-columns:minmax(0,1fr) 460px; }
}

/* =====================================================================
   15. FILTROS E ORDENAÇÃO DA LISTA
   ---------------------------------------------------------------------
   A barra da biblioteca já é flex com quebra de linha, então os controles
   novos (vendedor, modelo e ordenação) cabem sem grade nova. O que falta é
   distinguir ORDENAR de FILTRAR: são cinco controles em fila, e sem uma
   marca o quinto parece mais um filtro. Filtro esconde linha; ordenação só
   troca a ordem — confundir os dois é o caminho para alguém procurar uma
   proposta que está ali, só que embaixo.
   ===================================================================== */
.filtros .f-busca{ flex:1 1 220px; min-width:180px; }
.filtros .f-ord{
  margin-left:auto; font-size:12px; font-weight:600; color:var(--texto-3);
  white-space:nowrap; align-self:center;
}
.filtros #fOrdem{ min-width:190px; }
.filtros .f-conta{ flex:0 0 auto; }
@media (max-width:760px){
  /* no celular a barra já quebra sozinha; o rótulo perde o empurrão para a
     direita, senão ele fica sozinho numa linha só dele */
  .filtros .f-ord{ margin-left:0; }
  .filtros .f-busca{ flex:1 1 100%; }
}

/* Cópia que está no bucket e não tem registro: o cartão passou a mostrá-la
   (js/arquivo-pdf.js). Ela precisa se distinguir sem parecer erro do usuário —
   o arquivo existe e abre; o que falta é o registro. */
.arq-linha.arq-sem-registro{ background:var(--espera-bg); border-color:var(--espera); }
.arq-linha.arq-sem-registro .arq-quem{ color:var(--espera); font-weight:600; }

/* =====================================================================
   16. DOCUMENTOS DE PROPOSTAS APAGADAS
   ---------------------------------------------------------------------
   Agrupado por proposta, e nao uma linha por arquivo: a Bahia Blanca tem
   15 PDFs da mesma proposta, e quinze linhas iguais empurrariam as outras
   treze para fora da tela. O cabecalho identifica o cliente uma vez; as
   linhas de baixo sao as versoes do documento, da mais nova para a mais
   velha.
   ===================================================================== */
.perdido{ border:1px solid var(--borda); border-radius:10px; margin-bottom:10px;
  background:var(--papel); overflow:hidden; }
.perdido-cab{ display:flex; gap:10px; align-items:baseline; flex-wrap:wrap;
  padding:10px 13px; background:var(--roxo-tenue); border-bottom:1px solid var(--borda); }
.perdido-num{ font-weight:600; color:var(--roxo); font-size:13px;
  font-variant-numeric:tabular-nums; }
.perdido-cli{ font-weight:600; font-size:14.5px; flex:1 1 auto; min-width:0;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.perdido-qtd{ font-size:12px; color:var(--texto-3); white-space:nowrap; }
.perdido-arq{ display:flex; gap:12px; align-items:center; padding:8px 13px;
  font-size:13px; color:var(--texto-2); border-top:1px solid var(--borda); flex-wrap:wrap; }
.perdido-arq:first-of-type{ border-top:0; }
.pa-quando{ font-variant-numeric:tabular-nums; white-space:nowrap; }
.pa-quem{ flex:1 1 140px; min-width:0; overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; }
.pa-modo{ font-size:11.5px; color:var(--texto-3); text-transform:uppercase;
  letter-spacing:.04em; }
.pa-tam{ font-variant-numeric:tabular-nums; color:var(--texto-3); white-space:nowrap; }
.pa-abrir{ margin-left:auto; }
@media (max-width:760px){
  /* no celular a linha quebra; o botao ganha a largura toda para virar alvo */
  .pa-quem{ flex:1 1 100%; } .pa-abrir{ margin-left:0; flex:1 1 100%; }
}

/* ═══ ENDEREÇO EM PEDAÇOS, com o CEP na frente (27/set/2026) ═══
   js/endereco-pedacos.js desenha; aqui só a aparência.
   O bloco é recuado e com filete à esquerda para ler como UM assunto: sem
   isso, oito campos soltos no meio do cartão parecem oito perguntas
   independentes, e a pessoa não vê que são um endereço só. */
.ep-bloco{ border-left:3px solid var(--borda); padding-left:12px; margin:2px 0 4px; }
.ep-msg{ font:400 12.5px Inter,sans-serif; color:var(--texto-3); margin:5px 0 2px; min-height:1em; }
.ep-campos[hidden]{ display:none; }
.ep-opc{ font-weight:400; color:var(--texto-3); }
.ep-dica{ font:400 12px Inter,sans-serif; color:var(--texto-3); margin:4px 0 2px; }
/* duas colunas onde cabem duas; no celular viram uma, sem nada encolher para
   um tamanho que não dá para tocar. Provado a 390px. */
.ep-dupla{ display:grid; grid-template-columns:1fr 1fr; gap:0 10px; align-items:end; }
@media (max-width:460px){ .ep-dupla{ grid-template-columns:1fr; } .ep-dupla > div[style*="90px"]{ max-width:110px !important; } }

/* ═══════════════════════════════════════════════ 14. SOLICITAÇÕES DE PROPOSTA
   A aba onde o pedido que chegava por WhatsApp passa a ter dono e estado.
   Usa as peças da biblioteca (.cartao, .selo, .btn, .modal, .recolhe-t); o que
   está aqui é só o que não existia. */
#solicWrap { padding: 4px 0 24px; }
.solic-barra { display:flex; gap:10px; align-items:center; flex-wrap:wrap; margin:10px 0 14px; }
.solic-ver { display:flex; gap:6px; margin-left:auto; }

.solic-cartao { padding:14px 16px; margin-bottom:10px; }
.solic-topo { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-bottom:6px; }
.solic-topo h3 { font:600 15.5px Sora,Inter,sans-serif; margin:0; flex:1; min-width:180px; }
.solic-pedido { font-size:14px; line-height:1.5; color:var(--texto); margin:0 0 8px; white-space:pre-wrap; }
.solic-pe { font-size:12.5px; color:var(--texto-3); }

/* O QUE EMPERROU. É a única coisa em vermelho nesta tela, de propósito: se
   tudo grita, o que importa deixa de ser lido. */
.solic-parada { margin-top:8px; padding:7px 10px; border-radius:8px;
  background:#fdeceb; color:#8c2f26; font-size:13px; font-weight:600; }
.solic-ligada { margin-top:8px; font-size:13px; color:var(--texto-2); }
.solic-botoes { display:flex; gap:7px; flex-wrap:wrap; margin-top:11px; }

.solic-sumario-cab { font-size:14px; color:var(--texto-2); margin:2px 0 12px;
  padding-bottom:9px; border-bottom:1px solid var(--borda); }

.solic-achados { display:flex; flex-direction:column; gap:3px; margin:-4px 0 8px; }
.solic-achado { text-align:left; appearance:none; background:var(--papel); cursor:pointer;
  border:1px solid var(--borda); border-radius:8px; padding:8px 10px; font:400 13.5px Inter,sans-serif; }
.solic-achado:hover { border-color:var(--roxo); }
.solic-achado small { color:var(--texto-3); }

.solic-ops { display:flex; flex-direction:column; gap:6px; max-height:46vh; overflow:auto; }
.solic-op { display:flex; gap:9px; align-items:flex-start; cursor:pointer;
  border:1px solid var(--borda); border-radius:9px; padding:9px 11px; font-size:13.5px; }
.solic-op:hover { border-color:var(--roxo); }
.solic-op input { margin-top:3px; }

/* ═══════════════════════════════════════════════ 15. A SUGESTÃO DA RECEITA
   O cadastro manda, a Receita sugere. A caixa nunca é vermelha nem verde de
   alarme: é uma informação de outra fonte, não um erro nem uma confirmação. */
.receita-sugestao { border:1px solid var(--borda); border-left:3px solid var(--roxo);
  border-radius:9px; padding:10px 12px; margin:6px 0 12px; background:var(--papel); }
.receita-t     { font-size:12.5px; color:var(--texto-3); margin:0 0 3px; }
.receita-nome  { font:600 14px Inter,sans-serif; color:var(--texto); margin:0 0 4px; }
.receita-end   { font-size:13.5px; line-height:1.45; color:var(--texto); margin:0; }
.receita-nota  { font-size:12.5px; color:var(--texto-2); margin:7px 0 8px; }
.receita-ok    { font-size:12.5px; color:#166534; margin:7px 0 0; }
.receita-aviso { color:#a16207; font-size:13px; margin:0; }
/* De qual serviço veio. Com quatro fontes possíveis, "a Receita diz" sem dizer
   por onde esconde de quem confere — e quando duas discordam, saber a fonte é
   a primeira coisa que se pergunta. Discreto de propósito: é procedência, não
   notícia. */
.receita-fonte { color:var(--texto-3); font-weight:400; }
#cliReceita .btn { margin:0; }

/* recebimentos e recibos (29/out/2026): só na etapa 3, "Quanto fica" */
body.et-1 #cardRecibos, body.et-2 #cardRecibos, body.et-4 #cardRecibos{ display:none !important; }
