/* =====================================================================
   GestELT - estilos
   Um arquivo so, sem dependencia externa: carrega rapido e funciona
   mesmo se a internet da clinica estiver ruim.
   ===================================================================== */

:root {
    /* --azul e --lateral-fundo sao sobrescritos pelo layout com as cores
       da clinica ativa. Os valores aqui sao o padrao da plataforma. */
    --azul:           #2563eb;
    --lateral-fundo:  #111827;
    --azul-escuro: #1d4ed8;
    --texto:       #1f2937;
    --texto-fraco: #6b7280;
    --borda:       #e5e7eb;
    --fundo:       #f3f4f6;
    --branco:      #ffffff;
    --verde:       #059669;
    --vermelho:    #dc2626;
    --amarelo:     #d97706;
    --raio:        8px;

    /* Verde de botao de acao. Mais fechado que --verde, que e cor de
       texto e de etiqueta: aqui vai texto branco por cima, e o tom
       claro nao daria contraste. */
    --acao-verde:        #15803d;
    --acao-verde-escuro: #166534;

    /* Realces e avisos saem daqui para o tema escuro poder trocar todos
       de uma vez. Cor escrita direto na regra viraria mancha branca no
       modo noturno. */
    --realce:        #f9fafb;
    --realce-azul:   #eff6ff;
    --gengiva:       #f7d4d9;
    --sucesso-fundo: #ecfdf5;
    --sucesso-borda: #a7f3d0;
    --sucesso-texto: #065f46;
    --erro-fundo:    #fef2f2;
    --erro-borda:    #fecaca;
    --erro-texto:    #991b1b;
    --aviso-fundo:   #fffbeb;
    --aviso-borda:   #fde68a;
    --aviso-texto:   #92400e;

    /* Cores dos indicadores do painel. Sao do SISTEMA, nao da clinica:
       vermelho quer dizer atraso em qualquer lugar. Ficam como variaveis
       para o tema escuro clarear todas de uma vez. */
    --tom-azul:     #2563eb;
    --tom-verde:    #059669;
    --tom-roxo:     #7c3aed;
    --tom-vermelho: #dc2626;
    --tom-ambar:    #d97706;
    --tom-ciano:    #0891b2;
    --tom-neutro:   #64748b;

    /* Situacoes de atendimento. Cada clinica escolhe as suas em
       Configuracoes; o layout sobrescreve estas variaveis. Os valores
       aqui valem para as telas do master e como reserva. */
    --status-agendado:          #dbeafe;
    --status-agendado-texto:    #1f2937;
    --status-confirmado:        #d1fae5;
    --status-confirmado-texto:  #1f2937;
    --status-atendido:          #e5e7eb;
    --status-atendido-texto:    #1f2937;
    --status-faltou:            #fee2e2;
    --status-faltou-texto:      #1f2937;
    --status-cancelado:         #f3f4f6;
    --status-cancelado-texto:   #1f2937;
}

/* ------------------------------------------------------------------ */
/* Tema escuro                                                         */
/*                                                                     */
/* Cada usuario escolhe no perfil, e o layout carimba data-tema no     */
/* <html>. As cores da CLINICA (--azul, --lateral-fundo) nao mudam:    */
/* identidade visual nao e preferencia de quem esta olhando.           */
/*                                                                     */
/* --branco e o nome historico da cor de superficie (painel, tabela,   */
/* campo). Redefini-la aqui escurece a interface inteira de uma vez.   */
/* ------------------------------------------------------------------ */
html[data-tema="escuro"] {
    --texto:       #e5e7eb;
    --texto-fraco: #9ca3af;
    --borda:       #374151;
    --fundo:       #0f172a;
    --branco:      #1e293b;
    --verde:       #34d399;
    --vermelho:    #f87171;
    --amarelo:     #fbbf24;

    --realce:        #24324a;
    --realce-azul:   #1e3a5f;
    --gengiva:       #4a2f36;
    --sucesso-fundo: #064e3b;
    --sucesso-borda: #065f46;
    --sucesso-texto: #a7f3d0;
    --erro-fundo:    #4c1d24;
    --erro-borda:    #7f1d1d;
    --erro-texto:    #fecaca;
    --aviso-fundo:   #422f10;
    --aviso-borda:   #78350f;
    --aviso-texto:   #fde68a;

    /* Sobre fundo escuro as cores fechadas somem: sobem de tom */
    --tom-azul:     #60a5fa;
    --tom-verde:    #34d399;
    --tom-roxo:     #a78bfa;
    --tom-vermelho: #f87171;
    --tom-ambar:    #fbbf24;
    --tom-ciano:    #22d3ee;
    --tom-neutro:   #94a3b8;

    --status-agendado-texto:   #111827;
    --status-confirmado-texto: #111827;
    --status-atendido-texto:   #111827;
    --status-faltou-texto:     #111827;
    --status-cancelado-texto:  #111827;
}

@media (prefers-color-scheme: dark) {
    html[data-tema="sistema"] {
        --texto:       #e5e7eb;
        --texto-fraco: #9ca3af;
        --borda:       #374151;
        --fundo:       #0f172a;
        --branco:      #1e293b;
        --verde:       #34d399;
        --vermelho:    #f87171;
        --amarelo:     #fbbf24;

        --realce:        #24324a;
        --realce-azul:   #1e3a5f;
        --gengiva:       #4a2f36;
        --sucesso-fundo: #064e3b;
        --sucesso-borda: #065f46;
        --sucesso-texto: #a7f3d0;
        --erro-fundo:    #4c1d24;
        --erro-borda:    #7f1d1d;
        --erro-texto:    #fecaca;
        --aviso-fundo:   #422f10;
        --aviso-borda:   #78350f;
        --aviso-texto:   #fde68a;

        --tom-azul:     #60a5fa;
        --tom-verde:    #34d399;
        --tom-roxo:     #a78bfa;
        --tom-vermelho: #f87171;
        --tom-ambar:    #fbbf24;
        --tom-ciano:    #22d3ee;
        --tom-neutro:   #94a3b8;

        --status-agendado-texto:   #111827;
        --status-confirmado-texto: #111827;
        --status-atendido-texto:   #111827;
        --status-faltou-texto:     #111827;
        --status-cancelado-texto:  #111827;
    }
}

/* ------------------------------------------------------------------ */
/* Tamanho da interface                                                */
/*                                                                     */
/* zoom cresce letra, botao e espacamento juntos - que e o que a       */
/* pessoa quer dizer com "aumenta a tela". Fica no .app para nao       */
/* afetar a barra de progresso, que e fixa na janela.                  */
/*                                                                     */
/* O fator vai numa variavel, e nao direto no zoom, porque a ALTURA    */
/* precisa dele tambem: o zoom multiplica o tamanho ja calculado,      */
/* entao um min-height de 100vh com zoom 0.9 desenha 90vh - a barra    */
/* lateral parava no meio do caminho e sobrava uma faixa clara no pe   */
/* da tela. Nas escalas maiores era o contrario: 125vh desenhados,     */
/* com barra de rolagem em pagina que cabia inteira.                   */
/*                                                                     */
/* Dividir a altura pelo proprio fator devolve a tela cheia em         */
/* qualquer escala - ver .app.                                         */
/* ------------------------------------------------------------------ */
html[data-escala="compacta"]    { --escala: 0.9; }
html[data-escala="confortavel"] { --escala: 1.1; }
html[data-escala="ampliada"]    { --escala: 1.25; }

* { box-sizing: border-box; margin: 0; padding: 0; }

/* O atributo hidden precisa vencer o display do proprio elemento.
   Sem isto, esconder um bloco com display:flex ou :grid nao surte efeito -
   e o JavaScript acha que escondeu. */
[hidden] { display: none !important; }

/* A cor de fundo no <html> elimina o lampejo branco entre uma pagina e
   outra: o navegador pinta esta cor, nao o branco padrao. */
html { background: var(--fundo); }

body {
    font-family: -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
    font-size: 15px;
    color: var(--texto);
    background: var(--fundo);
    line-height: 1.5;
}

/* ------------------------------------------------------------------ */
/* Transicao entre telas                                               */
/* ------------------------------------------------------------------ */

/* Navegadores compativeis fazem a troca de documento com fade em vez de
   corte seco. Onde nao houver suporte, a regra e simplesmente ignorada
   e o resto do feedback (barra de progresso) continua valendo. */
@view-transition { navigation: auto; }

.barra-progresso {
    position: fixed;
    top: 0;
    left: 0;
    height: 3px;
    width: 0;
    background: var(--azul);
    box-shadow: 0 0 8px rgba(37, 99, 235, .6);
    z-index: 9999;
    opacity: 0;
    transition: width .12s linear, opacity .2s ease;
    pointer-events: none;
}

.barra-progresso.ativa { opacity: 1; }
.barra-progresso.concluida { transition: width .15s ease-out, opacity .25s ease; opacity: 0; }

/* Cursor de espera enquanto a proxima tela nao chega */
html.carregando { cursor: progress; }
html.carregando a, html.carregando button { cursor: progress; }

/* Conteudo entra suave, o que disfarca o repintar da pagina */
main { animation: surgir .18s ease-out; }

@keyframes surgir {
    from { opacity: 0; transform: translateY(3px); }
    to   { opacity: 1; transform: none; }
}

/* Quem prefere menos movimento nao recebe animacao nenhuma */
@media (prefers-reduced-motion: reduce) {
    main { animation: none; }
    .barra-progresso { transition: none; }
}

.botao.enviando { opacity: .7; cursor: progress; }

a { color: var(--azul); text-decoration: none; }

/* ------------------------------------------------------------------ */
/* Estrutura                                                           */
/* ------------------------------------------------------------------ */
.app {
    display: flex;
    zoom: var(--escala, 1);
    /* Dividido pela escala: o zoom multiplica depois, e o resultado na
       tela e 100vh de verdade em qualquer tamanho escolhido */
    min-height: calc(100vh / var(--escala, 1));
}

.lateral {
    width: 220px;
    flex-shrink: 0;
    background: var(--lateral-fundo);
    color: #d1d5db;
    padding: 20px 0;
}

/* A marca ocupa uma faixa de altura minima e centraliza o que estiver
   dentro dela - texto ou logo. Sem esse minimo, cada clinica empurrava o
   menu para uma altura diferente conforme a imagem que enviou.

   A faixa cresce junto com a logo (--logo-altura, escolhida em
   Configuracoes) mais o respiro de baixo: com a altura travada em 76px,
   uma logo de 120px vazava por cima do primeiro item do menu. */
.lateral .marca {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: max(76px, calc(var(--logo-altura, 56px) + 20px));
    padding: 4px 16px 16px;
    font-size: 22px;
    font-weight: 700;
    color: #fff;
    text-align: center;
    line-height: 1.15;
    /* Nome comprido quebra em vez de vazar para fora da barra */
    overflow-wrap: anywhere;
}

.lateral .marca span { color: #60a5fa; }

.lateral nav { display: flex; flex-direction: column; }

.lateral nav a {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 11px 20px;
    color: #d1d5db;
    border-left: 3px solid transparent;
}

.menu-rotulo { flex: 1; min-width: 0; }

/* ------------------------------------------------------------------ */
/* Marcadores de pendencia no menu                                     */
/*                                                                     */
/* Numero para o que se conta (orcamentos em aberto, agenda do dia) e   */
/* ponto para o que so esta ou nao pendente (o caixa do dia). Sao a     */
/* mesma informacao do sino, dita no lugar onde a pessoa ja esta        */
/* olhando quando decide o que fazer em seguida.                        */
/* ------------------------------------------------------------------ */
.menu-marcador {
    flex: 0 0 auto;
    min-width: 22px;
    padding: 1px 7px;
    border-radius: 999px;
    background: rgba(255, 255, 255, .16);
    color: #fff;
    font-size: 11px;
    font-weight: 700;
    line-height: 1.5;
    text-align: center;
    font-variant-numeric: tabular-nums;
}

/* Rede de seguranca: pilula sem numero nao se desenha. O layout ja manda
   o marcador com hidden nesse caso; isto cobre o item que chegar vazio. */
.menu-marcador:empty { display: none; }

.menu-ponto {
    flex: 0 0 auto;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: #ef4444;
    /* O anel escuro descola o ponto de qualquer cor de barra que a
       clinica escolher, inclusive de um vermelho parecido */
    box-shadow: 0 0 0 2px var(--lateral-fundo);
}

/* Clareia o item ativo sem depender da cor de fundo escolhida pela clinica */
.lateral nav a:hover { background: rgba(255, 255, 255, .08); color: #fff; }

.lateral nav a.ativo {
    background: rgba(255, 255, 255, .12);
    color: #fff;
    border-left-color: var(--azul);
    font-weight: 600;
}

.lateral .subtitulo-lateral {
    padding: 0 20px 16px;
    margin-top: -14px;
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: .08em;
    color: #9ca3af;
}

/* object-fit: a logo cabe inteira na faixa, sem esticar nem cortar,
   seja ela quadrada, larga ou enorme.

   O teto de altura e da clinica (Configuracoes > Aparencia): a mesma
   medida serve mal a uma logo em pe e a uma deitada - uma fica ilegivel,
   a outra deixa sobra em volta. Sem o valor gravado vale o de sempre. */
.logo-clinica {
    display: block;
    max-width: 100%;
    max-height: var(--logo-altura, 56px);
    width: auto;
    height: auto;
    object-fit: contain;
    margin: 0 auto;
}

/* Faixa que lembra o master de que ele esta dentro de uma clinica */
.faixa-master {
    background: var(--aviso-fundo);
    border-bottom: 1px solid var(--aviso-borda);
    color: var(--aviso-texto);
    padding: 8px 24px;
    font-size: 13px;
}

.faixa-master a { color: var(--aviso-texto); text-decoration: underline; margin-left: 8px; }

.conteudo { flex: 1; display: flex; flex-direction: column; min-width: 0; }

.topo {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    padding: 16px 24px;
    background: var(--branco);
    border-bottom: 1px solid var(--borda);
}

.topo h1 { font-size: 19px; font-weight: 600; }

.usuario { display: flex; align-items: center; gap: 14px; }

/* Filho DIRETO: o nome empilhado e alinhado a direita e so o bloco do
   usuario. Sem o ">", a regra descia para dentro dos menus suspensos e
   jogava a lista de pendencias inteira contra a margem direita. */
.usuario > span,
.usuario > .atalho-perfil { display: flex; flex-direction: column; line-height: 1.2; text-align: right; }
.usuario > span > small,
.usuario > .atalho-perfil > small { color: var(--texto-fraco); font-size: 12px; }

/* O nome no topo abre o perfil: e onde a pessoa procura por isso */
.atalho-perfil { color: var(--texto); }
.atalho-perfil:hover strong { color: var(--azul); }

/* Separado do resto do menu: nao e area do sistema, e a propria pessoa */
.lateral nav .item-perfil { margin-top: 10px; border-top: 1px solid rgba(255, 255, 255, .12); }

main { padding: 24px; flex: 1; }

/* ------------------------------------------------------------------ */
/* Indicadores                                                         */
/*                                                                     */
/* A faixa de numeros que abre quase toda tela de lista. Eram caixas   */
/* brancas iguais: cinco retangulos que so diziam alguma coisa depois  */
/* de lidos, um por um. Agora cada um leva a cor do que mede (--tom, o */
/* mesmo vocabulario dos cartoes do painel) em quatro lugares - faixa  */
/* do topo, icone, numero e brilho de fundo. De longe se ve o verde do */
/* que entrou e o vermelho do que venceu sem ler uma palavra.          */
/*                                                                     */
/* O HTML sai todo do parcial Views/_parciais/indicadores.php.         */
/* ------------------------------------------------------------------ */

/* O tom padrao mora na SECAO, e nao no indicador: aqui ele so vale por
   heranca, e a classe tom-* do proprio indicador passa na frente.
   Declarado em `.indicadores .indicador`, venceria `.tom-verde` por
   especificidade e a faixa inteira sairia cinza. */
.indicadores {
    --tom: var(--tom-neutro);
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(186px, 1fr));
    gap: 12px;
    margin-bottom: 24px;
}

.indicador {
    position: relative;
    display: flex;
    flex-direction: column;
    padding: 14px 16px 13px;
    background: var(--branco);
    border: 1px solid var(--borda);
    border-radius: 14px;
    overflow: hidden;
    transition: transform .15s ease, box-shadow .15s ease, border-color .15s ease;
}

/* Faixa da cor no topo, como nos cartoes do painel */
.indicador::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 3px;
    background: var(--tom);
}

/* Brilho diluido do mesmo tom: cor sem precisar de um fundo por tema -
   a opacidade resolve no claro e no escuro */
.indicador::after {
    content: "";
    position: absolute;
    top: -40px;
    right: -40px;
    width: 108px;
    height: 108px;
    border-radius: 50%;
    background: var(--tom);
    opacity: .10;
    pointer-events: none;
    transition: opacity .15s ease;
}

/* Altura de duas linhas de rotulo, sempre: "Diferencas de conferencia"
   quebra em duas e "Entradas" nao, e sem isto os numeros da mesma faixa
   ficariam cada um em uma altura */
.indicador-topo {
    display: flex;
    align-items: center;
    gap: 8px;
    min-height: 30px;
}

.indicador-icone {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border-radius: 9px;
    background: var(--tom);
    color: #fff;
    flex-shrink: 0;
}

.indicador-icone svg { width: 16px; height: 16px; }

/* No tema escuro os tons clareiam, e o branco do simbolo some dentro do
   ambar e do ciano. Ali o desenho vira escuro. */
html[data-tema="escuro"] .indicador-icone { color: var(--fundo); }

.indicador .rotulo {
    display: block;
    color: var(--texto-fraco);
    font-size: 12.5px;
    font-weight: 600;
    line-height: 1.2;
}

.indicador .numero {
    display: block;
    margin-top: 10px;
    font-size: 26px;
    font-weight: 700;
    line-height: 1.1;
    color: var(--tom);
    font-variant-numeric: tabular-nums;
    /* Valor em reais nao pode vazar da caixa em tela estreita */
    overflow-wrap: anywhere;
}

/* Quando o lugar do numero traz texto - uma data, um nome - o tamanho de
   numero grande so atrapalha a leitura */
.indicador .numero.curto { font-size: 17px; line-height: 1.25; }

.indicador-valor {
    margin-top: 1px;
    font-size: 13.5px;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    overflow-wrap: anywhere;
}

.indicador .dica { margin-top: 2px; font-size: 11.5px; }

/* Cor da situacao: a que a tela escolhe caso a caso perde para estas
   duas, que valem por si - vermelho para o que pede providencia. */
