/* Painel de Ferramentas · Capital Health
   Tokens compartilhados — identidade visual.
   Toda tela nova deve importar este arquivo antes do seu próprio CSS:

     <link rel="preconnect" href="https://fonts.googleapis.com">
     <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
     <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
     <link rel="stylesheet" href="assets/css/base.css">

   A fonte Inter continua vindo do Google Fonts no <head> (preconnect é mais
   rápido que um @import daqui). Aqui mora só a pilha tipográfica, em --font.
*/

:root{
  /* ---------- tipografia ---------- */
  --font: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;

  /* ---------- paleta ---------- */
  --mint:        #6FD7A7;
  --mint-strong: #4FC28E;
  --mint-soft:   #A9E9C8;
  --mint-wash:   #E4F6ED;
  --off-white:   #F7F8F8;
  --white:       #FFFFFF;
  --ink:         #10231C;
  --ink-2:       #5A6B64;
  --ink-3:       #8C9A94;
  --line:        #E3E7E5;

  /* ---------- superfície e texto (semânticos) ----------
     Em tela nova, use ESTES e não os brutos acima: são eles que viram
     no modo escuro. Os brutos continuam sendo a paleta — branco é branco. */
  --bg:        #E9F2EE;
  --surface:   #FFFFFF;
  --surface-2: #F7F8F8;
  --text:      #10231C;
  --text-2:    #5A6B64;
  --text-3:    #8C9A94;
  --border:    #E3E7E5;

  --shadow-lg: 0 30px 80px -50px rgba(14,59,42,.45);
  --shadow-md: 0 18px 40px -28px rgba(14,59,42,.55);
  --shadow-sm: 0 2px 10px -6px rgba(14,59,42,.35);

  /* ---------- status (semânticos) ----------
     Para badges e alertas: atrasado/erro, aviso, informativo. Os "wash"
     mudam no modo escuro (viram fundo escuro), as cores sólidas não. */
  --danger:      #E05B5B;
  --danger-wash: #FDECEC;
  --warn:        #E0A23C;
  --warn-wash:   #FBF2E2;
  --info:        #4A8FD4;
  --info-wash:   #EAF2FB;

  color-scheme: light;

  /* ---------- marca ----------
     Aplicado por mask — herda a cor de onde estiver. */
  --logo: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJsAAACYCAYAAADz9ZsiAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAydpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDEwLjAtYzAwMCA3OS5kMjBlNDY2MzAsIDIwMjUvMTIvMDktMDI6MTE6MjMgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkMwMUM1Q0ZENzRCQjExRjFCQThCRjVDMDc0Mzg5MDA5IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkMwMUM1Q0ZDNzRCQjExRjFCQThCRjVDMDc0Mzg5MDA5IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyNy4wIChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjFGMTEwQkZFQjlDQzExRjA4MDE0QTcyOUVGQjNDNkZDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjFGMTEwQkZGQjlDQzExRjA4MDE0QTcyOUVGQjNDNkZDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+lVukXwAABWlJREFUeNrs3U1oHGUYwPHnnd3OfjaZqLEVYhpvtb2oRQ2oqOBFUKiIFIoHDy1E2mo9iZdC0eIXgp4UPdSDFyuYgD1UL57aejJeLCjSapCaXnSbZHdmN9l9fTbNQcls2rrvbGbX/w/SwG4ymb75Z979mA9jrRWgFzyGAMQGYgOIDcQGEBt6Ltvfq18JpO7PrrvZtr6WfHnKyY+Iap+KkUd7/l8zzVfE3zpDbOkysf4X5W1zt+03w2LtRO9j84aZRgFiA7EBA/SYbbP86mYxNtAHaAGxobNc416RoNL1chqLe8VmpplGAWIDsQHEBmIDsQHEBmIDiA3EBmIDiA3EBhAbiA3EBhAbiA0gNhAbQGwgNhAbQGwgNoDYQGwgNoDYQGwAsYHYQGwAsYHYAGIDsYHYAGKDcB2EG9ZoLO32rfeIXnhsl1gZ1SvnjYkx5a4Wav3BvY5D07whtnY0LatjrX3N5Epn0hzbiNSrBzSqfRrantVbWnbtLqP/A/7aOzIypuMzlprVcXCVwGyCkR3Tyxge0NUsExWSiS2s7tep8gON7Dbd9jLCSCi2aOlj8byDDCuSjK0sUfUrnTYfu4nvWdGP+bXPrs33yy/AWi8yzq7w52SFivoA7fa0xjYs9fC0ruDD1/m6i2LNF2Ls2bAVfl8o3HolodD663nAtWd4d6VmhRK8SmD3sYW1E/pqXefQrEaWybxXqYafBUGw0L6pIEXmFKbRm1RfOqyP0Q5t8BUfSf7Hl0TuXw6CHKMtvIPwH58MRBP67cc63NvUCeKo5IovtkNjmNHdls2zJ1bfCYh3RHKFDxledB/bcu0+DW1/h1e+Xxe/SGhwNI1aebnDPRfE//I4wwpXsW3Rj6di72k19e2p55sMK9zEFlaf0y3bLTGbuwtS2HqeIYW72LKZJ2JnVk/eYTjhNjbb2hl3c60hZxhOuH7MtjvuXYJSqXSF4YTL2LIa1tC6W429xFDCbWyLi4HE78a5wFDCbWyeF/8icMvWGUpwdBWIDcQGEBuIDTJwB0fnpfMxI8QGl5sfc4fEvx9ZJTY4Zu6OvbnVWCA2uI5tV3xs0UVig0uB7mn9QMyxpJelNDpPbHAnqj6jYW2JeTtylmejcDyDdjhazrROEhvcCZeO6Hw5ETOF/il+eZrY4Gj61GOAM5k347dqZqb99IDY4GCLFt6p0+Rp3YKVYu69HLbqx3kHAW5Cy9hTErf39bVjgD8pFEbmiA3dWQ4f1NC+0T2vJ+O/wP4kV6vvCu+NQrp5La0RvqU7vJ7T0HZ2OEfbX5FdflJGR6vSj2cLx6bKSbi4Z/Ucx56nx/3a65yl3T6bzweX0nnmyfaJAOu16dQMbcZ8J9nC230ynU3qVubVhJZe0MddO3QLNi5epri21dr4xBoiT0u+/K2k+DSnY2sf6dC0/bPNtivb9a9jb3LLv+Gv/F1Pn7FPz2pwTtifDZLcRQ7O60scDyUZGrH979mf9Z8p8QuPu3yJgycI+Kezujmb0TODvi89PIk2sQ3+HNl++eIPPWvBD/p5VqKVUzI09Iuk/syTpZLu01QZSc04Ru39r/xBPfXDlOQan3e1hLmFSMbHo3/d5ks/neY0qKTm15HXVRnUY/E9G3U91uMBR1dBOJQPIDYQG0BsIDYQG0BsIDaA2EBsALGB2EBsALGB2ABiA7GB2ABiA7EBxAZiA7EBxAZiA4gNxAZiA4gNxAYQG4gNxAYQG4gNIDYQGzC4F92YlEbtpJMlWXMPmRDbRrbr1ehekB5f1g5MoyA2EBtAbOh3xtq+fwC8Y5N+7m9OljI3l9cr521bf0flaqouSkdsYBoFiA3EBmIDiA3EBmzkbwEGAH8POHcOgHuqAAAAAElFTkSuQmCC");
}

