/* ERP Samantha — Fatia 7. Baseado no mockup APROVADO pelo Paulo (24/07). */
/* Tipografia hospedada no VPS (correção do Paulo, 25/07) — nada de CDN. */
@font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:swap;
  src:url('fonts/inter-400.woff2') format('woff2')}
@font-face{font-family:'Inter';font-style:normal;font-weight:600;font-display:swap;
  src:url('fonts/inter-600.woff2') format('woff2')}
@font-face{font-family:'Poppins';font-style:normal;font-weight:400;font-display:swap;
  src:url('fonts/poppins-400.woff2') format('woff2')}
@font-face{font-family:'Poppins';font-style:normal;font-weight:600;font-display:swap;
  src:url('fonts/poppins-600.woff2') format('woff2')}
@font-face{font-family:'Poppins';font-style:normal;font-weight:700;font-display:swap;
  src:url('fonts/poppins-700.woff2') format('woff2')}
:root{
  --azul:#1565C0; --azul-esc:#0D47A1; --azul-claro:#E8F1FC; --fundo:#F4F7FB;
  --cinza:#5A6B7B; --verde:#2E7D32; --verde-bg:#E8F5E9; --verm:#C62828;
  --verm-bg:#FDECEA; --lar:#EF6C00; --lar-bg:#FFF3E0; --borda:#E3EAF2;
}
*{box-sizing:border-box}
body{margin:0;background:var(--fundo);font-family:'Inter',system-ui,sans-serif;color:#1B2A3A}
h1,h2,h3,h4,.num{font-family:'Poppins',system-ui,sans-serif;margin:0}

.aviso{background:var(--lar-bg);color:#8a4b00;border-bottom:2px solid #ffcc80;
  padding:8px 22px;font-size:13px;font-weight:600;text-align:center}

.topo{background:#fff;border-bottom:1px solid var(--borda);padding:14px 22px;
  display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.marca{font-family:'Poppins';font-weight:700;color:var(--azul-esc);font-size:19px}
.marca span{color:var(--azul)}
.chip{background:var(--verde-bg);color:var(--verde);border-radius:999px;
  padding:5px 13px;font-size:12px;font-weight:600}
.topo nav{display:flex;gap:8px;flex-wrap:wrap;margin-left:auto}
.topo nav a{background:#fff;border:1px solid var(--borda);border-radius:14px;
  padding:8px 14px;font-size:13px;font-weight:600;color:var(--cinza);
  text-decoration:none;transition:.15s}
.topo nav a:hover{border-color:var(--azul);color:var(--azul)}
.topo nav a.on{background:var(--azul);color:#fff;border-color:var(--azul)}

/* [M-79 ampliado · 04/08] TODA tela usa a largura, não só as listagens.
   O espaço morto nas laterais era do tempo em que o ERP era formulário; hoje
   quase toda tela mostra lista, card ou painel — e esses ganham com a
   largura. O teto existe para o texto não virar linha de 3000px em monitor
   ultrawide. */
.tela{padding:20px 22px 60px;max-width:1750px;margin:0 auto}

.card{background:#fff;border-radius:20px;padding:22px;border:1px solid var(--borda);
  box-shadow:0 2px 10px rgba(21,101,192,.05);margin-bottom:18px}
.card h3{font-size:16px;color:var(--azul-esc);margin-bottom:4px}
.sub{color:var(--cinza);font-size:13px;margin-bottom:16px}
.grade2{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:18px}
/* [M-75 · 04/08] card dentro do grid nao leva margem propria: quem
   espaca ali e o gap. Fora do grid ele segue o padrao da casa
   (margin-bottom:18px). Antes cada template decidia no inline, e o
   mesmo parcial (Pecas) saia com vao zero na triagem e certo na
   bancada — a irregularidade que o Paulo viu antes do Historico. */
.grade2 > .card{margin-bottom:0}

label{display:block;font-size:12px;font-weight:600;color:var(--cinza);margin:12px 0 5px}
/* [M-12 · 30/07] `textarea` NAO estava aqui: toda caixa de texto do ERP
   nascia com a largura padrao do navegador (~20 colunas) enquanto input e
   select ocupavam a linha inteira. O Paulo viu na caixa de comentario, mas
   era de TODAS as telas — o conserto e nesta linha, nao no bloco. */
input,select,textarea{width:100%;padding:11px 13px;border:1px solid var(--borda);border-radius:12px;
  font-family:'Inter';font-size:14px;background:#fff}
input:focus,select:focus{outline:2px solid var(--azul-claro);border-color:var(--azul)}
.btn{background:var(--azul);color:#fff;border:0;border-radius:14px;padding:12px 20px;
  font-family:'Poppins';font-weight:600;font-size:14px;cursor:pointer;margin-top:16px}
.btn:hover{background:var(--azul-esc)}
.btn.sec{background:#fff;color:var(--azul);border:1px solid var(--azul)}
.btn.peq{padding:7px 13px;font-size:12px;margin:0;border-radius:11px}
.btn.perigo{background:#fff;color:var(--verm);border:1px solid var(--verm)}

table{width:100%;border-collapse:collapse;font-size:13px}
th{text-align:left;color:var(--cinza);font-size:11px;text-transform:uppercase;
  letter-spacing:.5px;padding:10px 8px;border-bottom:2px solid var(--borda)}
td{padding:12px 8px;border-bottom:1px solid #F0F4F8}
/* [1003 · 04/09] ZEBRA em TODAS as listas (regra geral do Paulo, como o
   GestãoClick): linha par um tom abaixo. Vive ANTES dos :hover — mesma
   especificidade, e no CSS o último ganha: o hover continua por cima. */
tbody tr:nth-child(even) td{background:#F4F7FB}
tr:hover td{background:#FAFCFF}
.tag{display:inline-block;border-radius:999px;padding:3px 10px;font-size:11px;font-weight:600}
.t-ok{background:var(--verde-bg);color:var(--verde)}
.t-esp{background:var(--lar-bg);color:var(--lar)}
.t-off{background:#ECEFF1;color:#607D8B}
.t-novo{background:var(--verm-bg);color:var(--verm)}
.t-erro{background:var(--verm-bg);color:var(--verm)} /* [D8 · 14/09] Vencido, A definir, recusadas — a etiqueta vermelha que faltava */

/* =========================================================================
   M-97 · TAGS DA OS
   O mesmo chip aparece em nove lugares: ADM › Tags, o cabeçalho da OS e as
   sete listagens. O desenho dele mora AQUI e em erp/_os_tags.html — quando o
   mockup do Paulo chegar, são esses dois arquivos que mudam, e nenhuma das
   sete listas precisa ser tocada de novo.

   A cor vem do catálogo, então entra por `style` inline (é dado, não folha de
   estilo). O tratamento é o do chip de situação no topo da OS: fundo com alfa
   22 e borda na cor cheia — assim qualquer cor que o Paulo escolher continua
   com texto legível, sem ninguém ter de calcular contraste na tela de ADM.
   ========================================================================= */
.tagos{display:inline-flex;align-items:center;gap:4px;border-radius:999px;
  padding:2px 9px;font-size:11px;font-weight:600;line-height:18px;
  border:1px solid;white-space:nowrap;vertical-align:middle}
.tagos.off{opacity:.5}          /* aposentada no catálogo, ainda aplicada aqui */
/* o ✕ é botão de formulário, mas dentro do chip ele não pode parecer botão */
.tagos button.x{background:none;border:0;padding:0 0 0 1px;margin:0;color:inherit;
  font-size:12px;line-height:1;cursor:pointer;opacity:.55}
.tagos button.x:hover{opacity:1}
.tagos-linha{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
/* [complemento 05/08] a fila de chips ao lado do chip da SITUAÇÃO, nas telas
   que mostram o número da OS */
.tagos-fila{display:inline-flex;gap:5px;flex-wrap:wrap;vertical-align:middle}
/* na LISTA os chips vêm junto da coluna Condição, menores e sem quebrar a
   coluna: a linha da tabela é de varredura rápida, não de leitura */
.tagos-lista{display:flex;gap:4px;flex-wrap:wrap;margin-top:3px}
.tagos-lista .tagos{font-size:10px;padding:1px 7px;line-height:15px}

.no{padding:8px 10px;border-radius:11px;font-size:13px;display:flex;
  align-items:center;gap:8px}
.no:hover{background:var(--azul-claro)}

/* =========================================================================
   ADM › PERMISSÕES  [refeito 27/07 — ajuste 1 do Paulo]
   Antes eram duas colunas e a árvore vivia espremida em 340px, quebrando
   "Pastas do NAS" em três linhas. Agora as seções empilham em largura total
   e cada função ocupa UMA linha: código · nome · grupo · mover.
   ========================================================================= */
.perm-topo{max-width:420px}                 /* o seletor de pessoa não precisa
                                               de 1.100px de largura */
.gr{max-width:900px}                        /* checkbox perto do nome da função */
.gr th:not(:first-child){text-align:center;width:88px}
.gr td:not(:first-child){text-align:center}

.perm-arv{border:1px solid var(--borda);border-radius:16px;background:#fff;
  overflow:hidden}
.perm-cab{display:flex;align-items:center;gap:9px;flex-wrap:wrap;
  padding:11px 13px;background:#F8FAFD;border-bottom:1px solid var(--borda)}
.perm-cab input{flex:1;min-width:210px;max-width:360px;margin:0;
  padding:9px 13px;font-size:13px}
.perm-achou{font-size:12px;color:var(--cinza);font-weight:600}
.perm-corpo{max-height:68vh;overflow-y:auto;padding:8px 8px 12px}
.perm-corpo::-webkit-scrollbar{width:9px}
.perm-corpo::-webkit-scrollbar-thumb{background:#D8E2EE;border-radius:5px}

.perm-grupo{margin:1px 0}
.perm-grupo>summary{list-style:none;cursor:pointer;display:flex;align-items:center;
  gap:9px;padding:10px 12px;border-radius:12px;font-family:'Poppins',sans-serif;
  font-weight:600;font-size:13.5px;color:var(--azul-esc)}
.perm-grupo>summary::-webkit-details-marker{display:none}
.perm-grupo>summary:hover{background:var(--azul-claro)}
.perm-seta{color:#89A9D6;font-size:13px;width:11px;display:inline-block;
  transition:transform .15s}
.perm-grupo[open]>summary .perm-seta{transform:rotate(90deg)}
.perm-dentro{margin-left:15px;border-left:2px dashed var(--borda);padding-left:7px}

/* [29/07] A coluna do codigo era de 96px e o chip nao tinha corte: codigo
   longo (7.4.centros-de-custo, 15.1.produtividade-por-tecnico) transbordava
   POR CIMA do nome do item e virava sombra sobreposta ao texto. Agora o chip
   corta com reticencias e o codigo inteiro fica no title (hover). */
.perm-linha{display:grid;grid-template-columns:150px minmax(0,1fr) auto;
  align-items:center;gap:14px;padding:8px 12px;border-radius:12px;
  font-size:13.5px;white-space:nowrap;min-height:44px}
.perm-linha:hover{background:var(--azul-claro)}
.perm-linha .cod{justify-self:start;font-family:ui-monospace,monospace;
  font-size:12px;background:#F5F7FA;color:var(--azul-esc);
  padding:3px 8px;border-radius:6px;
  display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.perm-linha .nm{overflow:hidden;text-overflow:ellipsis;min-width:0}
.perm-linha .ar{color:var(--cinza);font-size:11px;font-weight:600;
  text-transform:uppercase;letter-spacing:.4px;margin-left:8px}
.perm-acoes{display:flex;align-items:center;gap:6px}
.perm-acoes form{display:flex;align-items:center;gap:6px;margin:0}
.perm-acoes select{width:auto;min-width:180px;margin:0;padding:7px 10px;
  font-size:12px;border-radius:10px}
.perm-cont{background:#ECEFF1;color:#546E7A;border-radius:999px;
  padding:1px 9px;font-size:11px;font-weight:600}
.perm-nc>summary{background:var(--verm-bg);color:var(--verm);
  border:1.5px dashed var(--verm);margin-top:10px}
.perm-nc>summary:hover{background:#FBDDD8}

.perm-rodape{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  margin-bottom:18px}
.perm-rodape form{margin:0}
.perm-novo{display:grid;grid-template-columns:1fr 1fr auto;gap:12px;
  align-items:end;margin-top:14px;width:100%}
.perm-novo label{margin-top:0}
@media(max-width:820px){
  .perm-linha{grid-template-columns:110px minmax(0,1fr);white-space:normal}
  .perm-acoes{grid-column:1/-1}
  .perm-novo{grid-template-columns:1fr}
}
.qd{width:19px;height:19px;accent-color:var(--azul);cursor:pointer}
.canal{font-size:10px;color:var(--cinza);display:block;font-weight:500;margin-top:2px}

.mono{font-family:ui-monospace,monospace;font-size:12px;background:#F5F7FA;
  padding:3px 7px;border-radius:6px;color:var(--azul-esc);word-break:break-all}
.nota{background:var(--azul-claro);border-left:4px solid var(--azul);border-radius:0 12px 12px 0;
  padding:13px 16px;font-size:13px;margin-top:14px;color:#123}
.alerta{background:var(--verm-bg);border-left:4px solid var(--verm);border-radius:0 12px 12px 0;
  padding:13px 16px;font-size:13px;margin-top:14px}
.okbox{background:var(--verde-bg);border-left:4px solid var(--verde);border-radius:0 12px 12px 0;
  padding:13px 16px;font-size:13px;margin-top:14px}
.login{max-width:400px;margin:36px auto}
.centro{text-align:center}
code{font-family:ui-monospace,monospace;font-size:12px;background:#F5F7FA;padding:2px 6px;border-radius:5px}
.olho{background:none;border:none;cursor:pointer;font-size:14px;padding:0 4px}

/* =========================================================================
   MENU LATERAL RETRÁTIL + TOPO  [MENU v2 — 26/07]
   ========================================================================= */
:root{ --lat:262px; --lat-min:0px; --topo-h:56px; }

body.com-menu{ padding-left:var(--lat); padding-top:var(--topo-h);
  transition:padding-left .18s ease }
body.com-menu.menu-fechado{ padding-left:var(--lat-min) }

/* ---------- lateral ---------- */
/* [2] o azul veio um tom mais claro, na familia do titulo "Receber
   equipamento" (--azul-esc #0D47A1): #0A3579 e o mesmo azul escurecido 25%,
   escuro o bastante para texto branco e azul o bastante para nao virar preto */
.lateral{ position:fixed; top:0; left:0; bottom:0; width:var(--lat); z-index:40;
  background:#0A3579; color:#D3E1F5; display:flex; flex-direction:column;
  transition:transform .18s ease; box-shadow:2px 0 12px rgba(0,0,0,.14) }
.menu-fechado .lateral{ transform:translateX(-100%) }

/* [3] logo maior e o nome da empresa em branco, os dois clicaveis */
.lat-topo{ display:flex; align-items:center; gap:10px; padding:14px 12px 14px 14px;
  border-bottom:1px solid rgba(255,255,255,.14); min-height:var(--topo-h) }
.lat-identidade{ display:flex; align-items:center; gap:10px; flex:1;
  text-decoration:none; min-width:0 }
/* [27/07] O logo estava dentro de uma pílula branca e nascia torto: a caixa
   tinha proporção fixa e a arte, não. Sem fundo, respirando no azul, a marca
   se alinha sozinha — e fica igual à do topo do WhatsApp. */
.lat-topo img{ height:38px; max-width:130px; width:auto; object-fit:contain;
  display:block; background:none; padding:0; border-radius:0 }
.lat-marca{ font-family:'Poppins',sans-serif; font-weight:700; color:#fff;
  font-size:14.5px; line-height:1.15; flex:1; min-width:0 }
.lat-toggle,.lat-abrir{ background:none; border:0; color:#9DB8DE; cursor:pointer;
  font-size:17px; padding:3px 7px; border-radius:8px }
.lat-toggle:hover,.lat-abrir:hover{ background:rgba(255,255,255,.13); color:#fff }

.lat-nav{ flex:1; overflow-y:auto; padding:8px 0 }
.lat-nav::-webkit-scrollbar{ width:7px }
.lat-nav::-webkit-scrollbar-thumb{ background:rgba(255,255,255,.20); border-radius:4px }

.lat-grupo{ margin-bottom:1px }
.lat-cab{ width:100%; display:flex; align-items:center; gap:10px; background:none;
  border:0; color:#D3E1F5; padding:10px 14px; cursor:pointer; font-size:13.5px;
  font-family:'Inter',sans-serif; font-weight:600; text-align:left;
  text-decoration:none }
.lat-cab:hover{ background:rgba(255,255,255,.10); color:#fff }
.lat-direto.on{ background:rgba(255,255,255,.16); color:#fff }
.lat-ico{ font-size:15px; width:20px; text-align:center }
.lat-txt{ flex:1 }
.lat-seta{ font-size:15px; transition:transform .15s; color:#89A9D6 }
.lat-grupo.aberto .lat-seta{ transform:rotate(90deg) }
.lat-itens{ display:none; padding:2px 0 6px }
.lat-grupo.aberto .lat-itens{ display:block }

/* [4] subsecao: rotulo em azul royal claro, com seta propria e recolhimento */
.lat-bloco{ margin:2px 0 }
.lat-sub{ width:100%; display:flex; align-items:center; gap:6px; background:none;
  border:0; cursor:pointer; text-align:left;
  font-size:10.5px; text-transform:uppercase; letter-spacing:.7px;
  color:#7FB2FF; padding:9px 14px 5px 28px; font-weight:700;
  font-family:'Inter',sans-serif }
.lat-sub:hover{ color:#B9D6FF; background:rgba(255,255,255,.06) }
.lat-sub-seta{ font-size:13px; transition:transform .15s; display:inline-block;
  width:10px; color:#5E8FD6 }
.lat-bloco.aberto .lat-sub-seta{ transform:rotate(90deg) }
.lat-bloco-itens{ display:none }
.lat-bloco.aberto .lat-bloco-itens{ display:block }

.lat-item{ display:block; padding:7px 14px 7px 44px; color:#BFD2EA;
  text-decoration:none; font-size:13px; border-left:3px solid transparent }
.lat-item:hover{ background:rgba(255,255,255,.10); color:#fff }
.lat-item.on{ background:rgba(255,255,255,.17); color:#fff; border-left-color:#7FB2FF;
  font-weight:600 }
.lat-item.futuro{ color:#6E8CB8; cursor:default }
.lat-item.futuro:hover{ background:none; color:#6E8CB8 }
.lat-item.futuro small{ font-size:9.5px; background:rgba(255,255,255,.12);
  padding:1px 5px; border-radius:6px; margin-left:5px }
.lat-rodape{ border-top:1px solid rgba(255,255,255,.14); padding:8px 0 }
.lat-rodape .lat-item{ padding-left:16px }

/* ---------- topo ---------- */
.topo-erp{ position:fixed; top:0; right:0; left:var(--lat); height:var(--topo-h);
  background:#fff; border-bottom:1px solid var(--borda); z-index:30;
  display:flex; align-items:center; gap:12px; padding:0 16px;
  transition:left .18s ease }
.menu-fechado .topo-erp{ left:var(--lat-min) }
.lat-abrir{ color:var(--cinza); font-size:19px; display:none }
.menu-fechado .lat-abrir{ display:block }

.busca-uni{ display:flex; align-items:center; gap:6px; flex:1;
  min-width:230px; max-width:520px }
.busca-uni input{ margin:0; padding:9px 14px; border-radius:12px; font-size:13.5px }
.busca-uni button{ background:none; border:0; font-size:15px; cursor:pointer;
  padding:4px 6px; border-radius:8px }
.busca-uni button:hover{ background:var(--azul-claro) }

.metricas{ display:flex; gap:8px; margin-left:auto }
.metrica{ display:flex; flex-direction:column; align-items:center; text-decoration:none;
  background:var(--azul-claro); border-radius:11px; padding:5px 12px; min-width:62px }
.metrica b{ font-family:'Poppins'; font-size:15px; color:var(--azul-esc); line-height:1.1 }
.metrica span{ font-size:9.5px; color:var(--cinza); text-transform:uppercase;
  letter-spacing:.3px }
.metrica:hover{ background:#D9E8FA }

.sino{ position:relative; font-size:17px; text-decoration:none; padding:4px 6px }
.sino i{ position:absolute; top:-2px; right:-3px; background:var(--verm); color:#fff;
  font-size:9.5px; font-style:normal; font-weight:700; border-radius:999px;
  padding:1px 5px; min-width:16px; text-align:center }
.chip-samantha{ background:var(--verde-bg); color:var(--verde); border-radius:999px;
  padding:5px 11px; font-size:11.5px; font-weight:600; white-space:nowrap }
.chip-samantha.off{ background:var(--verm-bg); color:var(--verm) }
.usuario-topo{ font-size:12.5px; color:var(--cinza); white-space:nowrap }
.usuario-topo span{ font-weight:600; color:#1B2A3A }

.tela.sem-menu{ padding-top:20px }

@media(max-width:900px){
  body.com-menu{ padding-left:0 }
  .lateral{ transform:translateX(-100%) }
  body.com-menu:not(.menu-fechado) .lateral{ transform:none }
  .topo-erp{ left:0 }
  .lat-abrir{ display:block }
  .metricas,.chip-samantha,.usuario-topo{ display:none }
}

/* ---------- regras globais de UI: ajuda (?) e obrigatório ---------- */
.obrig{ color:var(--verm); font-weight:700; margin-left:2px }
.ajuda{ background:none; border:0; cursor:pointer; color:var(--azul);
  font-size:11px; font-weight:700; padding:0 3px; border-radius:50%;
  width:15px; height:15px; line-height:1; border:1px solid var(--azul-claro) }
.ajuda:hover{ background:var(--azul-claro) }
.campo-cab{ display:flex; align-items:center; gap:6px; position:relative;
  flex-wrap:nowrap }
/* o (?) é a âncora do próprio balão — sem isto ele se posiciona pelo bloco
   inteiro e desce para baixo do título */
.campo-cab .ajuda{ position:relative; flex:0 0 auto }
.campo-cab .ajuda-balao{ left:auto }
.campo-cab > h3, .campo-cab > label{ flex:0 1 auto }
/* [28/07 · correção do teste guiado] O balão nascia colado à ESQUERDA do
   bloco (left:0), longe do (?) que a pessoa clicou — em título largo ele
   aparecia embaixo do texto, parecendo de outro campo. Agora ele sai do
   próprio botão: o (?) vira a âncora. */
.ajuda-balao{ display:none; position:absolute; top:calc(100% + 6px); left:0;
  z-index:20;
  background:#1B2A3A; color:#fff; font-size:11.5px; line-height:1.45;
  padding:9px 12px; border-radius:10px; width:270px; font-weight:400;
  box-shadow:0 4px 16px rgba(0,0,0,.2); text-transform:none; letter-spacing:0 }
.ajuda-balao.on{ display:block }

/* ---------- travas de processo ---------- */
.trava{ background:#FFF8E1; border-left:4px solid #FFA000; border-radius:0 12px 12px 0;
  padding:12px 15px; font-size:13px; margin:12px 0 }
.trava b{ color:#8a5a00 }

/* ---------- [27] OS fora da Samantha ---------- */
/* Vermelho de aviso, nao de erro: a OS existe e e valida no GC — o que falta
   e o rastreamento deste lado. O texto diz exatamente isso em todo lugar. */
.etq-fora{ display:inline-block; background:var(--verm-bg); color:var(--verm);
  border:1px solid #F5B7B1; border-radius:8px; padding:2px 9px;
  font-size:11px; font-weight:700; letter-spacing:.2px; white-space:nowrap }
.etq-fora.peq{ font-size:9.5px; padding:1px 6px; font-weight:600 }
.card.fora-sam{ border-left:5px solid var(--verm); background:#FFFBFB }

/* ADM › Permissões por grupo — abas, chips de grupo, dupla de canais  [27/07] */
.perm-abas{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:16px}
.perm-abas a{background:#fff;border:1px solid var(--borda);border-radius:14px;
  padding:9px 16px;font-size:13.5px;font-weight:600;color:var(--cinza);
  text-decoration:none;transition:.15s}
.perm-abas a:hover{border-color:var(--azul);color:var(--azul)}
.perm-abas a.on{background:var(--azul);color:#fff;border-color:var(--azul)}

.perm-membro{display:flex;flex-wrap:wrap;gap:6px;margin:0;align-items:center}
.perm-chip{display:inline-flex;align-items:center;gap:6px;background:#F5F8FC;
  border:1px solid var(--borda);border-radius:999px;padding:5px 12px;
  font-size:12.5px;font-weight:600;color:var(--cinza);cursor:pointer;margin:0}
.perm-chip:hover{border-color:var(--azul)}
.perm-chip.on{background:var(--azul-claro);border-color:var(--azul);
  color:var(--azul-esc)}
.perm-chip input{width:auto;margin:0;accent-color:var(--azul)}
.perm-chip small{font-weight:500;color:var(--lar)}

.perm-canais{display:flex;gap:14px;align-items:center;white-space:nowrap}
.perm-canais label{display:inline-flex;align-items:center;gap:5px;margin:0;
  font-size:12px;font-weight:600;color:var(--cinza);cursor:pointer}
.perm-canais input{width:auto;margin:0}
.perm-marca{grid-template-columns:96px minmax(0,1fr) auto}

/* Pessoas: uma linha por pessoa, recolhida  [27/07 — organizar a equipe] */
.pessoa-linha{border:1px solid var(--borda);border-radius:14px;background:#fff;
  margin-bottom:8px}
.pessoa-linha>summary{list-style:none;cursor:pointer;display:flex;
  align-items:center;gap:9px;padding:12px 14px;font-size:13.5px}
.pessoa-linha>summary::-webkit-details-marker{display:none}
.pessoa-linha>summary:hover{background:var(--azul-claro);border-radius:14px}
.pessoa-linha[open]>summary{border-bottom:1px solid var(--borda);
  border-radius:14px 14px 0 0}
.pessoa-linha[open]>summary .perm-seta{transform:rotate(90deg)}
.pes-nome{font-family:'Poppins',sans-serif}
.pes-resumo{margin-left:auto;font-size:12px;color:var(--cinza);font-weight:600}
.pes-corpo{padding:14px}
.pes-add{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:12px}
.pes-add select{width:auto;min-width:260px;margin:0;padding:8px 11px;font-size:13px}

/* o × que tira do grupo — a única forma de tirar acesso */
.chip-x{background:none;border:0;cursor:pointer;font-size:15px;line-height:1;
  padding:0 0 0 6px;color:var(--cinza);font-weight:700}
.chip-x:hover{color:var(--verm)}
.perm-chip.on .chip-x{color:var(--azul-esc)}
.conf-origem{display:inline-flex;align-items:center;margin:1px 4px 1px 0}
.conf-origem a{text-decoration:none}
.perm-abas a.discreta{background:#F7F9FC;color:#8A9AAB;border-style:dashed;
  font-weight:500;font-size:12.5px}
.perm-abas a.discreta:hover{color:var(--azul);border-style:solid}
.perm-abas a.discreta.on{background:var(--azul);color:#fff;border-style:solid}

/* Número da OS: três blocos, três tons da casa  [27/07] */
.os-num{font-family:ui-monospace,monospace;font-size:13px;white-space:nowrap;
  letter-spacing:.2px}
.os-num b{font-weight:700}
.os-num i{color:#B8C6D6;font-style:normal;margin:0 1px}
.os-cli{color:var(--azul-esc)}     /* 4 do cliente  — o que mais se procura */
.os-vc{color:var(--cinza)}         /* 2 da condição — contexto, não destaque */
.os-seq{color:var(--azul)}         /* 3 sequenciais — o que diferencia a OS */

/* Canal WhatsApp: um tico discreto, não um botão  [27/07] */
.canal-wa{white-space:nowrap}
.tico{display:inline-flex;align-items:center;margin:0;cursor:pointer}
.tico input{width:18px;height:18px;margin:0;accent-color:var(--verde);cursor:pointer}
.tico input:disabled{cursor:not-allowed;opacity:.45}
.dica{display:block;color:var(--cinza);font-size:10.5px;margin-top:2px}
.fone{font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12.5px}

/* Recebimento: lista com filtros  [27/07] */
.receb-filtros{display:grid;gap:10px;align-items:end;margin:16px 0 6px;
  grid-template-columns:repeat(auto-fit,minmax(140px,1fr))}
.receb-filtros label{margin:0 0 4px}
.receb-filtros input,.receb-filtros select{margin:0;padding:8px 11px;font-size:13px}
tr.clicavel{cursor:pointer}
tr.clicavel:hover td{background:var(--azul-claro)}
.paginacao{display:flex;align-items:center;gap:5px;margin-top:14px;flex-wrap:wrap}
.pag{display:inline-block;min-width:30px;text-align:center;padding:5px 8px;
  border:1px solid var(--borda);border-radius:9px;font-size:12.5px;
  text-decoration:none;color:var(--cinza)}
.pag:hover{border-color:var(--azul);color:var(--azul)}
.pag.on{background:var(--azul);color:#fff;border-color:var(--azul)}

/* =========================================================================
   TABELA-MÃE — o componente de lista de todo o ERP  [28/07]
   ========================================================================= */
th .ord{color:var(--cinza);text-decoration:none;display:inline-flex;
  align-items:center;gap:4px;white-space:nowrap}
th .ord:hover{color:var(--azul)}
th .ord.on{color:var(--azul-esc)}
th .ord i{font-style:normal;font-size:10px}
th .ord i.fraca{opacity:.25}
.fraca{opacity:.45}

.tab-filtros{display:grid;gap:10px;align-items:end;margin:16px 0 4px;
  grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}
.tab-filtros label{margin:0 0 4px}
.tab-filtros input,.tab-filtros select{margin:0;padding:8px 11px;font-size:13px}
.tab-filtros .extra{display:none}
.tab-filtros.aberto .extra{display:block}
.tab-filtros-acoes{display:flex;gap:8px;align-items:end;grid-column:1/-1;
  flex-wrap:wrap}

.tab-atalhos{display:flex;gap:6px;flex-wrap:wrap;grid-column:1/-1;margin-top:2px}
.atalho{display:inline-flex;align-items:center;gap:5px;margin:0;
  background:#F5F8FC;border:1px solid var(--borda);border-radius:999px;
  padding:5px 12px;font-size:12px;font-weight:600;color:var(--cinza);
  cursor:pointer}
.atalho:hover{border-color:var(--azul);color:var(--azul)}
.atalho.on{background:var(--azul-claro);border-color:var(--azul);color:var(--azul-esc)}
.atalho input{width:auto;margin:0;accent-color:var(--azul)}

/* [1002 · rodada (a) · 05/09] O TOPO DA LISTA: só a BUSCA e o botão ⚙ Filtro;
   o painel abre SOBRE a lista (absolute, como o balão da trilha), nunca a
   empurra; o badge é o número de recortes ligados. Genérico de propósito:
   nasceu no Recebimento; se virar padrão das sete listas, o CSS já serve. */
.filtro-barra{display:flex;gap:10px;align-items:center;flex-wrap:wrap;
  margin:14px 0 4px;position:relative}
.filtro-busca{flex:1;min-width:260px;display:flex;gap:6px;align-items:center}
.filtro-busca input{flex:1;margin:0;padding:8px 11px;font-size:13px}
.filtro-painel{position:relative;margin:0}
.filtro-painel>summary{list-style:none;cursor:pointer;display:inline-flex;
  align-items:center;gap:6px;user-select:none;margin:0}
.filtro-painel>summary::-webkit-details-marker{display:none}
.filtro-painel>summary .cont{background:var(--azul);color:#fff;
  border-radius:999px;padding:1px 7px;font-size:11px;font-weight:700;
  line-height:1.5}
.filtro-painel-corpo{position:absolute;right:0;z-index:40;margin-top:6px;
  background:#fff;border:1px solid var(--borda);border-radius:12px;
  padding:12px 14px;min-width:320px;max-width:min(560px,92vw);
  box-shadow:0 6px 20px rgba(20,40,80,.13);text-align:left}
.filtro-secao{margin-bottom:10px}
.filtro-secao>label{margin:0 0 4px;display:block}
.filtro-checks{display:flex;gap:6px;flex-wrap:wrap}
.filtro-checks .atalho input{width:auto;margin:0;accent-color:var(--azul)}
.filtro-grade{display:grid;gap:8px 10px;align-items:end;
  grid-template-columns:repeat(2,minmax(140px,1fr))}
.filtro-grade label{margin:0 0 4px}
.filtro-grade .de-ate{display:flex;gap:8px;min-width:0}.filtro-grade .de-ate>div{flex:1;min-width:0}  /* [1108] De/Até num bloco só */
.filtro-grade input,.filtro-grade select{margin:0;padding:8px 11px;font-size:13px}
.filtro-acoes{display:flex;gap:8px;justify-content:flex-end;margin-top:10px}
@media (max-width:600px){
  .filtro-painel-corpo{right:auto;left:0}
  .filtro-grade{grid-template-columns:1fr}
}

/* [1009 · rodada (c) · 05/09] o clipe "Inserir documento" e a pergunta do
   tipo — o modal nasce escondido e só aparece com um arquivo segurado. */
.doc-clipe .dz{padding:8px 12px;font-size:12.5px}
.doc-modal{margin-top:8px;background:#f4f8fd;border:1px solid #cfe0f5;
  border-radius:10px;padding:10px 14px;font-size:12.5px}
.doc-tipos{display:flex;gap:6px;flex-wrap:wrap}
.doc-tipos .atalho input{width:auto;margin:0;accent-color:var(--azul)}
.doc-tipos .doc-provavel{border-color:var(--azul);background:#fff}

.paginacao{display:flex;align-items:center;gap:5px;margin-top:14px;flex-wrap:wrap}
.por-pag{width:auto;margin:0;padding:5px 8px;font-size:12px;border-radius:9px}
.tab-vazia{text-align:center;color:var(--cinza);padding:26px 8px}

/* [28/07] Minhas Notificações: a não lida se destaca sem gritar — uma barra
   fina à esquerda, no azul da casa. Negrito na linha inteira cansava a vista
   quando a pessoa volta de férias com 80 avisos. */
tr.nao-lida td:first-child { box-shadow: inset 3px 0 0 var(--azul); }
tr.nao-lida td { font-weight: 600; }

/* [28/07 · correção do teste guiado] O (?) fica AO LADO do título, na mesma
   linha — nunca embaixo — e o balão sai colado nele. O wrapper existe só para
   ser a âncora: sem ele o balão se posiciona pelo bloco inteiro e desce. */
.ajuda-wrap{ position:relative; display:inline-flex; align-items:center;
  vertical-align:middle }
.ajuda-wrap .ajuda-balao{ top:calc(100% + 6px); left:-6px }
h3.tit-aj{ display:flex; align-items:center; gap:6px; flex-wrap:nowrap }

/* abas do Recebimento — uma tela, tres entradas [28/07] */
.abas-receb{ display:flex; gap:4px; margin-bottom:-1px }
.abas-receb .aba{ background:#EDF3FA; border:1px solid var(--borda);
  border-bottom:0; border-radius:14px 14px 0 0; padding:10px 18px;
  font-size:13.5px; font-weight:600; color:var(--cinza); text-decoration:none }
.abas-receb .aba:hover{ color:var(--azul) }
.abas-receb .aba.on{ background:#fff; color:var(--azul-esc);
  box-shadow:0 -2px 0 var(--azul) inset }
.abas-receb + .card{ border-top-left-radius:0 }

/* =========================================================================
   TELA DA OS — padrões do sistema  [M-11, M-12, M-16, M-17]
   ========================================================================= */

/* [M-16] O número da OS identifica a tela. Grande, primeiro, sem competir. */
.os-titulo{margin:0;font-size:26px;line-height:1.15;letter-spacing:-.3px;
  display:flex;align-items:center;gap:8px}
@media (max-width:600px){.os-titulo{font-size:21px}}
/* [M-16 · correção 30/07] `.os-num` tem font-size:13px FIXO para caber nas
   listas, e vencia o tamanho do título — eu aumentei a palavra "OS" e o
   número continuou pequeno, que e justamente o contrario do pedido: o
   numero e o que identifica. Aqui ele herda do titulo, um pouco MAIOR que
   a palavra. Em `em` para acompanhar o titulo tambem no celular. */
.os-titulo .os-num{font-size:1.08em;letter-spacing:-.5px}
.os-titulo .os-num i{margin:0 2px}

/* [M-17] a capa: uma foto só, do recebimento */
.os-capa{width:160px;height:160px;object-fit:cover;border-radius:12px;
  border:1px solid var(--linha,#dde3ea);background:#f2f5f8;display:block}
@media (max-width:600px){.os-capa{width:120px;height:120px}}

/* [M-19] o caminho da pasta, para copiar */
.os-pasta{display:block;font-size:12px;background:#F5F7FA;padding:8px 10px;
  border-radius:8px;word-break:break-all;border:1px solid var(--linha,#dde3ea)}

/* [M-11] blocos recolhíveis: consulta fica fechada, trabalho fica aberto */
/* [1031-c · rodada 5a] a PLACA E brasileira — o ícone ÚNICO de
   estacionado no ERP (aba, botão da linha, chip do planejamento, sinal
   da busca): círculo vermelho, fundo branco, E preto. O 🅿 azul "quase
   não se via" (Paulo). */
.placa-e{display:inline-flex;align-items:center;justify-content:center;
  width:15px;height:15px;border-radius:50%;background:#fff;
  border:2.5px solid var(--verm,#C62828);color:#111;font-weight:800;
  font-size:9.5px;line-height:1;font-family:Arial,Helvetica,sans-serif;
  vertical-align:-2px;box-sizing:content-box}
.placa-e::before{content:'E'}

/* [1026-3 · rodada 5a] o RESUMO DE UMA LINHA do bloco recolhido: vive no
   summary, invisível com o bloco aberto (o miolo já diz), visível quando
   recolhe — o título vira "o que tem aqui dentro" sem abrir. */
.bloco-resumo{display:none;font-weight:400;font-size:12.5px;
  color:var(--cinza,#7a8794);margin-left:8px}
details.card:not([open]) > summary .bloco-resumo{display:inline}
/* [5b-g · 03/09] O CABEÇALHO DE BLOCO é COMPONENTE — um só, para todo
   bloco recolhível do ERP (regra do Paulo): dentro de details.card, o
   summary.os-dobra tem UMA seta (do tamanho da ▼ que o Orçamento tinha),
   título 15px no AZUL do Orçamento; o cadeado e o resumo à direita ficam.
   Fora de details.card, o os-dobra continua como era. */
details.card>summary.os-dobra{font-size:15px;color:var(--azul-esc,#0d47a1)}
details.card>summary.os-dobra::before{font-size:15px}
.os-dobra{cursor:pointer;font-size:14px;font-weight:600;list-style:none;
  display:flex;align-items:center;gap:8px;user-select:none}
.os-dobra::-webkit-details-marker{display:none}
.os-dobra::before{content:'▸';font-size:12px;color:var(--cinza,#7a8794);
  transition:transform .15s}
details[open]>.os-dobra::before{transform:rotate(90deg)}
.os-dobra .cont{background:var(--fundo2,#eef2f6);border-radius:999px;
  padding:1px 8px;font-size:11px;font-weight:600}

/* [M-12] a caixa de comentário nasce com tamanho de escrever, não de bilhete */
.coment-caixa textarea{min-height:96px;resize:vertical;line-height:1.45}

/* [M-14] "Técnicos desta fase": uma linha por pessoa, com a autoria ao lado */
.tec-lista{list-style:none;margin:0;padding:0}
.tec-lista li{display:flex;align-items:center;gap:8px;padding:6px 0;
  border-bottom:1px solid var(--linha,#eef2f6);flex-wrap:wrap}
.tec-lista li:last-child{border-bottom:0}
.tec-marca{width:18px;flex:0 0 18px;text-align:center}
.tec-autor{color:var(--cinza,#7a8794);font-size:11.5px}
.tec-lista form{margin:0 0 0 auto}
.tec-lista form .btn{margin:0;padding:2px 8px;line-height:1.3}

/* [M-29] a capa dentro de outro card não repete moldura nem margem */
.card .capa-os{box-shadow:none;border:0;padding:10px 0 0;margin:10px 0 0;
  border-top:1px solid var(--linha,#eef2f6)}

/* [M-35] A migalha: discreta, e cada nível clicável menos a seção (grupo de
   menu não é tela) e a folha (é onde você está). */
.migalha{display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  font-size:12px;margin:0 0 10px;color:var(--cinza,#7a8794)}
.migalha a{color:var(--azul,#1565c0);text-decoration:none}
.migalha a:hover{text-decoration:underline}
.migalha i{font-style:normal;color:#c3ccd6}
.migalha b{color:var(--azul-esc,#0d3c68);font-weight:600}

/* [M-30] o ícone de foto na coluna OS, e o popup.
   [Conferência 31/07 · item 2] font-size herdada = o tamanho da fonte do
   NÚMERO ao lado, e sem meia-opacidade: a 55% o ícone parecia decoração. */
.foto-os{background:none;border:0;cursor:pointer;padding:0 6px 0 0;
  font-size:inherit;opacity:.85;line-height:1;vertical-align:baseline}
.foto-os:hover{opacity:1}

/* [1069 · 10/09] A MINIATURA no lugar do ícone. O quadrado de 30 px cabe na
   altura da linha da tabela sem empurrá-la — a foto é o que se vê, e o número
   continua sendo o que se lê. O ícone 📷 fica escondido e só aparece quando a
   miniatura não vem (o `onerror` marca o botão), para a lista nunca ter um
   buraco onde havia uma foto. */
.foto-os .mini-os{width:30px;height:30px;border-radius:6px;object-fit:cover;
  border:1px solid var(--borda);background:#fff;display:block}
.foto-os .mini-cai{display:none}
.foto-os.sem-mini .mini-cai{display:inline}
.foto-os:hover .mini-os{border-color:var(--azul)}
/* [1063-a · 08/09 · achado do Paulo] AMPLIAR tem que ser MAIOR que a moldura:
   a caixa parava em 620px e 70vh, menor que a foto já aberta na lista do
   laudo. Agora ocupa quase toda a janela, fundo bem escuro e a legenda
   embaixo (a mídia desconta a altura dela para nada ficar cortado). */
.foto-modal{display:none;position:fixed;inset:0;background:rgba(10,16,22,.86);
  z-index:900;align-items:center;justify-content:center;padding:16px}
.foto-modal-caixa{background:#fff;border-radius:16px;padding:12px;
  max-width:min(96vw,1500px);max-height:96vh;text-align:center;
  display:flex;flex-direction:column;gap:8px}
.foto-modal-caixa img{max-width:100%;max-height:calc(96vh - 84px);
  border-radius:10px;display:block;margin:0 auto;object-fit:contain}

/* [Conferência 31/07 · item 4] equipamento AO LADO da foto na tela da OS, com
   o modelo em fonte de título. A capa perde as margens de card aninhado para
   alinhar com o texto — esta regra precisa vir DEPOIS de `.card .capa-os`. */
.eq-linha{display:flex;gap:14px;align-items:flex-start;flex-wrap:wrap}
.eq-linha .capa-os{flex:0 0 auto;margin:0;padding:0}
/* [rodada 3 · item 4] no cabeçalho a foto é MINIATURA (o lightbox mostra
   inteira) — 160px comia a linha e escondia as Observações */
.eq-linha .os-capa{width:110px;height:110px}
.eq-col{flex:1;min-width:220px}
/* [1007 · rodada (b) · 05/09] a foto do equipamento como MINIATURA DENTRO do
   quadro azul (tela do recebido): a capa perde a moldura de card aninhado
   (precisa vir DEPOIS de `.card .capa-os`) e vira 96px ao lado dos dados;
   sem foto o `.capa-os` continua display:none e a linha não ocupa nada. */
.equip-box.eq-com-foto{display:flex;gap:14px;align-items:flex-start;flex-wrap:wrap}
.equip-box .eq-foto{flex:0 0 auto}
.equip-box .eq-foto .capa-os{border:0;padding:0;margin:0;background:transparent;
  box-shadow:none}
.equip-box .eq-foto .os-capa{width:96px;height:96px;border-radius:8px}
.equip-box .eq-dados{flex:1;min-width:220px}
.equip-box .eq-dados>div{padding:2px 0}
.eq-modelo{font-size:17px;font-weight:700;line-height:1.25}
.eq-defeito{margin:8px 0 0;white-space:pre-wrap}
/* [rodada 2 · item 2] as quatro linhas do equipamento, sem o peso das
   células de listagem (o td global tem 12px de padding e borda) */
.eq-tab{width:auto}
.eq-tab td{padding:2px 10px 2px 0;border:0}
.eq-tab td:first-child{color:var(--cinza);font-size:12px;white-space:nowrap;
  vertical-align:baseline}

/* [M-52] o checklist da triagem — o gate do M-45 com rosto */
.check-triagem{list-style:none;margin:0 0 12px;padding:10px 14px;
  background:#F4F9F4;border:1px solid #DCE9DC;border-radius:10px;
  font-size:13px;display:flex;gap:16px;flex-wrap:wrap}
.check-triagem li{opacity:.7;display:flex;gap:5px;align-items:center}
.check-triagem li.ok{opacity:1}
.check-triagem small{color:var(--cinza)}

/* [rodada 2 · item 6] cards de ação com altura natural: o grid esticava o
   card curto (Técnico da triagem, Peças) até a altura do laudo, deixando um
   vazio enorme embaixo */
.os-acoes{align-items:start}

/* [MOCKUP v3] o cabeçalho da OS em grid: dados | foto | equipamento+técnicos */
.head{display:grid;grid-template-columns:1fr 160px 1fr;gap:20px}
@media (max-width:900px){.head{grid-template-columns:1fr}}
.kv{font-size:13px}
.kv>div{padding:5px 0;border-bottom:1px solid #F0F4F8}
.kv b{display:inline-block;min-width:80px;color:var(--cinza);font-weight:600}
.nas{background:#F5F7FA;border:1px solid #E0E4EA;border-radius:6px;
  padding:3px 7px;font-size:11.5px}
.head-buttons{margin-top:14px;display:flex;gap:8px;flex-wrap:wrap}
.head .capa-os{margin:0;padding:0}
/* [1026-1 · rodada 5a·r2] a foto da capa tem a MESMA ALTURA do quadro do
   equipamento ao lado, largura da coluna, corte centralizado — NUNCA o
   tamanho natural. A 1ª versão usava height:100% numa cadeia sem altura
   definida e a % caía para auto: a foto estourava em tamanho natural por
   cima do quadro (pego pelo Paulo). Agora a foto é ABSOLUTA dentro da
   célula do grid — a célula é esticada pela linha (a altura do quadro
   azul), e inset:0 + cover fazem o resto. */
/* [r3 · regra FINAL do Paulo] a foto vive numa MOLDURA com a altura
   EXATA do quadro azul (o JS orcFotoMoldura lê o .equip-box e fixa a
   altura da célula; topo e base alinhados), largura da coluna, cover, e
   cantos 8px iguais ao quadro. A r2 usava a altura da LINHA do grid — e
   quem mandava na linha era a coluna 1, mais alta que o quadro. */
/* [r4] SEM absolute: havia um div relative anônimo entre a img e a
   célula e o inset resolvia contra a caixa errada (rect 0 — pego pelo
   vigia com a foto injetada). A moldura agora manda DIRETO na altura da
   img (o JS iguala img e célula ao quadro azul). */
.head>div:nth-child(2){min-height:150px;overflow:hidden}
.head .capa-link{flex:1 1 auto !important;display:block}
.head .os-capa{width:100%;height:150px;object-fit:cover;min-height:0;
  border-radius:8px;display:block}
@media (max-width:900px){.head .os-capa{height:180px}}
.equip-box{background:#EEF4FB;border-left:4px solid var(--azul);
  border-radius:0 8px 8px 0;padding:12px 14px;font-size:12.5px}
.equip-box>div{padding:2px 0}
.equip-box b{display:inline-block;min-width:80px;color:var(--cinza);
  font-weight:600}
.equip-box .eq-modelo{font-size:15.5px}
.obs-sum{cursor:pointer;font-size:11px;color:var(--cinza);list-style:none}
.tecnico-inline{margin-top:12px;background:#fff;border:1px solid #E0E4EA;
  border-radius:8px;padding:10px 12px;font-size:12.5px}

/* [rodada 3 · item 2] a triagem em FAIXAS: cards de largura inteira, um
   abaixo do outro — sem espaço morto no meio. Dentro do card do laudo, o
   texto e a mídia dividem a faixa. */
.os-faixas{display:flex;flex-direction:column;gap:18px}
.os-faixas .card{margin:0}

/* [mockup v3] o card do laudo: texto+mídia largos | checklist estreito */
.laudo-grid{display:grid;grid-template-columns:2.2fr 1fr;gap:20px}
@media (max-width:900px){.laudo-grid{grid-template-columns:1fr}}
.laudo-grid .check-triagem{flex-direction:column;gap:4px;margin:0 0 12px}
.laudo-actions{display:flex;gap:10px;align-items:center;margin-top:16px;
  flex-wrap:wrap}
.laudo-actions .spacer{flex:1}
.chip-laudo{display:inline-block;font-size:11.5px;padding:3px 12px;
  border-radius:12px;border:1px solid var(--azul)}
.chip-laudo a{color:var(--azul);text-decoration:none}

/* [recebimento v4 · item 3] responsáveis em 3 colunas + link de adicionar */
.resp-grid{display:grid;grid-template-columns:1.2fr 1fr 1fr;gap:10px;
  margin-top:10px}
@media (max-width:800px){.resp-grid{grid-template-columns:1fr}}
.addlink{font-size:11.5px;color:var(--azul);cursor:pointer;font-weight:600}

/* [recebimento v4 · item 4] dropzone unica + checklist de fotos */
.dropzone{border:2px dashed #b9c4d4;border-radius:8px;padding:18px 14px;
  text-align:center;color:#667;font-size:12.5px;background:#fafbfd;
  cursor:pointer}
.dropzone b{color:var(--azul)}
.dropzone.ia{border-color:#8ab4e8;background:#f2f7fd}
.dropzone.arrasta{border-color:var(--azul);background:#e8f1fc}
.check-fotos{background:#f2f8f2;border:1px solid #d5e8d5;border-radius:8px;
  padding:12px 14px;font-size:12.5px;align-self:start}
.check-fotos .ck{color:#999;padding:3px 0}
.check-fotos .ck.ok{color:#2e7d32;font-weight:700}
.check-fotos .ck span{font-weight:normal;font-size:10.5px}
/* [recebimento v8 · item 2] lista de arquivos em colunas alinhadas */
.filerow{display:grid;grid-template-columns:1fr 190px 34px;
  align-items:center;gap:10px;padding:5px 0;font-size:12px}
.filerow select{width:100%;margin:0}
.filerow button{width:100%}

/* [cartao v1] os passos do cartao de sucesso */
.step{border:1px solid var(--borda);border-radius:10px;padding:12px 14px;
  margin-top:14px;text-align:left}
.step h4{font-size:13px;color:var(--azul);margin:0 0 8px;display:flex;
  align-items:center;gap:6px}
.stepnum{display:inline-flex;width:20px;height:20px;border-radius:50%;
  background:var(--azul);color:#fff;font-size:11px;align-items:center;
  justify-content:center}
.todo{color:#b26a00;font-weight:700;font-size:12px}
.okbadge{color:#2e7d32;font-weight:700;font-size:12px}
.sent{background:#eefaf0;border:1px solid #cde8d2;border-radius:7px;
  padding:7px 11px;font-size:12px;margin-top:8px;text-align:left}

/* [cartao v1 · bugs 5-6] O input abre no MESMO y em todas as colunas.
   Duas tentativas anteriores dependiam da altura do rotulo (min-height
   normalizado) e o Paulo continuou vendo degrau. Agora nao depende: a
   celula vira uma grade de duas linhas com a PRIMEIRA de altura FIXA —
   o rotulo mora nela, ancorado no rodape, e tudo o que vem depois
   comeca sempre em 40px, tenha o rotulo uma linha ou duas.
   (Medido na pagina SERVIDA: o degrau antigo vinha do label solto com
   margin-top 12px enquanto o campo-cab nasce com zero.) */
.alinha-rotulos > div{display:grid;grid-template-rows:40px auto;
  align-content:start}
.alinha-rotulos > div > label:first-child,
.alinha-rotulos > div > .campo-cab:first-child{
  margin:0;align-self:end;display:flex;align-items:flex-end;flex-wrap:wrap;
  column-gap:6px;line-height:1.25}

/* [item 5 · 06/08] O campo só de LEITURA dentro das grades.
   Mesma altura e mesmo alinhamento do <input> ao lado, SEM a moldura: caixa
   com borda promete edição, e a pessoa clica e não acontece nada. */
.valor{padding:8px 0;font-size:13.5px;color:#1B2A3A;min-height:22px;
  word-break:break-word}

/* [recebimento v8 · item 3] ER à esquerda · barra · Defeito à direita */
.er-defeito{display:grid;grid-template-columns:1.2fr auto 1fr;gap:18px;
  margin-top:10px}
.barra-eq{border-left:3px solid var(--azul);border-radius:2px}
@media (max-width:800px){
  .er-defeito{grid-template-columns:1fr}
  .barra-eq{display:none}
}

/* [recebimento v8 · item 1] miniaturas abaixo do checklist */
.thumbs{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;
  margin-top:10px}
.thumb{height:58px;width:100%;object-fit:cover;border-radius:6px;
  border:1.5px solid #2e7d32;cursor:zoom-in;background:#d8dde5}

/* [rodada 2 · item 8] o copiar do caminho do NAS */
.copiar-pasta{background:none;border:0;cursor:pointer;padding:0 4px;
  opacity:.7;font-size:13px;vertical-align:baseline}
.copiar-pasta:hover{opacity:1}

/* [rodada 2 · item 2] a fila de fotos com miniatura e legenda */
.fotos-lista{display:flex;gap:10px;flex-wrap:wrap;margin-top:8px}
.foto-mini{display:flex;flex-direction:column;gap:4px;width:112px;position:relative}
.foto-mini img{width:112px;height:82px;object-fit:cover;border-radius:8px;
  border:1px solid var(--borda)}
.foto-mini input{font-size:11px;padding:4px 6px;margin:0}
.foto-mini button{position:absolute;top:2px;right:2px;background:#fff9;
  border:0;border-radius:6px;cursor:pointer;line-height:1;padding:2px 5px}

/* [M-18] os três campos de foto do laudo, com arrastar */
.laudo-fotos{display:flex;gap:8px;margin:10px 0}
.laudo-fotos .solta{flex:1;min-height:72px;border:2px dashed var(--linha,#cdd6e0);
  border-radius:12px;display:flex;align-items:center;justify-content:center;
  text-align:center;font-size:12px;color:var(--cinza,#7a8794);cursor:pointer;
  margin:0;transition:.15s}
.laudo-fotos .solta:hover,.laudo-fotos .solta.sobre{border-color:var(--azul,#1565c0);
  background:#f2f7fd;color:var(--azul,#1565c0)}
.laudo-fotos .solta.cheia{border-style:solid;border-color:var(--verde,#2e7d32);
  background:#f1f8f2;color:var(--verde,#2e7d32)}

/* ===========================================================================
   [GALERIA DO LAUDO · mockup v1 · 04/08]
   As classes seguem o mockup: .secao-laudo / .thumbs / .th / .mini / .dup-aviso.
   A miniatura é quadrada e a foto preenche sem distorcer (object-fit), porque
   foto de placa vem em proporção qualquer e a galeria precisa ficar alinhada.
   =========================================================================== */
.secao-laudo{font-size:12px;font-weight:700;color:var(--azul,#1565C0);
  margin:16px 0 8px;display:flex;align-items:center;gap:10px}
.secao-laudo .cont{background:#eef4fb;border-radius:10px;padding:1px 9px;
  font-size:11px;font-weight:600}
.secao-laudo .dica-galeria{margin-left:auto;font-weight:normal;font-size:11px;
  color:#666}
/* [1054 · 07/09] a grade .thumbs/.th da galeria v1 morreu: as fotos do laudo
   viraram a lista recolhível (.laudo-item) — ver o bloco 1054 abaixo. */
.mini{border:1px solid #cfd8e6;border-radius:5px;font-size:10px;padding:2px 6px;
  color:#666;cursor:pointer;background:#fff;text-decoration:none;
  display:inline-block}
.mini:hover{border-color:var(--azul,#1565C0);color:var(--azul,#1565C0)}
.dup-aviso{background:#fff8e6;border:1px solid #f0d9a0;border-radius:8px;
  padding:9px 12px;font-size:12px;margin-bottom:10px}
.hint-galeria{font-size:11px;color:#999;margin:6px 0 0}

/* ===========================================================================
   [M-84 · 04/08] LINHAS DE GRADE — versão A do mockup ("grade média")
   Linha horizontal por registro, divisória vertical suave entre colunas e
   realce ao passar o mouse. Sem a divisória vertical, olho perdia a coluna
   em tabela larga; com grade cheia (versão C), a tela vira papel quadriculado.
   =========================================================================== */
.card table th{border-bottom:2px solid #d7dee8}
.card table td{border-bottom:1px solid #e6ebf2;border-right:1px solid #eef1f6}
.card table td:last-child,
.card table th:last-child{border-right:none}
.card table tbody tr:hover td{background:#f6f9fd}
/* a linha "nenhum resultado" não é registro: não leva grade */
.card table td.tab-vazia{border-right:none;background:none}


/* ===========================================================================
   [M-80 · correção 04/08] BOTÃO DESABILITADO TEM CARA DE DESABILITADO
   O Concluir nascia com `disabled` (não clicava) e continuava AZUL: o Paulo
   leu como habilitado e tentou clicar. Faltava só isto — o mockup já trazia
   `.btn.off` e eu implementei a trava sem o visual dela.
   =========================================================================== */
.btn:disabled,
.btn[disabled]{background:#eef1f6;border-color:#d3d9e2;color:#9aa3af;
  cursor:not-allowed;box-shadow:none}
.btn:disabled:hover,
.btn[disabled]:hover{background:#eef1f6;border-color:#d3d9e2;color:#9aa3af}

/* ===========================================================================
   [M-75 · reincidente 04/08] O ÚLTIMO CARD DA FAIXA DA OS
   `.os-faixas` espaça os filhos com `gap:18px` e zera a margem deles — certo
   por dentro. Mas o gap não vale DEPOIS do último: entre a faixa e o
   Histórico (que vem fora dela) sobrava zero, e os dois cards encostavam.
   Era o vão do M-75 de novo, agora do outro lado da tela.
   =========================================================================== */
.os-faixas{margin-bottom:18px}

/* ===========================================================================
   [M-79 ampliado · 04/08] A TELA É LARGA; O CAMPO, NÃO
   -----------------------------------------------------------------------
   O aviso do Paulo: "a TELA ocupa a largura toda, mas os CAMPOS se
   distribuem em colunas — nada de input de 1500px". Sem isto, medido no
   levantamento: `#busca_cli` e o botão do recebimento (filhos diretos do
   <form>) iriam a ~1660px, e os campos dentro de `.grade2` de dois filhos
   passariam de ~546px para ~820px cada.
   Campo de uma linha tem tamanho de leitura: ninguém digita uma OS em 1600px.
   Textarea ganha mais, porque texto corrido usa a largura — mas também tem
   teto, senão a linha fica longa demais para o olho voltar ao começo.
   =========================================================================== */
.card input:not([type=radio]):not([type=checkbox]):not([type=file]),
.card select{max-width:520px}
.card textarea{max-width:900px}
/* dentro de uma grade de campos o container já limita: ali o campo preenche
   a coluna, senão sobra buraco à direita de cada rótulo */
.grade2 input, .grade2 select, .grade2 textarea,
.resp-grid input, .resp-grid select, .resp-grid textarea,
.er-defeito input, .er-defeito select, .er-defeito textarea,
.tab-filtros input, .tab-filtros select,
.laudo-grid textarea{max-width:none}
/* [medido] `.grade2` é auto-FIT: com dois filhos ele colapsa as trilhas
   vazias e cada campo dobra de tamanho. Onde a grade é de CAMPOS (marcada
   com alinha-rotulos), auto-FILL mantém a coluna do tamanho pensado e deixa
   a sobra à direita. Nas grades de CARD o auto-fit continua — lá esticar é
   o certo. */
.grade2.alinha-rotulos{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}
/* [M-79 · acabamento 05/08] O BLOCO DE MÍDIA ENTRA NA MESMA COLUNA DOS CAMPOS
   -----------------------------------------------------------------------
   O que o Paulo viu desalinhado no Recebimento: o bloco de fotos usa `.grade2`
   crua (auto-FIT), e com dois filhos o auto-fit colapsa as trilhas vazias e
   cada metade vai a ~820px na tela de 1750. Os campos logo abaixo usam
   `alinha-rotulos` (auto-FILL), que mantém a coluna de ~317px. Resultado: o
   bloco de fotos ocupava a largura inteira e nenhuma borda dele caía onde as
   dos campos caem.
   Aqui a grade de mídia passa a usar as MESMAS trilhas dos campos, com cada
   lado ocupando duas — a borda do dropzone cai na borda do segundo campo, e o
   checklist começa onde o terceiro começa. Em tela estreita (uma ou duas
   trilhas) o span volta a 1, senão a coluna inventada estouraria a largura. */
.grade2.midia{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}
.grade2.midia > *{grid-column:span 2}
@media (max-width:780px){.grade2.midia > *{grid-column:auto}}

/* [M-93 · 05/08] A LINHA DE ENVIO DA FOTO — barra proporcional de verdade
   A do M-68 anda sozinha (animação); esta anda com os bytes, pelo
   `upload.onprogress` do XHR. Vermelha quando falha: envio que morre calado
   faz a pessoa concluir o recebimento sem a foto. */
.envio-linha{display:grid;grid-template-columns:1fr 120px 84px;gap:8px;
  align-items:center;font-size:12px;color:var(--cinza);padding:5px 0}
.envio-nome{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.envio-barra{height:6px;border-radius:999px;background:#e6ebf2;overflow:hidden}
.envio-barra i{display:block;height:100%;width:0;background:var(--azul);
  transition:width .15s linear}
.envio-pct{text-align:right;font-variant-numeric:tabular-nums}
.envio-linha.falhou{color:var(--verm)}
.envio-linha.falhou .envio-pct{text-align:left;grid-column:2 / span 2}

/* [M-92 · 05/08] os degraus do "Próximos passos": rótulo pequeno separando
   fechar → documento → resposta do cliente. Vem do mockup (.etapa), com o
   nome prefixado para não colidir com as etapas das listas. */
.etapa-orc{font-size:10.5px;text-transform:uppercase;letter-spacing:.4px;
  color:#8a929c;margin:14px 0 8px;border-top:1px solid var(--borda);
  padding-top:10px}
.etapa-orc:first-of-type{border-top:none;margin-top:0;padding-top:0}

/* [itens 4 e 5 · 09/08] ENVIAR AO CLIENTE — a caixa da etapa 3 e a PRÉVIA.
   A caixa segue o `.esc` do mockup (recuo claro, fundo quase branco): o envio
   é uma escolha dentro da etapa, não mais um botão na pilha. */
.esc-envio{border:1px solid var(--borda);border-radius:10px;padding:12px 14px;
  margin-bottom:8px;background:#fafbfd}
.lin-envio{font-size:12.5px;color:#666;padding:4px 0}

/* A prévia ocupa a tela porque é o passo em que se CONFERE. Meia tela, com o
   resto piscando atrás, é onde se clica "enviar" sem ter lido. */
.previa-fundo{display:none;position:fixed;inset:0;z-index:60;
  background:rgba(16,24,32,.72);align-items:center;justify-content:center;
  padding:18px}
.previa-caixa{background:#fff;border-radius:14px;padding:16px 18px;
  width:min(94vw,760px);max-height:92vh;display:flex;flex-direction:column;
  box-shadow:0 8px 28px rgba(0,0,0,.28)}
.previa-cab{border:1px solid var(--borda);border-radius:10px;padding:10px 12px;
  background:#f8fafc;font-size:12.5px;margin-bottom:10px}
.previa-linha{padding:3px 0;color:#445}
.previa-linha b{color:#8a929c;font-weight:600;margin-right:4px}
.previa-anexo{display:inline-block;background:#eef4fb;color:var(--azul-esc);
  border-radius:6px;padding:2px 8px;margin:2px 4px 2px 0;font-size:11.5px}
.previa-anexo i{color:#8a929c;font-style:normal}
/* o corpo do e-mail dentro de um iframe SANDBOX: o HTML vem de um modelo que
   uma pessoa edita no ADM, e ele não roda nada dentro da tela do ERP */
.previa-corpo{flex:1;min-height:320px;width:100%;border:1px solid var(--borda);
  border-radius:10px;background:#fff}

/* [achado (a) · 09/08] O aviso da contagem, FIXO no rodapé.
   A caixa vivia no meio do card, acima dos campos de leitura: quem conta no
   galpão está com a tela rolada até os campos, e a recusa acendia fora do
   campo de visão. Aqui ela nasce onde o polegar está. */
.aviso-fixo{position:fixed;left:10px;right:10px;bottom:10px;z-index:70;
  margin:0;box-shadow:0 4px 18px rgba(16,24,32,.28);font-size:15px;
  padding:14px 16px;border-radius:12px}
.aviso-fixo.acende{animation:aviso-pisca .35s ease-out}
@keyframes aviso-pisca{from{transform:translateY(14px);opacity:0}
  to{transform:translateY(0);opacity:1}}
@media (prefers-reduced-motion: reduce){.aviso-fixo.acende{animation:none}}

/* [M-86 · 05/08] o que está só anexado, ao lado do que está salvo. Laranja
   de aviso, não vermelho de erro: não é falha, é trabalho que falta gravar. */
.check-triagem .pendente{color:var(--lar,#EF6C00);font-weight:600;
  font-size:11.5px}

/* [06/08] A PROVA DA APROVAÇÃO — o bloco que pede o documento antes do
   clique que move dinheiro. Recuado e discreto: não é obstáculo, é o lugar
   de largar o pedido de compra que já está na mão de quem aprova. */
.prova-aprov{border:1px dashed var(--borda);border-radius:10px;
  padding:10px 12px;margin-bottom:10px;background:#fafbfd}
.prova-aprov textarea{width:100%;padding:8px 10px;border:1px solid var(--borda);
  border-radius:8px;font-size:12.5px}

/* [mockup "Documento de aprovação" · 06/08] a LINHA do anexo e o STATUS.
   O status existe porque, sem ele, a pessoa descobria que faltava a prova só
   depois de clicar no botão verde e levar a recusa — no clique que ela achava
   que ia fechar a venda. Agora a tela diz sempre em que pé está, e o botão só
   destrava quando há prova. */
.prova-arq{display:flex;align-items:center;gap:8px;border:1px solid #cde8d2;
  background:var(--verde-bg);border-radius:8px;padding:8px 11px;
  font-size:12.5px;margin-top:8px}
.prova-arq .prova-x{margin-left:auto;color:var(--verm)}
.status-prova{display:flex;align-items:center;gap:8px;font-size:12.5px;
  font-weight:600;margin-top:12px;padding:9px 12px;border-radius:8px}
.status-prova.ok{background:var(--verde-bg);border:1px solid #cde8d2;
  color:var(--verde)}
.status-prova.sem{background:var(--lar-bg);border:1px solid #f0d9a0;
  color:#b26a00}
.status-prova.falta{background:var(--verm-bg);border:1px solid #f0c0c0;
  color:#c0392b}

/* [pacote A · 06/08] o bloco do equipamento e a escolha das duas ações do ER.
   A moldura laranja não é decoração: ela separa, dentro do mesmo formulário,
   o que muda ESTA OS do que muda TODAS as OS do código. */
.er-escolha{border:2px solid #ef8c00;background:#fffcf5;border-radius:9px;
  padding:12px 14px;margin-top:12px}
.er-opt{display:block;border:1px solid #e8dcc4;background:#fff;
  border-radius:8px;padding:10px 12px;margin-bottom:8px;cursor:pointer;
  font-size:12.5px;font-weight:normal}
.er-opt input[type=radio]{width:auto;margin-right:6px}
.er-alerta{font-size:11.5px;color:#c0392b;margin-top:5px;font-weight:600}
/* [2e] contador em falta: menos de 3 fotos = âmbar, para avisar antes da trava */
.cont-falta{background:#8a6d1a;color:#fff}
/* [M-121, 2ª rodada] a estrela por item do menu: invisível até o hover */
.lat-item{position:relative}
.lat-item .lat-fav{position:absolute;right:10px;top:50%;transform:translateY(-50%);
  opacity:0;font-size:13px;cursor:pointer;padding:2px 4px;border-radius:6px}
.lat-item:hover .lat-fav{opacity:.85}
.lat-item .lat-fav:hover{background:rgba(255,255,255,.18);opacity:1}

/* ===========================================================================
   A ESTEIRA DA OS — a trilha embaixo do número  [fatia 3 · 18/08]
   ---------------------------------------------------------------------------
   A COR É POR DOMÍNIO, não por etapa: a travessia de domínio tem de ser
   visível SEM LEGENDA. Reparo azul, Venda verde, Financeiro roxo, Encerrada
   escuro — quem olha de longe vê a OS sair do azul e voltar.

   Os cinco estados, e cada um responde uma pergunta diferente:
     cumprida    pintada, com a DATA embaixo        "quando passou?"
                 (o requisito chamou de "percorrida"; o servico chama
                  'cumprida' — UM nome so, e e o do servico, porque e ele
                  que responde. Trocar so aqui deixaria dois vocabularios.)
     atual       MAIOR, cor cheia, "há N dias"      "onde está, e há quanto?"
     futura      contorno tracejado, apagada, "—"   "o que falta?"
     pulada      riscada, com o MOTIVO              "por que não passou?"
     retorno     a data + "N×"                      "quantas vezes voltou?"
   =========================================================================== */
.os-trilha{display:flex;gap:0;flex-wrap:wrap;align-items:flex-start;
  margin:10px 0 4px;padding:0}
.os-trilha .trl{display:flex;flex-direction:column;align-items:center;
  flex:1 1 0;min-width:74px;position:relative}
/* o fio que liga as paradas: nasce da bola, não do texto */
.os-trilha .trl::before{content:'';position:absolute;top:11px;left:-50%;
  width:100%;height:2px;background:var(--linha,#DDE3EA);z-index:0}
.os-trilha .trl:first-child::before{display:none}
/* [19/08] a trilha virou MAPA: `cursor:pointer` saiu daqui junto com o botao.
   Cursor de mao em coisa que nao faz nada e a mesma mentira do botao que
   sempre recusa — a pessoa clica, nada acontece, e a tela parece travada.
   O `.trl-f` (o <form>) sumiu com a rota; a regra fica por enquanto para nao
   deixar sobra de estilo caso algum cache sirva HTML velho. */
.os-trilha .trl-f{margin:0;display:block}
.os-trilha .trl-b{display:flex;flex-direction:column;align-items:center;
  gap:3px;background:none;border:0;padding:0 2px;cursor:default;
  font:inherit;color:inherit;position:relative;z-index:1}
.os-trilha .trl-parado{cursor:default}
/* [1032 · 03/09] TODAS as bolas têm o centro em y=12px — a bola de 16px
   desce 4px, a atual (22px) desce 1px, e a linha (top 11 + 2 de altura)
   cruza exatamente o centro das duas. Antes eram três alturas (8/11/12,
   e 15 na linha da atual) e "a linha passava fora do centro" (o Paulo). */
.os-trilha .trl-bola{width:16px;height:16px;border-radius:999px;
  background:#fff;border:2px solid var(--linha,#DDE3EA);display:block;
  margin-top:4px}
.os-trilha .trl-nome{font-size:11px;line-height:1.15;text-align:center;
  color:var(--cinza)}
.os-trilha .trl-quando{font-size:10px;color:var(--cinza);margin-top:2px;
  text-align:center;min-height:12px}

/* --- a cor do DOMÍNIO --- */
.os-trilha .dom-reparo     .trl-bola{border-color:#1565C0}
.os-trilha .dom-venda      .trl-bola{border-color:#2E7D32}
.os-trilha .dom-financeiro .trl-bola{border-color:#6A1B9A}
.os-trilha .dom-fim        .trl-bola{border-color:#37474F}

/* --- PERCORRIDA: pintada --- */
.os-trilha .trl-cumprida.dom-reparo     .trl-bola{background:#1565C0}
.os-trilha .trl-cumprida.dom-venda      .trl-bola{background:#2E7D32}
.os-trilha .trl-cumprida.dom-financeiro .trl-bola{background:#6A1B9A}
.os-trilha .trl-cumprida.dom-fim        .trl-bola{background:#37474F}
.os-trilha .trl-cumprida .trl-nome{color:#33475B}

/* --- ATUAL: maior, cor cheia --- */
/* [1032 · 03/09] a ATUAL é VERDE em QUALQUER domínio — regra do Paulo:
   "azul = já passou · VERDE e maior = está aqui agora · apagada = não
   chegou". A cor do domínio continua nas cumpridas (a travessia de
   domínio segue visível); o AGORA tem uma cor só, e é esta. O margin-top
   de 1px põe o centro da bola de 22px no mesmo y=12 da linha. */
.os-trilha .trl-atual .trl-bola{width:22px;height:22px;border-width:3px;
  margin-top:1px;background:#1E9C49 !important;border-color:#157A38}
.os-trilha .trl-atual .trl-nome{font-weight:700;color:#12232F;font-size:12px}
.os-trilha .trl-atual .trl-quando{font-weight:700;color:#12232F}

/* --- FUTURA: tracejada e apagada --- */
.os-trilha .trl-futura .trl-bola{border-style:dashed;opacity:.5}
.os-trilha .trl-futura .trl-nome,
.os-trilha .trl-futura .trl-quando{opacity:.5}

/* --- PULADA: riscada, com o motivo --- */
.os-trilha .trl-pulada .trl-nome{text-decoration:line-through;opacity:.65}
.os-trilha .trl-pulada .trl-bola{background:repeating-linear-gradient(
  45deg,#fff,#fff 3px,var(--linha,#DDE3EA) 3px,var(--linha,#DDE3EA) 6px)}
.os-trilha .trl-pulada .trl-quando{font-style:italic}

/* --- NÃO CONSTRUÍDA: existe na esteira, não existe como dado ainda.
       Estado PRÓPRIO de propósito: "sem dado" não pode parecer "não chegou
       lá" — campo vazio é honesto, campo confundido não. --- */
.os-trilha .trl-nao_construida .trl-bola{border-style:dotted;opacity:.32}
.os-trilha .trl-nao_construida .trl-nome,
.os-trilha .trl-nao_construida .trl-quando{opacity:.32}

/* --- o "há N dias" que passou do PRAZO CADASTRADO --- */
.os-trilha .trl-atrasado{color:var(--verm,#C62828);font-weight:700}

.os-trilha-nota{margin:2px 0 10px;font-size:11px;opacity:.75}

/* a trilha MIÚDA das listas: 9 pontinhos, NÃO clicável.
   "Pontinho de 9px numa lista é clique errado garantido. Mover OS só na tela
   da OS." (Paulo, 18/08) */
.trilha-mini{display:inline-flex;gap:2px;vertical-align:middle;line-height:1}
.trilha-mini i{width:7px;height:7px;border-radius:999px;display:inline-block;
  border:1px solid var(--linha,#DDE3EA);background:#fff}
.trilha-mini i.m-cumprida{background:#1565C0;border-color:#1565C0}
.trilha-mini i.m-atual{background:#1565C0;border-color:#1565C0;
  width:10px;height:10px;margin-top:-1px}
.trilha-mini i.m-atual.m-atrasado{background:var(--verm,#C62828);
  border-color:var(--verm,#C62828)}
.trilha-mini i.m-venda.m-cumprida,
.trilha-mini i.m-venda.m-atual{background:#2E7D32;border-color:#2E7D32}
.trilha-mini i.m-financeiro.m-cumprida,
.trilha-mini i.m-financeiro.m-atual{background:#6A1B9A;border-color:#6A1B9A}
.trilha-mini i.m-fim.m-cumprida,
.trilha-mini i.m-fim.m-atual{background:#37474F;border-color:#37474F}
.trilha-mini i.m-pulada{background:repeating-linear-gradient(45deg,
  #fff,#fff 2px,#B0BEC5 2px,#B0BEC5 4px)}
.trilha-mini i.m-nao_construida{opacity:.3;border-style:dotted}

/* [TRILHA · PARTE B · 20/08] o painel de cada parada.
   O alvo de clique e o triangulo do <details>, NUNCA a bolinha de 9px —
   "pontinho de 9px numa lista e clique errado garantido" continua valendo. */
.trl-painel{ margin-top:2px }
.trl-painel > summary{ list-style:none; cursor:pointer; font-size:11px;
  color:var(--cinza); line-height:1; padding:2px 6px; border-radius:6px;
  display:inline-block; user-select:none }
.trl-painel > summary::-webkit-details-marker{ display:none }
.trl-painel > summary:hover{ background:#E8EEF8; color:var(--azul-esc) }
.trl-painel[open] > summary{ background:#E8EEF8; color:var(--azul-esc) }
.trl-painel-corpo{ position:absolute; z-index:40; margin-top:4px;
  background:#fff; border:1px solid var(--borda); border-radius:12px;
  padding:12px 14px; min-width:210px; max-width:280px; text-align:left;
  box-shadow:0 6px 20px rgba(20,40,80,.13) }
.trl-painel-corpo .sub{ margin:2px 0 0; font-size:12px }
/* [mockup #2 · 02/09] o nome da parada como LINK de navegação (herda a cor
   da trilha; a mão e o sublinhado dizem que é clicável) */
.os-trilha .trl-nome-link{ cursor:pointer; text-decoration:none; color:inherit }
.os-trilha .trl-nome-link:hover{ text-decoration:underline }
/* o número da OS no rodapé do balão — link discreto, não botão */
.trl-painel-corpo .trl-ir-os{ display:inline-block; margin-top:8px;
  font-size:12px; font-weight:600; color:var(--azul-esc); text-decoration:none;
  border-top:1px solid var(--borda); padding-top:8px; width:100% }
.trl-painel-corpo .trl-ir-os:hover{ text-decoration:underline }

/* [R60 · 27/08] linha vermelha da fila da expedição: entregue sem comprovante
   além do prazo do ADM (Configurações da Expedição) */
tr.tr-verm td{background:rgba(198,40,40,.07)}
tr.tr-verm td:first-child{box-shadow:inset 3px 0 0 var(--verm,#C62828)}

/* [27/08] dropzone de formulário (_dz.html) — a regra: todo input de
   arquivo aceita arrastar OU clicar */
label.dz{display:block;border:2px dashed var(--linha,#cdd6e0);border-radius:12px;
  padding:12px 14px;text-align:center;cursor:pointer;background:#FAFCFF;margin-top:4px}
label.dz:hover,label.dz.sobre{border-color:var(--azul,#1565c0);background:#F0F6FF}
label.dz .dz-nome{color:#5c6773}

/* [1041 · 1042 · guardados · 06/09] a MOLDURA nasce visível: a foto padrão
   ("📷 sem foto", clicável = pôr a foto) tem o MESMO tamanho da capa em cada
   tela (é a mesma classe .os-capa), e embaixo o "✎ trocar foto". */
.capa-vazia{display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:4px;color:#8a97a6;font-size:22px;border-style:dashed;cursor:pointer;user-select:none}
.capa-vazia span{font-size:11.5px}
.capa-acoes{margin-top:6px;display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.capa-acoes .capa-msg{font-size:11.5px}
.equip-box .eq-foto .capa-vazia{font-size:18px}
.equip-box .eq-foto .capa-acoes .btn{padding:1px 6px;font-size:11px}
.capa-sobre,.capa-sobre .os-capa{outline:2px dashed #2f7de1;outline-offset:2px}


/* ===========================================================================
   [1063 · REGRA DA CASA · 07/09] A MOLDURA — o componente ÚNICO de foto/vídeo
   Tamanho fixo, cover (corte centralizado), nunca passa da borda; o vídeo
   toca DENTRO; ampliar é clique por cima da página (molduraAmpliar, base).
   Tamanhos = os já aprovados: capa 160 · quadro 96 · mini 112×84 · grande.
   A capa 1041 (.os-capa) é APLICAÇÃO disto: mantém as medidas por tela.
   =========================================================================== */
.moldura{position:relative;overflow:hidden;border-radius:10px;background:#f2f5f8;
  border:1px solid var(--linha,#dde3ea);margin:0;display:block;flex:0 0 auto}
.moldura>.moldura-mid{object-fit:cover;display:block}
/* a medida vem do TAMANHO nomeado (moldura--capa/quadro/mini/grande); uma moldura
   sem tamanho (a capa 1041, que mede pelo .os-capa) não recebe 100% */
.moldura[class*="moldura--"]>.moldura-mid{width:100%;height:100%}
/* a capa 1041: o link é a moldura só pela semântica e pelo ampliar — sem borda
   nem fundo próprios (a img .os-capa já tem os dela e as medidas por tela) */
.capa-moldura{border:0;background:transparent;border-radius:0;overflow:visible}
.moldura>img.moldura-mid{cursor:zoom-in}
.moldura>video.moldura-mid{background:#000}
.moldura--capa{width:160px;height:160px;border-radius:12px}
.moldura--quadro{width:96px;height:96px;border-radius:8px}
.moldura--mini{width:112px;height:84px;border-radius:8px}
.moldura--grande{width:100%;max-width:560px;aspect-ratio:4/3;border-radius:10px}
.moldura .moldura-play{display:flex;align-items:center;justify-content:center;
  font-size:26px;color:#fff;background:#3b4652;cursor:pointer;user-select:none}
.moldura .moldura-ausente{display:flex;align-items:center;justify-content:center;
  text-align:center;font-size:10px;line-height:1.25;color:#c33;border:1px dashed #c33;
  border-radius:inherit;padding:4px;box-sizing:border-box}
.moldura .moldura-baixar{display:flex;align-items:center;justify-content:center;
  text-align:center;font-size:11.5px;padding:8px;height:100%;color:var(--azul,#1565c0);
  text-decoration:none;box-sizing:border-box}
.foto-modal-caixa video{max-width:100%;max-height:calc(96vh - 84px);border-radius:10px;
  display:block;margin:0 auto}   /* [1063-a] o vídeo ampliado acompanha a foto */
/* o link que "apaga" (o Gerar laudo com anexo pendente): fica na tela, dito, sem clique útil */
a.btn.apagado{opacity:.45;pointer-events:auto;cursor:not-allowed}

/* ===========================================================================
   [1054 · 07/09] AS FOTOS DO LAUDO — lista recolhível, UMA ABERTA POR VEZ
   fechada: nº · miniatura (moldura mini) · começo da legenda (laranja se
   vazia) · ↑↓ ✕; aberta: foto grande na moldura + legenda AO LADO (2–3
   frases), ⟳ e 🔍. Todas fechadas ao entrar. O pré-salvar tem o mesmo desenho.
   =========================================================================== */
.laudo-lista{display:flex;flex-direction:column;gap:6px;margin-top:8px}
.laudo-item{border:1px solid #e0e4ea;border-radius:10px;background:#fff}
.laudo-item[open]{border-color:var(--azul,#1565c0);box-shadow:0 1px 6px rgba(21,101,192,.12)}
.laudo-item>.laudo-sum{display:flex;align-items:center;gap:10px;padding:6px 8px;cursor:pointer;
  list-style:none}
.laudo-item>.laudo-sum::-webkit-details-marker{display:none}
.laudo-item>.laudo-sum .moldura--mini{width:72px;height:54px}
.laudo-n{background:rgba(21,101,192,.9);color:#fff;border-radius:9px;font-size:10.5px;
  padding:1px 8px;flex:0 0 auto}
.laudo-leg{flex:1;min-width:0;font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.leg-falta{color:var(--laranja,#EF6C00);font-style:italic}
.laudo-marca{font-style:normal;font-size:10px;color:#b26a00;background:#fff8e6;border-radius:6px;padding:0 5px}
.laudo-acoes{display:flex;gap:4px;flex:0 0 auto}
.laudo-acoes .laudo-x{color:#c62828;border-color:#e3b7b7}
.laudo-corpo{display:flex;gap:14px;padding:6px 10px 12px;flex-wrap:wrap;align-items:flex-start}
.laudo-corpo .moldura--grande{flex:1 1 320px;max-width:560px}
.laudo-lado{flex:1 1 220px;min-width:200px;display:flex;flex-direction:column;gap:6px}
.laudo-lado label{font-size:12px;font-weight:600;margin:0}
.laudo-lado .laudo-legenda{width:100%;min-height:72px;font-size:13px;padding:8px;
  border:1px solid var(--borda,#dde3ea);border-radius:8px;resize:vertical}
.laudo-legenda-ro{font-size:13px;margin:0;white-space:pre-wrap}
.laudo-lado-acoes{display:flex;gap:6px;flex-wrap:wrap}
.laudo-lado-acoes .mini{cursor:pointer}
.laudo-dz.sobre{border-color:var(--azul,#1565c0);background:#f2f7fd;color:var(--azul,#1565c0)}
.laudo-dup{border-color:#f0d9a0;background:#fffdf6}
.laudo-item.pisca{animation:pisca-dup 1.1s ease-in-out 2}
.laudo-pendente{border-style:dashed}
.laudo-vazia{margin:6px 0}

/* =========================================================================
   [2024 · 07/09] A TELA DO ORÇAMENTO DE PRODUTOS — o mockup do Paulo
   (docs/MOCKUP_2024_ORCAMENTO_PRODUTOS.html): capa em duas colunas (número
   grande + três linhas | Salvar/Gerar/Enviar empilhados), o "Aos cuidados
   de" em linhas, a linha nova do item (código + descrição), as observações
   internas em laranja, o que falta no cadastro em laranja.
   ========================================================================= */
.orc-capa{display:grid;grid-template-columns:1fr 300px;gap:22px;align-items:start}
@media(max-width:900px){.orc-capa{grid-template-columns:1fr}}
.orc-kv{display:grid;grid-template-columns:130px 1fr;row-gap:8px;align-items:center;font-size:13.5px;margin-top:10px}
.orc-kv .k{color:var(--cinza)}
.orc-resp{display:flex;align-items:center;gap:8px;background:#F3F7FC;border:1px solid var(--borda);border-radius:10px;padding:6px 10px;margin-bottom:6px;font-size:13px;flex-wrap:wrap}
.orc-resp .nome{font-weight:600;color:var(--azul)}
.orc-tagp{font-size:11px;padding:2px 8px;border-radius:20px;background:var(--azul-claro);color:var(--azul);font-weight:600}
.orc-tagp.copia{background:#F5F5F5;color:var(--cinza)}
.orc-doc{background:#F3F7FC;border-left:4px solid var(--azul);border-radius:0 12px 12px 0;padding:12px 14px}
.orc-doc .orc-btn{display:flex;justify-content:center;width:100%;margin:0 0 8px;padding:10px 14px;font-size:14px;border-radius:12px;box-sizing:border-box}
.orc-doc .orc-btn.off{opacity:.45;cursor:not-allowed}
.orc-falta{color:var(--lar);font-weight:600}
.orc-sku-det{background:none;border:0;color:var(--cinza);cursor:pointer;
  font-size:12px;padding:0 4px;margin:0}
.orc-sku-sub{margin:2px 0 0 14px;font-size:11.5px;color:var(--cinza)}
/* [2026 · 07/09] o detalhe por estoque da busca do código: o produto aparece
   UMA vez com o saldo somado; isto só abre quando a pessoa pede. */
.orc-aviso{display:block;color:#8a6d1f;background:#fff8e1;border-radius:6px;
  padding:1px 6px;margin-top:2px;font-size:11px;line-height:1.35;font-weight:400}
/* [2025 · 07/09] o aviso da linha do orçamento: cor de AVISO (âmbar), nunca
   o vermelho do .alerta — vermelho é coisa que impede, e aqui nada impede. */
.orc-sku{font-family:ui-monospace,Consolas,monospace;color:var(--azul)}
.orc-nova{display:grid;grid-template-columns:200px 1fr 100px 60px 70px 140px auto;gap:8px;align-items:center;margin-top:10px;padding:12px;background:#F3F7FC;border-radius:12px}
@media(max-width:900px){.orc-nova{grid-template-columns:1fr}}
.orc-nova input,.orc-nova select{margin:0;width:100%;box-sizing:border-box}
.orc-rot{grid-column:1/-1;font-size:11.5px;color:var(--cinza)}
.orc-sku-caixa{position:relative}
.orc-sugest{position:absolute;top:100%;left:0;min-width:320px;max-width:520px;background:#fff;border:1px solid var(--borda);border-radius:10px;box-shadow:0 6px 18px rgba(0,0,0,.12);margin-top:3px;z-index:5;overflow:hidden;max-height:260px;overflow-y:auto}
.orc-sugest div{padding:7px 10px;font-size:12.5px;cursor:pointer;border-bottom:1px solid var(--borda)}
.orc-sugest div:last-child{border-bottom:0}
.orc-sugest div:hover{background:#F3F7FC}
.orc-sugest .livre{color:var(--cinza);font-style:italic}
.orc-cond{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media(max-width:900px){.orc-cond{grid-template-columns:1fr}}
.orc-obsint{background:var(--lar-bg);border:1px solid #FFCC80;border-radius:12px;padding:10px 12px;margin:0}
.orc-obsint label{color:var(--lar);font-weight:600}
.orc-obsint textarea{background:#fff;border-color:#FFCC80;width:100%;box-sizing:border-box}

/* [1052 · 07/09] Equipamento em duas linhas nas listas: a 2ª linha (modelo ·
   fabricante) em cinza pela variável da casa, nunca cor solta */
.eq2-sub{display:block;color:var(--cinza);font-size:11.5px;line-height:1.2}

/* =========================================================================
   7003 · A FAIXA DE COR NA LATERAL DO BLOCO   [09/09/2026]
   -------------------------------------------------------------------------
   Adiantado a pedido dele, no dia em que ele esbarrou nos três blocos do
   Fiscal — "os três em azul, sem barra de cor". Isto é o RECORTE PEQUENO do
   7003: só a faixa AZUL nos blocos de registro/consulta que já existem, sem
   fundir nada (isso é o 7004) e sem tocar no verde (esse depende de ele
   dizer, tela por tela, qual bloco é o trabalho).

   A régua do 7003, para quando o resto vier:
     🟢 verde   · onde o trabalho é feito e concluído — UM por tela
     🟠 laranja · os acessórios (peças, materiais, insumos)
     🔵 azul    · registro e consulta (documentos, comentários, timeline)

   Um lugar só decide a cor: a classe entra no <details>, a faixa é CSS.
   Nunca marcação repetida em quarenta telas — se um dia o azul mudar de
   tom, muda aqui e muda em tudo.
   ========================================================================= */
/* 🔴 `.card`, não `details.card`: medido em 09/09, os três blocos azuis têm
   MOLDURAS DIFERENTES — `_os_docs_etapa` é <details class="card">, o
   `_comentarios` é <div class="card"> com o <details> dentro, e o
   `_os_timeline` não tem moldura própria (quem embrulha é cada tela). Uma
   régua que só casasse com <details> pintaria dois dos três e eu descobriria
   isso pela tela, não pelo código. */
.card.bloco-azul,
.card.bloco-verde,
.card.bloco-laranja{position:relative;overflow:hidden}

.card.bloco-azul::before,
.card.bloco-verde::before,
.card.bloco-laranja::before{
  content:"";position:absolute;left:0;top:0;bottom:0;width:5px;border-radius:20px 0 0 20px}

/* a faixa vale ABERTO OU FECHADO — é o que ele pediu: a cor tem de estar lá
   antes de a pessoa abrir, senão ela abre para descobrir o que é. */
.card.bloco-azul::before   {background:var(--azul)}
.card.bloco-verde::before  {background:var(--verde)}
.card.bloco-laranja::before{background:var(--lar)}

/* [7003 · 10/09] O GESTO QUE É O TRABALHO DA TELA.
   Régua dele: "o verde é o trabalho, esteja ele onde estiver. Em geral é um
   bloco; quando o trabalho da tela é um gesto único, é o gesto que fica
   verde." É o caso da Compra: a tela inteira é consulta e o trabalho é um
   botão — `📦 chegou`. A cor mora aqui, como a da faixa: nunca `style=` na
   marcação, senão o dia em que o verde mudar de tom muda em quarenta telas. */
.btn.acao-verde{background:var(--verde)}
.btn.acao-verde:hover{filter:brightness(.94)}

/* =========================================================================
   7004 · O HISTÓRICO ÚNICO — três blocos viraram um   [10/09/2026]
   -------------------------------------------------------------------------
   O fio: ícone da família à esquerda, quem/quando em cima, a frase embaixo.
   Os chips recortam a VISTA (classe .hist-fora), não a consulta — trocar de
   chip não pode custar uma ida ao servidor nem ao NAS.
   ========================================================================= */
.hist-topo{margin-top:10px;padding-bottom:12px;border-bottom:1px solid var(--borda)}
.hist-topo textarea{margin-bottom:0}

.hist-chips{display:flex;gap:7px;flex-wrap:wrap;margin:14px 0 6px}
.hist-chip{border:1px solid var(--borda);background:#fff;border-radius:20px;
  padding:5px 13px;font-size:12.5px;cursor:pointer;font-family:inherit;
  color:inherit;display:inline-flex;align-items:center;gap:6px}
.hist-chip:hover{border-color:var(--azul)}
.hist-chip.on{background:var(--azul);border-color:var(--azul);color:#fff;font-weight:600}
.hist-chip.on .cont{background:rgba(255,255,255,.25);color:#fff}

.hist-fio{margin-top:10px}
.hist-ev{display:flex;gap:11px;padding:10px 0;border-bottom:1px solid var(--borda)}
.hist-ev:last-child{border-bottom:0}
.hist-fora,.hist-tarde{display:none}
.hist-icone{flex:none;width:22px;text-align:center;font-size:15px;line-height:1.5}
.hist-corpo{flex:1;min-width:0}
.hist-quem{font-size:12.5px;margin-bottom:3px}
.hist-frase{font-size:13.5px;line-height:1.5;word-break:break-word}
.hist-obs{color:var(--cinza);font-size:12.5px;margin-top:2px;white-space:pre-wrap}
/* a etapa do arquivo — o cuidado que ele exigiu medido ANTES: sem ela some a
   organização por pasta que ele desenhou */
.hist-etapa{background:var(--fundo);color:var(--cinza);border-radius:20px;
  padding:1px 8px;font-size:11px;margin-left:5px;text-transform:lowercase}
/* (g) o comentário vira balão: fica diferente do resto sem precisar de rótulo */
.hist-balao{background:var(--azul-claro);border:1px solid var(--borda);border-radius:12px;
  padding:9px 12px;font-size:13.5px;line-height:1.5;white-space:pre-wrap;
  word-break:break-word}
.hist-mencao{color:var(--azul-esc);font-weight:600}
.hist-mais{margin-top:12px;border:1px solid var(--borda);background:#fff;
  border-radius:20px;padding:6px 15px;font-size:12.5px;cursor:pointer;
  font-family:inherit;color:var(--azul)}
.hist-mais:hover{border-color:var(--azul)}

/* ==========================================================================
   [1069 rev 2 · 10/09] O POPUP DAS DUAS FOTOS e o EDITOR (girar/enquadrar)
   Medidas do mockup rev 2 (docs/mockup-1069-foto-na-lista.html).
   ========================================================================== */
.fotos-pop{position:fixed;inset:0;background:rgba(15,23,35,.82);display:none;
  align-items:center;justify-content:center;z-index:50;padding:28px}
.fotos-caixa{background:#fff;border-radius:14px;width:100%;max-width:980px;
  max-height:94vh;display:flex;flex-direction:column;overflow:hidden}
.fotos-caixa header{display:flex;align-items:center;justify-content:space-between;
  padding:13px 18px;border-bottom:1px solid var(--borda,#E0E4EA)}
.fotos-caixa header .t{font-weight:600;font-size:14px}
.fotos-caixa header .t small{display:block;font-weight:400;font-size:12px;
  color:var(--cinza,#616161);margin-top:1px;word-break:break-all}
.fotos-pop .fechar,.foto-ed .fechar{border:1px solid var(--borda,#E0E4EA);background:#fff;
  border-radius:8px;width:32px;height:32px;font-size:16px;cursor:pointer;
  color:var(--cinza,#616161);line-height:1}
.fotos-pop .fechar:hover,.foto-ed .fechar:hover{background:var(--cinza-claro,#F5F7FA)}
.fotos-pop .duas{display:grid;grid-template-columns:1fr 1fr;gap:16px;padding:18px;overflow:auto}
@media (max-width:760px){.fotos-pop .duas{grid-template-columns:1fr}}
.foto-box{border:1px solid var(--borda,#E0E4EA);border-radius:10px;overflow:hidden;
  background:var(--cinza-claro,#F5F7FA);display:flex;flex-direction:column}
.foto-box .rot{font-size:11.5px;font-weight:600;color:var(--cinza,#616161);
  padding:7px 10px;background:#fff;border-bottom:1px solid var(--borda,#E0E4EA);
  display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap}
.foto-box .acoes{display:flex;gap:4px;flex-wrap:wrap}
.foto-box .acoes button{font-family:inherit;font-size:11px;font-weight:500;
  color:var(--azul,#1565C0);background:#fff;border:1px solid var(--borda,#E0E4EA);
  border-radius:6px;padding:3.5px 8px;cursor:pointer;white-space:nowrap}
.foto-box .acoes button:hover{background:var(--azul-claro,#E3F2FD);border-color:var(--azul,#1565C0)}
.foto-box .acoes button.voltar{color:var(--cinza,#616161)}
.foto-box img.principal{width:100%;height:330px;object-fit:contain;background:#F0F2F5;
  cursor:zoom-in;display:block}
/* [11/09] ampliar nunca diminui: a foto que já está no tamanho máximo não
   promete a lupa — o clique nela não abre nada */
.foto-box img.principal.sem-ampliar{cursor:default}
.foto-box .falta{height:330px;display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:9px;color:#98A2B3;font-size:13px;background:#F0F2F5;
  text-align:center;padding:20px}
.foto-box .selo{font-size:10.5px;font-weight:600;color:var(--verde,#2E7D32);
  background:var(--verde-claro,#E8F5E9);border-radius:5px;padding:2px 7px}
/* o editor */
.foto-ed{position:fixed;inset:0;background:rgba(8,12,18,.9);display:none;
  align-items:center;justify-content:center;z-index:70;padding:24px}
.foto-ed .ed-caixa{background:#fff;border-radius:14px;width:100%;max-width:560px;
  overflow:hidden;display:flex;flex-direction:column}
.foto-ed header{padding:13px 18px;border-bottom:1px solid var(--borda,#E0E4EA);
  font-weight:600;font-size:14px;display:flex;justify-content:space-between;align-items:center}
.foto-ed .visor{width:100%;height:330px;background:#111;position:relative;
  overflow:hidden;cursor:grab;touch-action:none}
.foto-ed .visor.arrastando{cursor:grabbing}
.foto-ed .visor img{position:absolute;left:0;top:0;transform-origin:0 0;
  user-select:none;-webkit-user-drag:none;pointer-events:none;max-width:none}
.foto-ed .grade{position:absolute;inset:0;pointer-events:none;
  background-image:linear-gradient(rgba(255,255,255,.22) 1px,transparent 1px),
                   linear-gradient(90deg,rgba(255,255,255,.22) 1px,transparent 1px);
  background-size:33.33% 33.33%}
.foto-ed .ed-carregando{position:absolute;inset:0;display:none;align-items:center;
  justify-content:center;color:#D6DCE5;font-size:12.5px;background:rgba(8,12,18,.55)}
.foto-ed .ed-ctrl{padding:14px 18px;display:flex;flex-direction:column;gap:12px}
.foto-ed .linha-zoom{display:flex;align-items:center;gap:8px;font-size:12px;
  color:var(--cinza,#616161)}
.foto-ed .linha-zoom input[type=range]{flex:1;accent-color:var(--azul,#1565C0)}
.foto-ed .ed-botoes{display:flex;justify-content:flex-end;gap:10px}
.foto-ed .ed-msg{color:var(--vermelho,#C62828)}

/* ==========================================================================
   [1073 · 11/09 · mockup rev 3] A FOTO GRANDE E A OS EM CIMA DO CLIENTE
   Medidas do mockup: moldura 58×58, OS 14,5 px, cliente 12,5 px.
   ========================================================================== */
.os-foto{width:58px;height:58px;border-radius:9px;overflow:hidden;
  border:1px solid var(--borda);background:#fff;display:flex;align-items:center;
  justify-content:center;cursor:pointer;position:relative;padding:0;
  transition:border-color .12s, box-shadow .12s}
.os-foto:hover{border-color:var(--azul);box-shadow:0 0 0 3px var(--azul-claro)}
.os-foto img.mini-os58{width:100%;height:100%;object-fit:cover;display:block}
/* o ＋ só aparece quando a foto NÃO carregou (o onerror acende a .vazia) */
.os-foto .os-foto-cai{display:none}
.os-foto.vazia{border-style:dashed;background:var(--cinza-claro);color:#B8C0CC}
.os-foto.vazia .os-foto-cai{display:block;font-size:19px;line-height:1;
  color:var(--verde)}
.os-foto.vazia:hover{border-color:var(--azul);background:var(--azul-claro)}
/* a célula de duas linhas: a OS manda, o cliente apoia.
   🔴 NOMES PRÓPRIOS: `os-num`/`os-cli` são de os_numero.html() (o número em três
   blocos coloridos) desde antes. Reusá-los fez o meu `display:block` quebrar o
   número em duas linhas em TODA tela que usa |os_num. Aqui a gente DECORA o
   dele por dentro, em vez de disputar o nome. */
.cel-os{display:block;margin-bottom:1px;line-height:1.25}
.cel-os .os-num{font-size:14.5px;font-weight:700;letter-spacing:.02em}
.cel-cli{font-weight:500;font-size:12.5px;color:var(--texto);line-height:1.3;
  display:block}
/* os dois nomes clicáveis do cabeçalho */
.ord-dois{display:inline-flex;align-items:center;gap:7px;white-space:nowrap}
.ord-dois .ord-sep{color:#C3CBD6;font-weight:400}

/* [1073] o TROCAR — nível 4, e o botão perigoso longe do salvar */
.foto-troca{position:fixed;inset:0;background:rgba(15,23,35,.86);display:none;
  align-items:center;justify-content:center;z-index:80;padding:24px}
.foto-troca .ft-caixa{background:#fff;border-radius:14px;width:100%;
  max-width:460px;overflow:hidden;display:flex;flex-direction:column}
.foto-troca header{display:flex;align-items:center;justify-content:space-between;
  padding:13px 18px;border-bottom:1px solid var(--borda)}
.foto-troca header .t{font-weight:600;font-size:14px}
.foto-troca header .t small{display:block;font-weight:400;font-size:12px;
  color:var(--cinza);margin-top:1px}
.foto-troca .ft-corpo{padding:18px}
.ft-solta{border:2px dashed var(--azul-borda,#BBDEFB);background:#FAFCFF;
  border-radius:11px;padding:22px;text-align:center;font-size:13.5px;
  color:var(--azul);cursor:pointer;font-weight:500}
.ft-solta:hover,.ft-solta.sobre{background:var(--azul-claro)}
.ft-solta small{display:block;font-size:11.5px;color:var(--cinza);
  font-weight:400;margin-top:4px}
.ft-ou{text-align:center;font-size:11.5px;color:#9AA3AF;margin:14px 0 9px;
  font-style:italic}
.ft-sam{display:inline-block;font-size:12px;font-weight:500;color:var(--verde);
  background:var(--verde-claro);border:1px solid #C3E0C8;border-radius:16px;
  padding:4px 12px;text-decoration:none}
.ft-msg{color:var(--vermelho)}
/* o trocar fica na ESQUERDA da linha de botões do editor, longe do salvar */
.foto-ed .ed-botoes{justify-content:space-between}

/* [1073] a frase que avisa que o clique pôs a ordem do planejador de lado */
.resumo-1051.resumo-ord{background:var(--azul-claro);border-left-color:var(--azul)}