.indicador.atencao { --tom: var(--tom-vermelho); }

/* O numero que resume os outros da faixa: o mesmo tom, com mais peso */
.indicador.destaque { box-shadow: 0 0 0 1px var(--tom); }
.indicador.destaque::before { height: 5px; }
.indicador.destaque::after { opacity: .16; }

/* ------------------------------------------------------------------ */
/* Indicador que tambem e filtro                                       */
/*                                                                     */
/* Na lista de orcamentos clicar em "Contratados" filtra a tabela de   */
/* baixo. O hover e o recorte aberto falam pela cor do proprio         */
/* indicador, e nao pelo azul do sistema: o filtro ativo se reconhece  */
/* pelo tom que ja estava ali - senao a lista mostra um subconjunto    */
/* sem dizer de onde ele veio.                                         */
/* ------------------------------------------------------------------ */
a.indicador { color: inherit; }

a.indicador:hover,
a.indicador:focus-visible {
    border-color: var(--tom);
    transform: translateY(-2px);
    box-shadow: 0 8px 20px rgba(17, 24, 39, .12);
}

a.indicador:hover::after,
a.indicador:focus-visible::after { opacity: .16; }

a.indicador.ativo {
    border-color: var(--tom);
    box-shadow: 0 0 0 1px var(--tom);
}

a.indicador.ativo::before { height: 5px; }
a.indicador.ativo::after { opacity: .18; }

/* Faixa apertada: dentro de um painel, ou com muitos indicadores */
.indicadores.compacta { grid-template-columns: repeat(auto-fit, minmax(158px, 1fr)); gap: 10px; }
.indicadores.compacta .indicador { padding: 12px 14px 11px; }
.indicadores.compacta .numero { margin-top: 8px; font-size: 22px; }

/* ------------------------------------------------------------------ */
/* Cartoes do painel                                                   */
/*                                                                     */
/* Cada cartao e um link para o modulo, com a cor do que ele mede: o   */
/* dinheiro em verde, o atraso em vermelho. A cor entra em tres        */
/* lugares (faixa, icone e numero) a partir de --tom, entao trocar a   */
/* cor de um indicador e trocar uma linha.                             */
/* ------------------------------------------------------------------ */
.cartoes-painel {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(212px, 1fr));
    gap: 16px;
    margin-bottom: 24px;
}

.cartao-painel {
    --tom: var(--tom-neutro);
    position: relative;
    display: flex;
    flex-direction: column;
    padding: 18px 18px 14px;
    background: var(--branco);
    border: 1px solid var(--borda);
    border-radius: 14px;
    color: var(--texto);
    overflow: hidden;
    transition: transform .15s ease, box-shadow .15s ease, border-color .15s ease;
}

.tom-azul     { --tom: var(--tom-azul); }
.tom-verde    { --tom: var(--tom-verde); }
.tom-roxo     { --tom: var(--tom-roxo); }
.tom-vermelho { --tom: var(--tom-vermelho); }
.tom-ambar    { --tom: var(--tom-ambar); }
.tom-ciano    { --tom: var(--tom-ciano); }
.tom-neutro   { --tom: var(--tom-neutro); }

/* Faixa da cor no topo do cartao */
.cartao-painel::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 4px;
    background: var(--tom);
}

/* Brilho diluido da mesma cor: da vida ao cartao sem precisar de um
   fundo por tema - a opacidade resolve no claro e no escuro */
.cartao-painel::after {
    content: "";
    position: absolute;
    top: -46px;
    right: -46px;
    width: 132px;
    height: 132px;
    border-radius: 50%;
    background: var(--tom);
    opacity: .12;
    pointer-events: none;
}

.cartao-painel:hover,
.cartao-painel:focus-visible {
    transform: translateY(-2px);
    border-color: var(--tom);
    box-shadow: 0 10px 24px rgba(17, 24, 39, .13);
}

.cartao-painel.com-detalhe { cursor: pointer; }

.cartao-cabecalho { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }

.cartao-icone {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 34px;
    height: 34px;
    border-radius: 10px;
    background: var(--tom);
    color: #fff;
    flex-shrink: 0;
}

.cartao-icone svg { width: 19px; height: 19px; }

.cartao-rotulo { font-size: 13px; font-weight: 600; color: var(--texto-fraco); line-height: 1.2; }

.cartao-valor {
    font-size: 30px;
    font-weight: 700;
    line-height: 1.15;
    color: var(--tom);
    font-variant-numeric: tabular-nums;
    /* Valor em reais nao pode vazar do cartao em telas estreitas */
    overflow-wrap: anywhere;
}

.cartao-dica { margin-top: 3px; font-size: 12px; color: var(--texto-fraco); }

.cartao-acao {
    margin-top: 12px;
    font-size: 12px;
    font-weight: 600;
    color: var(--tom);
    opacity: .8;
}

.cartao-painel:hover .cartao-acao { opacity: 1; }

/* Detalhe do indicador: tabela larga, que rola dentro do proprio modal */
.dialogo-detalhe { max-width: 940px; }
.dialogo-detalhe .barra-acoes { margin-bottom: 10px; }
.dialogo-detalhe h2 { color: var(--tom); }
.dialogo-detalhe .tabela { max-height: 60vh; overflow-y: auto; }

/* Possivel paciente em dobro: o bloco precisa parar o olho antes do
   formulario, sem parecer um erro - nao e proibicao, e conferencia */
.aviso-duplicidade {
    border-left: 4px solid var(--amarelo);
    margin-bottom: 20px;
}

.aviso-duplicidade h2 { color: var(--aviso-texto); }
.lista-semelhantes { list-style: none; font-size: 14px; }
.lista-semelhantes li { padding: 6px 0; border-bottom: 1px solid var(--borda); }
.lista-semelhantes li:last-child { border-bottom: none; }

/* ------------------------------------------------------------------ */
/* Grafico de receitas por profissional (painel)                       */
/*                                                                     */
/* Barras em HTML puro, sem biblioteca de grafico: sao cinco linhas de  */
/* CSS, imprimem bem e nao dependem de nada baixado da internet - que   */
/* e a mesma razao de o sistema inteiro nao ter dependencia externa.    */
/* ------------------------------------------------------------------ */
.barras-receita { list-style: none; display: grid; gap: 16px; }

.barra-topo {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: 5px;
    font-size: 14px;
}

.barra-nome { display: flex; align-items: center; gap: 7px; font-weight: 600; }
.barra-numeros { display: flex; align-items: baseline; gap: 8px; white-space: nowrap; }
.barra-numeros .dica { font-size: 13px; }

.barra-trilho {
    background: var(--realce);
    border-radius: 999px;
    height: 16px;
    overflow: hidden;
}

.barra-bruto {
    display: block;
    height: 100%;
    border-radius: 999px;
    /* Barra de valor baixo nao pode sumir: sem o minimo, o profissional
       que recebeu R$ 40 num mes de R$ 40 mil viraria uma linha invisivel
       e pareceria nao ter recebido nada */
    min-width: 3px;
    transition: width .25s ease;
}

/* A parte que volta ao profissional, desenhada dentro do proprio bruto:
   escurece o pedaco em vez de somar uma segunda barra ao lado, porque o
   repasse e uma FATIA daquele valor, e nao um valor a mais */
.barra-repasse {
    display: block;
    height: 100%;
    border-radius: 999px 0 0 999px;
    background: rgba(0, 0, 0, .38);
}

.barra-rodape { display: block; margin-top: 5px; }

.legenda-grafico {
    display: flex;
    align-items: center;
    gap: 7px;
    flex-wrap: wrap;
    margin-top: 16px;
    padding-top: 12px;
    border-top: 1px solid var(--borda);
    color: var(--texto-fraco);
    font-size: 13px;
}

.legenda-grafico .amostra {
    display: inline-block;
    width: 14px;
    height: 14px;
    border-radius: 4px;
    vertical-align: middle;
}

.legenda-grafico .amostra-bruto { background: var(--tom-azul); }

/* A mesma composicao da barra - cor de base com o escurecimento por cima -
   em vez de uma cor fechada: assim a amostra continua igual ao desenho no
   tema escuro, que troca --tom-azul por um azul mais claro */
.legenda-grafico .amostra-repasse {
    background: var(--tom-azul);
    box-shadow: inset 0 0 0 999px rgba(0, 0, 0, .38);
    margin-left: 10px;
}

/* O seletor de periodo do grafico nao pode empurrar o titulo para fora
   da tela no celular */
.seletor-visao { flex-wrap: wrap; }
.seletor-visao .botao { padding: 6px 12px; font-size: 13px; }

/* Pendencia que trava o sistema: alerta com a acao ao lado */
.faixa-pendencia {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 14px;
    flex-wrap: wrap;
}

/* ------------------------------------------------------------------ */
/* Blocos e tabelas                                                    */
/* ------------------------------------------------------------------ */
.painel {
    background: var(--branco);
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    padding: 20px;
}

.painel h2 { font-size: 16px; font-weight: 600; margin-bottom: 14px; }
.painel.centralizado { text-align: center; padding: 48px 20px; }
.painel.centralizado .botao { margin-top: 16px; }

.vazio { color: var(--texto-fraco); }

/* ------------------------------------------------------------------ */
/* Painel com cabecalho e corpo                                        */
/*                                                                     */
/* O bloco comum tem titulo, botoes e conteudo no mesmo espaco - e em  */
/* telas com muita informacao (o orcamento, por exemplo) a barra de    */
/* acoes se mistura com a ficha logo abaixo. Aqui o cabecalho vira uma */
/* faixa propria: identificacao a esquerda, o que da para fazer a      */
/* direita, e uma linha separando dos dados.                           */
/* ------------------------------------------------------------------ */
.painel-cartao { padding: 0; overflow: hidden; }

.painel-cabecalho {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 14px;
    flex-wrap: wrap;
    padding: 14px 20px;
    background: var(--realce);
    border-bottom: 1px solid var(--borda);
}

.painel-titulo { min-width: 0; }
.painel-titulo h2 { margin-bottom: 2px; }

.painel-subtitulo {
    display: flex;
    align-items: center;
    gap: 6px;
    flex-wrap: wrap;
    font-size: 13px;
    color: var(--texto-fraco);
}

.painel-corpo { padding: 20px; }

/* Botao de dentro de linha de tabela: o tamanho cheio empurraria a
   linha para 50px de altura so por causa dele */
.botao.compacto { padding: 5px 11px; font-size: 13px; font-weight: 500; }

/* Acoes na linha ficam lado a lado. Empilhadas - que e o que a quebra
   automatica faz numa coluna estreita - elas dobram a altura da linha e
   desalinham a tabela inteira; a tabela ja rola na horizontal. */
.tabela .grupo-botoes { flex-wrap: nowrap; }

/* Tabela larga rola dentro do proprio bloco, sem quebrar a pagina */
.tabela { width: 100%; border-collapse: collapse; display: block; overflow-x: auto; }
.tabela th, .tabela td { padding: 10px 12px; text-align: left; border-bottom: 1px solid var(--borda); white-space: nowrap; }
.tabela th { font-size: 12px; text-transform: uppercase; letter-spacing: .03em; color: var(--texto-fraco); }
.tabela tbody tr:hover { background: var(--realce); }

/* ------------------------------------------------------------------ */
/* Tabela de listagem                                                  */
/*                                                                     */
/* A lista de registros e a tela em que a pessoa passa o dia. A tabela */
/* solta - linhas coladas, cabecalho sem peso, tudo do mesmo tamanho - */
/* obriga a ler celula por celula para achar um orcamento. Aqui a      */
/* linha ganha ar, o cabecalho ganha fundo e cada celula diz o que ela */
/* e: identificacao em cima, contexto embaixo, em letra menor.         */
/* ------------------------------------------------------------------ */
.tabela-quadro {
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    overflow-x: auto;
    background: var(--branco);
}

/* Dentro do quadro quem rola e o quadro: a tabela volta a ser tabela */
.tabela-quadro .tabela { display: table; overflow: visible; }

/* ------------------------------------------------------------------ */
/* So a rolagem, sem a moldura                                         */
/*                                                                     */
/* Para a tabela que ja mora dentro de um painel e so precisa caber:   */
/* numa coluna estreita (o caixa, com a lateral de apoio ao lado) as   */
/* colunas nao cabiam e a tabela invadia a coluna vizinha. Aqui ela    */
/* volta a ser <table> de verdade - o algoritmo de tabela negocia a    */
/* largura das colunas - e quem rola na horizontal e este quadro.      */
/* ------------------------------------------------------------------ */
.tabela-rolagem { overflow-x: auto; }
.tabela-rolagem .tabela { display: table; overflow: visible; }

.tabela-lista thead th {
    padding: 11px 14px;
    background: var(--realce);
    border-bottom: 1px solid var(--borda);
    font-size: 11.5px;
    font-weight: 700;
}

.tabela-lista tbody td { padding: 12px 14px; vertical-align: middle; }
.tabela-lista tbody tr:last-child td { border-bottom: none; }
.tabela-lista tbody tr { transition: background .12s ease; }

/* Nome do paciente, numero do orcamento: o que se procura na varredura.
   Como link, ele nao fica azul: a linha inteira e clicavel e uma coluna
   de nomes azuis vira ruido. O azul volta no hover, dizendo que clica. */
.tabela-lista .celula-forte { font-weight: 600; color: var(--texto); }
.tabela-lista a.celula-forte:hover { color: var(--azul); text-decoration: underline; }
.tabela-lista .celula-fraca { display: block; margin-top: 2px; font-size: 12px; color: var(--texto-fraco); font-weight: 400; }
.tabela-lista .celula-valor { font-size: 15px; font-weight: 700; }
.tabela-lista .texto-quitado { color: var(--verde); font-weight: 600; }

/* A coluna de acoes so aparece de verdade na linha em que o ponteiro
   esta - fora dela, fica discreta para nao competir com o conteudo */
.tabela-lista .celula-acoes { text-align: right; }
.tabela-lista .celula-acoes .botao { opacity: .7; }
.tabela-lista tr:hover .celula-acoes .botao,
.tabela-lista .celula-acoes .botao:focus-visible { opacity: 1; }

/* Quanto do orcamento ja foi pago, em uma olhada */
.barra-pagamento {
    display: block;
    width: 120px;
    height: 6px;
    margin-top: 5px;
    border-radius: 999px;
    background: var(--borda);
    overflow: hidden;
}

.barra-pagamento i {
    display: block;
    height: 100%;
    border-radius: 999px;
    background: var(--verde);
}

.barra-pagamento.parcial i { background: var(--amarelo); }
.barra-pagamento.largura-total { width: 100%; height: 8px; margin: 4px 0 0; }

/* ------------------------------------------------------------------ */
/* Resumo do contrato (lateral do orcamento contratado)                */
/* ------------------------------------------------------------------ */
.resumo-contrato { display: flex; flex-direction: column; gap: 2px; }

.resumo-contrato > div {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 10px;
    padding: 7px 0;
    border-bottom: 1px dashed var(--borda);
}

.resumo-contrato dt { font-size: 13px; color: var(--texto-fraco); }
.resumo-contrato dd { font-size: 15px; font-weight: 600; }

.resumo-contrato .linha-paga dd { color: var(--verde); }

/* O que falta e a linha que interessa: fica maior, e em vermelho
   enquanto houver saldo */
.resumo-contrato .linha-resto { border-bottom: none; }
.resumo-contrato .linha-resto dt { font-weight: 600; color: var(--texto); }
.resumo-contrato .linha-resto dd { font-size: 18px; font-weight: 700; }
.resumo-contrato .linha-resto.devendo dd { color: var(--vermelho); }

/* ------------------------------------------------------------------ */
/* Etiquetas de status                                                 */
/* ------------------------------------------------------------------ */
.etiqueta {
    display: inline-block;
    padding: 2px 9px;
    border-radius: 999px;
    font-size: 12px;
    font-weight: 600;
    background: var(--fundo);
    color: var(--texto-fraco);
}

.etiqueta.agendado   { background: var(--status-agendado);   color: var(--status-agendado-texto); }
.etiqueta.confirmado { background: var(--status-confirmado); color: var(--status-confirmado-texto); }
.etiqueta.atendido   { background: var(--status-atendido);   color: var(--status-atendido-texto); }
.etiqueta.faltou     { background: var(--status-faltou);     color: var(--status-faltou-texto); }

.etiqueta.cancelado {
    background: var(--status-cancelado);
    color: var(--status-cancelado-texto);
    text-decoration: line-through;
}

/* Situacoes do financeiro. Nao saem das cores de atendimento (que a
   clinica configura): conta vencendo hoje e conta paga pela metade sao
   do sistema, e a cor tem que dizer a mesma coisa em toda clinica. */
.etiqueta.vence-hoje { background: var(--aviso-fundo); color: var(--aviso-texto); }
.etiqueta.parcial    { background: var(--realce-azul); color: var(--azul); }

/* A linha que vence hoje fica marcada sem gritar: vencida ja usa o
   vermelho, e as duas no mesmo tom se confundiriam na varredura */
.linha-vence-hoje { background: var(--aviso-fundo); }

/* ------------------------------------------------------------------ */
/* Botoes, formularios e alertas                                       */
/* ------------------------------------------------------------------ */
.botao {
    display: inline-block;
    padding: 9px 16px;
    border: 1px solid transparent;
    border-radius: var(--raio);
    font-size: 14px;
    font-weight: 600;
    cursor: pointer;
    text-align: center;
}