/* ---------- modo escuro ----------
   Ativado por data-theme="dark" no <html>. A escolha é do usuário e fica
   no localStorage; a preferência do sistema só decide a primeira visita.
   A marca (mint) não muda — só as superfícies e o texto. */
[data-theme="dark"]{
  --mint-wash: #123027;

  --bg:        #071411;
  --surface:   #0E201A;
  --surface-2: #142A23;
  --text:      #E9F3EF;
  --text-2:    #9DB1A9;
  --text-3:    #758A82;
  --border:    #1D362D;

  --shadow-lg: 0 30px 80px -50px rgba(0,0,0,.95);
  --shadow-md: 0 18px 40px -28px rgba(0,0,0,.8);
  --shadow-sm: 0 2px 10px -6px rgba(0,0,0,.6);

  --danger-wash: #2A1414;
  --warn-wash:   #2B2210;
  --info-wash:   #12232F;

  color-scheme: dark;
}


/* ============================================================
   CAIXAS DE SELEÇÃO
   ============================================================
   A lista suspensa do navegador é desenhada pelo sistema operacional e
   não obedece a CSS: no Windows sai cinza, quadrada e com outra fonte.
   `assets/js/select.js` põe uma casca por cima; o <select> continua ali,
   escondido, e continua sendo a verdade.

   Estas regras moram aqui, e não na página, porque a casca aparece em
   nove telas — e um select criado por JavaScript pode nascer em
   qualquer uma.

   **Toda classe daqui começa com `sel-`, sem exceção.** A casca herda as
   classes que a tela pôs no <select> — é o que mantém a etiqueta colorida
   da Cobrança funcionando —, e por isso ela vive dentro do CSS da página.
   As primeiras versões marcavam o estado com `aberto` e `vazio`: `vazio`
   é o nome do estado "nada para mostrar" em **dezoito** telas, e o filtro
   de risco da Cobrança virou uma caixa tracejada de 198×164 com a seta
   embaixo do texto. `aberto` bate com o checklist. Nome curto aqui é
   colisão garantida. */

/* O <select> de verdade some da vista mas continua no formulário, no
   teclado e no leitor de tela do sistema. `display:none` o tiraria da
   validação nativa. */
.sel-nativo{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;
}

.sel{
  display:inline-flex;align-items:center;justify-content:space-between;gap:9px;
  width:100%;min-height:40px;padding:0 12px;
  border:1px solid var(--border);border-radius:13px;
  background:var(--surface);color:var(--text);
  font:500 13px var(--font);text-align:left;cursor:pointer;
  transition:border-color .16s, background .16s, box-shadow .16s;
}
/* Para o select que não ocupava a linha inteira. Quem decide é o
   `select.js`, medindo a caixa antes de vestir — a tela não declara nada.
   O `min-width` é posto lá, com a largura que o navegador já tinha dado
   àquele select. */
.sel-justo{width:auto;flex:none;max-width:100%}
.sel:hover:not(:disabled){border-color:var(--mint)}
.sel:focus-visible{outline:none;border-color:var(--mint);box-shadow:0 0 0 3px var(--mint-wash)}
.sel-aberto{border-color:var(--mint);box-shadow:0 0 0 3px var(--mint-wash)}
.sel:disabled{opacity:.55;cursor:not-allowed}
/* Opção de valor vazio é o texto de dica, não uma escolha. */
.sel-vazio .sel-texto{color:var(--text-3)}
.sel-texto{
  flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.sel-seta{
  width:15px;height:15px;flex:none;color:var(--text-3);
  transition:transform .18s cubic-bezier(.2,.8,.25,1), color .16s;
}
.sel:hover .sel-seta, .sel-aberto .sel-seta{color:var(--mint-strong)}
.sel-aberto .sel-seta{transform:rotate(180deg)}

.sel-painel{
  /* `width:max-content` é obrigatório: sem largura própria, um elemento
     fixo com filhos em `width:100%` estica até a borda da janela, e a
     lista abria atravessada na tela inteira. */
  position:fixed;z-index:10000;width:max-content;
  min-width:180px;max-width:min(420px,92vw);
  padding:6px;border:1px solid var(--border);border-radius:16px;
  background:var(--surface);box-shadow:var(--shadow-lg);
  overflow-y:auto;overscroll-behavior:contain;
  animation:sel-entra .16s cubic-bezier(.2,.8,.25,1) both;
}
@keyframes sel-entra{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
.sel-painel::-webkit-scrollbar{width:8px}
.sel-painel::-webkit-scrollbar-thumb{background:var(--border);border-radius:99px}

.sel-item{
  display:flex;align-items:center;gap:10px;width:100%;
  padding:9px 11px;border:0;border-radius:11px;background:transparent;
  color:var(--text-2);font:500 13px var(--font);text-align:left;cursor:pointer;
  transition:background .12s, color .12s;
}
.sel-item span{flex:1;min-width:0}
.sel-item svg{width:14px;height:14px;flex:none;opacity:0}
.sel-item:hover, .sel-item:focus-visible{outline:none;background:var(--surface-2);color:var(--text)}
.sel-item.sel-escolhido{background:var(--mint-wash);color:var(--mint-strong);font-weight:600}
.sel-item.sel-escolhido svg{opacity:1}

@media (prefers-reduced-motion:reduce){
  .sel-painel{animation:none}
  .sel-seta{transition:color .16s}
}


/* ============================================================
   FOTO NO AVATAR
   ============================================================
   O avatar já existia com as iniciais em cima de um gradiente mint. Com
   foto, a imagem cobre tudo e o texto some — mas continua no HTML, para
   o leitor de tela e para o caso de a imagem não carregar.

   `Painel.foto(elemento, perfil)` põe e tira a classe. Vale para o
   avatar da barra lateral, para o do hub e para a lista de pessoas do
   administrativo, porque todos usam a mesma classe. */
.com-foto{
  background-size:cover !important;
  background-position:center !important;
  background-repeat:no-repeat !important;
  color:transparent !important;
}


/* ============================================================
   A MOLDURA APARECE NA HORA
   ============================================================
   A barra lateral e o topo entram assim que a página carrega; só o
   conteúdo espera os dados. Antes cada tela escondia o `.app` inteiro
   até o `pronto`, e numa busca demorada (a Cobrança puxa 895 linhas da
   planilha) isso é uma página em branco de vários segundos, que parece
   travamento.

   Estava copiado nas 21 telas; mora aqui porque a regra é a mesma em
   todas e o `pronto` que a destrava também. Quem preenche o vão enquanto
   isso é o `assets/js/esqueleto.js`. */
.content{opacity:0;transition:opacity .25s ease}
.app.pronto .content{opacity:1}


/* ============================================================
   ESQUELETO DE CARREGAMENTO
   ============================================================
   Os blocos que ocupam o lugar do conteúdo enquanto os dados não chegam.
   Quem os põe e tira é `assets/js/esqueleto.js`; a tela não muda nada.

   O brilho que atravessa cada bloco é o que separa "carregando" de
   "quebrou": bloco cinza parado parece erro de desenho. */
.esqueleto{
  padding:0 4px 24px;max-width:1180px;
  animation:esq-entra .3s ease both;
}
@keyframes esq-entra{from{opacity:0}to{opacity:1}}
.esqueleto.saindo{animation:esq-sai .22s ease both}
@keyframes esq-sai{from{opacity:1}to{opacity:0}}

.esq-linha, .esq-bloco{
  position:relative;overflow:hidden;
  background:var(--surface-2);border:1px solid var(--border);
}
.esq-linha::after, .esq-bloco::after{
  content:"";position:absolute;inset:0;
  background:linear-gradient(90deg,
    transparent 0%,
    color-mix(in srgb, var(--surface) 70%, transparent) 45%,
    transparent 90%);
  transform:translateX(-100%);
  animation:esq-brilho 1.4s ease-in-out infinite;
}
@keyframes esq-brilho{to{transform:translateX(100%)}}

.esq-titulo{width:min(300px,60%);height:34px;border-radius:11px;margin:4px 0 12px}
.esq-sub   {width:min(440px,80%);height:16px;border-radius:8px;margin-bottom:26px}
.esq-bloco {height:96px;border-radius:20px;margin-bottom:12px}

/* Quem pediu menos movimento no sistema fica com os blocos parados —
   eles continuam dizendo onde o conteúdo vai entrar. */
@media (prefers-reduced-motion:reduce){
  .esqueleto, .esqueleto.saindo{animation:none}
  .esq-linha::after, .esq-bloco::after{animation:none;display:none}
}


/* ============================================================
   TROCA DE PÁGINA
   ============================================================
   O painel é multipágina — sair do hub para um módulo é navegação de
   verdade, e o navegador apaga tudo e redesenha, com o piscar branco no
   meio. Estas linhas fazem uma tela se dissolver na outra.

   Só isto, e nenhum JavaScript: quem não tiver suporte navega como
   sempre, sem nada quebrado. */
@view-transition{ navigation:auto }

::view-transition-old(root){ animation:tv-sai .16s ease both }
::view-transition-new(root){ animation:tv-entra .22s ease both }
@keyframes tv-sai  {to  {opacity:0}}
@keyframes tv-entra{from{opacity:0}}

/* Curto de propósito. Transição de página é moldura, não espetáculo:
   passando de uns 250ms ela deixa de suavizar e passa a atrasar. */

@media (prefers-reduced-motion:reduce){
  ::view-transition-old(root), ::view-transition-new(root){ animation:none }
}