.botao.principal  { background: var(--azul); color: #fff; }
.botao.principal:hover { background: var(--azul-escuro); }
.botao.secundario { background: var(--branco); color: var(--texto); border-color: var(--borda); }
.botao.secundario:hover { background: var(--fundo); }

/* Acao de criar numa tela onde o azul ja quer dizer OUTRA coisa. Na
   agenda o azul marca onde voce esta - hoje, a visao atual, o dia
   escolhido -, e mais um bloco azul ao lado deles some no meio. O verde
   e o mesmo do resto do sistema (--acao-verde), escuro o bastante para
   o texto branco passar no contraste. */
.botao.acao-nova { background: var(--acao-verde); color: #fff; }
.botao.acao-nova:hover { background: var(--acao-verde-escuro); }
.largura-total { width: 100%; }

/* Botao travado precisa PARECER travado. Um "Avancar" azul e cheio que
   nao responde ao clique passa por tela quebrada; apagado, ele mesmo diz
   que ainda falta alguma coisa acima dele. */
.botao:disabled,
.botao[disabled] {
    opacity: .45;
    cursor: not-allowed;
    /* Sem isto o hover ainda escurece o botao e promete um clique que
       nao vai acontecer */
    pointer-events: none;
}

/* A situacao de agora, no meio dos botoes que mudam de situacao. Tem a
   forma de botao para a fila nao quebrar, mas nao e clicavel: verde diz
   "e aqui que este registro esta", e nao "clique para chegar aqui". */
.botao.situacao-atual {
    background: var(--sucesso-fundo);
    /* Borda no verde cheio, e nao no verde claro do fundo: e o que faz a
       situacao de agora saltar no meio dos botoes brancos */
    border-color: var(--verde);
    color: var(--sucesso-texto);
    cursor: default;
    margin-bottom: 8px;
}

label { display: block; margin: 14px 0 5px; font-size: 13px; font-weight: 600; }

input[type="text"], input[type="email"], input[type="password"],
input[type="date"], input[type="time"], input[type="number"],
select, textarea {
    width: 100%;
    padding: 9px 11px;
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    font-size: 15px;
    font-family: inherit;
    background: var(--branco);
}

input:focus, select:focus, textarea:focus {
    outline: none;
    border-color: var(--azul);
    box-shadow: 0 0 0 3px rgba(37, 99, 235, .15);
}

.alerta {
    padding: 11px 14px;
    border-radius: var(--raio);
    margin-bottom: 16px;
    font-size: 14px;
    border: 1px solid;
}

.alerta.sucesso { background: var(--sucesso-fundo); border-color: var(--sucesso-borda); color: var(--sucesso-texto); }
.alerta.erro    { background: var(--erro-fundo);    border-color: var(--erro-borda);    color: var(--erro-texto); }
.alerta.aviso   { background: var(--aviso-fundo);   border-color: var(--aviso-borda);   color: var(--aviso-texto); }

/* ------------------------------------------------------------------ */
/* Aviso flutuante - o retorno de "salvou", "excluiu", "nao deu"       */
/*                                                                     */
/* A faixa dentro do <main> empurrava a tela para baixo bem na hora do */
/* clique seguinte, e so saia na proxima navegacao. Como notificacao   */
/* ela passa por cima: nada se desloca e ela mesma se despede.         */
/*                                                                     */
/* O relogio e daqui, e nao do JavaScript: mesmo sem script o aviso    */
/* aparece e some na hora certa. O .alerta acima continua existindo -  */
/* ele e o recado que pertence a um lugar da pagina (dentro de um      */
/* dialogo, acima de um formulario) e por isso fica onde esta.         */
/*                                                                     */
/* Fixo na janela, fora do .app: o zoom da preferencia de tamanho      */
/* arrastaria a caixa para longe do canto conforme a escala escolhida. */
/* ------------------------------------------------------------------ */
.avisos {
    position: fixed;
    /* O canto e escolha de cada um, em Meu perfil (ver .avisos-* abaixo).
       Estes valores sao o que sobra se a classe do canto faltar. */
    bottom: 16px;
    left: 16px;
    z-index: 90;
    display: flex;
    flex-direction: column;
    gap: 10px;
    /* A coluna passa por cima do menu; sem isto ela roubaria o clique
       dos itens debaixo mesmo depois do aviso ter apagado */
    pointer-events: none;
}

/* --aviso-desloca: de que lado a caixa entra e sai. Quem nasce a direita
   deslizando para a esquerda parece ter vindo do meio da tela. */
.avisos-superior-esquerdo { top: 16px; bottom: auto; left: 16px; right: auto; }
.avisos-inferior-esquerdo { top: auto; bottom: 16px; left: 16px; right: auto; }

.avisos-superior-direito,
.avisos-inferior-direito {
    --aviso-desloca: 16px;
    left: auto;
    right: 16px;
    align-items: flex-end;
}

.avisos-superior-direito { top: 16px; bottom: auto; }

/* Em baixo a direita mora o botao de ajuda: a coluna comeca acima dele
   (22 de margem + 48 do botao + respiro) em vez de cobri-lo */
.avisos-inferior-direito { top: auto; bottom: 82px; }

/* Preso a .avisos de proposito.
   Solto, ".aviso" tambem pegava o recado que fica DENTRO da pagina - o
   "alerta aviso" amarelo do caixa bloqueado, do a receber, do lancamento.
   Aqueles viravam uma caixa de 340px em display:flex (com o texto
   quebrado em colunas, cada trecho virando um item do flex) e, pior,
   herdavam a animacao de saida: o recado da tela sumia sozinho depois de
   cinco segundos. Recado da pagina fica; notificacao e que se despede. */
.avisos .aviso {
    --aviso-tempo: 5s;
    position: relative;
    display: flex;
    align-items: flex-start;
    gap: 10px;
    width: 340px;
    max-width: calc(100vw - 32px);
    padding: 12px 38px 14px 14px;
    border: 1px solid;
    border-radius: 12px;
    box-shadow: 0 14px 34px rgba(17, 24, 39, .24);
    font-size: 14px;
    line-height: 1.45;
    overflow: hidden;
    pointer-events: auto;
    animation: aviso-entrar .18s ease-out,
               aviso-sair .45s ease-in var(--aviso-tempo) forwards;
}

/* Erro fica mais tempo: dar certo se entende de relance, dar errado
   precisa ser lido ate o fim */
.aviso-erro { --aviso-tempo: 9s; }

.aviso-sucesso { background: var(--sucesso-fundo); border-color: var(--sucesso-borda); color: var(--sucesso-texto); }
.aviso-erro    { background: var(--erro-fundo);    border-color: var(--erro-borda);    color: var(--erro-texto); }
.aviso-atencao { background: var(--aviso-fundo);   border-color: var(--aviso-borda);   color: var(--aviso-texto); }

.aviso-icone {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    margin-top: 1px;
    border: 1.5px solid currentColor;
    border-radius: 50%;
    font-size: 12px;
    font-weight: 700;
    line-height: 1;
}

.aviso-texto { flex: 1; }

.aviso-fechar {
    position: absolute;
    top: 7px;
    right: 7px;
    width: 24px;
    height: 24px;
    padding: 0;
    border: none;
    border-radius: 6px;
    background: transparent;
    color: inherit;
    font: inherit;
    font-size: 18px;
    line-height: 1;
    opacity: .6;
    cursor: pointer;
}

/* Fundo do hover pela variavel do tema: uma sombra preta fixa nao
   apareceria na caixa escura do tema noturno */
.aviso-fechar:hover { opacity: 1; background: var(--borda); }

/* A barrinha que escorre ate o fim: o aviso sumir sozinho assusta menos
   quando da para ver que ele estava contando */
.aviso-tempo {
    position: absolute;
    left: 0;
    bottom: 0;
    width: 100%;
    height: 3px;
    background: currentColor;
    opacity: .3;
    transform-origin: left center;
    animation: aviso-tempo var(--aviso-tempo) linear forwards;
}

@keyframes aviso-entrar {
    from { opacity: 0; transform: translateX(var(--aviso-desloca, -16px)); }
    to   { opacity: 1; transform: none; }
}

@keyframes aviso-sair {
    /* pointer-events junto: apagado e sem sair do lugar, ele ainda
       engoliria o clique de quem ja mirou o menu embaixo */
    to { opacity: 0; transform: translateX(var(--aviso-desloca, -16px)); pointer-events: none; }
}

@keyframes aviso-apagar {
    to { opacity: 0; pointer-events: none; }
}

@keyframes aviso-tempo {
    from { transform: scaleX(1); }
    to   { transform: scaleX(0); }
}

/* Saida na hora, pelo X.
 *
 * Nome PROPRIO de animacao, de proposito: repetindo "aviso-sair" aqui o
 * navegador entende que e a mesma animacao de sempre, so com outra
 * duracao, e aproveita o tempo que ela ja tinha corrido - quem tivesse
 * lido o aviso por dois segundos veria a saida nascer terminada, sem o
 * animationend que tira a caixa do lugar. Com outro nome ela comeca do
 * zero, que e o que "fechar agora" quer dizer. */
.avisos .aviso.fechando { animation: aviso-fechar .2s ease-in forwards; }
.avisos .aviso.fechando .aviso-tempo { animation: none; opacity: 0; }

@keyframes aviso-fechar {
    to { opacity: 0; transform: translateX(var(--aviso-desloca, -16px)); pointer-events: none; }
}

@keyframes aviso-fechar-suave {
    to { opacity: 0; pointer-events: none; }
}

@media (prefers-reduced-motion: reduce) {
    /* Sumir nao e enfeite, e o combinado - fica. O que sai e o deslize */
    .avisos .aviso { animation: none, aviso-apagar .45s ease-in var(--aviso-tempo) forwards; }
    .avisos .aviso.fechando { animation: aviso-fechar-suave .2s ease-in forwards; }
}

/* ------------------------------------------------------------------ */
/* Tela de login                                                       */
/* ------------------------------------------------------------------ */
.tela-login {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
    background: #111827;
    padding: 20px;
}

.cartao-login {
    width: 100%;
    max-width: 380px;
    background: var(--branco);
    border-radius: 12px;
    padding: 32px;
    box-shadow: 0 10px 30px rgba(0, 0, 0, .3);
}

.cartao-login .marca { font-size: 28px; font-weight: 700; text-align: center; }
.cartao-login .marca span { color: var(--azul); }
.cartao-login .subtitulo { text-align: center; color: var(--texto-fraco); font-size: 14px; margin-bottom: 22px; }
.cartao-login .botao { margin-top: 22px; }

/* Marca da clinica no lugar do nome escrito. O tamanho vem de
   --logo-altura, a mesma medida que a clinica escolhe em Configuracoes
   para a barra lateral - um numero so, valendo nos dois lugares. */
.cartao-login .marca-com-logo { margin-bottom: 22px; }

.rodape-login {
    margin-top: 20px;
    text-align: center;
    font-size: 13px;
}

.rodape-login a { color: var(--texto-fraco); text-decoration: none; }
.rodape-login a:hover { color: var(--azul); text-decoration: underline; }

/* ------------------------------------------------------------------ */
/* Escolha da clinica (a tela anterior ao login)                       */
/*                                                                     */
/* Lista, e nao <select>: com logo e cor, a pessoa reconhece a clinica  */
/* dela pelo simbolo, sem ler. E um clique em vez de tres (abrir,       */
/* escolher, confirmar).                                               */
/* ------------------------------------------------------------------ */
.cartao-escolha { max-width: 420px; }

.lista-clinicas {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 8px;
    /* Plataforma com muitas clinicas nao pode empurrar o rodape para
       fora da tela: a lista rola dentro do cartao. */
    max-height: 60vh;
    overflow-y: auto;
}

.clinica-opcao {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 10px 12px;
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    color: var(--texto);
    text-decoration: none;
    transition: border-color .12s, background .12s;
}

.clinica-opcao:hover,
.clinica-opcao:focus-visible {
    border-color: var(--marca-clinica, var(--azul));
    background: var(--realce);
}

/* Quadrado da marca: a logo quando ha uma, a inicial quando nao ha.
   Tamanho fixo para a coluna de nomes comecar sempre no mesmo ponto -
   logo alta e logo deitada nao podem desalinhar a lista. */
.clinica-simbolo {
    flex: 0 0 40px;
    height: 40px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: var(--raio);
    background: var(--marca-clinica, var(--azul));
    color: #fff;
    font-weight: 700;
    font-size: 17px;
    overflow: hidden;
}

/* A logo tem fundo proprio; o quadrado colorido sairia por tras dela. */
.clinica-simbolo:has(img) { background: var(--branco); border: 1px solid var(--borda); }

.clinica-simbolo img {
    max-width: 100%;
    max-height: 100%;
    object-fit: contain;
}

.clinica-nome {
    font-weight: 600;
    font-size: 15px;
    /* Nome comprido corta com reticencias em vez de quebrar a linha e
       fazer a opcao ficar mais alta que as outras. */
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* ------------------------------------------------------------------ */
/* Barra de acoes, busca e paginacao                                   */
/* ------------------------------------------------------------------ */
.barra-acoes {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
    margin-bottom: 14px;
}

.barra-acoes h2 { margin-bottom: 0; }

/* ------------------------------------------------------------------ */
/* Barra de filtros das listagens                                      */
/*                                                                     */
/* A mesma barra atende telas com um campo (Pacientes) e telas com      */
/* cinco (Prontuarios: texto, profissional, de, ate e o botao). A       */
/* regra antiga era "flex, tudo em uma linha, no maximo 460px": com     */
/* dois campos ja apertava, com cinco cada um virava um tocinho de      */
/* 60px onde nao cabia nem "dd/mm/aaaa".                                */
/*                                                                     */
/* Agora cada controle declara a largura de que PRECISA e a barra       */
/* quebra em outra linha quando nao couber. Uma tela de um campo        */
/* continua enxuta; a de cinco fica legivel em vez de espremida.        */
/* ------------------------------------------------------------------ */
.busca {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    /* Cresce ate ocupar a barra, mas nunca empurra o botao de acao
       (+ Novo paciente) para fora da tela */
    flex: 1 1 380px;
    min-width: 0;
}

/* O campo de texto e o que manda: fica com a sobra ate um limite. Sem o
   teto, uma barra de um campo so esticava o campo por toda a largura da
   tela e jogava o botao "Buscar" para o outro lado do monitor. */
.busca input[type="text"],
.busca input[type="search"] { flex: 3 1 210px; min-width: 180px; max-width: 430px; }

/* Escolha e data tem largura propria: o conteudo delas nao cresce */
.busca select        { flex: 1 1 170px; min-width: 150px; max-width: 260px; }
.busca .campo-data   { flex: 1 1 150px; min-width: 140px; max-width: 200px; }
.busca .campo-data input[type="text"] { flex: none; width: 100%; min-width: 0; }
.busca input[type="date"] { flex: 1 1 160px; min-width: 150px; max-width: 200px; }

/* Campo de data solto na barra (sem o calendario do JS ter montado) */
.busca input[data-mascara="data"] { flex: 1 1 150px; min-width: 140px; max-width: 200px; }

/* Botao nao estica nem encolhe: "Filtrar" com 40px de largura vira um
   alvo que ninguem acerta */
.busca .botao { flex: 0 0 auto; }

/* Marcacao dentro da barra (ex.: "so os atrasados") */
.busca .opcao { flex: 0 0 auto; white-space: nowrap; }

/* A caixa de marcar tem o tamanho dela em qualquer barra. Sem isto, a
   largura minima dos filtros a esticava e ela se descolava do rotulo,
   deixando um quadradinho solto a meia tela do texto que ele marca. */
.opcao input[type="checkbox"],
.opcao input[type="radio"] { width: auto; min-width: 0; flex: 0 0 auto; }

.grupo-botoes { display: flex; gap: 8px; flex-wrap: wrap; }

.resumo-lista { color: var(--texto-fraco); font-size: 13px; margin-bottom: 12px; }

.paginacao {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 14px;
    margin-top: 16px;
    font-size: 14px;
    color: var(--texto-fraco);
}

/* ------------------------------------------------------------------ */
/* Formularios em grade                                                */
/* ------------------------------------------------------------------ */
.formulario h2 {
    font-size: 14px;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--texto-fraco);
    border-bottom: 1px solid var(--borda);
    padding-bottom: 8px;
    margin: 24px 0 4px;
}

.formulario h2:first-child { margin-top: 0; }

.grade {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
    gap: 0 16px;
}

.campo.largo    { grid-column: span 2; }
.campo.estreito { max-width: 130px; }

.acoes-formulario {
    display: flex;
    gap: 10px;
    margin-top: 26px;
    padding-top: 18px;
    border-top: 1px solid var(--borda);
}

/* ------------------------------------------------------------------ */
/* Ficha do paciente                                                   */
/* ------------------------------------------------------------------ */
.colunas { display: grid; grid-template-columns: 1fr 300px; gap: 20px; align-items: start; }
.coluna-principal, .coluna-lateral { display: flex; flex-direction: column; gap: 20px; min-width: 0; }

.ficha {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 14px 20px;
}

.ficha.compacta { grid-template-columns: 1fr; gap: 10px; }
.ficha dt { font-size: 12px; text-transform: uppercase; letter-spacing: .03em; color: var(--texto-fraco); }
.ficha dd { margin-top: 2px; }
.ficha .destaque-vermelho { color: var(--vermelho); font-weight: 600; }

.observacao { margin-top: 16px; font-size: 14px; color: var(--texto-fraco); }

/* ------------------------------------------------------------------ */
/* Linha do tempo do prontuario                                        */
/* ------------------------------------------------------------------ */
.linha-tempo { list-style: none; }

.linha-tempo li {
    display: flex;
    gap: 16px;
    padding: 12px 0;
    border-bottom: 1px solid var(--borda);
}

.linha-tempo li:last-child { border-bottom: none; }
.linha-tempo .data { min-width: 130px; font-size: 13px; color: var(--texto-fraco); }
.linha-tempo .detalhe p { font-size: 14px; margin-top: 3px; }

/* Historico de remarcacao: lista estreita, sem a coluna de data */
.linha-tempo-remarcacao li { padding: 8px 0; }
.linha-tempo-remarcacao strong { font-size: 13px; }
.linha-tempo-remarcacao .dica { margin-top: 2px; }

/* ------------------------------------------------------------------ */
/* Marcacoes, modulos e permissoes                                     */
/* ------------------------------------------------------------------ */
.dica { display: block; margin-top: 4px; font-size: 12px; color: var(--texto-fraco); }

.opcao {
    display: flex;
    align-items: center;
    gap: 8px;
    margin: 0;
    font-weight: 400;
    font-size: 14px;
    cursor: pointer;
}

.opcao input { width: auto; }

.lista-modulos {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
    gap: 10px;
    padding: 14px;
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    background: var(--realce);
}

.grupo-permissoes {
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    padding: 12px 14px;
    margin-bottom: 12px;
}

.grupo-permissoes legend {
    padding: 0 6px;
    font-size: 13px;
    font-weight: 600;
    color: var(--texto-fraco);
}

/* A caixa que marca o modulo inteiro mora no titulo dele: e ali que a
   pessoa esta olhando quando decide "esta pessoa cuida do financeiro". */
.grupo-permissoes legend .opcao-todas {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    margin: 0;
    cursor: pointer;
    font-size: 13px;
    font-weight: 600;
    color: var(--texto);
}

.grupo-permissoes legend .opcao-todas:hover { color: var(--azul); }
.grupo-permissoes legend input { width: auto; margin: 0; }

/* Meio-termo (parte do modulo marcada) precisa se distinguir do vazio */
.grupo-permissoes legend input:indeterminate { accent-color: var(--azul); }

/* Acao que corta o acesso de outra pessoa nao pode ter a cara de um
   botao qualquer da tela. A classe dupla e para vencer .botao.secundario,
   que pinta o texto na cor normal. */
.botao.botao-perigo {
    border-color: var(--erro-borda);
    color: var(--vermelho);
}

.botao.botao-perigo:hover { background: var(--erro-fundo); border-color: var(--vermelho); }

.formulario-acesso .opcao { margin-bottom: 6px; }
.formulario-acesso .dica { margin-bottom: 14px; }

/* ------------------------------------------------------------------ */
/* Acesso desativado no meio do expediente                             */
/* ------------------------------------------------------------------ */
.dialogo-revogado { text-align: center; }
.dialogo-revogado h2 { margin: 6px 0 10px; font-size: 20px; }
.dialogo-revogado .dica { margin-bottom: 12px; line-height: 1.55; }
.dialogo-revogado .alerta { text-align: left; margin-bottom: 12px; }
.dialogo-revogado .dialogo-acoes { justify-content: center; }
.revogado-icone { font-size: 38px; line-height: 1; }

.grupo-permissoes .opcao { margin: 6px 0; }

/* ------------------------------------------------------------------ */
/* Precos por regiao do procedimento                                   */
/*                                                                     */
/* Os quatro valores lado a lado, e nao empilhados: e uma comparacao   */
/* ("o dente custa X, a arcada custa Y") e comparacao se faz olhando   */
/* de uma vez, nao rolando a tela.                                     */
/* ------------------------------------------------------------------ */
.grade-precos {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
    gap: 0 14px;
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    padding: 6px 14px 12px;
    margin-bottom: 14px;
}

.grade-precos legend {
    padding: 0 6px;
    font-size: 13px;
    font-weight: 600;
    color: var(--texto-fraco);
}

.grade-precos .campo { margin-bottom: 10px; }
.grade-precos .dica.largo { grid-column: 1 / -1; margin: 0; }

/* O placeholder "mesmo do unitario" e informacao, nao rascunho: fica
   legivel em vez de quase apagado */
.grade-precos input::placeholder { color: var(--texto-fraco); opacity: .85; font-style: italic; }

.previa-logo {
    display: inline-block;
    padding: 10px;
    margin-bottom: 8px;
    background: var(--lateral-fundo);
    border-radius: var(--raio);
}

/* A previa imita a faixa do menu: a mesma largura util (a barra tem 220px
   menos 16px de folga de cada lado), e a altura vem da regua ao lado - o
   que se ve aqui e o que vai aparecer la. */
.previa-logo img { max-height: 56px; max-width: 188px; display: block; }

/* Regua com o valor escrito ao lado: medida em pixels sem o numero a
   vista vira tentativa e erro */
.campo-medida { display: flex; align-items: center; gap: 12px; }
.campo-medida input[type="range"] { flex: 1 1 auto; min-width: 0; }

.campo-medida output {
    flex: 0 0 auto;
    min-width: 58px;
    font-size: 13px;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    color: var(--texto-fraco);
}

.bolinha-cor {
    display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    margin-right: 6px;
    vertical-align: middle;
}

.lista-simples { list-style: none; font-size: 14px; }
.lista-simples li { padding: 6px 0; border-bottom: 1px solid var(--borda); }
.lista-simples li:last-child { border-bottom: none; }

input[type="color"] {
    width: 100%;
    height: 40px;
    padding: 3px;
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    background: var(--branco);
    cursor: pointer;
}

input[type="file"] { width: 100%; font-size: 14px; }

/* Na visao da plataforma o menu usa sempre a cor padrao do GestELT */
body.modo-plataforma { --lateral-fundo: #111827; --azul: #2563eb; }
body.modo-plataforma .lateral .marca span { color: #60a5fa; }

/* ------------------------------------------------------------------ */
/* Utilitarios de tabela                                               */
/* ------------------------------------------------------------------ */
.direita { text-align: right; }
/* Coluna de texto corrido (descricao, procedimento, motivo). O
   `.tabela td` acima manda `white-space: nowrap` e tem especificidade
   maior que `.coluna-texto` sozinha: a coluna nunca quebrava de linha, e
   o texto comprido saia POR CIMA das colunas seguintes - era o
   "atravessando as informacoes" do card de movimentos do caixa. */
.coluna-texto,
.tabela .coluna-texto { white-space: normal; min-width: 210px; max-width: 320px; }
.linha-atrasada { background: var(--erro-fundo); }
.tabela tfoot th { padding: 10px 12px; text-align: left; border-top: 1px solid var(--borda); }
.tabela tfoot .total-destaque th { font-size: 16px; color: var(--texto); }

/* Formularios em linha (salas, baixa de parcela, filtros) */
.linha-inline { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* min-width por TIPO: uma data precisa caber "dd/mm/aaaa" e uma escolha
   precisa caber o nome do profissional. Os 110px que valiam para todos
   cortavam os dois no meio. */
.linha-inline input:not([type="checkbox"]):not([type="radio"]) { width: auto; min-width: 130px; }
.linha-inline select { width: auto; min-width: 180px; max-width: 100%; }
.linha-inline input[type="number"] { min-width: 80px; }

/* "vezes" do cartao: cabe 2 digitos, e o minimo de 130px da linha-inline
   deixaria um campo de numero do tamanho do de valor */
.campo-vezes { display: inline-flex; }
.linha-inline .campo-vezes input { width: 92px; min-width: 0; }
.linha-sala { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* Linhas de item (procedimentos do atendimento / orcamento) */
.tabela-itens { display: table; }
.tabela-itens td { white-space: normal; vertical-align: top; }
.tabela-itens input, .tabela-itens select { min-width: 0; }

.texto-clinico { white-space: pre-line; line-height: 1.6; }

/* ------------------------------------------------------------------ */
/* Agenda                                                              */
/* ------------------------------------------------------------------ */
.navegacao-agenda { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* A semana divide a linha com os atalhos de salto, e nao uma faixa so
   dela: e a mesma pergunta ("que outro dia?"), e como faixa inteira ela
   comia 90px de altura para mostrar sete numeros. Ocupa a sobra da linha
   e desce para uma linha propria quando nao couber. */
.semana {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 5px;
    flex: 1 1 320px;
    min-width: 0;
}

.semana a {
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 3px 2px 4px;
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    color: var(--texto);
    background: var(--branco);
    line-height: 1.15;
}

.semana a:hover { background: var(--fundo); }
.semana a.dia-atual { border-color: var(--azul); background: var(--azul); color: #fff; }
.semana .dia-nome { font-size: 10px; text-transform: uppercase; letter-spacing: .04em; opacity: .75; }
.semana .dia-numero { font-size: 15px; font-weight: 700; }
.semana .dia-total { font-size: 10px; opacity: .8; }

.agenda-rolagem { overflow-x: auto; }

.agenda-cabecalho,
.agenda-corpo {
    display: grid;
    grid-template-columns: 56px repeat(var(--colunas), minmax(150px, 1fr));
    min-width: 100%;
}

.agenda-cabecalho { position: sticky; top: 0; z-index: 2; background: var(--branco); }

.agenda-titulo {
    padding: 8px 10px;
    border: 1px solid var(--borda);
    border-top-width: 3px;
    border-left: none;
    display: flex;
    flex-direction: column;
}

.agenda-titulo small { color: var(--texto-fraco); font-size: 12px; }
.agenda-canto { border-bottom: 1px solid var(--borda); }

.agenda-corpo { position: relative; }
.agenda-horas { position: relative; border-right: 1px solid var(--borda); }

.agenda-hora {
    position: absolute;
    right: 6px;
    font-size: 11px;
    color: var(--texto-fraco);
    transform: translateY(-6px);
}

.agenda-coluna { position: relative; border-right: 1px solid var(--borda); }

/* Faixa vazia: clicavel para marcar direto naquele horario */
.agenda-vago {
    position: absolute;
    left: 0;
    right: 0;
    display: block;
    border-bottom: 1px dashed var(--realce);
}

.agenda-vago.cheia { border-bottom-color: var(--borda); }
a.agenda-vago:hover { background: rgba(37, 99, 235, .07); }

.agenda-evento {
    position: absolute;
    left: 3px;
    right: 3px;
    overflow: hidden;
    padding: 4px 7px;
    border-radius: 6px;
    border-left: 4px solid var(--azul);
    background: var(--realce-azul);
    color: var(--texto);
    font-size: 12px;
    line-height: 1.3;
    display: flex;
    flex-direction: column;
    gap: 1px;
}

.agenda-evento:hover { filter: brightness(.96); }
.agenda-evento .evento-hora { font-weight: 700; }
.agenda-evento .evento-paciente { font-weight: 600; }
.agenda-evento .evento-extra { color: var(--texto-fraco); font-size: 11px; }

.agenda-evento.status-agendado   { background: var(--status-agendado);   color: var(--status-agendado-texto); }
.agenda-evento.status-confirmado { background: var(--status-confirmado); color: var(--status-confirmado-texto); }
.agenda-evento.status-atendido   { background: var(--status-atendido);   color: var(--status-atendido-texto); }
.agenda-evento.status-faltou     { background: var(--status-faltou);     color: var(--status-faltou-texto); }

.agenda-evento.status-cancelado {
    background: var(--status-cancelado);
    color: var(--status-cancelado-texto);
    opacity: .6;
    text-decoration: line-through;
}

/* Com fundo escolhido pela clinica, o texto secundario acompanha a
   legibilidade do principal em vez de continuar cinza fixo */
.agenda-evento .evento-extra { color: inherit; opacity: .75; }

.legenda-agenda { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 14px; align-items: center; }

/* ------------------------------------------------------------------ */
/* Arrastar na grade                                                   */
/* ------------------------------------------------------------------ */

/* touch-action: sem isto o navegador rola a pagina em vez de deixar o
   dedo mover o bloco */
[data-agenda-arrastavel] .agenda-evento { cursor: grab; touch-action: none; }
[data-agenda-arrastavel] .agenda-evento.status-cancelado { cursor: default; }

.agenda-evento.arrastando {
    cursor: grabbing;
    opacity: .85;
    z-index: 5;
    box-shadow: 0 6px 18px rgba(17, 24, 39, .25);
}

/* Punho de duracao: a borda de baixo do bloco, sempre a vista.
   Alvo invisivel so e encontrado por quem ja sabe que ele existe - e a
   barrinha e o que ensina, sem precisar de instrucao escrita. */
.agenda-punho { display: none; }

[data-agenda-arrastavel] .agenda-punho {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: flex-end;
    gap: 1px;
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 12px;
    cursor: ns-resize;
    background: linear-gradient(to bottom, transparent, rgba(17, 24, 39, .10));
}

.agenda-punho-barra {
    width: 28px;
    height: 3px;
    margin-bottom: 2px;
    border-radius: 2px;
    background: currentColor;
    opacity: .4;
}

/* O rotulo so cabe em bloco alto; em atendimento curto fica a barrinha */
.agenda-punho-texto {
    display: none;
    font-size: 9px;
    font-style: normal;
    letter-spacing: .02em;
    opacity: .7;
    white-space: nowrap;
}

[data-agenda-arrastavel] .agenda-evento:hover .agenda-punho {
    background: linear-gradient(to bottom, transparent, rgba(17, 24, 39, .22));
}

[data-agenda-arrastavel] .agenda-evento:hover .agenda-punho-barra { opacity: .85; }

/* Com o ponteiro em cima, a faixa cresce e o rotulo cabe. Em bloco
   curto ele fica cortado pelo overflow do proprio evento, que ja e o
   comportamento certo: ali a barrinha basta. */
[data-agenda-arrastavel] .agenda-evento:hover .agenda-punho { height: 26px; }
[data-agenda-arrastavel] .agenda-evento:hover .agenda-punho-texto { display: block; }

/* Espaco para a faixa nao cobrir a ultima linha de texto do bloco */
[data-agenda-arrastavel] .agenda-evento { padding-bottom: 13px; }

/* Coluna que vai receber o atendimento ao soltar */
.agenda-coluna.coluna-alvo { background: var(--realce-azul); }

/* A barrinha desenhada na legenda, para o olho reconhecer na grade */
.exemplo-punho {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    height: 12px;
    border: 1px solid var(--borda);
    border-radius: 3px;
    background: var(--realce);
    vertical-align: middle;
}

.exemplo-punho i { display: block; width: 14px; height: 2px; border-radius: 2px; background: var(--texto-fraco); }

/* ------------------------------------------------------------------ */
/* Punho de mover, no canto direito do atendimento                     */
/*                                                                     */
/* Arrastar o bloco pelo meio sempre funcionou; o problema era que      */
/* nada dizia isso. As quatro setas anunciam o gesto e, num bloco de    */
/* 30 minutos cheio de texto, dao um lugar seguro para pegar sem mirar. */
/* Sem permissao de editar nao ha o que arrastar, entao o simbolo nem   */
/* aparece.                                                            */
/* ------------------------------------------------------------------ */
.agenda-mover { display: none; }

[data-agenda-arrastavel] .agenda-mover {
    display: flex;
    align-items: center;
    justify-content: center;
    position: absolute;
    top: 3px;
    right: 3px;
    width: 20px;
    height: 20px;
    border-radius: 5px;
    background: rgba(17, 24, 39, .16);
    color: inherit;
    opacity: .8;
    cursor: grab;
    transition: opacity .12s ease, background .12s ease;
}

.agenda-mover svg { width: 13px; height: 13px; }

[data-agenda-arrastavel] .agenda-evento:hover .agenda-mover {
    opacity: 1;
    background: rgba(17, 24, 39, .18);
}

/* Cancelado nao se move: o simbolo sairia prometendo um gesto recusado */
[data-agenda-arrastavel] .agenda-evento.status-cancelado .agenda-mover { display: none; }

/* Espaco para o simbolo nao sentar em cima do horario */
[data-agenda-arrastavel] .agenda-evento .evento-hora { padding-right: 22px; }

/* ------------------------------------------------------------------ */
/* Agenda fechada                                                      */
/*                                                                     */
/* Ferias, congresso, saida mais cedo. Listrada porque tem que ler      */
/* como "area interditada" e nao como mais um atendimento - e atras de  */
/* tudo (z-index 0), ja que o que estava marcado antes do fechamento    */
/* continua de pe e precisa aparecer por cima.                          */
/* ------------------------------------------------------------------ */
.agenda-fechada {
    position: absolute;
    left: 2px;
    right: 2px;
    z-index: 0;
    overflow: hidden;
    padding: 3px 6px;
    border-radius: 6px;
    border: 1px dashed var(--tom-neutro);
    color: var(--texto-fraco);
    font-size: 11px;
    line-height: 1.25;
    cursor: not-allowed;
    background-color: var(--realce);
    background-image: repeating-linear-gradient(
        135deg,
        rgba(100, 116, 139, .16) 0 6px,
        transparent 6px 12px
    );
}

.agenda-fechada .fechada-motivo { display: block; font-weight: 700; }
.agenda-fechada .fechada-hora   { display: block; opacity: .8; }

/* ------------------------------------------------------------------ */
/* Popover da agenda                                                   */
/*                                                                     */
/* O cartao que abre ao passar o mouse num atendimento. Substitui o    */
/* title do navegador, que dava tudo em uma linha so, sem hierarquia,  */
/* e sumia sozinho no meio da leitura. Aqui o nome do paciente vem     */
/* grande - e a pergunta que se faz olhando a grade - e o telefone     */
/* fica a vista, que e o proximo passo de quem esta procurando.        */
/* ------------------------------------------------------------------ */
.popover-agenda {
    position: fixed;
    z-index: 60;
    width: 268px;
    max-width: calc(100vw - 24px);
    padding: 0;
    border: 1px solid var(--borda);
    border-radius: 12px;
    background: var(--branco);
    color: var(--texto);
    box-shadow: 0 12px 34px rgba(17, 24, 39, .18);
    overflow: hidden;
    pointer-events: none;   /* o cartao nunca rouba o clique do bloco */
    opacity: 0;
    transform: translateY(-4px);
    transition: opacity .13s ease, transform .13s ease;
}

.popover-agenda.visivel { opacity: 1; transform: translateY(0); }

/* Faixa da cor do profissional: liga o cartao a coluna de onde veio */
.popover-agenda .pop-topo {
    padding: 11px 14px 10px;
    border-left: 4px solid var(--pop-cor, var(--azul));
    background: var(--realce);
}

.popover-agenda .pop-topo-fechado { border-left-color: var(--tom-neutro); }

.popover-agenda .pop-nome {
    display: block;
    font-size: 14.5px;
    font-weight: 700;
    line-height: 1.25;
}

.popover-agenda .pop-hora {
    display: block;
    margin-top: 2px;
    font-size: 12px;
    color: var(--texto-fraco);
    font-variant-numeric: tabular-nums;
}

.popover-agenda .pop-dados { padding: 10px 14px 4px; }

.popover-agenda .pop-linha {
    display: flex;
    justify-content: space-between;
    gap: 12px;
    padding: 3px 0;
    font-size: 12.5px;
}

.popover-agenda .pop-linha dt { color: var(--texto-fraco); flex: 0 0 auto; }

.popover-agenda .pop-linha dd {
    text-align: right;
    font-weight: 600;
    min-width: 0;
    overflow-wrap: anywhere;
}

/* A observacao do agendamento. Bloco proprio, com o fundo de realce: e
   recado escrito a mao ("vem de jejum", "so ate as 10h"), e nao mais um
   campo do cadastro - precisa se distinguir das linhas de cima.

   Ate quatro linhas: observacao comprida transformaria o cartao numa
   pagina, e quem precisa do texto inteiro abre o atendimento. */
.popover-agenda .pop-observacao {
    margin: 4px 14px 0;
    padding: 8px 10px;
    border-radius: 8px;
    background: var(--realce);
}

.popover-agenda .pop-rotulo {
    display: block;
    margin-bottom: 2px;
    font-size: 10.5px;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--texto-fraco);
}

.popover-agenda .pop-observacao p {
    margin: 0;
    font-size: 12.5px;
    line-height: 1.4;
    overflow-wrap: anywhere;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 4;
    overflow: hidden;
}

.popover-agenda .pop-rodape {
    display: flex;
    align-items: center;
    gap: 6px;
    flex-wrap: wrap;
    padding: 9px 14px 11px;
    border-top: 1px solid var(--borda);
}

.popover-agenda .pop-acao {
    margin-left: auto;
    font-size: 11px;
    color: var(--texto-fraco);
}

.popover-agenda .pop-aviso {
    padding: 10px 14px 12px;
    font-size: 12.5px;
    color: var(--texto-fraco);
    line-height: 1.45;
}

/* Quem prefere menos movimento na tela nao ganha a animacao de entrada */
@media (prefers-reduced-motion: reduce) {
    .popover-agenda { transition: none; transform: none; }
    .popover-agenda.visivel { transform: none; }
}

/* Os fechamentos do dia, no topo da visao de lista */
.fechamentos-dia { list-style: none; margin-bottom: 14px; }

.fechamentos-dia li {
    padding: 8px 12px;
    margin-bottom: 6px;
    border-left: 3px solid var(--tom-neutro);
    border-radius: 0 var(--raio) var(--raio) 0;
    background: var(--realce);
    font-size: 13px;
}

/* Quantas vezes o atendimento ja mudou de horario */
.marca-remarcado {
    display: inline-block;
    padding: 0 5px;
    border-radius: 999px;
    background: rgba(217, 119, 6, .18);
    color: var(--amarelo);
    font-size: 10px;
    font-weight: 700;
    vertical-align: middle;
}

.agenda-evento.foi-remarcado { border-right: 3px solid var(--amarelo); }

/* ------------------------------------------------------------------ */
/* Grupo segmentado                                                    */
/*                                                                     */
/* Opcoes de uma mesma pergunta ("que dia?", "como ver?") coladas       */
/* dentro de um contorno so. Le-se como UM controle de varias           */
/* posicoes; com cada opcao em botao proprio e 8px de folga entre       */
/* eles, as tres viravam tres botoes soltos sem parentesco visivel.     */
/* ------------------------------------------------------------------ */
.grupo-segmentado,
.seletor-visao {
    display: inline-flex;
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    overflow: hidden;
    background: var(--branco);
}

/* Sem padding vertical: a altura vem do grupo, e o texto se centraliza
   sozinho. E o que faz a fila de controles terminar toda na mesma linha */
.grupo-segmentado > a,
.seletor-visao a {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 8px 14px;
    font-size: 14px;
    color: var(--texto);
    border-right: 1px solid var(--borda);
    white-space: nowrap;
}

.grupo-segmentado > a:last-child,
.seletor-visao a:last-child { border-right: none; }

.grupo-segmentado > a:hover,
.seletor-visao a:hover { background: var(--fundo); }

.grupo-segmentado > a.ativo,
.seletor-visao a.ativo { background: var(--azul); color: #fff; }

/* ------------------------------------------------------------------ */
/* Barra de controles da agenda                                        */
/*                                                                     */
/* Duas linhas com papeis separados. Em cima o que define A TELA: de    */
/* um lado o dia e o profissional, do outro o modo de ver e a acao.     */
/* Embaixo os atalhos para TROCAR DE DIA - saltos e semana - que sao a  */
/* mesma pergunta e por isso dividem a linha.                           */
/*                                                                     */
/* Antes os grupos se espalhavam por tres faixas com space-between,     */
/* abrindo um vao no meio de cada uma; os atalhos de salto ficavam      */
/* soltos longe do campo "daqui a X dias" que faz a mesma coisa, e a    */
/* semana ocupava uma faixa inteira para mostrar sete numeros.          */
/* ------------------------------------------------------------------ */
.agenda-barra {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px 16px;
    flex-wrap: wrap;
}

/* A segunda linha se separa da primeira por um fio, e nao por espaco.
   Alinhada pelo TOPO: o grupo do salto tem duas linhas (controles e
   previa), e centralizado o modo de ver ficaria boiando no meio delas
   em vez de na mesma altura dos atalhos. */
.agenda-barra-secundaria {
    align-items: flex-start;
    margin-top: 12px;
    padding-top: 12px;
    border-top: 1px solid var(--borda);
}

/* Controles do mesmo assunto andam juntos e com o mesmo respiro */
.agenda-grupo { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

.agenda-rotulo { font-size: 13px; font-weight: 600; color: var(--texto-fraco); }

/* "Que dia" e "de quem" sao perguntas diferentes na mesma linha, e o que
   as separa e o espaco. Um fio de 1px na cor da borda, entre campos que
   ja tem borda dessa cor, nao se enxerga - so vira sujeira no HTML.
   Espaco maior via gap, e nao margem: numa tela media a barra quebra, e
   com margem o filtro desceria empurrado 18px para dentro em vez de
   alinhar pela esquerda com o bloco do dia. */
.agenda-grupo-solto { column-gap: 14px; }

/* Altura unica para tudo que fica na barra. Sem isto a data (38px) e o
   botao (37px) terminam em linhas diferentes e a fila parece torta. */
.agenda-barra .botao,
.agenda-barra input,
.agenda-barra select,
.agenda-barra .grupo-segmentado { height: 38px; }

/* O segmentado tem altura fixa: se as opcoes quebrassem em duas linhas
   (o seletor de visao herda flex-wrap do grafico do painel), a segunda
   sumiria dentro do overflow do contorno */
.agenda-barra .grupo-segmentado { flex-wrap: nowrap; }

/* O botao precisa centralizar o proprio texto depois de ganhar altura fixa */
.agenda-barra .botao { display: inline-flex; align-items: center; justify-content: center; }

/* Sao onze controles em duas filas: cada folga a mais aqui e uma fila
   quebrada em duas no notebook de 1280. Corpo e respiro um pouco
   menores que o padrao do sistema, sem virar letra de bula. */
.agenda-barra .grupo-segmentado > a { padding: 8px 10px; }
.agenda-barra .botao { padding: 9px 13px; }
.agenda-barra input,
.agenda-barra select { font-size: 14px; padding-left: 9px; padding-right: 9px; }

/* Campo declara a largura de que precisa, em vez dos 100% do padrao */
.agenda-barra input[type="date"] { width: auto; min-width: 138px; }
.agenda-barra select { width: auto; min-width: 160px; max-width: 240px; }

.agenda-campo { display: flex; }

.atalhos-salto > a { font-weight: 600; }

.salto-dias { display: flex; align-items: center; gap: 7px; }
.salto-dias label { margin: 0; font-size: 13px; font-weight: 400; color: var(--texto-fraco); }
.salto-dias span { font-size: 13px; color: var(--texto-fraco); }
.salto-dias input[type="number"] { width: 58px; text-align: center; }

/* A previa do salto ocupa a linha inteira embaixo do grupo, alinhada com
   o rotulo "Ir para". Fica NO FLUXO, e nao flutuando: assim que a barra
   quebra - e ela quebra bem antes do celular, porque sao duas filas de
   controle - o modo de ver sobe para a linha seguinte e uma previa
   flutuante cairia por cima dele. Como o campo ja vem com 7 preenchido,
   a linha esta em uso o tempo todo; nao ha o que economizar escondendo. */
.agenda-grupo-salto [data-salto-previsao] { flex: 1 1 100%; white-space: nowrap; }

/* Sem JavaScript a previa nunca e preenchida: nao vale reservar a linha */
.agenda-grupo-salto [data-salto-previsao]:empty { display: none; }

/* Visao de semana */
.agenda-titulo.dia-escolhido { background: var(--realce-azul); }
.agenda-titulo a { color: var(--texto); }
.agenda-coluna.coluna-hoje { background: rgba(37, 99, 235, .035); }

/* Visao de lista */
.tabela-agenda .hora-lista strong { display: block; }
.tabela-agenda .hora-lista small { color: var(--texto-fraco); font-size: 12px; }
.tabela-agenda .dica { margin-top: 0; }
.tabela-agenda .linha-cancelado { opacity: .55; }

.ponto-cor {
    display: inline-block;
    width: 9px;
    height: 9px;
    border-radius: 50%;
    margin-right: 6px;
    vertical-align: middle;
}

/* ------------------------------------------------------------------ */
/* Dentes e arcada, no orcamento                                       */
/* ------------------------------------------------------------------ */
.campo-regiao { margin-bottom: 6px; }

/* Filtro de especialidade da propria linha, acima do procedimento. Menor
   e mais apagado que o select de baixo: ele nao e o que se escolhe, e o
   que enxuga a lista do que se escolhe. */
.campo-especialidade-linha {
    margin-bottom: 6px;
    font-size: 12px;
    padding-top: 4px;
    padding-bottom: 4px;
    color: var(--texto-fraco);
}

/* ------------------------------------------------------------------ */
/* Linhas do orcamento                                                 */
/* ------------------------------------------------------------------ */

/* Sem procedimento escolhido nao ha o que preencher: a linha fica
   apagada, e o cinza diz isso melhor que qualquer instrucao escrita */
.linha-travada td { opacity: .55; }
.linha-travada td:first-child { opacity: 1; }

.tabela-itens input[readonly],
.tabela-itens select:disabled,
.tabela-itens input:disabled {
    background: var(--fundo);
    cursor: not-allowed;
}

/* Quantidade calculada a partir dos dentes marcados */
.campo-automatico {
    background: var(--fundo);
    font-weight: 600;
    text-align: center;
}

[data-aviso-dentes] { min-height: 16px; }
[data-aviso-dentes].aviso-forte { color: var(--vermelho); }

.dentes-campo { display: flex; gap: 6px; align-items: center; }
.dentes-campo input { min-width: 0; }
.dentes-campo .botao { padding: 8px 10px; white-space: nowrap; }

.dialogo {
    border: none;
    background: var(--branco);
    border-radius: var(--raio);
    padding: 22px;
    max-width: 720px;
    width: calc(100% - 32px);
    box-shadow: 0 20px 50px rgba(17, 24, 39, .25);
    color: var(--texto);
    /* O reset de margem no topo do arquivo apaga o "margin: auto" que o
       navegador usa para centralizar o dialogo. Aqui ele volta. */
    margin: auto;
    /* Conteudo alto (o desenho da boca, com os dentes de leite a mostra)
       rola dentro do dialogo em vez de sair pela borda da tela */
    max-height: calc(100vh - 48px);
    overflow-y: auto;
}

.dialogo::backdrop { background: rgba(17, 24, 39, .5); }
.dialogo h2 { margin-bottom: 4px; }
.dialogo-acoes { display: flex; gap: 8px; margin-top: 18px; flex-wrap: wrap; }

/* O X de fechar, comum a todo dialogo que tem barra de titulo */
.dialogo-fechar {
    flex: 0 0 auto;
    width: 30px;
    height: 30px;
    padding: 0;
    border: none;
    border-radius: 50%;
    background: none;
    color: var(--texto-fraco);
    font-size: 23px;
    line-height: 1;
    cursor: pointer;
}

.dialogo-fechar:hover { background: var(--fundo); color: var(--texto); }

/* ------------------------------------------------------------------ */
/* Cabecalho do modal                                                  */
/*                                                                     */
/* Faixa na cor da clinica, de ponta a ponta no alto da caixa. Antes o */
/* titulo do modal era um texto solto no meio do conteudo: numa tela   */
/* com secoes proprias ("Atendimento", "Quando", "Dados do             */
/* lancamento") ele se perdia entre elas, e nada dizia onde a caixa    */
/* comecava.                                                           */
/*                                                                     */
/* As margens negativas cancelam o padding de 22px do .dialogo - e o   */
/* que faz a faixa encostar nas bordas em vez de flutuar dentro delas. */
/* O modal de formulario (o do <iframe>) nao entra nessa conta: ali o  */
/* dialogo ja tem padding zero, e quem tem margem e a pagina de dentro.*/
/* ------------------------------------------------------------------ */
.dialogo-cabecalho {
    margin: -22px -22px 18px;
    padding: 13px 22px;
    border-radius: var(--raio) var(--raio) 0 0;
}

.dialogo-cabecalho,
.dialogo-formulario-barra {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 14px;
    flex-wrap: wrap;
    background: var(--azul);
    color: #fff;
    flex: 0 0 auto;
}

/* Dentro da faixa o titulo e titulo, e nao mais uma divisoria de secao
   do formulario (.formulario h2, em caixa alta e com linha embaixo) */
.dialogo-cabecalho h2,
.dialogo-formulario-barra h2 {
    margin: 0;
    padding: 0;
    border: none;
    font-size: 17px;
    font-weight: 600;
    text-transform: none;
    letter-spacing: normal;
    color: #fff;
}

.dialogo-cabecalho .dica { margin: 0; color: rgba(255, 255, 255, .82); }

/* O X e os botoes da faixa passam a viver sobre a cor da clinica: o
   cinza de antes sumia em barra escura e brigava em barra clara */
.dialogo-cabecalho .dialogo-fechar,
.dialogo-formulario-barra .dialogo-fechar { color: rgba(255, 255, 255, .85); }

.dialogo-cabecalho .dialogo-fechar:hover,
.dialogo-formulario-barra .dialogo-fechar:hover {
    background: rgba(255, 255, 255, .2);
    color: #fff;
}

.dialogo-cabecalho .etiqueta {
    background: rgba(255, 255, 255, .2);
    color: #fff;
}

.dialogo-cabecalho .botao.secundario,
.dialogo-formulario-barra .botao.secundario {
    background: rgba(255, 255, 255, .16);
    border-color: rgba(255, 255, 255, .38);
    color: #fff;
}

.dialogo-cabecalho .botao.secundario:hover,
.dialogo-formulario-barra .botao.secundario:hover {
    background: rgba(255, 255, 255, .28);
    color: #fff;
}

/* ------------------------------------------------------------------ */
/* "Sair sem salvar?" (modal.js)                                       */
/*                                                                     */
/* Aparece POR CIMA de outro modal, entao precisa se destacar dele:    */
/* mais estreita, com sombra mais funda e o fundo escuro proprio - e   */
/* uma pergunta curta, nao mais uma tela para ler.                     */
/* ------------------------------------------------------------------ */
.dialogo-confirmar {
    max-width: 460px;
    padding: 24px;
    box-shadow: 0 24px 60px rgba(17, 24, 39, .38);
}

.dialogo-confirmar::backdrop { background: rgba(17, 24, 39, .45); }

.confirmar-corpo { display: flex; gap: 14px; align-items: flex-start; }

/* O aviso e de perda de informacao, nao de erro: ambar, e nao vermelho -
   o vermelho fica reservado para o botao que de fato descarta */
.confirmar-icone {
    flex: 0 0 auto;
    width: 38px;
    height: 38px;
    border-radius: 50%;
    background: var(--aviso-fundo);
    border: 1px solid var(--aviso-borda);
    color: var(--aviso-texto);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 20px;
    font-weight: 700;
    line-height: 1;
}

.dialogo-confirmar h2 { margin: 2px 0 6px; font-size: 17px; }
.dialogo-confirmar .dica { margin: 0; line-height: 1.55; }
.dialogo-confirmar .dialogo-acoes { margin-top: 20px; }

/* ------------------------------------------------------------------ */
/* Cadastro em modal                                                   */
/*                                                                     */
/* O formulario vem num <iframe>, entao o dialogo aqui e so a moldura: */
/* barra de titulo em cima e o quadro ocupando o resto. Sem padding    */
/* nas laterais - quem tem margem e a pagina de dentro.                */
/* ------------------------------------------------------------------ */
.dialogo-formulario {
    max-width: 1080px;
    width: calc(100% - 32px);
    height: calc(100vh - 48px);
    max-height: calc(100vh - 48px);
    padding: 0;
    /* O quadro ja rola por dentro: rolar tambem por fora daria duas
       barras de rolagem, uma dentro da outra */
    overflow: hidden;
}

/* O display fica no [open], e nao na regra de cima.
   Era o "clico no X e o modal nao fecha, e ainda fica tudo branco": um
   `display: flex` solto aqui vence o `dialog:not([open]) { display: none }`
   do navegador - regra de autor ganha de regra do navegador, nao importa a
   especificidade -, entao a caixa continuava desenhada na tela depois de
   fechada. Branca, porque fechar tambem manda o quadro para about:blank. */
.dialogo-formulario[open] { display: flex; flex-direction: column; }

/* A cor e o resto da faixa vem de .dialogo-cabecalho, la em cima: e a
   mesma barra de todo modal do sistema. Aqui fica so o que e daqui - o
   respiro proprio, ja que este dialogo nao tem padding para cancelar. */
.dialogo-formulario-barra { padding: 13px 18px; }

.dialogo-formulario-quadro {
    flex: 1 1 auto;
    width: 100%;
    border: none;
    display: block;
}

/* A pagina servida DENTRO do quadro: sem menu e sem topo, ela e so o
   formulario, com respiro nas bordas.

   O zoom da preferencia de tamanho tambem vale aqui - o modal nao tem
   .app, e sem isto quem escolheu "Compacta" via a lista miuda e o
   formulario em tamanho normal. Sem min-height para compensar: o quadro
   rola por dentro e nao tenta ocupar a tela toda. */
.corpo-modal {
    background: var(--fundo);
    zoom: var(--escala, 1);
}
.conteudo-modal { padding: 18px; }

/* O painel ja e a caixa branca da tela cheia; dentro do modal ele nao
   precisa da sombra, que so acumularia borda sobre borda */
.conteudo-modal .painel { box-shadow: none; }

/* Coluna lateral de ajuda (a de "Qual usar?", no lancamento) empilha:
   o modal e mais estreito que a tela cheia */
@media (max-width: 900px) {
    .conteudo-modal .colunas { display: block; }
}

/* ------------------------------------------------------------------ */
/* Marcar sem sair da agenda                                           */
/* ------------------------------------------------------------------ */

/* O titulo do modal nao pode ter a cara de "Atendimento" e "Quando", que
   sao as secoes DENTRO dele: um titulo do mesmo tamanho e da mesma cor
   das divisorias nao parece titulo de nada. Hoje quem cuida disso e a
   faixa colorida (.dialogo-cabecalho); aqui fica so o espaco ate o
   resumo do horario, que vem logo abaixo dela. */
.dialogo-agendamento .dialogo-cabecalho { margin-bottom: 14px; }

.dialogo-agendamento [data-resumo-horario] { margin-bottom: 4px; }
.dialogo-agendamento [data-resumo-horario]:empty { display: none; }

/* ------------------------------------------------------------------ */
/* De onde vem o atendimento (modal do prontuario)                     */
/* ------------------------------------------------------------------ */
.dialogo-origem { max-width: 560px; }

.etapa-origem { border: none; padding: 0; margin-bottom: 18px; }

.etapa-origem legend {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 0;
    margin-bottom: 10px;
    font-size: 14px;
    font-weight: 600;
}

/* O numero diz em que ponto do caminho a pessoa esta. Uma etapa que
   aparece do nada, sem numero, parece campo que faltava preencher. */
.numero-etapa {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    border-radius: 50%;
    background: var(--azul);
    color: #fff;
    font-size: 12px;
    font-weight: 700;
}

.opcoes-origem { display: grid; gap: 8px; }

.cartao-origem {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    padding: 12px 14px;
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    background: var(--branco);
    cursor: pointer;
    transition: border-color .15s ease, background .15s ease;
}

.cartao-origem:hover { border-color: var(--azul); background: var(--realce-azul); }

/* :has recebe o destaque quando o radio dentro dela esta marcado. Onde
   nao houver suporte, o proprio radio marcado ja diz qual e - o realce
   e reforco, nao a unica pista. */
.cartao-origem:has(input:checked) {
    border-color: var(--azul);
    background: var(--realce-azul);
    box-shadow: 0 0 0 1px var(--azul);
}

.cartao-origem input { flex: 0 0 auto; margin-top: 3px; width: auto; }
.cartao-origem-icone { font-size: 20px; line-height: 1.2; }
.cartao-origem-texto { display: flex; flex-direction: column; gap: 2px; }
.cartao-origem-texto strong { font-size: 14.5px; }
.cartao-origem-texto small { color: var(--texto-fraco); font-size: 12.5px; line-height: 1.45; }

/* Lista da etapa 3: rola dentro do modal em vez de esticar o dialogo */
.lista-origem { display: grid; gap: 6px; max-height: 260px; overflow-y: auto; }

.cartao-item-origem {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 10px 12px;
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    cursor: pointer;
}

.cartao-item-origem:hover { border-color: var(--azul); background: var(--realce-azul); }
.cartao-item-origem:has(input:checked) { border-color: var(--azul); background: var(--realce-azul); }
.cartao-item-origem input { flex: 0 0 auto; margin-top: 3px; width: auto; }
.cartao-item-origem span { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.cartao-item-origem strong { font-size: 14px; }
.cartao-item-origem small { color: var(--texto-fraco); font-size: 12.5px; }
.cartao-item-origem .etiqueta { align-self: flex-start; margin-top: 3px; }
.lista-origem .vazio { margin: 0; }

.mapa-dentes {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 12px;
    margin-top: 14px;
}

.quadrante { border: 1px solid var(--borda); border-radius: var(--raio); padding: 10px; }

.quadrante-titulo {
    display: block;
    width: 100%;
    background: none;
    border: none;
    padding: 0 0 8px;
    font: inherit;
    font-size: 12px;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .03em;
    color: var(--texto-fraco);
    cursor: pointer;
    text-align: left;
}

.quadrante-titulo:hover { color: var(--azul); }
.quadrante-dentes { display: flex; flex-wrap: wrap; gap: 5px; }

/* A caixa some e o numero vira o botao */
.dente input { position: absolute; opacity: 0; width: 0; height: 0; }

/* Os oito dentes de um quadrante dividem a largura, sem quebrar linha */
.dente { flex: 1 1 32px; }

.dente span {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 34px;
    border: 1px solid var(--borda);
    border-radius: 6px;
    font-size: 13px;
    cursor: pointer;
    background: var(--branco);
}

.dente span:hover { border-color: var(--azul); }

.dente input:checked + span {
    background: var(--azul);
    border-color: var(--azul);
    color: #fff;
    font-weight: 600;
}

.dente input:focus-visible + span { outline: 2px solid var(--azul); outline-offset: 2px; }

/* ------------------------------------------------------------------ */
/* Desenho da boca                                                     */
/*                                                                     */
/* A outra vista do mesmo mapa: em vez de procurar o numero, a pessoa   */
/* clica no dente. O que esta marcado continua nas caixas da lista - o  */
/* desenho so recebe a classe "marcado" para mostrar o mesmo estado.    */
/* ------------------------------------------------------------------ */
.vista-dentes {
    display: inline-flex;
    gap: 2px;
    margin: 10px 0 2px;
    padding: 3px;
    background: var(--fundo);
    border: 1px solid var(--borda);
    border-radius: 999px;
}

.vista-opcao {
    padding: 6px 16px;
    border: none;
    background: none;
    border-radius: 999px;
    font: inherit;
    font-size: 13px;
    font-weight: 600;
    color: var(--texto-fraco);
    cursor: pointer;
}

.vista-opcao:hover { color: var(--texto); }

.vista-opcao.ativo {
    background: var(--branco);
    color: var(--azul);
    box-shadow: 0 1px 2px rgba(17, 24, 39, .12);
}

.mapa-boca {
    display: block;
    width: 100%;
    max-width: 340px;
    margin: 12px auto 0;
    /* Arrastar o clique nao deve sair selecionando os numeros */
    user-select: none;
}

.boca-gengiva {
    fill: none;
    stroke: var(--gengiva);
    stroke-linecap: round;
    stroke-linejoin: round;
}

.boca-guia { stroke: var(--borda); stroke-width: 1; stroke-dasharray: 5 5; }

.boca-lado {
    font-size: 10px;
    font-weight: 600;
    letter-spacing: .06em;
    fill: var(--texto-fraco);
}

.boca-dente { cursor: pointer; }
.boca-dente rect { fill: var(--branco); stroke: var(--borda); stroke-width: 1.2; }

.boca-dente text {
    font-size: 10px;
    text-anchor: middle;
    fill: var(--texto-fraco);
    /* O clique e do dente inteiro, nao do numero */
    pointer-events: none;
}

.boca-dente:hover rect { stroke: var(--azul); stroke-width: 2; }

.boca-dente.marcado rect { fill: var(--azul); stroke: var(--azul); }
.boca-dente.marcado text { fill: #fff; font-weight: 600; }

/* Contorno de foco em SVG nao aparece em todo navegador: e a propria
   borda do dente que engrossa */
.boca-dente:focus { outline: none; }
.boca-dente:focus-visible rect { stroke: var(--azul); stroke-width: 2.5; }

@media (max-width: 560px) {
    .mapa-dentes { grid-template-columns: 1fr; }
}

/* ------------------------------------------------------------------ */
/* Abas                                                                */
/* ------------------------------------------------------------------ */
.abas-links {
    display: flex;
    gap: 4px;
    flex-wrap: wrap;
    margin-bottom: 16px;
    border-bottom: 2px solid var(--borda);
}

.abas-links a {
    padding: 10px 18px;
    font-weight: 600;
    color: var(--texto-fraco);
    border-bottom: 2px solid transparent;
    margin-bottom: -2px;
}

.abas-links a:hover { color: var(--texto); }

.abas-links a.ativo {
    color: var(--azul);
    border-bottom-color: var(--azul);
}

/* ------------------------------------------------------------------ */
/* Arquivos do paciente                                                */
/* ------------------------------------------------------------------ */

/* Area de envio: alvo grande, porque exame chega arrastado da pasta de
   downloads mais vezes do que pelo seletor de arquivo */
.area-envio { margin-bottom: 18px; }

.area-envio-alvo {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
    padding: 20px;
    border: 2px dashed var(--borda);
    border-radius: var(--raio);
    background: var(--realce);
    text-align: center;
    transition: border-color .15s ease, background .15s ease;
}

.area-envio-alvo.recebendo { border-color: var(--azul); background: var(--realce-azul); }
.area-envio-alvo input[type="file"] { width: auto; margin-top: 8px; }
.area-envio-icone { font-size: 22px; color: var(--texto-fraco); }

.area-envio-dados { display: flex; gap: 8px; margin-top: 10px; flex-wrap: wrap; }
.area-envio-dados input { flex: 1 1 240px; }

/* Filtros por tipo */
.filtros-galeria { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 14px; }

.chip-filtro {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 6px 14px;
    border: 1px solid var(--borda);
    border-radius: 999px;
    background: var(--branco);
    color: var(--texto);
    font: inherit;
    font-size: 13px;
    font-weight: 600;
    cursor: pointer;
}

.chip-filtro:hover { border-color: var(--azul); color: var(--azul); }
.chip-filtro.ativo { background: var(--azul); border-color: var(--azul); color: #fff; }

.chip-contagem {
    padding: 0 6px;
    border-radius: 999px;
    background: var(--fundo);
    color: var(--texto-fraco);
    font-size: 11px;
}

.chip-filtro.ativo .chip-contagem { background: rgba(255, 255, 255, .25); color: #fff; }

/* Cartoes */
.galeria-anexos {
    list-style: none;
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(215px, 1fr));
    gap: 16px;
}

.cartao-anexo {
    display: flex;
    flex-direction: column;
    border: 1px solid var(--borda);
    border-radius: 12px;
    overflow: hidden;
    background: var(--branco);
    transition: box-shadow .15s ease, transform .15s ease, border-color .15s ease;
}

.cartao-anexo:hover {
    border-color: var(--azul);
    box-shadow: 0 8px 22px rgba(17, 24, 39, .12);
    transform: translateY(-2px);
}

.cartao-previa {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    height: 155px;
    background: var(--realce);
    overflow: hidden;
}

.cartao-previa img,
.cartao-previa video { width: 100%; height: 100%; object-fit: cover; display: block; }
.cartao-previa img { cursor: zoom-in; }
.cartao-previa a { display: block; width: 100%; height: 100%; }

.previa-audio,
.previa-documento {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 8px;
    width: 100%;
    height: 100%;
    padding: 12px;
    color: var(--texto-fraco);
    font-size: 13px;
    font-weight: 600;
}

.previa-audio audio { width: 100%; }
.cartao-icone { font-size: 30px; line-height: 1; }

/* Etiqueta do tipo, sobre a previa */
.selo-tipo {
    position: absolute;
    top: 8px;
    left: 8px;
    padding: 2px 8px;
    border-radius: 999px;
    background: rgba(17, 24, 39, .72);
    color: #fff;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .02em;
}

.cartao-dados { display: flex; flex-direction: column; gap: 3px; padding: 12px 14px; flex: 1; }

.cartao-dados strong {
    font-size: 14px;
    /* Nome de exame e comprido: corta com reticencias em vez de esticar */
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.cartao-descricao { font-size: 13px; color: var(--texto-fraco); }
.cartao-acoes { display: flex; gap: 6px; margin-top: auto; padding-top: 10px; }
.cartao-acoes .botao { padding: 5px 12px; font-size: 13px; }
.botao.secundario.perigo { color: var(--vermelho); }
.botao.secundario.perigo:hover { border-color: var(--vermelho); }

/* Visor de imagem em tela cheia */
.visor {
    width: 100%;
    max-width: 100%;
    height: 100%;
    max-height: 100%;
    padding: 0;
    border: none;
    background: transparent;
}

.visor::backdrop { background: rgba(9, 12, 20, .92); }

.visor img {
    display: block;
    max-width: 92vw;
    max-height: 82vh;
    margin: auto;
    border-radius: 8px;
    object-fit: contain;
}

.visor-legenda {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 18px;
    text-align: center;
    color: #e5e7eb;
    font-size: 14px;
}

.visor-fechar,
.visor-navegar {
    position: absolute;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 44px;
    height: 44px;
    border: none;
    border-radius: 50%;
    background: rgba(255, 255, 255, .12);
    color: #fff;
    font-size: 26px;
    line-height: 1;
    cursor: pointer;
}

.visor-fechar:hover,
.visor-navegar:hover { background: rgba(255, 255, 255, .25); }

.visor-fechar { top: 16px; right: 16px; font-size: 22px; }
.visor-navegar { top: 50%; transform: translateY(-50%); }
.visor-navegar.anterior { left: 16px; }
.visor-navegar.proxima { right: 16px; }

@media (max-width: 560px) {
    .galeria-anexos { grid-template-columns: 1fr 1fr; }
    .cartao-previa { height: 120px; }
}

/* Cores das situacoes, nas configuracoes */
.grade-cores .campo { display: flex; flex-direction: column; gap: 6px; }
.grade-cores .previa-status { align-self: flex-start; }

/* ------------------------------------------------------------------ */
/* Campo de selecao com busca                                          */
/*                                                                     */
/* .campo-busca e o campo de escolher (paciente, profissional) que o    */
/* campo-busca.js monta em volta de um <select>. Nao confundir com      */
/* .busca, que e a barra de filtros das listagens: os dois ja tiveram   */
/* o mesmo nome e as regras se atropelavam.                             */
/* ------------------------------------------------------------------ */
.campo-busca { position: relative; }

/* O select continua na pagina guardando o valor, so nao aparece */
.busca-original { display: none; }

.busca-lista {
    position: absolute;
    z-index: 20;
    top: calc(100% + 2px);
    left: 0;
    right: 0;
    max-height: 260px;
    overflow-y: auto;
    list-style: none;
    background: var(--branco);
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    box-shadow: 0 8px 20px rgba(17, 24, 39, .12);
}

.busca-item { padding: 8px 12px; cursor: pointer; font-size: 14px; }
.busca-item:hover, .busca-item.ativo { background: var(--realce-azul); }

.busca-nada { padding: 8px 12px; font-size: 13px; color: var(--texto-fraco); }

/* Atalho de cadastro rapido, embaixo do campo de paciente */
.atalho-novo-paciente { margin-top: 6px; }
.atalho-novo-paciente .botao { padding: 6px 12px; font-size: 13px; }
.dialogo-estreito { max-width: 560px; }
.dialogo .alerta { margin: 14px 0 0; }

/* ------------------------------------------------------------------ */
/* Log do sistema                                                      */
/* ------------------------------------------------------------------ */
.filtros-log {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    margin-bottom: 16px;
}

/* Mesmo problema da barra de busca: 130px para tudo espremia a escolha
   de categoria ("Material de consumo") num campo onde so cabia "Mate".
   Marcacao fica de fora: uma caixa de marcar com largura minima de 150px
   se descola do proprio rotulo. */
.filtros-log input:not([type="checkbox"]):not([type="radio"]) {
    width: auto;
    flex: 0 1 auto;
    min-width: 150px;
}

.filtros-log select { width: auto; flex: 0 1 220px; min-width: 170px; }

/* Atalhos de periodo: um controle de tres posicoes antes dos campos de
   data. Nao encolhe junto com o resto - "Hoje / Este mes / Ano todo" nao
   tem como ser abreviado. */
.filtros-log .atalhos-periodo { flex: 0 0 auto; }
.filtros-log input[type="text"]:not([data-mascara="data"]) { flex: 1 1 200px; min-width: 190px; }
.filtros-log .botao { flex: 0 0 auto; }

.tabela-log { font-size: 13px; }
.tabela-log td { vertical-align: top; }
.nao-quebra { white-space: nowrap; }

.tabela-log details summary {
    cursor: pointer;
    color: var(--azul);
    font-size: 12px;
}

.json-log {
    margin-top: 6px;
    padding: 8px 10px;
    background: #111827;
    color: #e5e7eb;
    border-radius: var(--raio);
    font-family: Consolas, "Courier New", monospace;
    font-size: 11px;
    line-height: 1.45;
    max-width: 460px;
    max-height: 260px;
    overflow: auto;
    white-space: pre;
}

/* ------------------------------------------------------------------ */
/* Grafico de barras dos relatorios                                    */
/* ------------------------------------------------------------------ */
.grafico-barras { list-style: none; }

.grafico-barras li {
    display: grid;
    grid-template-columns: 110px 1fr 120px;
    align-items: center;
    gap: 10px;
    padding: 4px 0;
    font-size: 13px;
}

.barra-trilho { background: var(--fundo); border-radius: 4px; height: 16px; overflow: hidden; }
.barra-valor { display: block; height: 100%; background: var(--azul); border-radius: 4px; }
.barra-numero { text-align: right; font-variant-numeric: tabular-nums; }
.barra-rotulo { color: var(--texto-fraco); }

/* ------------------------------------------------------------------ */
/* Perfil: ordem do menu                                               */
/* ------------------------------------------------------------------ */
.lista-menu { list-style: none; margin-top: 6px; }

.lista-menu li {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 10px;
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    margin-bottom: 6px;
    background: var(--branco);
    cursor: grab;
}

.lista-menu li.arrastando { opacity: .5; border-style: dashed; }
.lista-menu .opcao { flex: 1; }
.lista-menu .dica { margin: 0; }
.menu-arrastar { color: var(--texto-fraco); letter-spacing: -3px; cursor: grab; user-select: none; }
.menu-acoes { display: flex; gap: 4px; }
.menu-acoes .botao { padding: 4px 10px; }

/* ------------------------------------------------------------------ */
/* Campo de data com calendario                                        */
/* ------------------------------------------------------------------ */
.campo-data { position: relative; display: block; }
.campo-data input[type="text"] { padding-right: 40px; }

/* O seletor nativo existe so para abrir o calendario do navegador */
.campo-data-nativo {
    position: absolute;
    right: 8px;
    bottom: 0;
    width: 1px;
    height: 1px;
    padding: 0;
    border: none;
    opacity: 0;
    pointer-events: none;
}

.campo-data-botao {
    position: absolute;
    top: 50%;
    right: 4px;
    transform: translateY(-50%);
    display: flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 30px;
    padding: 0;
    border: none;
    border-radius: 6px;
    background: none;
    color: var(--texto-fraco);
    cursor: pointer;
}

.campo-data-botao:hover { background: var(--fundo); color: var(--azul); }
.campo-data-botao svg { width: 18px; height: 18px; }

/* Data que nao existe no calendario */
.campo-invalido,
.campo-invalido:focus {
    border-color: var(--vermelho);
    box-shadow: 0 0 0 3px rgba(220, 38, 38, .15);
}

/* Em barras horizontais o campo nao pode esticar - mas tambem nao pode
   encolher abaixo de "dd/mm/aaaa" mais o botao do calendario, que e o
   que sobrava quando so havia "width: auto". */
.linha-inline .campo-data,
.filtros-log .campo-data { display: inline-block; width: auto; min-width: 155px; }

.linha-inline .campo-data input[type="text"],
.filtros-log .campo-data input[type="text"] { width: 100%; min-width: 0; }

/* ------------------------------------------------------------------ */
/* Financeiro: caixa e lancamentos                                     */
/* ------------------------------------------------------------------ */

/* Barra do modulo: abas a esquerda, estado do caixa a direita.
   O estado fica visivel em toda tela do financeiro porque e dele que
   depende poder receber e pagar. */
.barra-financeiro {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
    margin-bottom: 16px;
    border-bottom: 2px solid var(--borda);
}

.barra-financeiro .abas-links { margin-bottom: 0; border-bottom: none; }

.chip-caixa {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    margin-bottom: 8px;
    padding: 5px 12px;
    border: 1px solid var(--borda);
    border-radius: 999px;
    background: var(--branco);
    font-size: 13px;
    font-weight: 600;
    color: var(--texto);
    white-space: nowrap;
}

.chip-caixa.aberto  { border-color: var(--sucesso-borda); background: var(--sucesso-fundo); color: var(--sucesso-texto); }
.chip-caixa.fechado { border-color: var(--erro-borda);    background: var(--erro-fundo);    color: var(--erro-texto); }
a.chip-caixa:hover { filter: brightness(.97); }

.etiqueta.caixa-aberto  { background: var(--sucesso-fundo); color: var(--sucesso-texto); }
.etiqueta.caixa-fechado { background: var(--fundo); color: var(--texto-fraco); }

/* Faixa do painel: o estado do caixa e a primeira coisa da tela */
.faixa-caixa {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 14px;
    flex-wrap: wrap;
    margin-bottom: 20px;
    padding: 14px 18px;
}

.valor-positivo { color: var(--verde); }
.valor-negativo { color: var(--vermelho); }

.titulo-dia { font-size: 16px; margin-left: 6px; }

/* Movimento cancelado continua na lista, apagado: o caixa do dia tem
   que continuar explicavel depois. */
.linha-cancelada { opacity: .55; }
.linha-cancelada td:not(:last-child) { text-decoration: line-through; }

/* Reabertura salta aos olhos no historico */
.linha-reabertura { background: var(--aviso-fundo); }

/* ------------------------------------------------------------------ */
/* Conferencia do fechamento                                           */
/*                                                                     */
/* Uma linha por forma de pagamento: a esquerda o que o sistema        */
/* calculou, a direita o campo com o que a pessoa contou. A diferenca  */
/* fica logo abaixo do campo, em pastilha, porque e o unico numero que */
/* decide se o dia fechou certo.                                       */
/* ------------------------------------------------------------------ */
.conferencia-formas {
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    overflow: hidden;
}

.linha-conferencia {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
    padding: 11px 14px;
    border-bottom: 1px solid var(--borda);
}

.linha-conferencia:last-child { border-bottom: none; }
.linha-conferencia:nth-child(even) { background: var(--realce); }

.conf-forma { min-width: 120px; flex: 1 1 130px; }
.conf-forma label { margin: 0; font-size: 14px; }
.conf-forma .dica { display: block; font-size: 12px; }
.conf-forma .dica strong { color: var(--texto); font-weight: 600; }

.conf-contado { flex: 0 0 auto; text-align: right; }

/* Campo de dinheiro: o "R$" fica dentro da moldura, e o valor alinhado
   a direita - assim os numeros de todas as formas batem na vertical */
.campo-moeda {
    display: flex;
    align-items: center;
    gap: 4px;
    padding: 0 10px;
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    background: var(--branco);
    transition: border-color .15s ease, box-shadow .15s ease;
}

.campo-moeda:focus-within {
    border-color: var(--azul);
    box-shadow: 0 0 0 3px rgba(37, 99, 235, .15);
}

.campo-moeda .prefixo { font-size: 12px; font-weight: 600; color: var(--texto-fraco); }

.campo-moeda input[type="text"] {
    width: 108px;
    padding: 8px 0;
    border: none;
    background: transparent;
    text-align: right;
    font-size: 15px;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}

.campo-moeda input[type="text"]:focus { outline: none; box-shadow: none; }

/* Pastilha da diferenca: verde quando bate, vermelha quando falta,
   ambar quando sobra - sobra tambem e erro de conferencia */
.marca-diferenca {
    display: inline-block;
    margin-top: 5px;
    padding: 2px 8px;
    border-radius: 999px;
    font-size: 12px;
    font-weight: 600;
    line-height: 1.6;
}

.marca-diferenca:empty { display: none; }
.marca-diferenca.confere { background: var(--sucesso-fundo); color: var(--sucesso-texto); }
.marca-diferenca.falta   { background: var(--erro-fundo);    color: var(--erro-texto); }
.marca-diferenca.sobra   { background: var(--aviso-fundo);   color: var(--aviso-texto); }

/* Na lateral da tela do caixa nao cabe rotulo e campo lado a lado: o
   campo desce e ocupa a coluna inteira, em vez de espremer os dois */
.coluna-lateral .conf-contado { flex: 1 1 100%; }
.coluna-lateral .campo-moeda input[type="text"] { width: 100%; }

/* ------------------------------------------------------------------ */
/* Fechar o caixa atrasado direto do chip                              */
/* ------------------------------------------------------------------ */
.dialogo-fechar-caixa { max-width: 580px; max-height: 88vh; overflow-y: auto; }
.dialogo-fechar-caixa .alerta { margin: 14px 0; }

.dialogo-fechar-caixa .titulo-bloco {
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: .06em;
    color: var(--texto-fraco);
    margin: 22px 0 4px;
}

/* Os numeros do dia. O dinheiro na gaveta vem primeiro e grande: e o
   que a pessoa tem na mao para conferir; o resto explica como chegou
   ate ele. */
.resumo-fechamento {
    display: grid;
    gap: 10px;
    margin-top: 4px;
}

.resumo-fechamento .gaveta {
    padding: 14px 16px;
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    background: var(--realce);
    box-shadow: inset 3px 0 0 var(--azul);
}

.resumo-fechamento .gaveta .rotulo {
    display: block;
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--texto-fraco);
}

.resumo-fechamento .gaveta .numero {
    display: block;
    margin-top: 2px;
    font-size: 28px;
    font-weight: 700;
    line-height: 1.2;
    font-variant-numeric: tabular-nums;
}

.resumo-fechamento .fluxo { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }

.resumo-fechamento .fluxo-item {
    padding: 10px 14px;
    border: 1px solid var(--borda);
    border-radius: var(--raio);
}

.resumo-fechamento .fluxo-item .rotulo {
    display: block;
    font-size: 12px;
    color: var(--texto-fraco);
}

.resumo-fechamento .fluxo-item strong {
    font-size: 17px;
    font-variant-numeric: tabular-nums;
}

.resumo-fechamento .entradas { border-color: var(--sucesso-borda); background: var(--sucesso-fundo); }
.resumo-fechamento .entradas .rotulo,
.resumo-fechamento .entradas strong { color: var(--sucesso-texto); }
.resumo-fechamento .saidas { border-color: var(--erro-borda); background: var(--erro-fundo); }
.resumo-fechamento .saidas .rotulo,
.resumo-fechamento .saidas strong { color: var(--erro-texto); }

.fechamento-detalhes {
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    padding: 2px 14px;
}

.fechamento-detalhes > div {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 14px;
    padding: 9px 0;
    border-bottom: 1px solid var(--borda);
    font-size: 14px;
}

.fechamento-detalhes > div:last-child { border-bottom: none; }
.fechamento-detalhes dt { color: var(--texto-fraco); }
.fechamento-detalhes dt small { display: block; font-size: 11px; opacity: .8; }
.fechamento-detalhes dd { font-weight: 600; white-space: nowrap; font-variant-numeric: tabular-nums; }

/* ------------------------------------------------------------------ */
/* Campo de arquivo                                                    */
/*                                                                     */
/* O campo nativo continua no formulario, invisivel mas focavel: e ele  */
/* que guarda o arquivo e que o navegador usa para exigir o campo       */
/* obrigatorio. Esconder com display:none tiraria o campo do teclado e  */
/* quebraria a mensagem de "preencha este campo".                       */
/* ------------------------------------------------------------------ */
.campo-arquivo {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
    position: relative;
    margin-top: 2px;
}

.campo-arquivo-nativo {
    position: absolute;
    left: 12px;
    bottom: 0;
    width: 1px;
    height: 1px;
    padding: 0;
    border: 0;
    opacity: 0;
    pointer-events: none;
}

.campo-arquivo-botao {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    margin: 0;
    padding: 9px 16px;
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    background: var(--branco);
    color: var(--texto);
    font-size: 14px;
    font-weight: 600;
    cursor: pointer;
    white-space: nowrap;
    transition: border-color .15s ease, color .15s ease, background .15s ease;
}

.campo-arquivo-botao:hover {
    border-color: var(--azul);
    background: var(--realce-azul);
    color: var(--azul);
}

.campo-arquivo-botao svg { width: 16px; height: 16px; }

/* O foco cai no campo escondido; o anel precisa aparecer no botao, que
   e o que a pessoa esta vendo */
.campo-arquivo-nativo:focus-visible + .campo-arquivo-botao {
    border-color: var(--azul);
    box-shadow: 0 0 0 3px rgba(37, 99, 235, .15);
}

.campo-arquivo-nome {
    flex: 1 1 160px;
    min-width: 0;
    font-size: 13px;
    color: var(--texto-fraco);
    overflow-wrap: anywhere;
}

/* Arquivo escolhido vira texto normal: e informacao, nao mais um aviso
   de que falta escolher */
.campo-arquivo-nome.escolhido { color: var(--texto); font-weight: 600; }

.campo-arquivo-limpar {
    flex: 0 0 auto;
    width: 26px;
    height: 26px;
    padding: 0;
    border: none;
    border-radius: 50%;
    background: none;
    color: var(--texto-fraco);
    font-size: 19px;
    line-height: 1;
    cursor: pointer;
}

.campo-arquivo-limpar:hover { background: var(--fundo); color: var(--vermelho); }

/* Dentro da area de arrastar, o botao fica centralizado com o resto */
.area-envio-alvo .campo-arquivo { justify-content: center; margin-top: 8px; }
.area-envio-alvo .campo-arquivo-nome { flex: 0 1 auto; text-align: center; }

/* ------------------------------------------------------------------ */
/* Acoes do topo: sino das pendencias e engrenagem da conta            */
/* ------------------------------------------------------------------ */
.acoes-topo { display: flex; align-items: center; gap: 6px; }

.menu-topo { position: relative; }

.botao-icone {
    display: flex;
    align-items: center;
    justify-content: center;
    position: relative;
    width: 38px;
    height: 38px;
    padding: 0;
    border: 1px solid transparent;
    border-radius: var(--raio);
    background: none;
    color: var(--texto-fraco);
    cursor: pointer;
    transition: background .15s ease, color .15s ease, border-color .15s ease;
}

.botao-icone:hover { background: var(--fundo); color: var(--texto); }
.botao-icone svg { width: 20px; height: 20px; }

.menu-topo.aberto .botao-icone {
    background: var(--realce-azul);
    border-color: var(--azul);
    color: var(--azul);
}

/* O ponto vermelho do sino. Fica na borda do icone, e nao dentro dele:
   assim aparece por cima do desenho em vez de se confundir com ele. */
.ponto-alerta {
    position: absolute;
    top: 6px;
    right: 7px;
    width: 9px;
    height: 9px;
    border-radius: 50%;
    background: #ef4444;
    box-shadow: 0 0 0 2px var(--branco);
}

.caixa-menu {
    position: absolute;
    z-index: 60;
    top: calc(100% + 8px);
    right: 0;
    width: 320px;
    max-width: calc(100vw - 32px);
    background: var(--branco);
    border: 1px solid var(--borda);
    border-radius: 10px;
    box-shadow: 0 12px 32px rgba(17, 24, 39, .16);
    overflow: hidden;
}

.caixa-menu-titulo {
    padding: 12px 14px;
    border-bottom: 1px solid var(--borda);
    background: var(--realce);
}

.caixa-menu-titulo strong { display: block; font-size: 14px; }
.caixa-menu-titulo .dica { margin-top: 1px; overflow-wrap: anywhere; }

/* Itens da engrenagem */
.caixa-conta a {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 11px 14px;
    color: var(--texto);
    font-size: 14px;
}

.caixa-conta a:hover { background: var(--realce-azul); color: var(--azul); }
.caixa-conta a svg { width: 17px; height: 17px; flex-shrink: 0; }

/* Sair fica separado e em vermelho: e a acao que se lamenta ter clicado
   sem querer no meio de um cadastro */
.caixa-conta .item-sair { border-top: 1px solid var(--borda); color: var(--vermelho); }
.caixa-conta .item-sair:hover { background: var(--erro-fundo); color: var(--vermelho); }

/* Lista de pendencias do sino */
.caixa-pendencias { width: 380px; }

.lista-pendencias { list-style: none; max-height: 60vh; overflow-y: auto; }

.lista-pendencias li { border-bottom: 1px solid var(--borda); }
.lista-pendencias li:last-child { border-bottom: none; }

.lista-pendencias a {
    display: flex;
    align-items: flex-start;
    gap: 11px;
    padding: 11px 14px;
    color: var(--texto);
}

.lista-pendencias a:hover { background: var(--realce); }

/* A cor do numero e a gravidade: vermelho e atraso, ambar e prazo
   estourando, ciano e so "esta esperando resposta" */
.lista-pendencias .tom-vermelho .pendencia-quantidade { background: var(--tom-vermelho); }
.lista-pendencias .tom-ambar    .pendencia-quantidade { background: var(--tom-ambar); }
.lista-pendencias .tom-ciano    .pendencia-quantidade { background: var(--tom-ciano); }
.lista-pendencias .tom-roxo     .pendencia-quantidade { background: var(--tom-roxo); }
.lista-pendencias .tom-neutro   .pendencia-quantidade { background: var(--tom-neutro); }

.pendencia-quantidade {
    flex: 0 0 auto;
    min-width: 26px;
    padding: 2px 7px;
    border-radius: 999px;
    background: var(--tom-neutro);
    color: #fff;
    font-size: 12px;
    font-weight: 700;
    text-align: center;
    font-variant-numeric: tabular-nums;
}

/* Pendencia que trava o sistema (caixa) nao mostra "1": mostra que e um
   bloqueio */
.lista-pendencias .critica .pendencia-quantidade { font-size: 13px; }
.lista-pendencias .critica strong { color: var(--vermelho); }

.pendencia-texto { min-width: 0; }
.pendencia-texto strong { display: block; font-size: 13.5px; }

.pendencia-texto small {
    display: block;
    margin-top: 2px;
    font-size: 12px;
    color: var(--texto-fraco);
    line-height: 1.45;
}

.pendencia-vazia { padding: 22px 16px; text-align: center; font-size: 13px; color: var(--texto-fraco); }

/* ------------------------------------------------------------------ */
/* Ajuda flutuante                                                     */
/*                                                                     */
/* Fica fixo na janela, e nao no .app: o zoom da preferencia de tamanho */
/* moveria o botao para fora do canto conforme a escala escolhida.      */
/* ------------------------------------------------------------------ */
.ajuda-flutuante {
    position: fixed;
    right: 22px;
    bottom: 22px;
    z-index: 80;
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 12px;
}

/* Parado, e so o circulo do "?": em toda tela do sistema ele fica ali no
   canto, e uma pilula escrita "Ajuda" o tempo inteiro competiria com o
   conteudo. O rotulo aparece quando o cursor chega - que e exatamente o
   momento em que alguem esta perguntando "o que e esse botao?". */
.ajuda-botao {
    display: inline-flex;
    align-items: center;
    padding: 14px;
    border: none;
    border-radius: 999px;
    background: var(--azul);
    color: #fff;
    font: inherit;
    font-size: 14px;
    font-weight: 600;
    cursor: pointer;
    box-shadow: 0 8px 24px rgba(17, 24, 39, .28);
    transition: transform .15s ease, box-shadow .15s ease;
}

.ajuda-botao:hover { transform: translateY(-2px); box-shadow: 0 12px 28px rgba(17, 24, 39, .34); }
.ajuda-botao svg { flex: 0 0 auto; width: 20px; height: 20px; }

/* O texto continua no HTML (o leitor de tela precisa dele para dizer o
   nome do botao), so nasce com largura zero. Animar a largura, e nao o
   display, faz o circulo virar pilula crescendo para a esquerda, sem o
   pulo de quem so troca none por block. */
.ajuda-botao-texto {
    max-width: 0;
    margin-left: 0;
    overflow: hidden;
    white-space: nowrap;
    opacity: 0;
    transition: max-width .18s ease, margin-left .18s ease, opacity .18s ease;
}

.ajuda-botao:hover .ajuda-botao-texto,
.ajuda-botao:focus-visible .ajuda-botao-texto {
    max-width: 120px;
    margin-left: 8px;
    opacity: 1;
}

.ajuda-balao {
    display: flex;
    flex-direction: column;
    width: 380px;
    max-width: calc(100vw - 32px);
    max-height: min(70vh, 560px);
    background: var(--branco);
    border: 1px solid var(--borda);
    border-radius: 12px;
    box-shadow: 0 18px 44px rgba(17, 24, 39, .24);
    overflow: hidden;
    animation: ajuda-entrar .16s ease-out;
}

@keyframes ajuda-entrar {
    from { opacity: 0; transform: translateY(10px); }
    to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
    .ajuda-balao { animation: none; }
    .ajuda-botao:hover { transform: none; }
    .ajuda-botao-texto { transition: none; }
}

.ajuda-cabecalho {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 10px;
    padding: 14px 16px;
    border-bottom: 1px solid var(--borda);
    background: var(--realce);
}

.ajuda-cabecalho strong { display: block; font-size: 15px; }
.ajuda-cabecalho .dica { margin-top: 1px; }

.ajuda-fechar {
    flex: 0 0 auto;
    width: 28px;
    height: 28px;
    padding: 0;
    border: none;
    border-radius: 50%;
    background: none;
    color: var(--texto-fraco);
    font-size: 22px;
    line-height: 1;
    cursor: pointer;
}

.ajuda-fechar:hover { background: var(--borda); color: var(--texto); }

.ajuda-corpo { flex: 1; overflow-y: auto; }

.ajuda-atalhos { list-style: none; }

.ajuda-atalhos button {
    display: block;
    width: 100%;
    padding: 12px 16px;
    border: none;
    border-bottom: 1px solid var(--borda);
    background: none;
    color: var(--texto);
    font: inherit;
    text-align: left;
    cursor: pointer;
}

.ajuda-atalhos button:hover { background: var(--realce-azul); }
.ajuda-atalho-titulo { display: block; font-size: 14px; font-weight: 600; }

.ajuda-atalho-modulo {
    display: block;
    margin-top: 2px;
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--texto-fraco);
}

.ajuda-detalhe { padding: 16px; }
.ajuda-detalhe h3 { font-size: 15px; margin-bottom: 6px; }

.ajuda-detalhe h4 {
    margin: 14px 0 6px;
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--texto-fraco);
}

.ajuda-para-que { font-size: 13.5px; line-height: 1.55; color: var(--texto); }

.ajuda-passos { padding-left: 18px; font-size: 13.5px; line-height: 1.55; }
.ajuda-passos li { margin-bottom: 6px; }

/* O cuidado que a pessoa so descobriria errando */
.ajuda-atencao {
    margin-top: 14px;
    padding: 10px 12px;
    border: 1px solid var(--aviso-borda);
    border-radius: var(--raio);
    background: var(--aviso-fundo);
    color: var(--aviso-texto);
    font-size: 13px;
    line-height: 1.5;
}

.ajuda-ir { display: inline-block; margin-top: 14px; }

.ajuda-rodape {
    display: flex;
    gap: 8px;
    padding: 12px 16px;
    border-top: 1px solid var(--borda);
    background: var(--realce);
}

.ajuda-rodape .botao { flex: 1; padding: 8px 12px; font-size: 13px; }

/* ------------------------------------------------------------------ */
/* Central de ajuda                                                    */
/* ------------------------------------------------------------------ */
.central-ajuda { display: grid; grid-template-columns: 250px 1fr; gap: 20px; align-items: start; }

.ajuda-indice { position: sticky; top: 16px; list-style: none; }

.ajuda-indice a {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px 12px;
    border-radius: var(--raio);
    color: var(--texto);
    font-size: 14px;
}

.ajuda-indice a:hover { background: var(--realce-azul); }

.ajuda-indice a.ativo {
    background: var(--azul);
    color: #fff;
    font-weight: 600;
}

.ajuda-indice-icone { font-size: 16px; line-height: 1; }

.ajuda-modulo + .ajuda-modulo { margin-top: 26px; }
.ajuda-modulo > header { margin-bottom: 14px; }
.ajuda-modulo > header h2 { font-size: 19px; }
.ajuda-modulo > header .dica { margin-top: 3px; font-size: 13.5px; }

.ajuda-topico {
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    margin-bottom: 10px;
    background: var(--branco);
    overflow: hidden;
}

.ajuda-topico > summary {
    padding: 13px 16px;
    font-size: 14.5px;
    font-weight: 600;
    cursor: pointer;
    list-style: none;
}

.ajuda-topico > summary::-webkit-details-marker { display: none; }

.ajuda-topico > summary::before {
    content: '+';
    display: inline-block;
    width: 18px;
    color: var(--azul);
    font-weight: 700;
}

.ajuda-topico[open] > summary { border-bottom: 1px solid var(--borda); background: var(--realce); }
.ajuda-topico[open] > summary::before { content: '\2212'; }
.ajuda-topico > summary:hover { color: var(--azul); }

.ajuda-topico-corpo { padding: 16px; }

/* ===================================================================== */
/* Relatorios                                                            */
/*                                                                       */
/* A estante (/relatorios) e uma lista de cartoes: nome, o que o         */
/* relatorio responde e em que formatos ele sai. O cartao inteiro e o    */
/* link - alvo pequeno obriga a mirar, e aqui nao ha nada mais para      */
/* clicar dentro dele.                                                   */
/* ===================================================================== */
.cabecalho-grupo { display: flex; align-items: flex-start; gap: 12px; margin-bottom: 16px; }
.cabecalho-grupo h2 { margin-bottom: 2px; }
.cabecalho-grupo .dica { margin: 0; }

.grupo-icone {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 38px;
    height: 38px;
    border-radius: 10px;
    background: var(--realce-azul);
    font-size: 19px;
    line-height: 1;
}

.lista-relatorios {
    list-style: none;
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(290px, 1fr));
    gap: 12px;
}

.cartao-relatorio {
    display: flex;
    flex-direction: column;
    gap: 6px;
    height: 100%;
    padding: 14px 16px;
    border: 1px solid var(--borda);
    border-left: 3px solid var(--borda);
    border-radius: var(--raio);
    background: var(--branco);
    color: var(--texto);
    transition: border-color .15s ease, box-shadow .15s ease, transform .15s ease;
}

.cartao-relatorio:hover,
.cartao-relatorio:focus-visible {
    border-color: var(--azul);
    border-left-color: var(--azul);
    box-shadow: 0 6px 18px rgba(17, 24, 39, .10);
    transform: translateY(-2px);
}

.cartao-relatorio strong { font-size: 14.5px; }
.cartao-relatorio:hover strong { color: var(--azul); }
.cartao-relatorio .cartao-descricao { font-size: 13px; line-height: 1.5; flex: 1; }

.cartao-rodape { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 4px; }

.etiqueta-leve,
.selo-formato {
    padding: 2px 8px;
    border-radius: 999px;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .01em;
}

.etiqueta-leve { background: var(--realce-azul); color: var(--azul); }
.selo-formato  { border: 1px solid var(--borda); color: var(--texto-fraco); }

/* ------------------------------------------------------------------ */
/* Relatorio em blocos, na tela                                        */
/*                                                                     */
/* O geral mensal nao e uma lista: sao sete respostas empilhadas. Numa */
/* tabela unica a primeira coluna repetia "1. Resumo do mes" por dez   */
/* linhas e nada marcava onde um assunto acabava. Aqui cada bloco vira */
/* uma secao com titulo - a mesma leitura do documento que sai no      */
/* fechamento do caixa, e o PDF do relatorio sai igual a isto.         */
/* ------------------------------------------------------------------ */
.documento-relatorio { display: flex; flex-direction: column; gap: 22px; }

.bloco-relatorio h3 {
    font-size: 11.5px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .06em;
    color: var(--texto-fraco);
    padding-bottom: 6px;
    margin-bottom: 10px;
    border-bottom: 1px solid var(--borda);
}

/* A tabela do bloco e leve de proposito: o titulo ja separa as secoes,
   e um cabecalho pesado em cada uma das sete criaria sete inicios de
   documento na mesma folha */
.tabela-bloco thead th {
    padding-top: 4px;
    padding-bottom: 6px;
    font-size: 10.5px;
    letter-spacing: .04em;
    background: none;
    color: var(--texto-fraco);
}

/* .tabela e display:block (para rolar sozinha), e bloco encolhe ate o
   conteudo: cada secao terminava numa largura diferente e o documento
   saia serrilhado do lado direito. Aqui quem rola e a caixa de fora. */
.tabela-bloco { display: table; width: 100%; }

/* Quantidade e valor com largura fixa: assim as sete secoes alinham a
   coluna de dinheiro, que e a que se le de cima a baixo */
.tabela-bloco th:nth-last-child(2),
.tabela-bloco td:nth-last-child(2) { width: 80px; }

.tabela-bloco th:last-child,
.tabela-bloco td:last-child { width: 130px; }

/* ------------------------------------------------------------------ */
/* Mapa mensal consolidado                                             */
/*                                                                     */
/* Nao e lista nem tabela: e o painel de fechamento do mes, em quadros */
/* que se leem de relance. Cada quadro tem a faixa cinza de titulo e   */
/* linhas de rotulo/valor - o mesmo desenho do papel, para quem confere*/
/* na tela e manda imprimir reconhecer a mesma folha.                  */
/* ------------------------------------------------------------------ */
.mapa-mensal { display: flex; flex-direction: column; gap: 16px; }

.mapa-cabecalho {
    border: 1px solid var(--borda);
    border-radius: 8px;
    overflow: hidden;
}

.mapa-cabecalho h3 {
    margin: 0;
    padding: 9px 14px;
    background: var(--realce);
    border-bottom: 1px solid var(--borda);
    font-size: 12px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .07em;
    color: var(--texto-fraco);
    text-align: center;
}

.mapa-identificacao {
    display: flex;
    flex-wrap: wrap;
    /* Clinica, mes e ano dividem a faixa em partes iguais, como no
       modelo: sao tres identificacoes de mesmo peso, e nao um titulo
       com dois complementos */
    justify-content: space-around;
    gap: 6px 18px;
    padding: 9px 14px;
    font-size: 12.5px;
}

.mapa-identificacao strong {
    color: var(--texto-fraco);
    font-weight: 600;
    margin-right: 5px;
}

/* Estatisticas e despesas lado a lado. Abaixo de 900px empilham: em
   duas colunas espremidas o rotulo quebra em tres linhas e a folha
   fica mais alta do que empilhada. */
.mapa-duas {
    display: grid;
    grid-template-columns: 1.35fr 1fr;
    gap: 16px;
    align-items: start;
}

@media (max-width: 900px) {
    .mapa-duas { grid-template-columns: 1fr; }
}

.mapa-bloco {
    border: 1px solid var(--borda);
    border-radius: 8px;
    overflow: hidden;
}

.mapa-bloco h4,
.mapa-cartao h5 {
    margin: 0;
    padding: 8px 12px;
    background: var(--realce);
    border-bottom: 1px solid var(--borda);
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .06em;
    color: var(--texto-fraco);
}

.mapa-bloco > .vazio,
.mapa-bloco > .tabela-rolavel { padding: 12px; }
.mapa-bloco > .vazio { margin: 0; text-align: center; }

/* .tabela e display:block (para rolar sozinha), e bloco encolhe ate o
   conteudo: a tabela das especialidades parava no meio do quadro, com o
   TOTAL longe da borda. Aqui quem rola e a caixa de fora. */
.mapa-bloco .tabela { display: table; width: 100%; }

/* Dinheiro encostado a direita, que e o que faz a coluna virar uma pilha
   de numeros comparavel de cima a baixo.

   Precisa desta regra porque `.direita` (0,1,0) perde de
   `.tabela th, .tabela td` (0,1,1), que alinha tudo a esquerda - o
   utilitario nunca chegou a valer DENTRO de .tabela, em tela nenhuma do
   sistema. O conserto geral seria `.tabela th.direita, .tabela td.direita`
   la em cima, e ele mexeria na aparencia de toda listagem do sistema de
   uma vez; aqui a correcao fica no mapa, que e o que se pediu. */
.mapa-bloco .tabela th.direita,
.mapa-bloco .tabela td.direita { text-align: right; }

/* As linhas de rotulo/valor.

   O valor vem na COLUNA ESTREITA e o rotulo na larga: e o valor que se
   procura correndo o olho, e alinhado a direita numa coluna propria ele
   forma a pilha de numeros que se compara de cima a baixo. */
.mapa-pares {
    width: 100%;
    border-collapse: collapse;
    font-size: 12.5px;
}

.mapa-pares th,
.mapa-pares td {
    padding: 5px 12px;
    border-bottom: 1px solid var(--borda);
}

.mapa-pares tr:last-child th,
.mapa-pares tr:last-child td { border-bottom: none; }

.mapa-pares th {
    font-weight: 400;
    text-align: left;
    color: var(--texto);
}

.mapa-pares .mapa-valor {
    width: 34%;
    text-align: right;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
    color: var(--texto);
}

/* Nas despesas o rotulo vem primeiro e o valor fecha a linha */
.mapa-pares-direita .mapa-valor { width: 40%; }

/* Total liquido, resultado liquido, valor pago do dentista: as linhas
   que respondem a pergunta que fez alguem abrir a folha */
.mapa-pares tr.forte th,
.mapa-pares tr.forte td {
    font-weight: 700;
    background: var(--realce);
}

.mapa-nota {
    color: var(--texto-fraco);
    font-weight: 700;
    cursor: help;
}

/* Um cartao por dentista. Largura minima de 260px: abaixo disso
   "Media de pgto por orcamento contratado" quebra em quatro linhas. */
.mapa-cartoes {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
    gap: 12px;
    padding: 12px;
}

.mapa-cartao {
    border: 1px solid var(--borda);
    border-radius: 6px;
    overflow: hidden;
}

.mapa-cartao h5 { text-align: center; }

.mapa-formas {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-around;
    gap: 10px 22px;
    padding: 12px;
    font-size: 12.5px;
    font-variant-numeric: tabular-nums;
}

.mapa-formas strong {
    color: var(--texto-fraco);
    font-weight: 700;
    margin-right: 6px;
    letter-spacing: .03em;
}

.mapa-rodape { margin: 0; }

/* ------------------------------------------------------------------ */
/* Os formatos de saida, na tela do relatorio                          */
/*                                                                     */
/* Botao pequeno, so o icone e o nome, na cor de cada formato: o       */
/* vermelho do PDF, o verde da planilha, e assim por diante. A         */
/* explicacao de cada um foi para o title - quem ja sabe o que e um    */
/* CSV nao precisa ler de novo a cada relatorio.                       */
/* ------------------------------------------------------------------ */
.lista-formatos {
    list-style: none;
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}

.botao-formato {
    --formato-cor:   var(--texto-fraco);
    --formato-fundo: var(--realce);

    display: inline-flex;
    align-items: center;
    gap: 7px;
    padding: 7px 13px;
    border: 1px solid transparent;
    border-radius: 999px;
    background: var(--formato-fundo);
    color: var(--formato-cor);
    font-size: 13px;
    font-weight: 600;
    line-height: 1;
    white-space: nowrap;
    transition: border-color .15s ease, box-shadow .15s ease, transform .15s ease;
}

.botao-formato svg { width: 16px; height: 16px; flex: 0 0 auto; }

.botao-formato:hover,
.botao-formato:focus-visible {
    border-color: currentColor;
    box-shadow: 0 4px 12px rgba(17, 24, 39, .10);
    transform: translateY(-1px);
}

/* A cor de cada extensao. O fundo sai do proprio tom, bem diluido. */
.botao-formato.formato-pdf  { --formato-cor: #dc2626; --formato-fundo: rgba(220, 38, 38, .10); }
.botao-formato.formato-xlsx { --formato-cor: #15803d; --formato-fundo: rgba(21, 128, 61, .10); }
.botao-formato.formato-csv  { --formato-cor: #0f766e; --formato-fundo: rgba(15, 118, 110, .10); }
.botao-formato.formato-json { --formato-cor: #b45309; --formato-fundo: rgba(180, 83, 9, .10); }

html[data-tema="escuro"] .botao-formato.formato-pdf  { --formato-cor: #f87171; --formato-fundo: rgba(248, 113, 113, .14); }
html[data-tema="escuro"] .botao-formato.formato-xlsx { --formato-cor: #4ade80; --formato-fundo: rgba(74, 222, 128, .14); }
html[data-tema="escuro"] .botao-formato.formato-csv  { --formato-cor: #2dd4bf; --formato-fundo: rgba(45, 212, 191, .14); }
html[data-tema="escuro"] .botao-formato.formato-json { --formato-cor: #fbbf24; --formato-fundo: rgba(251, 191, 36, .14); }

/* A previa tem muitas colunas: rola sozinha, sem esticar a pagina */
.tabela-rolavel { overflow-x: auto; }
.tabela-rolavel .tabela { min-width: 100%; }

/* ------------------------------------------------------------------ */
/* Telas pequenas                                                      */
/* ------------------------------------------------------------------ */
@media (max-width: 980px) {
    .central-ajuda { grid-template-columns: 1fr; }
    .ajuda-indice { position: static; display: flex; flex-wrap: wrap; gap: 6px; }
    .ajuda-indice li { flex: 0 0 auto; }
    .ajuda-indice a { border: 1px solid var(--borda); }

    .colunas { grid-template-columns: 1fr; }
}

@media (max-width: 780px) {
    .app { flex-direction: column; }
    .lateral { width: 100%; padding: 12px 0; }
    .lateral nav { flex-direction: row; overflow-x: auto; }
    .lateral nav a { border-left: none; border-bottom: 3px solid transparent; white-space: nowrap; }
    .lateral nav a.ativo { border-left-color: transparent; border-bottom-color: var(--azul); }
    main { padding: 16px; }

    .campo.largo { grid-column: span 1; }
    .barra-acoes { flex-direction: column; align-items: stretch; }
    .linha-tempo li { flex-direction: column; gap: 4px; }

    /* Numa tela estreita nao ha o que dividir: cada filtro ocupa a
       largura toda em vez de virar tres tocos lado a lado */
    .busca,
    .filtros-log { flex-direction: column; align-items: stretch; }

    .busca > *,
    .filtros-log > * { width: 100%; max-width: none; min-width: 0; flex: 0 0 auto; }

    .busca .campo-data,
    .filtros-log .campo-data { display: block; }

    .barra-financeiro { flex-direction: column; align-items: stretch; }
    .chip-caixa { align-self: flex-start; }

    /* Agenda: cada grupo passa a ocupar a largura toda, um por linha, em
       vez de virar tocos lado a lado. */
    .agenda-barra { flex-direction: column; align-items: stretch; }
    .agenda-grupo { align-items: stretch; }
    .agenda-grupo-solto { column-gap: 8px; }

    .agenda-grupo .agenda-grupo,
    .agenda-campo,
    .agenda-barra .salto-dias { flex: 1 1 100%; }
    .agenda-barra input[type="date"],
    .agenda-barra select { width: 100%; min-width: 0; max-width: none; }

    /* Com a barra em coluna, flex-basis passa a valer para a ALTURA: os
       480px que dao a largura da semana na tela larga virariam 480px de
       faixa vazia aqui. */
    .semana { flex: 0 0 auto; }

    /* Segmentado e botao de acao ganham a linha inteira, e as opcoes
       dentro do segmentado repartem essa largura por igual. So o botao
       de ACAO: o "Ir" do salto tem que continuar do tamanho dele, senao
       empurra o "ou daqui a" ao lado para tres linhas. */
    .agenda-barra .grupo-segmentado,
    .agenda-barra .acao-nova { flex: 1 1 100%; }
    .agenda-barra .grupo-segmentado { display: flex; }
    .agenda-barra .grupo-segmentado > a { flex: 1 1 0; padding-left: 4px; padding-right: 4px; }

    /* O campo de dias nao precisa mais do minimo de 130px da barra: numa
       tela estreita ele reparte a linha com o "Ir" */
    .agenda-barra .salto-dias input[type="number"] { min-width: 0; }

    /* O menu vira uma faixa horizontal que rola: aqui o rotulo nao pode
       esticar, senao cada item ocuparia a tela inteira */
    .menu-rotulo { flex: 0 0 auto; }

    /* Menu suspenso ancorado a direita vazaria pela borda numa tela
       estreita: passa a ocupar a largura util */
    .caixa-menu,
    .caixa-pendencias { width: calc(100vw - 32px); right: -8px; }

    /* Tela estreita nao tem canto que caiba uma caixa de 340: o aviso
       ocupa a largura util e o canto escolhido decide so em cima ou
       embaixo */
    .avisos { left: 12px; right: 12px; align-items: stretch; }
    .avisos .aviso { width: auto; }

    /* Em tela de toque nao existe hover: o rotulo abriria no toque e
       ficaria aberto depois dele. Aqui o botao e so o icone, e ponto. */
    .ajuda-flutuante { right: 14px; bottom: 14px; }
    .ajuda-botao:hover .ajuda-botao-texto,
    .ajuda-botao:focus-visible .ajuda-botao-texto { max-width: 0; margin-left: 0; opacity: 0; }
}
