/* =====================================================================
   Temas controlados por  <html data-tema="...">.
   "sereno" (claro/azul) é o padrão; "mare" (azul-petróleo) e "escuro" são
   alternativos. Os componentes usam apenas variáveis — trocar o data-tema
   reskina tudo. O tema "escuro" é pragmático: cobre bem os tokens de base
   (fundo/texto/borda/superfície), mas badges de status, linhas da grade
   financeira e outros pontos com cor fixa recebem overrides pontuais mais
   abaixo (ver "Ajustes finos — tema escuro").
   ===================================================================== */
:root,
[data-tema="sereno"] {
    --azul: #15315e;        /* navy forte — hover, totais */
    --azul-claro: #1e4079;  /* navy principal — botões, links, ativo */
    --titulo: #1f4fa0;      /* azul vívido — títulos de página */
    --marca: #16294d;       /* texto da logo */
    --teal-bg: #eaf1fb;     /* acento suave */
    --cinza-bg: #f6f8fc;    /* fundo da página */
    --superficie: #ffffff;  /* cartões e tabelas */
    --borda: #e7ecf5;
    --texto: #1f2a3d;
    --suave: #65718a;       /* texto secundário */
    --verde: #1a9e63;
    --vermelho: #d14343;
    --th-bg: #eef2f7;       /* cabeçalho de tabela */
    --linha-hover: #f4f7fc;
    --menu-hover: #f1f5fb;
    --menu-hover-borda: #cdd9ec;
    --login-grad: linear-gradient(160deg, #23508f 0%, #15315e 100%);
    --radius: 10px;
    --sombra: 0 1px 2px rgba(30,50,90,.05);
}

[data-tema="mare"] {
    --azul: #0b5563;
    --azul-claro: #0e7490;
    --titulo: #0b5563;
    --marca: #163a5a;
    --teal-bg: #e3f3f6;
    --cinza-bg: #f2f9fb;
    --superficie: #ffffff;
    --borda: #e3eef1;
    --texto: #26303d;
    --suave: #6b7c84;
    --verde: #0f8a5f;
    --vermelho: #c0392b;
    --th-bg: #f3f9fa;
    --linha-hover: #f6fbfc;
    --menu-hover: #eef6f8;
    --menu-hover-borda: #bcdfe6;
    --login-grad: linear-gradient(160deg, #0e7490 0%, #0b5563 100%);
}

[data-tema="escuro"] {
    --azul: #9db8e8;         /* claro sobre fundo escuro — hover, totais */
    --azul-claro: #4c7fd6;   /* botões, links, ativo */
    --titulo: #7ea6e8;
    --marca: #cddcf5;
    --teal-bg: #1b2740;
    --cinza-bg: #10141d;     /* fundo da página */
    --superficie: #1a2030;   /* cartões e tabelas */
    --borda: #2b3448;
    --texto: #e6eaf2;
    --suave: #94a1bd;        /* texto secundário */
    --verde: #4ecb8e;
    --vermelho: #f0716b;
    --th-bg: #202940;        /* cabeçalho de tabela */
    --linha-hover: #202940;
    --menu-hover: #212a42;
    --menu-hover-borda: #3a4666;
    --login-grad: linear-gradient(160deg, #23324f 0%, #10141d 100%);
    --sombra: 0 1px 2px rgba(0,0,0,.35);
}

/* Fade suave entre páginas — sistema é multi-página (sem SPA/router JS),
   então isso usa a View Transitions API nativa do navegador PARA NAVEGAÇÃO
   ENTRE DOCUMENTOS (Chrome/Edge recentes). Zero JS: o navegador já faz isso
   sozinho quando o link é do mesmo site. Navegadores sem suporte
   simplesmente ignoram, sem quebrar nada (Carlos, 17/08/2026: "consegue
   tratar a transição de uma tela pra outra?" — fade suave).
   SEQUENCIAL, não crossfade simultâneo: a página antiga some primeiro, só
   DEPOIS a nova aparece — nunca as duas sobrepostas ao mesmo tempo. O
   crossfade padrão do navegador mostra as duas juntas por um instante, e
   como as páginas daqui têm alturas/rolagem bem diferentes entre si
   (Financeiro é enorme, outras são curtas), esse desalinhamento aparecia
   como um "tremor" (Carlos, 18/08/2026: "a transição treme... preciso que
   seja mais profissional"). Sequencial elimina a sobreposição por
   completo — e como o intervalo entre as duas usa o fundo do próprio
   sistema (body já tem --cinza-bg), não vira um flash branco. */
@view-transition {
    navigation: auto;
}
::view-transition-old(root) {
    animation: vt-fade-out .1s ease-out forwards;
}
::view-transition-new(root) {
    animation: vt-fade-in .1s ease-in .1s backwards;
}
@keyframes vt-fade-out { to { opacity: 0; } }
@keyframes vt-fade-in { from { opacity: 0; } }

* { box-sizing: border-box; }
body { margin: 0; font-family: Cambria, Georgia, "Times New Roman", serif; color: var(--texto); background: var(--cinza-bg); font-size: 14px; }
a { color: var(--azul-claro); text-decoration: none; }

/* ---- Topo (menu horizontal claro) ---- */
.topo { display: flex; align-items: center; gap: 18px; background: var(--superficie); border-bottom: 1px solid var(--borda); color: var(--texto); padding: 0 16px; height: 78px; position: sticky; top: 0; z-index: 50; transition: transform .25s ease; view-transition-name: header-fixo; }
/* Header some ao rolar pra baixo, volta perto do topo (ver script em
   layout.php) — em todas as páginas, não só no editor de texto. */
body.hdr-oculto header.topo { transform: translateY(-100%); }
/* Header fora da View Transition nativa entre páginas — fica estático (sem
   crossfade) enquanto só o conteúdo troca, eliminando o "flash" branco ao
   navegar entre Clientes/Casos/Financeiro (Carlos, 22/08/2026: "tornar o
   header fixo, não suscetivel aquelas piscadas de tela"). */
::view-transition-group(header-fixo) { animation: none; }
::view-transition-old(header-fixo), ::view-transition-new(header-fixo) { animation: none; mix-blend-mode: normal; }
/* Some ao rolar para baixo, volta ao rolar para cima — igual ao editor de texto (ver script no layout.php) */
body.hdr-oculto header.topo { transform: translateY(-100%); }
.topo-marca { display: flex; align-items: center; gap: 11px; height: 100%; transform-origin: left center; transition: opacity .18s ease, transform .18s ease; }
.topo-marca:hover { opacity: .82; transform: scale(1.02); }
.topo-marca img { height: 61px; width: auto; display: block; max-width: 360px; }
.topo-marca .logo-simbolo { display: none; }
.marca-nome .amp { color: #c9a227; }
.topo-menu { display: flex; align-items: center; justify-content: center; gap: 2px; flex: 0 1 auto; min-width: 0; overflow: hidden; }
.topo-menu a { display: inline-flex; align-items: center; padding: 8px 13px; color: var(--suave); font-weight: 600; font-size: 14px; border-bottom: 2.5px solid transparent; transition: color .18s ease, border-color .18s ease; }
.topo-menu a:hover { color: var(--azul-claro); border-bottom-color: var(--menu-hover-borda); }
.topo-menu a.ativo { color: var(--azul-claro); border-bottom-color: var(--azul-claro); }
.menu-badge { display: inline-flex; align-items: center; justify-content: center; min-width: 17px; height: 17px; padding: 0 5px; margin-left: 6px; border-radius: 9px; background: #e24b4a; color: #fff; font-size: 10.5px; font-weight: 700; line-height: 1; }
/* flex-shrink: 0 (o "1 0 auto") é de propósito — cresce igual dos dois
   lados pra centralizar o .topo-menu em telas largas, mas NUNCA encolhe
   abaixo do próprio conteúdo (logo/nome/ícones): sem overflow:hidden aqui,
   encolher fazia o conteúdo vazar por cima do menu em vez de ser cortado
   (Carlos, 17/08/2026, com print mostrando "Financeiro" atrás do ícone da
   agenda). Só o .topo-menu absorve o aperto — e os estágios em JS já
   reduzem o conteúdo de cada lado (nome/logo) antes disso ser necessário. */
.topo-lado { flex: 1 0 auto; display: flex; align-items: center; }
.topo-lado-dir { justify-content: flex-end; gap: 6px; }
.topo-editor-btn { display: inline-flex; align-items: center; justify-content: center; position: relative; width: 32px; height: 32px; border-radius: 7px; color: var(--suave); text-decoration: none; transition: all .15s; background: none; border: none; cursor: pointer; padding: 0; }
.topo-editor-btn:hover, .topo-editor-btn-ativo { color: var(--azul-claro); background: var(--menu-hover); }
.topo-editor-btn svg { width: 18px; height: 18px; flex: none; }
.menu-hamburguer { display: none; align-items: center; justify-content: center; width: 40px; height: 40px; border: 1px solid var(--borda); border-radius: 9px; background: var(--superficie); color: var(--texto); cursor: pointer; padding: 0; flex: none; }
.menu-hamburguer:hover { border-color: var(--azul-claro); color: var(--azul-claro); }
.menu-hamburguer svg { width: 20px; height: 20px; }
.link { background: none; border: none; color: var(--azul-claro); cursor: pointer; font-size: 13px; font-family: inherit; }
.link:hover { color: var(--azul); }


/* ---- Avatar (iniciais) ---- */
.avatar { width: 32px; height: 32px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 700; flex: none; }

/* ---- Barra de progresso (upload de foto) ---- */
.barra-progresso-wrap { display: flex; align-items: center; gap: 8px; }
.barra-progresso-wrap[hidden] { display: none; }
.barra-progresso { flex: 1; height: 6px; border-radius: 4px; background: var(--cinza-bg, #eef1f5); overflow: hidden; max-width: 220px; }
.barra-progresso-fill { height: 100%; width: 0%; background: var(--azul-claro); border-radius: 4px; transition: width .15s ease; }
.barra-progresso-texto { font-size: 11px; color: var(--suave); min-width: 32px; }

/* ---- Menu do usuário (canto superior direito) ---- */
/* ── Sino de notificações ── */
.sino-wrap { position: relative; flex: none; }
.sino-wrap > summary { list-style: none; display: inline-flex; align-items: center; justify-content: center; position: relative; width: 32px; height: 32px; border-radius: 7px; color: var(--suave); cursor: pointer; transition: all .15s; }
.sino-wrap > summary::-webkit-details-marker { display: none; }
.sino-wrap > summary:hover, .sino-wrap[open] > summary { color: var(--azul-claro); background: var(--menu-hover); }
.sino-wrap > summary svg { width: 18px; height: 18px; }
.sino-badge { position: absolute; top: 0; right: 0; min-width: 15px; height: 15px; padding: 0 4px; border-radius: 8px; background: #e24b4a; color: #fff; font-size: 9.5px; font-weight: 700; line-height: 15px; text-align: center; }
.sino-painel { position: absolute; right: 0; top: calc(100% + 8px); width: 320px; max-width: 86vw; background: var(--superficie); border: 1px solid var(--borda); border-radius: 12px; box-shadow: 0 12px 34px rgba(20,40,80,.14); z-index: 60; overflow: hidden; }
.sino-cabe { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 11px 13px; border-bottom: 1px solid var(--borda); }
.sino-cabe strong { font-size: 13px; color: var(--texto); }
.sino-cabe-acoes { display: flex; align-items: center; gap: 10px; }
.sino-todas { background: none; border: none; color: var(--azul-claro); font-size: 11.5px; font-weight: 600; cursor: pointer; padding: 0; font-family: inherit; }
.sino-todas:hover { text-decoration: underline; }
.sino-gear-btn { background: none; border: none; padding: 2px; color: var(--suave); cursor: pointer; display: flex; align-items: center; line-height: 0; }
.sino-gear-btn svg { width: 15px; height: 15px; }
.sino-gear-btn:hover { color: var(--azul-claro); }
/* Painel da engrenagem expande INLINE (empurra a lista pra baixo) em vez de
   flutuar por cima — .sino-painel tem overflow:hidden (cantos arredondados da
   lista com scroll), então um popover absoluto aqui ficaria cortado. */
.sino-gear-painel { padding: 12px 13px; border-bottom: 1px solid var(--borda); background: var(--cinza-bg); }
.sino-gear-painel .gear-titulo { margin-bottom: 8px; }
.sino-gear-painel .gear-item { padding: 4px 0; }
.sino-lista { max-height: 380px; overflow-y: auto; }
.sino-vazio { padding: 22px 14px; text-align: center; color: var(--suave); font-size: 12.5px; }
.sino-rodape { display: flex; align-items: center; justify-content: center; gap: 14px; padding: 9px 13px; border-top: 1px solid var(--borda); }
.sino-rodape a { font-size: 12px; font-weight: 600; color: var(--azul-claro); text-decoration: none; }
.sino-rodape a:hover { text-decoration: underline; }
.sino-filtro-btn { background: none; border: none; padding: 0; font-family: inherit; font-size: 12px; font-weight: 600; color: var(--suave); cursor: pointer; }
.sino-filtro-btn:hover { color: var(--azul-claro); text-decoration: underline; }
.sino-filtro-btn.ativo { color: var(--azul-claro); }
/* Filtro "mostrar não lidas": esconde os itens já lidos da lista do sino. */
.sino-lista.somente-nao-lidas .sino-item:not(.nao-lida) { display: none; }
.sino-vazio-filtro { display: none; }
.sino-lista.somente-nao-lidas .sino-vazio-filtro.mostrar { display: block; }
.sino-item { display: flex; gap: 10px; padding: 10px 13px; border-bottom: 1px solid #f0f3f8; text-decoration: none; transition: background .12s; }
.sino-item:last-child { border-bottom: none; }
.sino-item:hover { background: #f6f9fe; }
.sino-item.nao-lida { background: #f2f7ff; }
@keyframes sinoItemEntra { 0% { opacity: 0; transform: translateY(-6px); } 100% { opacity: 1; transform: translateY(0); } }
@keyframes sinoItemFundo { 0% { background: #dcebff; } 100% { background: #f2f7ff; } }
.sino-item.novo-agora { animation: sinoItemEntra .25s ease, sinoItemFundo 1.6s ease forwards; }
.sino-item-ic { flex: none; width: 30px; height: 30px; color: #65718a; display: flex; align-items: center; justify-content: center; }
.sino-item-ic svg { width: 20px; height: 20px; }
.sino-item-ic img { width: 20px; height: 20px; object-fit: contain; }
/* Uma cor por categoria de novidade (mesmos ícones da lixeira) — pra bater o
   olho e saber se é petição, lançamento financeiro ou caso. */
.sino-item-ic-peticao    { color: #2b6fd6; }
.sino-item-ic-lancamento { color: #1a9e63; }
.sino-item-ic-caso       { color: #8a4baf; }
.sino-item-ic-cliente    { color: #b9770e; }
.sino-item-ic-agenda     { color: #c0392b; }
.sino-item-ic-comentario { color: #0e8f8f; }
.sino-item-ic-mencao     { color: #a3286e; }
.sino-item-txt { min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.sino-item-tit { font-size: 12.5px; font-weight: 600; color: var(--texto); }
.sino-item.nao-lida .sino-item-tit { font-weight: 700; }
.sino-item-msg { font-size: 11.5px; color: var(--suave); overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.sino-item-meta { font-size: 11px; color: #98a2b3; margin-top: 2px; }

.menu-usuario { position: relative; }
.menu-usuario > summary { list-style: none; display: flex; align-items: center; gap: 9px; cursor: pointer; padding: 5px 8px 5px 6px; border-radius: 10px; position: relative; z-index: 61; }
.menu-usuario > summary::-webkit-details-marker { display: none; }
.menu-usuario > summary:hover { background: var(--menu-hover); }
.menu-usuario[open] > summary { background: var(--menu-hover); border-radius: 10px 10px 0 0; box-shadow: 0 1px 0 var(--menu-hover); }
.menu-usuario .avatar { width: 36px; height: 36px; background: var(--azul-claro); color: #fff; }
.mu-nome { font-weight: 600; color: var(--texto); font-size: 13px; white-space: nowrap; }
.mu-nome-abrev { display: none; }
.mu-seta { width: 16px; height: 16px; color: var(--suave); transition: transform .15s; }
.menu-usuario[open] .mu-seta { transform: rotate(180deg); }
/* Largura acompanha o botão do nome (details não cresce por causa do painel,
   que é position:absolute — então width:100% = largura do avatar+nome+seta).
   Só quando não há espaço para o nome completo (ver media query abaixo) o
   painel ganha uma largura própria, fixa. */
.menu-painel { position: absolute; right: 0; top: 100%; width: 100%; min-width: 236px; background: var(--superficie); border: 1px solid var(--borda); border-top: none; border-radius: 0 0 12px 12px; box-shadow: 0 12px 34px rgba(20,40,80,.14); padding: 8px; z-index: 60; }
.mp-cabe { padding: 6px 10px 10px; border-bottom: 1px solid var(--borda); margin-bottom: 6px; }
.mp-nome { display: none; color: var(--texto); }
.mp-cabe small { display: block; color: var(--suave); }
.mp-cabe .mp-oab { font-weight: 600; color: var(--azul-claro); margin-top: 2px; }
.mp-sep { height: 1px; background: var(--borda); margin: 6px 0; }

/* ---- Cartões de seleção de tema (Configurações) ---- */
.tema-cartao { display: flex; align-items: center; gap: 10px; padding: 10px 14px; border: 1px solid var(--borda); border-radius: 12px; background: var(--superficie); cursor: pointer; font-family: inherit; font-size: 14px; font-weight: 600; color: var(--texto); }
.tema-cartao:hover { border-color: var(--azul-claro); }
.tema-cartao.ativo { border-color: var(--azul-claro); box-shadow: 0 0 0 3px rgba(30,64,121,.12); }
.tema-amostra { width: 28px; height: 28px; border-radius: 8px; border: 1px solid rgba(0,0,0,.08); }
.tema-amostra.tema-sereno { background: linear-gradient(135deg, #1f4fa0 0 50%, #eaf1fb 50% 100%); }
.tema-amostra.tema-mare { background: linear-gradient(135deg, #0e7490 0 50%, #e3f3f6 50% 100%); }
.tema-amostra.tema-escuro { background: linear-gradient(135deg, #4c7fd6 0 50%, #10141d 50% 100%); }
/* ---- Seletor de cor de destaque (perfil/editar.php) ---- */
.perfil-cor-wrap { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; padding: 2px 0; }
.perfil-cor-swatch { width: 22px; height: 22px; border-radius: 50%; border: 2px solid transparent; cursor: pointer; flex: none; transition: transform .12s, box-shadow .12s; outline: none; }
.perfil-cor-swatch:hover { transform: scale(1.15); }
.perfil-cor-swatch.ativo { box-shadow: 0 0 0 2px var(--superficie), 0 0 0 4px currentColor; border-color: transparent; }
.perfil-cor-livre { display: flex; align-items: center; justify-content: center; width: 26px; height: 26px; border-radius: 50%; border: 1.5px dashed var(--borda); cursor: pointer; color: var(--suave); position: relative; flex: none; transition: border-color .12s, color .12s; }
.perfil-cor-livre:hover { border-color: var(--azul-claro); color: var(--azul-claro); }
.perfil-cor-livre input[type="color"] { position: absolute; inset: 0; opacity: 0; width: 100%; height: 100%; cursor: pointer; border: none; padding: 0; }
.perfil-cor-limpar { display: flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: 50%; border: 1.5px solid var(--borda); background: none; cursor: pointer; color: var(--suave); flex: none; transition: border-color .12s, color .12s; }
.perfil-cor-limpar:hover { border-color: var(--vermelho); color: var(--vermelho); }
.perfil-cor-limpar.oculto { display: none; }
.perfil-cor-status { font-size: 11.5px; color: var(--verde, #1a9e63); margin-left: 2px; }
.mp-item { display: flex; align-items: center; gap: 9px; width: 100%; text-align: left; padding: 9px 10px; border-radius: 8px; color: var(--texto); background: none; border: none; cursor: pointer; font-family: inherit; font-size: 13px; }
.mp-item:hover { background: var(--menu-hover); }
.mp-item svg { width: 16px; height: 16px; color: var(--suave); }
.mp-item.ativo { background: var(--teal-bg); color: var(--azul-claro); }
.mp-item.ativo svg { color: var(--azul-claro); }

/* Margem lateral reduzida (Carlos, 26/08/2026: "espaço é valioso, quero que
   chegue mais próximo das laterais") — era 32px, alinhado ao padding do
   .topo (22px) pro conteúdo ficar sob as mesmas bordas do header. Sempre
   100% de verdade, sem reserva de espaço pra barra de rolagem nenhuma
   (Carlos, 27/08/2026: "quero que ocupe 100% do width, pare de deixar
   esse espaço pra barra de rolagem" — removido todo o esquema de
   scrollbar-gutter:stable + --sbw/--sbw-fantasma medido em JS). */
.conteudo { padding: 8px 16px 26px; min-height: calc(100vh - 78px); }

/* Timeline "Cliente → Caso → Financeiro" (fluxo de cadastro) — ver
   app/Views/partials/timeline_cadastro.php. Substitui o <h1>/subtítulo da
   página inteira: ocupa 100% da largura, sozinha na própria linha (os
   botões de ação — Salvar/Cancelar/Voltar — ficam numa barra abaixo, não
   mais dividindo espaço com ela). A trilha de progresso fica em cima
   esticada de ponta a ponta, e o título + a descrição da etapa ATUAL (o que
   essa tela pede pro usuário fazer) ficam embaixo. Estados: pendente
   (cinza), atual (azul, destacado) e feito (verde, com check). */
.timeline-cadastro { width: 100%; margin-bottom: 22px; }

.tlc-trilha { display: flex; align-items: flex-start; margin-bottom: 18px; width: 100%; }
.tlc-passo { display: flex; flex-direction: column; align-items: center; flex: 1; position: relative; }
/* Cada .tlc-passo é 1/3 da trilha e por padrão a bolinha fica no CENTRO
   desse terço, então a última sobra bem antes da borda direita (e a
   primeira, antes da esquerda) — Carlos, 26/07/2026: "a stteper...
   atualmente ele parece alinhado no centro" / depois "ainda tem um espaço
   muito grande na direita".
   IMPORTANTE: o deslocamento é em PIXELS fixos (não % do segmento) — esse
   componente é usado tanto compacto (90% de largura, ao lado do título) que
   quanto em largura total da página (casos/detalhe.php, sem título do
   lado); um deslocamento em % explode em containers largos e jogava a
   bolinha 1 pra fora da tela (Carlos, 26/07/2026, ao ver o resultado nessa
   segunda tela: "está excedendo o quadro abaixo, está demais para a
   direita"). Um valor fixo pequeno é seguro em qualquer largura, ainda que
   não encoste 100% na borda em trilhas bem largas. O NOME fica de fora do
   deslocamento — deslocar o texto (bem mais largo) jogava o rótulo por cima
   do título/cortado na borda da tela. A .tlc-linha do primeiro e do
   penúltimo passo estica pelo mesmo tanto (calc), pra continuar alcançando
   a bolinha vizinha. */
.tlc-bola-wrap { width: 100%; display: flex; justify-content: center; }
.tlc-passo:first-child .tlc-bola-wrap { transform: translateX(-28px); }
.tlc-passo:last-child .tlc-bola-wrap { transform: translateX(28px); }
.tlc-passo:first-child .tlc-linha { left: calc(50% - 28px); width: calc(100% + 28px); }
.tlc-passo:nth-last-child(2) .tlc-linha { width: calc(100% + 28px); }
.tlc-bola { width: 30px; height: 30px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 700; border: 2.5px solid var(--borda); color: var(--suave); background: var(--superficie); z-index: 1; transition: background .2s, border-color .2s, color .2s; }
.tlc-bola svg { width: 15px; height: 15px; }
.tlc-passo.feito .tlc-bola { background: var(--verde); border-color: var(--verde); color: #fff; }
.tlc-passo.atual .tlc-bola { border-color: var(--azul-claro); color: var(--azul-claro); background: var(--teal-bg); box-shadow: 0 0 0 3px var(--teal-bg); }
.tlc-linha { position: absolute; top: 14px; left: 50%; width: 100%; height: 3px; background: var(--borda); z-index: 0; }
.tlc-passo.feito .tlc-linha { background: var(--verde); }
.tlc-nome { font-size: 12px; margin-top: 7px; color: var(--suave); white-space: nowrap; }
.tlc-passo.atual .tlc-nome { color: var(--azul-claro); font-weight: 700; }
/* Cadastro já concluído: nome em verde (não só a bolinha) — Carlos, 21/07/2026. */
.tlc-passo.feito .tlc-nome { color: var(--verde); font-weight: 600; }

.tlc-eyebrow { display: block; font-size: 10.5px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; color: var(--azul-claro); margin-bottom: 4px; }
.tlc-cabecalho h1 { font-size: 26px; margin: 0; font-weight: 600; color: var(--titulo); letter-spacing: -.01em; }
.tlc-cabecalho p { color: var(--suave); font-size: 13px; margin: 4px 0 0; }

/* "X" dentro do próprio campo de busca pra abortar "adicionar mais um" e
   voltar ao estado anterior (Carlos, 26/07/2026: "não consigo mais cancelar
   o adicionar cliente, deve-se criar um x dentro da propria imputbox"). */
.busca-cancelar-x {
    position: absolute; right: 8px; top: 50%; transform: translateY(-50%);
    width: 22px; height: 22px; display: flex; align-items: center; justify-content: center;
    border: none; background: none; color: var(--suave); cursor: pointer; border-radius: 50%; padding: 0;
}
.busca-cancelar-x:hover { background: rgba(0,0,0,.06); color: var(--vermelho); }
#clienteBusca { padding-right: 32px; box-sizing: border-box; }

/* Autocomplete genérico (busca com filtro instantâneo + lista suspensa) */
.autocomplete-lista {
    position: absolute; left: 0; right: 0; top: calc(100% + 2px);
    background: var(--superficie); border: 1px solid var(--borda); border-radius: 8px;
    box-shadow: 0 4px 16px rgba(20,40,80,.12); max-height: 220px; overflow-y: auto; z-index: 50;
}
.autocomplete-lista > div { padding: 7px 11px; font-size: 13px; cursor: pointer; }
.autocomplete-lista > div:hover { background: var(--cinza-bg); }

/* Cartões dos clientes selecionados (casos/form.php) — um por cliente
   vinculado ao caso (o primeiro é o principal), com a qualificação formal
   completa (nome, nacionalidade, estado civil, profissão, CPF, endereço) e
   botão pra remover. Uma nova busca ADICIONA outro cartão, não substitui
   (Carlos, 21/07/2026 — "deve ser possível adicionar novo cliente"). */
.clientes-cards-wrap { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; }
/* Cartão padronizado (cliente e parte contrária): estica pra ocupar a
   largura da coluna a que pertence (Carlos, 26/07/2026: "elas podem se
   estender horizontalmente na metade da tela que lhes compete"). Avatar
   como coluna própria (alinhado ao TOPO); nome+ações+qualificação formam
   uma coluna ao lado — o nome fica colado no topo (ao lado do topo do
   avatar) e a qualificação começa logo na linha de baixo, sem esperar a
   altura inteira do avatar (Carlos, 26/07/2026: "alinhe o nome do cliente
   para o topo e a qualificação comece logo na linha de baixo"). */
.cliente-card-selecionado { display: flex; align-items: flex-start; gap: 10px; padding: 8px 10px; background: var(--teal-bg); border: 1px solid var(--menu-hover-borda); border-radius: 8px; width: 100%; box-sizing: border-box; }
.cliente-card-corpo { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.cliente-card-topo { display: flex; align-items: center; gap: 10px; }
.cliente-card-avatar { width: 42px; height: 42px; font-size: 15px; flex: none; }
.cliente-card-nome { flex: 1; min-width: 0; font-size: 13.5px; color: var(--texto); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Justificado — texto corrido de qualificação deixava uma "escada" com
   espaço vazio grande à direita (Carlos, 26/07/2026: "distribua melhor o
   texto dentro do card, justifique o texto"). Margem no topo pra não colar
   nos ícones da linha de cima (Carlos, 26/07/2026: "abaixe um pouco o texto
   pra não tocar nos icones"). */
.cliente-card-qualif { display: block; margin-top: 2px; font-size: 11.5px; color: var(--suave); line-height: 1.4; white-space: normal; text-align: justify; text-justify: inter-word; }
/* Advogado(s) habilitados no processo — FORA do card (Carlos, 29/08/2026:
   "quero que os advogados sejam exibidos fora do card"), logo abaixo do
   .clientes-cards-wrap de cada lado (o dado é do CASO, não da parte/cliente
   em si, ver Caso::garantirColunasAdvogadosPartes()). Rótulo "Adv.:" fixo
   antes do valor editável (.il-val). */
.cliente-card-adv-fora { margin-top: 6px; font-size: 11.5px; color: var(--suave); line-height: 1.4; }
.cliente-card-adv-rot { font-weight: 600; margin-bottom: 2px; }
.cliente-card-adv-fora .il-val { display: block; color: var(--texto); }
.cliente-card-acoes { flex: none; display: flex; align-items: center; gap: 2px; }
.cliente-card-copiar { flex: none; display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 50%; border: none; background: none; color: var(--suave); cursor: pointer; }
.cliente-card-copiar:hover { background: rgba(0,0,0,.06); color: var(--azul-claro); }
.cliente-card-copiar.copiado { color: #1a8a55; }
/* Editar parte contrária — abre a mesma modal de cadastro, já preenchida
   (Carlos, 26/07/2026: "crie um icone de editar e copiar, ao lado do
   fechar, se clicado no editar, deve aparecer a mesma modal do cadastro,
   permitindo alterar as informações"). */
.cliente-card-editar { flex: none; display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 50%; border: none; background: none; color: var(--suave); cursor: pointer; text-decoration: none; }
.cliente-card-editar:hover { background: rgba(0,0,0,.06); color: var(--azul-claro); }
.cliente-card-remover { flex: none; display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 50%; border: none; background: none; color: var(--suave); cursor: pointer; }
.cliente-card-remover:hover { background: rgba(0,0,0,.06); color: var(--vermelho); }

/* Identificação das partes do caso: 2 colunas de 50%/50% no mesmo bloco,
   meu cliente à esquerda e a parte contrária à direita — SEM linha
   divisória (Carlos, 26/07/2026: "divida a tela em 2..." / depois "remova a
   linha que divide as partes, deixe apenas um x"; X removido de novo em
   24/08/2026: "esse x nao está funcionando, o layout está ficando
   quebrado, remova"). Gap reduzido de 56px pra 28px — 56px deixava "um
   espaço exagerado" entre as colunas (Carlos, 24/08/2026). */
.partes-caso-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 28px; }
/* Pegadinha clássica do CSS Grid: uma coluna "1fr" tem largura mínima
   implícita = largura do conteúdo, então um card com texto que não quebra
   tão fácil (endereço/qualificação mais longos, ex.: parte contrária) podia
   empurrar sua coluna pra MAIS de 50%, espremendo a outra (Carlos,
   24/08/2026: "repare que a parte contraria ocupa mais espaço que o
   cliente do caso"). min-width:0 trava as duas em exatos 50%/50% sempre. */
.partes-caso-grid > div { min-width: 0; }
@media (max-width: 720px) {
    .partes-caso-grid { grid-template-columns: 1fr; }
}
/* "Adicionar mais clientes"/"Adicionar mais partes contrárias" — texto
   discreto em cinza, não um botão com borda (Carlos, 24/08/2026: "esses
   botões nao merecem destaque"). */
.partes-add-discreto { display: block; margin-top: 10px; background: none; border: none; padding: 0; font-family: inherit; font-size: 12px; font-weight: 600; color: var(--suave); cursor: pointer; text-align: left; }
.partes-add-discreto:hover { color: var(--azul-claro); }
/* Flecha recolhível "Partes do processo" (casos/detalhe.php) — mesmos
   cartões de qualificação do cadastro, só que read-only e escondidos por
   padrão pra não pesar o bloco Dados. */
.partes-processo-toggle {
    display: flex; align-items: center; gap: 6px; margin-top: 10px;
    padding: 0; border: none; background: none; cursor: pointer;
    font-family: inherit; font-size: 13px; font-weight: 600; color: var(--azul-claro);
}
.partes-processo-chevron { flex: none; transition: transform .15s ease; }
.partes-processo-toggle.aberto .partes-processo-chevron { transform: rotate(90deg); }

/* Parte contrária (casos/form.php) — mesmo cartão do cliente (avatar+nome+
   qualificação+ações). Card vazio (nenhuma parte ainda) vira um botão
   tracejado que abre a modal de busca/cadastro. */
.parte-contraria-add-btn {
    display: flex; align-items: center; gap: 6px; padding: 9px 12px; border-radius: 8px;
    border: 1.5px dashed #c7cdd6; background: #f5f6f8; color: #7a8699; cursor: pointer;
    font-family: inherit; font-size: 12.5px; white-space: nowrap; width: 100%;
    /* Mesmo afastamento do label que "Cliente(s) do caso" tem (o campo de
       busca ali fica embaixo de um <div style="position:relative">, sem
       margin próprio — quem afasta é o margin-top:8px de .clientes-cards-wrap
       nos cards abaixo; aqui o botão vazio ficava colado direto no label,
       sem equivalente). Carlos, 31/08/2026: "a box de adicionar parte
       contraria está muito colada no titulo, deixe com o mesmo afastamento
       de clientes do caso". */
    margin-top: 8px;
}
.parte-contraria-add-btn:hover { border-color: var(--azul-claro); color: var(--azul-claro); background: var(--teal-bg); }

/* Bloco "Modelo de petição sugerido" (casos/form.php, abaixo do checklist de
   documentos) — melhor palpite (área/subárea do caso) com prévia já
   preenchida, mais um dropdown "Outros modelos". Carlos, 28/07/2026:
   "quero que apareça o editor de texto, com um modelo sugerido
   autopreenchido com as informações já preenchidas no cadastro do caso". */
.modelo-sugerido-cabe { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.modelo-sugerido-preview {
    margin-top: 4px; padding: 18px 22px; max-height: 320px; overflow-y: auto;
    background: #fff; border: 1px solid var(--borda); border-radius: 10px;
    font-size: 13px; line-height: 1.6; color: var(--texto);
    position: relative;
}
.modelo-sugerido-preview::after {
    content: ''; position: sticky; display: block; bottom: -18px; left: 0; right: 0; height: 28px;
    margin-top: -28px; background: linear-gradient(transparent, #fff); pointer-events: none;
}
.modelo-sugerido-preview p { margin: 0 0 10px; }
.modelo-sugerido-preview p:last-child { margin-bottom: 0; }
/* Tela do Laurel embutida (não mais só uma prévia estática) — Carlos,
   29/07/2026: "preciso que apareça uma tela do laurel dentro do cadastro do
   caso e também no caso já cadastrado". SEMPRE em modo COMPACTO agora (tanto
   no cadastro quanto no caso já cadastrado — Carlos, 31/07/2026: "leve a
   visualização compacta do laurel... para o caso já cadastrado, substitua
   pela laurel que está no caso cadastrado"; "Abrir no editor" continua indo
   pra tela cheia de verdade, fora do iframe). Alto o bastante pra mostrar a
   1ª folha A4 inteira, sem cortar — a rolagem interna do iframe só entra em
   ação a partir da 2ª folha (Carlos, 30/07/2026 e 31/07/2026: "quero que
   apareça apenas 1 página, antes de ativar a rolagem"). 297mm (altura A4) +
   folga pra toolbar fixa e espaçador. */
.modelo-sugerido-iframe {
    /* Borda nos 4 lados de novo — só topo/base (Carlos, 06/08/2026: "borda
       dos 2 lados... quase zero") deixava o border-radius com um efeito
       estranho nos cantos e passava a impressão de "sem borda nenhuma"
       (Carlos, 08/08/2026: "o editor de texto nao possui borda"). Altura
       reduzida em 28px — o mesmo tanto que o padding-inferior do
       .ed-layout compacto encolheu logo abaixo, senão sobrava um vão vazio
       entre o fim da folha A4 e essa borda (Carlos, 08/08/2026: "entre a
       folha a4 e a borda, existe um espaço desnecessário"). */
    width: 100%; height: calc(297mm + 122px); border: 1px solid var(--borda);
    border-radius: 10px; background: #fff; display: block;
}
/* Placeholder "sem página" do Laurel — só uma barra no lugar da toolbar,
   sem folha A4 nem texto de cabeçalho nenhum (Carlos, 24/08/2026: "não
   precisa adicionar a folha a4 muito menos exibir um texto novo no
   cabeçalho" — correção de uma tentativa anterior que carregava o modelo
   em branco de verdade pra "mostrar a toolbar"). Altura só o suficiente
   pra barra + uma linha de instrução, não a altura de uma folha inteira. */
.modelo-sugerido-vazio {
    width: 100%; border: 1px solid var(--borda); border-radius: 10px;
    background: var(--superficie); overflow: hidden; display: flex; flex-direction: column;
}
.modelo-sugerido-vazio-toolbar { height: 44px; flex: none; background: var(--cinza-bg); border-bottom: 1px solid var(--borda); }
.modelo-sugerido-vazio-corpo { padding: 16px 20px; text-align: center; }
.modelo-sugerido-vazio-corpo .subtitulo { margin: 0; color: var(--suave); font-size: 12.5px; }
/* Editor Laurel + navegador de arquivos lado a lado (detalhe do caso) — o
   editor tem prioridade fixa (mostra a folha A4 real, nunca encolhe); o
   navegador é quem cede espaço, com largura ajustável arrastando o divisor
   entre os dois (Carlos, 06/08/2026: "a prioridade sempre será o editor de
   texto... quem deve ir diminuindo é o navegador de arquivos... permita que
   o usuário redimencione as telas, arrastando o divisor"). flex-wrap: sem
   espaço nem no mínimo do navegador (220px), o Laurel desce pra própria
   linha em vez de estourar a largura da tela (Carlos, 10/08/2026). */
.detalhe-editor-drive-split { display: flex; flex-wrap: wrap; align-items: flex-start; }
/* Trava dura contra barra de rolagem horizontal (Carlos, 22/08/2026: "isso
   nao deve acontecer jamais, o laurel deve ter 100% do espaço disponivel
   para a folha a4") — o navegador de arquivos NUNCA deve conseguir esticar
   a linha inteira além da largura do bloco; overflow-x:hidden aqui garante
   isso mesmo se algo dentro do navegador (nome de arquivo comprido etc.)
   tentar forçar mais largura do que o previsto. */
.bloco-modelo-sugerido { overflow-x: hidden; }
/* flex-grow:1 + flex-basis:auto (via width, não um valor fixo no `flex`
   shorthand) — cresce pra absorver a largura que o editor deixou de vir a
   assumir a mais (ver .detalhe-editor-col abaixo) e encolhe até min-width
   antes de o Laurel ter que descer de linha; width continua sendo o alvo
   ajustável arrastando o divisor (Carlos, 08/08/2026: "o navegador de
   arquivos e o editor de texto devem ocupar sempre 100% do width"). SEM
   max-width — enquanto o usuário não arrasta o divisor (sem a classe
   .largura-manual abaixo), o flex-grow:1 sozinho já ocupa TODO o espaço que
   sobrar, sem teto artificial (Carlos, 10/08/2026: "o navegador de
   arquivos, deve sempre ocupar o maximo de espaço horizontal que
   conseguir" — um max-width:600px antigo aqui deixava espaço vazio sobrando
   em telas largas). */
.detalhe-drive-col { flex: 1 1 auto; width: 220px; min-width: 220px; overflow-x: hidden; }
/* Depois que o usuário arrasta o divisor uma vez (JS liga esta classe),
   vira largura FIXA (flex:none) — sem isso o flex-grow:1 acima ignoraria
   qualquer largura arrastada e voltaria a preencher 100% sozinho. */
.detalhe-drive-col.largura-manual { flex: none; }
/* Largura fixa = exatamente a folha A4 (+ a borda de 1px do iframe de cada
   lado) — nunca mais nem menos, sem sobrar "gordura" cinza nas laterais
   dentro do iframe (Carlos, 10/08/2026: "existe um espaçamento entre a
   folha a4 e a borda do laurel... economizar o width dessa pagina" —
   opção escolhida: encolher o editor até a folha e devolver a largura
   sobrando pro navegador, ver .detalhe-drive-col acima). */
.detalhe-editor-col { flex: none; width: calc(210mm + 2px); max-width: 100%; }
/* Empilha sozinho (JS mede a largura disponível — ver script abaixo) quando
   o navegador de arquivos ficaria ILEGÍVEL espremido ao lado do editor
   (Carlos, 22/08/2026: "os 2 devem ocupar 100% do width, todavia o tamanho
   do navegador sempre terá que ser 100% da pagina a4 [entenda-se: o
   EDITOR], o navegador de arquivos pode recolher tranquilamente, quando
   começar a ficar ilegivel, pode deixar o navegador de arquivos no topo e
   descer o laurel pra baixo"). Diferente de .split-maximizado (esse aqui é
   automático por espaço, não uma escolha manual do usuário) — sem altura
   forçada de 70vh, cada um fica com a altura natural do conteúdo.
   flex-wrap:wrap sozinho (a regra de cima) já resolveria matematicamente,
   mas só troca de linha quando ESTOURA — sem essa classe o navegador ainda
   passava um bom tempo espremido e ilegível ANTES de estourar de vez. */
.detalhe-editor-drive-split.split-auto-empilhado { flex-direction: column; flex-wrap: nowrap; }
.detalhe-editor-drive-split.split-auto-empilhado .detalhe-drive-col { width: 100% !important; max-width: 100%; flex: none; }
.detalhe-editor-drive-split.split-auto-empilhado .detalhe-editor-col { width: 100%; }
.detalhe-editor-drive-split.split-auto-empilhado .detalhe-split-divisor { display: none; }
.detalhe-split-divisor { flex: none; width: 14px; align-self: stretch; cursor: col-resize; position: relative; border-radius: 4px; transition: background .15s; }
.detalhe-split-divisor.arrastando { background: rgba(30, 64, 121, .08); }
/* Botão "Maximizar navegador" (Carlos, 10/08/2026: "crie o botão de
   maximizar, assim o navegador de arquivos irá ocupar todo o espaço
   vertical daquele bloco, empurrando o editor de textos para baixo") —
   empilha as duas colunas, dá altura generosa e rolagem própria pro
   navegador, e o editor desce pra abaixo dele. */
/* Botão de maximizar mudou pra dentro da própria toolbar do navegador
   (ao lado da engrenagem do scanner — ver opt.mostrarMaximizar em
   drive-explorer.js), não precisa mais de uma barra à parte aqui em cima
   (Carlos, 10/08/2026). */
.detalhe-editor-drive-split.split-maximizado { flex-wrap: nowrap; flex-direction: column; }
/* O .fm (caixa com borda do navegador, injetada pelo partial) não herdava
   a altura do pai — sobrava um vão vazio e SEM borda entre o fim da caixa
   visível e o início do Laurel, lá embaixo do bloco de 70vh (Carlos,
   11/08/2026: "quando maximizo... aparece um espaço exagerado entre o
   navegador de arquivos e o laurel"). flex column aqui só pro título
   (h4) ficar com altura própria em cima e o .fm ocupar exatamente o
   resto — a rolagem agora é do .fm mesmo (não mais do wrapper), senão o
   próprio overflow:hidden do .fm cortava o conteúdo antes da barra de
   rolagem do wrapper ter chance de aparecer. */
.detalhe-editor-drive-split.split-maximizado .detalhe-drive-col { width: 100% !important; max-width: 100%; flex: none; height: 70vh; display: flex; flex-direction: column; }
/* .fm não é filho DIRETO de .detalhe-drive-col — o partial injeta um
   wrapper (.drive-pasta-caso) no meio; flex:1 só funciona no filho direto
   do flex container, por isso precisa dos dois passos aqui (esticar o
   wrapper primeiro, depois o .fm dentro dele em 100% do wrapper). */
.detalhe-editor-drive-split.split-maximizado .detalhe-drive-col > .drive-pasta-caso { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
.detalhe-editor-drive-split.split-maximizado .detalhe-drive-col .fm { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
.detalhe-editor-drive-split.split-maximizado .detalhe-split-divisor { display: none; }
.detalhe-editor-drive-split.split-maximizado .detalhe-editor-col { width: 100%; }
/* Títulos e botões (Abrir no editor / Escolher outro modelo) das duas
   colunas foram removidos (Carlos, 17/08/2026: "remova os titulos do
   navegador de arquivos e do laurel, inclusive remova os botões") — CSS
   correspondente removido junto (era só pra esses elementos).*/
.modelo-peticao-item svg { flex: none; color: #97a3b5; }
.modelo-peticao-item:hover svg { color: var(--azul-claro); }

/* Modal da parte contrária — mesmo padrão visual da modal de agenda
   (.ag-modal-*), classes próprias (pc-*) pra não depender do CSS local do
   editor.php. */
.pc-modal-overlay { display:none; position:fixed; inset:0; background:rgba(20,40,80,.4); z-index:400; align-items:flex-start; justify-content:center; padding:40px 16px; overflow-y:auto; }
.pc-modal-overlay.aberto { display:flex; }
.pc-modal { background:var(--superficie); border-radius:12px; box-shadow:0 20px 60px rgba(20,40,80,.25); width:100%; max-width:560px; }
.pc-modal-header { display:flex; align-items:center; justify-content:space-between; padding:16px 20px; border-bottom:1px solid var(--borda); font-size:15px; font-weight:700; }
.pc-modal-header button { background:none; border:none; cursor:pointer; color:var(--suave); padding:4px; border-radius:6px; }
.pc-modal-header button:hover { background:#eef2fa; color:var(--texto); }
[data-tema="escuro"] .pc-modal-header button:hover { background:var(--menu-hover); }
.pc-modal-body { padding:18px 20px; }
.pc-grupo { position:relative; }
.pc-label { font-size:12px; font-weight:600; color:var(--suave); margin-bottom:4px; }
.pc-modal-body input, .pc-modal-body select { width:100%; padding:8px 10px; border:1px solid var(--borda); border-radius:6px; font-family:inherit; font-size:13px; box-sizing:border-box; }
.pc-btn { padding:9px 16px; border-radius:6px; border:none; background:var(--azul-claro); color:#fff; font-family:inherit; font-size:13px; font-weight:600; cursor:pointer; }
.pc-btn:hover { background:var(--azul); }

/* ---- Responsivo (mantém logo · menu · usuário em uma linha, nunca sobrepõe) ----
   Medido em JS (ver "Responsividade do header" no fim do layout.php), não por
   largura fixa de tela — cada estágio só liga quando o conteúdo de verdade
   deixa de caber, nem um pixel antes. Ordem de degradação conforme o espaço
   aperta (Carlos, 16/08/2026 — "impeça que os ícones do laurel encavalem com
   o menu"):
   1) esconde o sobrenome do advogado (só o primeiro nome)
   2) esconde o nome inteiro, só o ícone/foto aparece
   3) remove a logo inteira (não só a escrita) — o menu ocupa o lugar dela
      (Carlos, 17/08/2026: "quando não houver espaço para a logo completa,
      já pode remover a logo, deixe o menu ocupar o lugar da logo")
   4) menu principal vira ícone de três risquinhos (clique abre as opções) */
.topo-menu a { white-space: nowrap; }
.topo.topo-oculta-sobrenome .mu-sobrenome { display: none; }
.topo.topo-oculta-nome .mu-nome { display: none; }
.topo.topo-oculta-logo .topo-marca { display: none; }
/* Sem a logo, o lado esquerdo não tem mais conteúdo pra "empatar" com o
   lado direito (ver flex-grow em .topo-lado) — deixa de crescer e o menu
   passa a crescer no lugar dela, herdando o espaço que sobrou. */
.topo.topo-oculta-logo .topo-lado:not(.topo-lado-dir) { flex: 0 0 0; }
.topo.topo-oculta-logo .topo-menu { flex: 1 1 auto; }
.topo.topo-compacta .topo-lado:not(.topo-lado-dir) { display: none; }
.topo.topo-compacta .menu-hamburguer { display: inline-flex; }
.topo.topo-compacta .topo-menu { position: absolute; top: 100%; left: 0; right: 0; flex-direction: column; align-items: stretch; gap: 2px; background: var(--superficie); border-top: 1px solid var(--borda); border-bottom: 1px solid var(--borda); box-shadow: 0 10px 24px rgba(20,40,80,.12); padding: 8px; display: none; z-index: 49; }
.topo.topo-compacta.menu-aberto .topo-menu { display: flex; }
.topo.topo-compacta .topo-menu a { border-bottom: none; border-radius: 8px; padding: 12px 14px; font-size: 15px; }
.topo.topo-compacta .topo-menu a:hover { border-bottom-color: transparent; background: var(--menu-hover); }
.topo.topo-compacta .topo-menu a.ativo { border-bottom-color: transparent; background: var(--teal-bg); }

/* ---- Cabeçalho de página ---- */
.pagina-topo { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 22px; }
/* Título do caso encolheu (Carlos, 27/08/2026), sobrou espaço demais até o
   bloco "Identificação do caso" — reduzido só nesta tela pra não afetar o
   .pagina-topo das outras (lista de casos, financeiro, clientes...). */
.caso-pagina-topo { margin-bottom: 10px; }
/* Quando o título da página foi substituído pela timeline de cadastro (ver
   .timeline-cadastro acima), esta barra sobra só com os botões de ação —
   sem o bloco da esquerda, joga tudo pra direita. */
.pagina-topo-so-acoes { justify-content: flex-end; }
.pagina-topo h1 { font-size: 26px; margin: 0; font-weight: 600; color: var(--titulo); letter-spacing: -.01em; }
.pagina-topo .subtitulo { color: var(--suave); font-size: 13px; margin-top: 4px; }
/* Título à esquerda, stepper à direita, na mesma linha — os botões de ação
   saíram daqui e foram pro rodapé do formulário (.rodape-form abaixo);
   Carlos, 21/07/2026. .timeline-cadastro normalmente é width:100% (quando é
   a única coisa na linha), aqui ganha uma largura própria pra sobrar espaço
   pro título. */
.pagina-topo-stepper { align-items: center; }
/* Ocupa até 90% do espaço disponível na linha do cabeçalho (ao lado do
   título) e encolhe conforme esse espaço diminui — antes era uma largura
   fixa de 320px, sem se adaptar (Carlos, 26/07/2026: "quero que vc faça ele
   ocupar 90% do width disponivel e vá diminuindo conforme o espaço
   diminui"). min-width:0 é necessário pra um item flex conseguir encolher
   abaixo do tamanho natural do conteúdo. */
.pagina-topo-stepper .timeline-cadastro { flex: 0 1 90%; min-width: 0; margin-bottom: 0; }
.pagina-topo-stepper .tlc-trilha { margin-bottom: 0; }

/* Rodapé fixo do formulário de cadastro — Cancelar/Salvar, alinhados à
   direita, com uma linha separando do conteúdo acima. */
.rodape-form { display: flex; justify-content: flex-end; gap: 10px; margin-top: 26px; padding-top: 20px; border-top: 1px solid var(--borda); }

/* ---- Botões ---- */
/* Hover aprovado: Flash Interno Radial — o botão NÃO se move. Ver docs/INTERFACE.md */
.btn { position: relative; overflow: hidden; display: inline-flex; align-items: center; gap: 7px; background: var(--azul-claro); color: #fff; padding: 10px 20px; border-radius: 5px; border: none; cursor: pointer; font-weight: 600; font-size: 14px; font-family: inherit; line-height: 1; transition: background .2s ease; white-space: nowrap; flex-shrink: 0; }
.btn::after { content: ''; position: absolute; inset: 0; pointer-events: none; background: radial-gradient(circle at 50% 50%, rgba(255,255,255,.22) 0%, rgba(255,255,255,0) 70%); opacity: 0; transition: opacity .2s ease; }
.btn:hover { background: var(--azul); }
.btn:hover::after { opacity: 1; }
.btn svg { width: 16px; height: 16px; position: relative; z-index: 1; }
.btn.secundario { background: var(--superficie); color: var(--azul-claro); border: 1.5px solid #c8d6ec; }
.btn.secundario:hover { background: var(--teal-bg); border-color: var(--azul-claro); }
.btn.secundario:hover::after { background: radial-gradient(circle at 50% 50%, rgba(30,64,121,.1) 0%, rgba(30,64,121,0) 70%); }
.btn.perigo { background: #fde8e8; color: #d6453f; border: 1.5px solid #f5c6c6; }
.btn.perigo:hover { background: #fbd5d5; border-color: #e9a2a2; }
.btn.perigo:hover::after { background: radial-gradient(circle at 50% 50%, rgba(192,57,43,.12) 0%, rgba(192,57,43,0) 70%); }
.btn-link { background: none; border: none; padding: 0; cursor: pointer; font-family: inherit; font-size: 12.5px; font-weight: 600; color: var(--azul-claro); text-decoration: none; }
.btn-link:hover { text-decoration: underline; }
.btn.verde { background: #1a9850; color: #fff; border: none; }
.btn.verde:hover { background: #158040; }
.btn.verde svg { color: #fff; }

/* ---- Botões de ação em ícone ---- */
.btn-icone { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; border: 1px solid var(--borda); border-radius: 5px; color: var(--suave); background: var(--superficie); }
.btn-icone:hover { border-color: var(--azul-claro); color: var(--azul-claro); background: var(--teal-bg); }
/* flex-shrink:0 — sem isso o Chrome encolhe o SVG abaixo do width/height
   definidos (ex.: 12px vira 8px) dentro do container inline-flex, mesmo
   sobrando espaço de sobra; é um comportamento real do navegador com SVG
   como flex item, não um erro de seletor CSS (achado investigando "o icone
   de disquete ainda nao está aparecendo", Carlos, 10/08/2026 — o disquete
   não estava ausente, estava desenhado ilegível/espremido). */
.btn-icone svg { width: 16px; height: 16px; flex-shrink: 0; }

/* ---- Senha do gov.br (Cliente) — oculta por padrão, só revela sob clique
   (Carlos, 03/08/2026: "a senha aparecerá, más oculta, será necessário
   clicar em um icone de olho para exibi-la"). ---- */
.senha-gov-atual { display: flex; align-items: center; gap: 8px; border: 1.5px solid #0c7a52; background: #f2faf6; border-radius: 8px; padding: 9px 12px; }
.senha-gov-valor { font-family: monospace; font-size: 14px; letter-spacing: 1px; color: var(--texto); min-width: 90px; }
/* Documento pessoal + CPF/senha lado a lado — CPF/senha à direita da caixa
   de documento, quebrando pra linha de baixo se não couber (Carlos,
   24/08/2026: "podem aparecer a direita da imputbox de documento pessoal...
   se faltar espaço no layout, jogue o CPF e senha pra linha de baixo"). */
/* CPF/senha sempre embaixo do documento pessoal, não mais do lado (Carlos,
   27/08/2026: "o cpf e senha, pode levar pra baixo do documento pessoal") —
   a coluna da esquerda ficou mais estreita (2/5 do bloco, ver
   .checklist-caso-grid), não sobrava espaço pra ficar lado a lado mesmo. */
.doc-cpf-senha-linha { display: flex; flex-direction: column; gap: 4px; }
.doc-cpf-senha-doc { width: 100%; }
/* CPF/senha no quadro Dados do caso — uma linha só, sem caixa/borda (Carlos,
   24/08/2026: "ocupam muito espaço, diminua o destaque, algo minimalista"). */
.cpf-senha-mini-linha { display: flex; flex-wrap: wrap; gap: 18px; margin-top: 10px; font-size: 12.5px; flex: 0 0 auto; }
.cpf-senha-mini-item { display: inline-flex; align-items: center; gap: 6px; font-family: monospace; color: var(--texto); }
/* Mesmo bug do display sobrepondo [hidden] (ver .campo-senha-gov-inline
   logo abaixo) — precisa dessa regra pra linha.hidden=true (JS do duplo
   clique) esconder de verdade. */
.cpf-senha-mini-item[hidden] { display: none; }
.cpf-senha-mini-rot { font-family: Cambria, Georgia, serif; color: var(--suave); }
.cpf-senha-mini-vazio { font-family: Cambria, Georgia, serif; color: var(--suave); }
.cpf-senha-mini-vazio a { color: var(--azul-claro); }
/* Campo inline pra definir/alterar a senha do gov.br sem sair da tela do
   caso (Carlos, 28/08/2026: "quero poder atualizar a senha do meu inss ali
   mesmo no campo de senha em casos"). */
/* Do mesmo tamanho dos "••••••••••" que ela substitui, não uma caixa
   grande numa linha própria (Carlos, 28/08/2026: "amenize isso, faça uma
   imputbox pequena, do mesmo tamanho dos asteriscos"). */
.campo-senha-gov-inline { display: inline-block; width: 92px; font-size: 12.5px; font-family: monospace; padding: 1px 4px; border: 1px solid var(--borda); border-radius: 4px; vertical-align: baseline; }
/* .campo-senha-gov-inline força um `display` próprio, o que por si só já
   sobrepõe o display:none do atributo `hidden` nativo (CSS de autor sempre
   vence a regra do agente de usuário) — o campo nunca escondia de verdade,
   e o duplo clique parecia não funcionar (Carlos, 28/08/2026: "ainda
   continua aparecendo... ainda nao estou conseguindo editar a senha
   clicando duas vezes"). Mesmo bug já visto e corrigido em
   .tl-tag-oculto[hidden]. */
.campo-senha-gov-inline[hidden] { display: none; }
.cpf-senha-mini-copiar { background: none; border: none; padding: 2px; color: var(--suave); cursor: pointer; display: inline-flex; }
.cpf-senha-mini-copiar:hover { color: var(--azul-claro); }
.cpf-senha-mini-copiar svg { width: 13px; height: 13px; }
/* Botão "Entrar no INSS" — igual espírito do copiar/olho ao lado (discreto,
   sem caixa pesada), só com texto porque é uma AÇÃO (abre aba nova), não só
   revelar/copiar (Carlos, 27/08/2026: "quero implementar login automatico
   no site do meu inss"). */
.cpf-senha-entrar-inss { background: none; border: 1px solid var(--borda); border-radius: 20px; padding: 2px 10px 2px 8px; color: var(--azul-claro); cursor: pointer; display: inline-flex; align-items: center; gap: 5px; font-size: 12px; font-family: inherit; }
.cpf-senha-entrar-inss:hover { background: var(--teal-bg); border-color: var(--azul-claro); }
.cpf-senha-entrar-inss svg { flex: none; }
.cpf-senha-entrar-inss[hidden] { display: none; }
.campo-senha-wrap { display: flex; align-items: center; gap: 8px; }
.campo-senha-wrap input { flex: 1; }
/* Documento do cliente — mesmo bloco visual da checklist de documentos do
   caso (.checklist-doc-linha), na tela de cadastro/edição do cliente
   (Carlos, 10/08/2026: "quero poder subir na hora de cadastrar o cliente,
   ou na hora de editar o cadastro do cliente... deve aparecer como se
   fosse uma bloco do checklist de documentos" — não no cartão de cliente
   do formulário de caso, que é só pra identificação). */
.cliente-doc-linha { margin-top: 6px; padding: 8px 12px; }

/* ---- Botão de documento com ícone PDF (Procuração / Hipossuficiência) ---- */
/* flex-shrink:0 de propósito — sem isso o botão ia encolhendo sozinho
   (texto vazando por cima do próprio botão) em vez de deixar a CÉLULA
   (.acoes-cel, que aí sim tem overflow:hidden) reportar o estouro de
   verdade pro JS medir. */
.btn-doc-pdf { display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; border: 1px solid #d3dbeb; border-radius: 7px; background: #fff; color: #33415a; font-size: 12.5px; font-weight: 500; white-space: nowrap; cursor: pointer; transition: border-color .15s, background .15s; flex-shrink: 0; }
.btn-doc-pdf:hover { border-color: var(--azul-claro); background: var(--teal-bg); }
.btn-doc-pdf .ico-pdf { width: 16px; height: 16px; flex-shrink: 0; }

/* Itens equivalentes dentro do menu "⋮" (só aparecem em telas estreitas —
   ver breakpoint logo abaixo, telefone/carlos, 20/07/2026). */
.menu-item-doc-estreito { display: none; }
.menu-item-doc-estreito .ico-pdf { width: 16px; height: 16px; flex-shrink: 0; }
.menu-dropdown-item:hover { background: var(--teal-bg); }

/* ---- Lista de Clientes: responsiva ----
   Tela estreita: Procuração/Hipossuficiência somem da linha e passam a
   aparecer dentro do menu "⋮"; abaixo disso, some também a coluna de
   e-mail e o avatar (bolinha com iniciais), pra sobrar espaço pro essencial.
   O 1º passo (botões → "⋮") é medido em JS, não por largura fixa de tela —
   ver "Responsividade da lista de Clientes" no fim de clientes/lista.php:
   um breakpoint fixo não sabia se a célula de Ações estava REALMENTE
   apertada (cabia numa tela, estourava alguns pixels antes em outra,
   dependendo do conteúdo real de cada linha) — Carlos, 17/08/2026: "antes
   de começar a encolher qualquer linha, quero que vc retire os botões e
   jogue para os 3 pontinhos". A classe .clientes-acoes-compacta é quem
   liga essas regras.
   table-layout:auto SÓ NESTA TABELA (o resto do sistema continua fixed+% —
   ver tabelas-layout-fluido) — Telefone/E-mail curtos não precisam ficar
   ocupando a mesma fatia sempre; cada coluna encolhe pro que o conteúdo
   real precisa (Carlos, 17/08/2026: "o certo é exibir o tamanho mínimo
   necessário para comportar o texto"). */
.tabela.tabela-auto { table-layout: auto; }
/* Telefone/E-mail não quebram linha (são valores curtos por natureza) — sem
   isso, table-layout:auto preferia quebrar o TEXTO deles em vez de encolher
   a célula de Ações, e o JS nunca detectava aperto nenhum (Ações sempre
   "cabia" às custas de Telefone/E-mail virando 2 linhas silenciosamente). */
#conteudo-clientes .tabela-auto .cli-tel-cel,
#conteudo-clientes .tabela-auto td:nth-child(3) .cli-campo-rapido { white-space: nowrap; }
/* Cabeçalhos também não podem quebrar linha — "E-mail"/"Ações" quebrando
   ("E-MAI/L") era outra válvula de escape que deixava a coluna de Ações
   encolher além do mínimo sem o JS nunca detectar estouro de verdade
   (Carlos, 17/08/2026: "não permita que a coluna ações fique oculta").
   E min-width incondicional no último th/td (Ações, sempre a última coluna
   aqui) garante um piso mesmo antes do JS ligar .clientes-acoes-compacta. */
#conteudo-clientes .tabela-auto th { white-space: nowrap; }
#conteudo-clientes .tabela-auto th:last-child,
#conteudo-clientes .tabela-auto td:last-child { min-width: 64px; }
#conteudo-clientes.clientes-acoes-compacta .btn-doc-pdf { display: none; }
#conteudo-clientes.clientes-acoes-compacta .menu-item-doc-estreito { display: flex; }
/* Sem os botões de Procuração/Hipossuficiência, a célula de Ações vira só
   o "⋮" — a coluna pode encolher pro mínimo, sobrando espaço pra Nome
   (Carlos, 17/08/2026: "é necessário que a coluna ações redimensione para
   o mínimo possível"). */
#conteudo-clientes.clientes-acoes-compacta .tabela .col-cli-acoes { width: 64px !important; }
@media (max-width: 640px) {
    /* E-mail é a 3ª coluna agora — CPF saiu da tabela (mora embaixo do nome,
       ver .cli-nome-cpf) e Ações é sempre a última, medida em JS. */
    #conteudo-clientes .tabela th:nth-child(3),
    #conteudo-clientes .tabela td:nth-child(3) { display: none; }
    #conteudo-clientes .cli-nome .avatar { display: none; }
}

/* ── Grade financeira: botão de ações minimalista (sem borda em repouso) ── */

.grade-fin .acoes-fin .btn-icone,
.grade-fin .btn-icone { border-color: transparent; background: transparent; color: #b8c4d4; width: 28px; height: 28px; }
.grade-fin .acoes-fin .btn-icone:hover,
.grade-fin .btn-icone:hover { border-color: var(--borda); background: var(--teal-bg); color: var(--azul-claro); }
.grade-fin td:last-child { width: 36px; min-width: 36px; text-align: right; }
.grade-fin .acoes-fin { flex-wrap: nowrap; min-width: 28px; }
/* overflow:hidden é o que faz o JS conseguir medir estouro de verdade (ver
   "Responsividade da lista de Clientes" em clientes/lista.php) — sem isso,
   quando os botões não cabem eles vazam pra fora da célula (por causa do
   justify-content:flex-end) em vez de serem contados como overflow, e o
   scrollWidth mentia dizendo que cabia. */
.acoes-cel { display: flex; gap: 7px; justify-content: flex-end; overflow: hidden; }

/* ---- Cartões / grid ---- */
.cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 16px; margin-bottom: 24px; }
.card { background: var(--superficie); border: 1px solid var(--borda); border-radius: 14px; padding: 18px; box-shadow: var(--sombra); }
.card .num { font-size: 28px; font-weight: 600; color: var(--azul); }
.card .rotulo { color: var(--suave); font-size: 13px; }

/* ---- Painel: board de casos por status ---- */
.board { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; margin-bottom: 22px; }
@media (max-width: 900px) { .board { grid-template-columns: 1fr; } }
.coluna { background: var(--superficie); border: 1px solid var(--borda); border-top: 3px solid var(--col-cor, #ccc); border-radius: 14px; box-shadow: var(--sombra); display: flex; flex-direction: column; }
.coluna-cab .ponto { width: 9px; height: 9px; border-radius: 50%; background: var(--col-cor); flex: none; }
.coluna-cab .contador { background: var(--col-bg); color: var(--col-forte); font-size: 12px; font-weight: 700; min-width: 24px; text-align: center; padding: 2px 9px; border-radius: 20px; }

/* ---- Painel: cartões de indicador (KPIs) ---- */
@media (max-width: 900px) { .kpis { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 560px) { .kpis { grid-template-columns: 1fr; } }
.kpi { background: var(--superficie); border: 1px solid var(--borda); border-radius: 14px; box-shadow: var(--sombra); padding: 18px; display: flex; gap: 14px; align-items: flex-start; }
.kpi-corpo .kpi-mes.zero { color: var(--suave); font-weight: 400; }

/* ---- Painel: rodapé ---- */

/* ---- Tabelas ---- */
.tabela { width: 100%; border-collapse: collapse; background: var(--superficie); border: 1px solid var(--borda); border-radius: 8px; overflow: hidden; box-shadow: var(--sombra); table-layout: fixed; }
/* Larguras proporcionais das colunas da grade financeira — definidas aqui (e não
   só no cabeçalho) para que a tabela de lançamento rápido, que não tem <thead>,
   fique com as colunas alinhadas às da tabela principal. */
.grade-fin .col-venc     { width: 9%; }
.grade-fin .col-cliente  { width: 26%; }
.grade-fin .col-par      { width: 4%; }
.grade-fin .col-previsto { width: 12%; }
.grade-fin .col-conta    { width: 12.5%; }
.grade-fin .col-valor    { width: 12%; }
.grade-fin .col-anota    { width: 8%; }
.grade-fin .col-acoes    { width: 4%; }
/* Layout fluido: conteúdo longo quebra dentro da célula em vez de esticar a coluna */
.tabela td, .tabela th { word-break: break-word; overflow-wrap: anywhere; }
.tabela th, .tabela td { text-align: left; padding: 13px 16px; border-bottom: 1px solid var(--borda); }
.tabela th { background: var(--th-bg); font-size: 11px; text-transform: uppercase; color: var(--suave); font-weight: 700; letter-spacing: .04em; }
.tabela tr:last-child td { border-bottom: none; }
/* Efeito zebra (exceto a grade financeira, que tem zebra própria).
   Com zebra, dispensa a linha separadora; usa o mesmo tom e hover da grade financeira.
   Linha não lida (.linha-nova) fica de fora da zebra E do hover: mantém o azul
   sólido, sem alternância e sem cinza no hover — igual ao Financeiro. */
.tabela:not(#grade-fin) tbody td { border-bottom: none; }
.tabela:not(#grade-fin) tbody tr:nth-child(even):not(:hover):not(.linha-nova) td { background: #f7f9fc; }
.tabela:not(#grade-fin) tbody tr:hover:not(.linha-nova) td { background: #e1e6ef; }
.tabela#grade-fin tbody tr:hover td { background: #e1e6ef; }
/* Linha de lançamento rápido: tabela separada, isolada da tabela principal
   (ordenação/filtros/recarregamentos dela não a afetam), mas visualmente
   emendada logo abaixo — sem borda dupla nem espaço entre as duas. */
.grade-fin-principal { border-bottom-left-radius: 0; border-bottom-right-radius: 0; box-shadow: none; margin-bottom: 0; }
.grade-fin-add { border-top-left-radius: 0; border-top-right-radius: 0; border-top: none; margin-top: 0; }
.grade-fin tbody tr.linha-pago:hover td      { background: #d4f3e2 !important; }
.grade-fin tbody tr.linha-parcial:hover td   { background: #f5edc8 !important; }
.grade-fin tbody tr.linha-vencido:hover td   { background: #f5d0d0 !important; }
.grade-fin tbody tr.linha-pendente:hover td  { background: #e1e6ef !important; }
.th-arrastavel { cursor: grab; user-select: none; }
.th-arrastavel.arrastando { opacity: .45; }
.th-arrastavel.col-alvo { box-shadow: inset 3px 0 0 var(--azul-claro); }
.col-num { width: 44px; color: var(--suave); }
.cli-nome { display: flex; align-items: center; gap: 11px; min-width: 0; }
.cli-nome strong { font-weight: 700; color: var(--texto); }
/* Nunca quebra linha (corta com "…") — numa tabela com table-layout:auto
   (ver .tabela-auto), deixar o Nome quebrar em 2 linhas era uma "válvula de
   escape" silenciosa: a tabela nunca chegava a estourar de verdade e os
   botões de Ações não escondiam a tempo (Carlos, 17/08/2026: "os botões
   procuração e hipossuficiência não ocultam mais"). */
#conteudo-clientes .tabela-auto .cli-nome-txt strong,
#conteudo-clientes .tabela-auto .cli-nome-cpf { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block; }
.zap { color: #25d366; vertical-align: -3px; margin-left: 6px; width: 13px; height: 13px; }

/* ---- Campo de busca novo ---- */
.busca-wrap-interno { position: relative; width: 100%; max-width: 400px; display: flex; align-items: center; }
.busca-wrap-interno .campo-busca-novo { padding-right: 38px; }
/* Botão lupa (submit) fixo à direita */
.busca-wrap-interno .busca-submit {
    position: absolute; right: 6px;
    width: 28px; height: 28px; padding: 0;
    display: inline-flex; align-items: center; justify-content: center;
    background: transparent; border: none; border-radius: 6px;
    cursor: pointer; flex: none; transition: background .15s;
}
.busca-wrap-interno .busca-submit svg { width: 15px; height: 15px; fill: none; stroke: #b0bcc8; stroke-width: 2.2; stroke-linecap: round; transition: stroke .15s; }
.busca-wrap-interno .busca-submit:hover { background: #1e3a5f; }
.busca-wrap-interno .busca-submit:hover svg { stroke: #fff; }
.campo-busca-novo {
    display: block;
    width: 100%;
    height: 38px;
    padding: 0 14px;
    font-size: 13.5px;
    font-family: inherit;
    color: var(--texto);
    background-color: var(--superficie);
    border: 1px solid var(--borda);
    border-radius: 4px;
    outline: none;
    box-sizing: border-box;
    -webkit-appearance: none;
    appearance: none;
    transition: border-color .15s;
}
.campo-busca-novo::placeholder { color: var(--suave); }
.campo-busca-novo:focus { border-color: var(--azul-claro); }
.campo-busca-novo.compacto { height: 34px; font-size: 13px; }
.busca-outros-meses { display: flex; align-items: center; gap: 6px; margin-top: 6px; font-size: 12px; color: var(--suave); }
.busca-outros-meses[hidden] { display: none; }
.busca-spinner { width: 13px; height: 13px; animation: busca-spin .8s linear infinite; }
@keyframes busca-spin { to { transform: rotate(360deg); } }

/* Barra padrão: busca à esquerda, botões à direita */
.barra-acoes { display: flex; align-items: center; gap: 12px; margin-bottom: 20px; flex-wrap: wrap; }
.barra-acoes-busca { width: 100%; max-width: 400px; }
.barra-acoes-direita { margin-left: auto; display: flex; align-items: center; gap: 8px; flex-shrink: 0; }

/* campo-busca legado (CEP em formulários — mantido) */
.campo-busca { position: relative; flex: 1; }
.campo-busca .lupa { position: absolute; left: 13px; top: 50%; transform: translateY(-50%); width: 16px; height: 16px; color: var(--suave); pointer-events: none; }
.campo-busca input:not([type=checkbox]):not([type=radio]):not([type=submit]) { padding-left: 38px; background: var(--superficie); }

/* ---- Paginação ---- */
.lista-rodape { display: flex; align-items: center; justify-content: space-between; margin-top: 18px; flex-wrap: wrap; gap: 12px; }
.lista-rodape .contagem { color: var(--suave); font-size: 13px; }
.lista-rodape .contagem strong { color: var(--texto); }
.lista-rodape .rodape-esq { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
.por-pagina { display: inline-flex; align-items: center; gap: 7px; color: var(--suave); font-size: 12.5px; }
.por-pagina select { width: auto; padding: 5px 9px; font-size: 12.5px; }
.paginacao { display: flex; align-items: center; gap: 6px; }
.paginacao a, .paginacao span { display: inline-flex; align-items: center; justify-content: center; min-width: 34px; height: 34px; padding: 0 9px; border-radius: 8px; border: 1px solid var(--borda); background: var(--superficie); color: var(--suave); font-weight: 600; font-size: 13px; }
.paginacao a:hover { border-color: var(--azul-claro); color: var(--azul-claro); }
.paginacao .ativo { background: var(--azul-claro); border-color: var(--azul-claro); color: #fff; }
.paginacao .reticencias { border: none; background: none; }
.paginacao .desativado { opacity: .4; pointer-events: none; }
.paginacao svg { width: 16px; height: 16px; }

/* ---- Detalhe do cliente / fichas ---- */
.ficha-topo { display: flex; align-items: center; justify-content: space-between; gap: 16px; background: var(--superficie); border: 1px solid var(--borda); border-radius: 14px; box-shadow: var(--sombra); padding: 20px 22px; margin-bottom: 18px; }
.ficha-ident { display: flex; align-items: center; gap: 15px; }
.ficha-ident .avatar { width: 56px; height: 56px; font-size: 19px; background: var(--teal-bg); color: var(--azul-claro); }
.ficha-nome { font-size: 21px; font-weight: 400; color: var(--texto); display: flex; align-items: center; gap: 10px; }
.ficha-sub { color: var(--suave); font-size: 13px; margin-top: 3px; }
.ficha-acoes { display: flex; gap: 10px; }
.drop { position: relative; }
details.drop > summary { list-style: none; }
details.drop > summary::-webkit-details-marker { display: none; }

.ficha-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; margin-bottom: 18px; }
@media (max-width: 900px) { .ficha-grid { grid-template-columns: 1fr; } }
.bloco-icone { display: flex; align-items: center; gap: 9px; }
.bloco-icone svg { width: 18px; height: 18px; color: var(--azul-claro); }
.bloco-cab { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 6px; }
.info-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px 20px; }
@media (max-width: 640px) { .info-grid { grid-template-columns: 1fr; } }
.info-linha { display: flex; flex-direction: column; gap: 2px; font-size: 13.5px; }
.info-linha .il-rot { color: var(--suave); font-size: 11.5px; }
.info-linha .il-val { color: var(--texto); cursor: text; border-radius: 4px; padding: 1px 4px; margin: -1px -4px; width: fit-content; max-width: 100%; }
.info-linha .il-val-vazio:hover { background: var(--linha-hover); }
.info-linha .il-val-input { font: inherit; padding: 3px 6px; border: 1px solid var(--azul-claro); border-radius: 4px; background: var(--superficie); color: var(--texto); width: 100%; max-width: 260px; }
.info-linha .il-val-select { font: inherit; padding: 3px 6px; border: 1px solid var(--azul-claro); border-radius: 4px; background: var(--superficie); color: var(--texto); }
.info-linha .il-val-grupo { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.il-whats-inline { display: flex; align-items: center; gap: 5px; font-size: 12.5px; color: var(--suave); white-space: nowrap; }
.badge-ok { display: inline-block; background: #e4f6ec; color: #1a8a52; padding: 2px 10px; border-radius: 20px; font-size: 12px; font-weight: 600; }

.resumo-fin { display: flex; align-items: center; gap: 22px; flex-wrap: wrap; }
.rf-icone { width: 48px; height: 48px; border-radius: 50%; background: #e4f6ec; color: var(--verde); display: flex; align-items: center; justify-content: center; flex: none; }
.rf-icone svg { width: 22px; height: 22px; }
.rf-tit strong { display: block; color: var(--texto); }
.rf-tit small { color: var(--suave); font-size: 12.5px; }
.rf-metricas { display: flex; gap: 32px; margin-left: 14px; }
.rf-metrica { display: flex; flex-direction: column; }
.rf-metrica .rf-rot { color: var(--suave); font-size: 12.5px; }
.rf-metrica .rf-val { font-size: 20px; font-weight: 700; }
.resumo-fin > .btn { margin-left: auto; }

.proto-badge { font-weight: 700; font-size: 11.5px; letter-spacing: .02em; }
.tabela-rolavel { overflow-x: auto; }

@media (max-width: 680px) {
    .tabela-resp { min-width: 0 !important; }
    .tabela-resp, .tabela-resp tbody, .tabela-resp tr, .tabela-resp td { display: block; width: 100%; }
    .tabela-resp thead { display: none; }
    .tabela-resp tr { border: 1px solid var(--borda); border-radius: 10px; padding: 12px 14px; margin-bottom: 10px; }
    .tabela-resp tbody tr:nth-child(even) td { background: transparent; }
    .tabela-resp td { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 7px 0; border-bottom: 1px dashed var(--borda); text-align: right; }
    .tabela-resp td:last-child { border-bottom: none; }
    .tabela-resp td[data-label]:not([data-label=""])::before { content: attr(data-label); font-size: 11px; text-transform: uppercase; letter-spacing: .04em; font-weight: 700; color: var(--suave); text-align: left; }
    .tabela-resp td[data-label=""] { justify-content: flex-end; padding-top: 12px; }
    .tabela-resp td[data-label="Nome"] { flex-direction: column; align-items: flex-start; text-align: left; }
}
.tabela td.num { text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }
.seta-cel { color: var(--suave); width: 30px; }
.seta-cel svg { width: 16px; height: 16px; }
.ver-todos-rodape { text-align: center; margin-top: 14px; }
.ver-todos-rodape a { font-weight: 700; }

/* ---- Formulário em cards (cliente) ---- */
.form-cards { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; margin-bottom: 16px; }
@media (max-width: 900px) { .form-cards { grid-template-columns: 1fr; } }
.obg { color: var(--vermelho); }
.radio-linha { display: flex; gap: 22px; padding: 7px 0 2px; }
.radio-op { display: inline-flex; align-items: center; gap: 7px; font-weight: 400; font-size: 14px; color: var(--texto); margin: 0; cursor: pointer; }
.radio-op input { width: auto; }
.check-inline { display: inline-flex; align-items: center; gap: 7px; font-weight: 400; font-size: 13px; margin-top: 8px; color: var(--suave); }
.check-inline input { width: auto; }
.campo-busca .lupa-dir { left: auto; right: 13px; }
.campo-busca:has(.lupa-dir) input:not([type=checkbox]):not([type=radio]):not([type=submit]) { padding-left: 11px; padding-right: 38px; }
.nota-form { display: flex; gap: 11px; align-items: flex-start; background: var(--teal-bg); border: 1px solid var(--borda); color: var(--texto); border-radius: 12px; padding: 13px 16px; font-size: 13px; }
.nota-form svg { width: 18px; height: 18px; color: var(--azul-claro); flex: none; margin-top: 1px; }

/* ---- Financeiro: barra de meses e rodapé de indicadores ---- */
.sub-proto { color: var(--suave); font-size: 11.5px; margin-top: 2px; }
.acoes-fin { display: flex; align-items: center; gap: 6px; justify-content: flex-end; }
.fin-kpi { flex: 1 1 160px; background: var(--superficie); border: 1px solid var(--borda); border-radius: 14px; box-shadow: var(--sombra); padding: 14px 16px; display: flex; align-items: center; gap: 12px; }

/* ---- Nova cobrança ---- */
.trilha { display: flex; align-items: center; flex-wrap: wrap; gap: 7px; font-size: 12.5px; color: #9aa4b2; font-weight: 400; margin-bottom: 14px; }
.trilha a { color: #9aa4b2; font-weight: 400; }
.trilha a:hover { text-decoration: underline; }
.trilha .sep { color: #c7cedb; }
.trilha .atual { color: #9aa4b2; font-weight: 400; }
/* Botão "···" da trilha compacta do navegador de arquivos (Carlos,
   25/08/2026, "opção 2" dos layouts sugeridos) — some com o meio do
   caminho quando há mais de 2 níveis, clicável pra expandir a trilha
   inteira de novo. */
.trilha-colapso {
    border: 1px solid var(--borda, #d8dee9); background: var(--superficie, #fff);
    color: #9aa4b2; font-size: 12px; line-height: 1; padding: 2px 7px; border-radius: 5px;
    cursor: pointer; font-family: inherit;
}
.trilha-colapso:hover { background: var(--cinza-bg, #f1f4f9); color: var(--texto, #1f2a3d); }
/* Ponto de extensão da trilha (ex.: engrenagem de casos/detalhe.php) —
   empurra pro fim da mesma linha, não pra baixo dela. */
.trilha-acoes-extra { margin-left: auto; display: flex; align-items: center; }
.secao-num { display: flex; align-items: center; gap: 9px; font-weight: 700; color: var(--texto); font-size: 14px; margin: 0 0 14px; }
.secao-num svg { width: 18px; height: 18px; color: var(--azul-claro); }
hr.divisor { border: none; border-top: 1px solid var(--borda); margin: 22px 0; }
/* #bloco-valores na especificidade é necessário: ".bloco h3" (mais abaixo
   neste arquivo) também bate aqui e vencia o espaçamento por vir depois no
   arquivo — o título ficava colado na inputbox de valor acima (Carlos,
   21/07/2026). */
#bloco-valores h3.parcelas-titulo { font-size: 14px; font-weight: 700; color: var(--texto); margin: 32px 0 8px; }
.cobranca-parcelas td, .cobranca-parcelas th { padding: 8px 12px; }
.cobranca-parcelas .p-num { font-weight: 600; color: var(--suave); }
.cobranca-parcelas input:not([type=checkbox]):not([type=radio]):not([type=submit]) { max-width: 240px; }
/* À vista: a coluna "Parcela" fica sem sentido (é um pagamento único) — o
   cabeçalho já ficava sem texto, mas a coluna (14% de largura) continuava
   reservando o espaço vazia, empurrando Vencimento/Valor pra direita
   (Carlos, 18/08/2026). */
.cobranca-parcelas.parcela-oculta col:first-child { display: none; }
.cobranca-parcelas.parcela-oculta th:first-child,
.cobranca-parcelas.parcela-oculta td.p-num { display: none; }
.cobranca-total { margin-top: 14px; padding: 12px 16px; background: var(--teal-bg); border-radius: 10px; font-size: 14px; color: var(--texto); }
.cobranca-total strong { color: var(--azul-claro); font-size: 15px; margin-left: 4px; }

/* ---- Formulários ---- */
input:not([type=checkbox]):not([type=radio]):not([type=submit]):not(.campo-busca-novo):not(.campo-senha-gov-inline), select, textarea {
    width: 100%; padding: 9px 11px; border: 1px solid var(--borda); border-radius: var(--radius);
    font-size: 14px; font-family: inherit; background: var(--superficie); color: var(--texto);
    transition: border-color .4s cubic-bezier(.34,1.56,.64,1);
}
/* Padrão de foco do sistema inteiro: só a borda azul, sem glow acinzentado,
   com uma transição elástica (assenta suave, com leve exagero no final) em
   vez de trocar instantâneo. Carlos, 27/07/2026: "gosto dessa borda azul, o
   que não me agrada é o efeito cinza que vem junto... [opção 9] implemente
   como padrão para todo o sistema" — escolhida entre 10 alternativas
   mostradas no chat. */
input:not([type=checkbox]):not([type=radio]):not([type=submit]):not(.campo-busca-novo):not(.campo-senha-gov-inline):hover:not(:disabled),
select:hover:not(:disabled),
textarea:hover:not(:disabled) { border-color: var(--azul-claro); }
input:focus, select:focus, textarea:focus { outline: none; border-color: var(--azul-claro); }
.form-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px 18px; }
.form-grid .full { grid-column: 1 / -1; }
.bloco { background: var(--superficie); border: 1px solid var(--borda); border-radius: 14px; padding: 20px; margin-bottom: 18px; box-shadow: var(--sombra); }
.bloco h3 { margin: 0 0 16px; font-size: 15px; color: var(--azul); font-weight: 600; }

/* Blocos recolhíveis (relatorios/index.php) — <details>/<summary> nativos,
   fechados por padrão; o conteúdo só chega via AJAX na primeira abertura
   (ver script inline da view). Carlos, 27/07/2026: "ambos os blocos serão
   recolhíveis e devem aparecer encolhidos já na abertura da tela". */
.bloco-recolhivel > summary { display: flex; align-items: center; gap: 8px; cursor: pointer; list-style: none; user-select: none; }
.bloco-recolhivel > summary::-webkit-details-marker { display: none; }
.bloco-recolhivel > summary h3 { margin: 0; }
.bloco-recolhivel-seta { width: 15px; height: 15px; flex: none; color: var(--suave); transition: transform .15s; }
.bloco-recolhivel[open] > summary .bloco-recolhivel-seta { transform: rotate(90deg); }
.bloco-recolhivel[open] > summary { margin-bottom: 16px; }
.bloco-recolhivel-corpo { animation: blocoRecolhivelSurge .18s ease; }
@keyframes blocoRecolhivelSurge { from { opacity: 0; } to { opacity: 1; } }
.bloco-recolhivel-loading { display: flex; align-items: center; justify-content: center; gap: 8px; color: var(--suave); font-size: 13px; padding: 24px 0; text-align: center; }
.bloco-recolhivel-spinner { width: 16px; height: 16px; animation: busca-spin .8s linear infinite; }
.bloco-sub + .bloco-sub { margin-top: 22px; }
.bloco-sub h4 { margin: 0 0 10px; font-size: 13px; color: var(--texto); font-weight: 600; }
/* ---- Bloco de Produtividade (relatórios) — cards, mini-gráficos de barra
   (div, sem lib externa) e pizza via conic-gradient (Carlos, 21/08/2026:
   prints de referência de "Processos por Estágio", "Processos por
   Fase"/"Mix por Tipo de Ação", "Distribuição por Categoria", "Indicadores
   de Protocolo" e "Protocolados × Arquivados"/"Últimos Protocolos"/
   "Pipeline"). ---- */
.prod-card { background: var(--superficie); border: 1px solid var(--borda); border-radius: 12px; padding: 16px 18px; margin-bottom: 16px; box-shadow: var(--sombra); }
.prod-card-estagios { border-top: 3px solid var(--azul-claro); }
.prod-card-titulo { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--suave); margin-bottom: 14px; }
.prod-card-subtitulo { font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--suave); margin: 16px 0 10px; }
.prod-duas-col { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
@media (max-width: 860px) { .prod-duas-col { grid-template-columns: 1fr; } }
.prod-estagios-linha { display: flex; justify-content: space-around; text-align: center; gap: 10px; flex-wrap: wrap; }
.prod-estagio-num { font-size: 30px; font-weight: 700; line-height: 1.1; }
.prod-estagio-rotulo { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: .03em; color: var(--suave); margin-top: 4px; }
.prod-estagio-nota { font-size: 11px; color: #7c4dbd; margin-top: 2px; }
.prod-estagios-resumo { text-align: center; font-size: 12.5px; color: var(--suave); margin-top: 16px; padding-top: 12px; border-top: 1px solid var(--borda); }
/* Gráfico de barras simples (divs com height%, sem SVG/lib). */
.prod-barras { display: flex; align-items: flex-end; gap: 8px; height: 160px; padding: 0 4px; }
.prod-barra-col { flex: 1 1 0; display: flex; flex-direction: column; align-items: center; justify-content: flex-end; height: 100%; min-width: 0; }
.prod-barra-valor { font-size: 11px; font-weight: 700; color: var(--texto); margin-bottom: 4px; }
.prod-barra { width: 60%; border-radius: 4px 4px 0 0; min-height: 2px; transition: height .2s; }
.prod-barra-rotulo { font-size: 10px; color: var(--suave); margin-top: 6px; white-space: nowrap; }
.prod-barra-dupla-par { display: flex; align-items: flex-end; gap: 3px; width: 100%; height: 100%; justify-content: center; }
.prod-barra-fina { width: 30%; }
.prod-barras-dupla { height: 140px; }
.prod-legenda-dupla { display: flex; gap: 16px; font-size: 12px; color: var(--suave); margin-bottom: 10px; }
/* Pizza via conic-gradient — leve, sem depender de canvas/SVG externo. */
.prod-pizza-linha { display: flex; align-items: center; gap: 20px; flex-wrap: wrap; }
.prod-pizza { width: 130px; height: 130px; border-radius: 50%; flex: none; }
.prod-pizza-legenda { display: flex; flex-direction: column; gap: 6px; font-size: 12.5px; color: var(--texto); }
.prod-pizza-item { display: flex; align-items: center; gap: 7px; }
.prod-pizza-bolinha { width: 10px; height: 10px; border-radius: 50%; flex: none; display: inline-block; }
/* Lista "Distribuição por Categoria" — rótulo+número numa linha, barra fina
   embaixo (mesmo idioma visual do .barra já usado em "Casos por status",
   só que colorido por categoria). */
.prod-categoria-lista { display: flex; flex-direction: column; gap: 10px; }
.prod-categoria-linha { display: flex; justify-content: space-between; align-items: baseline; font-size: 13px; }
.prod-categoria-rotulo { color: var(--texto); }
.prod-categoria-num { font-weight: 700; color: var(--texto); }
.prod-categoria-barra-trilha { height: 5px; background: var(--teal-bg); border-radius: 3px; margin-top: -4px; overflow: hidden; }
.prod-categoria-barra { height: 100%; border-radius: 3px; }
/* Mini-cards (Indicadores de Protocolo / Pipeline). */
.prod-mini-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 12px; }
.prod-mini-card { background: var(--cinza-bg); border: 1px solid var(--borda); border-top: 3px solid var(--azul-claro); border-radius: 10px; padding: 12px 14px; }
.prod-mini-rotulo { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--suave); }
.prod-mini-num { font-size: 22px; font-weight: 700; color: var(--texto); margin-top: 4px; }
.prod-mini-sub { font-size: 11px; color: var(--suave); margin-top: 2px; }
.prod-pipeline-titulo { margin-top: 4px; }
/* Ranking "Últimos Protocolos". */
.prod-ranking { display: flex; flex-direction: column; gap: 10px; max-height: 320px; overflow-y: auto; }
.prod-ranking-item { display: flex; align-items: center; gap: 10px; }
.prod-ranking-num { flex: none; width: 20px; height: 20px; border-radius: 50%; background: var(--azul-claro); color: #fff; font-size: 10.5px; font-weight: 700; display: flex; align-items: center; justify-content: center; }
.prod-ranking-corpo { flex: 1 1 auto; min-width: 0; }
.prod-ranking-nome { font-size: 12.5px; font-weight: 600; color: var(--texto); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.prod-ranking-area { font-size: 11px; color: var(--suave); }
.prod-ranking-data { flex: none; font-size: 11.5px; color: #1e8449; font-weight: 600; }
/* Funil do escritório — barras horizontais, largura proporcional ao valor. */
.prod-funil { display: flex; flex-direction: column; gap: 14px; }
.prod-funil-linha { display: grid; grid-template-columns: 150px 1fr 44px; align-items: center; gap: 12px; }
.prod-funil-rotulo { font-size: 13px; color: var(--texto); text-align: right; }
.prod-funil-barra-trilha { height: 34px; }
.prod-funil-barra { height: 100%; border-radius: 6px; min-width: 8px; transition: width .2s; }
.prod-funil-num { font-size: 13.5px; font-weight: 700; }
/* Listas "Aguardando Protocolo" / "Últimos Arquivados" — faixa colorida na
   lateral do card (vermelho = atenção/atraso, verde = concluído) e cada
   linha nome + subtítulo à esquerda, valor em destaque à direita. */
.prod-card-listra-vermelha { border-left: 3px solid var(--vermelho); }
.prod-card-listra-verde { border-left: 3px solid var(--verde); }
.prod-lista-nomes { display: flex; flex-direction: column; max-height: 420px; overflow-y: auto; }
.prod-lista-linha { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 8px 4px; border-bottom: 1px solid var(--borda); }
.prod-lista-linha:last-child { border-bottom: none; }
.prod-lista-corpo { min-width: 0; }
.prod-lista-nome { font-size: 12.5px; font-weight: 600; color: var(--texto); }
.prod-lista-sub { font-size: 11px; color: var(--suave); margin-top: 1px; }
.prod-lista-valor { flex: none; font-size: 12.5px; font-weight: 700; }
.prod-lista-valor-vermelho { color: var(--vermelho); }
.prod-lista-valor-laranja { color: #b5490f; }
.prod-card-nota { font-size: 11px; color: var(--suave); margin-top: 8px; }
/* Ranking por Área (bloco Financeiro) — um mini-card por área, com duas
   colunas (melhores/piores) reaproveitando o selo numerado .prod-ranking-num. */
.fin-ranking-areas { display: flex; flex-direction: column; gap: 14px; }
.fin-ranking-area-card { border: 1px solid var(--borda); border-radius: 10px; padding: 12px 14px; }
.fin-ranking-area-titulo { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .03em; color: var(--suave); margin-bottom: 10px; }
.fin-ranking-duas-col { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
@media (max-width: 700px) { .fin-ranking-duas-col { grid-template-columns: 1fr; } }
.fin-ranking-sub { font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .03em; margin-bottom: 6px; }
.fin-ranking-sub-verde { color: var(--verde); }
.fin-ranking-sub-laranja { color: #b5490f; }
.fin-ranking-linha { display: flex; align-items: center; gap: 8px; padding: 4px 0; }
.fin-ranking-nome { flex: 1 1 auto; min-width: 0; font-size: 12.5px; font-weight: 600; color: var(--texto); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fin-ranking-valor { flex: none; font-size: 12.5px; font-weight: 700; }
.fin-ranking-valor-verde { color: var(--verde); }
.fin-ranking-valor-laranja { color: #b5490f; }
label { display: block; font-size: 13px; font-weight: 600; margin-bottom: 4px; color: #4b5a62; }
.acoes { display: flex; gap: 10px; margin-top: 8px; }

/* ---- Atividade do caso: Painel de recados + Linha do tempo (casos/detalhe.php) ----
   Um só bloco, os dois LADO A LADO (Carlos, 12/08/2026: primeiro pediu abas,
   depois voltou atrás: "eles nao devem aparecer em abas, más sum um do lado
   do outro"). Linha do tempo migrada de app/Views/casos/detalhe.php (antes em
   <style> inline); Painel de recados é o antigo "Conversas do caso",
   redesenhado com avatar do autor e opção de responder um recado. */
.caso-atividade-split { display: flex; gap: 24px; align-items: flex-start; }
.caso-atividade-col { flex: 1 1 0; min-width: 0; }
.caso-atividade-col-titulo { display: flex; align-items: center; gap: 7px; font-size: 13px; font-weight: 600; color: var(--texto); margin: 0 0 14px; }
.caso-atividade-col-titulo svg { width: 16px; height: 16px; flex: none; color: var(--azul-claro); }
@media (max-width: 760px) {
    .caso-atividade-split { flex-direction: column; gap: 22px; }
}

/* Ícone por categoria em vez do pontinho genérico — mesmas cores usadas no
   sino de notificações (novidade_icone()/sino-item-ic-*), pra bater o olho
   entre os dois (Carlos, 12/08/2026, opção 1 dos 3 exemplos de layout). */
.caso-timeline { display: flex; flex-direction: column; overflow-x: hidden; }
/* Layout de linhas com zebra (Carlos, 27/08/2026: "faça linhas e implante o
   layout zebra") — cada movimento é uma linha inteira (ícone + corpo juntos,
   não só o texto), com divisória embaixo e fundo alternado; troca o visual
   de "timeline contínua" por um de lista/tabela, mais fácil de escanear
   numa lista longa. */
/* Agrupamento por data — cada dia nasce recolhido (só o cabeçalho), expande
   pra mostrar as movimentações daquele dia (Carlos, 01/09/2026: "exibir as
   movimentações por data, a data vai estar recolhida, quando expandido vai
   aparecer todas as movimentações daquela data"). */
.caso-timeline-grupo-data { border-bottom: 1px solid var(--borda); }
.caso-timeline-grupo-data:last-child { border-bottom: none; }
.caso-timeline-data-header { display: flex; align-items: center; gap: 8px; width: 100%; background: none; border: none; padding: 10px; margin: 0; cursor: pointer; font-family: inherit; text-align: left; }
.caso-timeline-data-header:hover { background: rgba(0,0,0,.03); }
.caso-timeline-data-header-seta { flex: none; color: var(--suave); transition: transform .15s; }
.caso-timeline-grupo-data.aberto .caso-timeline-data-header-seta { transform: rotate(90deg); }
.caso-timeline-data-header-data { font-size: 13px; font-weight: 700; color: var(--texto); }
.caso-timeline-data-header-contagem { font-size: 11.5px; color: var(--suave); margin-left: auto; }
.caso-timeline-grupo-corpo { display: none; }
.caso-timeline-grupo-data.aberto .caso-timeline-grupo-corpo { display: block; }
/* Grupo sem nenhum item visível (tudo filtrado por chip/busca/ocultos) —
   ver atualizarVisibilidadeGruposTimeline() no JS. */
.caso-timeline-grupo-data.tl-grupo-vazio { display: none; }
[data-tema="escuro"] .caso-timeline-data-header:hover { background: rgba(255,255,255,.04); }
/* --tl-linha-bg acompanha o background REAL da linha em cada estado (base/
   zebra/hover) — usado pelo fade atrás dos ícones flutuantes (ver
   .caso-timeline-icones-flutuantes::before mais abaixo), senão o gradiente
   ficaria com uma cor fixa errada quando a linha é zebrada ou está em hover. */
.caso-timeline-item { display: flex; gap: 12px; padding: 10px; border-bottom: 1px solid var(--borda); transition: background .12s; --tl-linha-bg: var(--superficie); }
.caso-timeline-item:last-child { border-bottom: none; }
/* Mesmas cores da zebra do financeiro (Carlos, 27/08/2026: "quero que vc
   copie as mesmas cores do financeiro") — ver #grade-fin .zebra / :hover em
   financeiro/grade.php. */
.caso-timeline-item:nth-child(even) { background: #f7f9fc; --tl-linha-bg: #f7f9fc; }
.caso-timeline-item:hover { background: #e1e6ef; --tl-linha-bg: #e1e6ef; }
/* Data à esquerda da timeline — DD/MM/AA em cima, horário embaixo (Carlos,
   27/08/2026: "coloca a data do lado esquerdo da timeline... o horario pode
   colocar na linha de baixo"). Largura fixa pra toda linha alinhar certinho
   independente do tamanho da data. */
.caso-timeline-data-col { flex: none; width: 46px; padding-top: 1px; text-align: right; }
.tl-data-dia { display: block; font-size: 12px; color: var(--texto); }
.tl-data-hora { display: block; font-size: 12px; color: var(--suave); }
.caso-timeline-icone-col { display: flex; flex-direction: column; align-items: center; flex: none; }
/* 26px -> 32px (Carlos, 01/09/2026: "aumente o tamanho dos icones"). */
.caso-timeline-icone { width: 32px; height: 32px; border-radius: 50%; display: flex; align-items: center; justify-content: center; flex: none; }
.caso-timeline-icone svg { width: 16px; height: 16px; }
/* Sigla por extenso (DJEN/DataJud) em vez de ícone de linha — mais didático
   que uma abreviação de 2-3 letras (Carlos, 01/09/2026: "O icone DJ, pode
   virar DJEN, DTJ pode ser DataJud"). Não cabe no círculo padrão — DJEN vira
   uma pílula com largura automática em vez de círculo fixo. */
/* Texto ainda pequeno demais pra ler bem (Carlos, 01/09/2026: "a escrita
   nos icones ainda são muito pequenas, aumente"). */
.caso-timeline-icone-sigla { font-size: 11.5px; font-weight: 800; letter-spacing: .1px; line-height: 1; white-space: nowrap; }
.caso-timeline-icone-djen, .caso-timeline-icone-eproc { width: auto; min-width: 32px; padding: 0 8px; border-radius: 16px; }
/* DataJud em 2 linhas ("Data"/"Jud") — o círculo de 32px ainda obrigava um
   texto pequeno demais pra 2 linhas (Carlos, 01/09/2026: "DATAJUD ainda é
   pequeno, dificil de ler, aumente"). Vira oval (mais alto que largo) em vez
   de espremer num círculo perfeito, com fonte bem maior. */
.caso-timeline-icone-datajud { width: 36px; height: 40px; border-radius: 18px; }
.caso-timeline-icone-sigla-2l { white-space: normal; text-align: center; font-size: 11px; }
/* 4 categorias (Carlos, 24/08/2026: "diferencie todos eles com icones
   diferenciados") — sistema=roxo (era "caso"), eproc=azul-marinho (cor
   própria, não confundir com documento), atividade=verde (nota/documento
   como variação do mesmo ícone-base), financeiro=dourado. */
.caso-timeline-icone-sistema img { width: 24px; height: 24px; }
.caso-timeline-icone-eproc      { background: #e3e9fb; color: #3949ab; }
/* DJEN nunca tinha cor própria (caía no cinza padrão, igual "sem categoria")
   — ficava indistinguível de eproc/datajud numa lista rápida (Carlos,
   01/09/2026: "preciso destacar o que é DJEN e Datajud"). */
.caso-timeline-icone-djen       { background: #fdeef1; color: #b0356b; }
/* Verde — a logo de verdade do DataJud é esverdeada (Carlos, 01/09/2026:
   "datajud usa uma logo esverdeada, então troque as cores do datajud pra
   verde"). Tom mais fechado/azulado que "atividade" (#1a9e63) pra não
   confundir as duas categorias. */
.caso-timeline-icone-datajud    { background: #d9f3e9; color: #0e7c5a; }
.caso-timeline-icone-atividade  { background: #dcf3e8; color: #1a9e63; }
.caso-timeline-icone-financeiro { background: #fdf1d6; color: #b8860b; }
.caso-timeline-linha { width: 2px; flex: 1; min-height: 12px; background: var(--borda); margin-top: 2px; }
/* flex: 1 — sem isso o corpo fica do tamanho do próprio texto (shrink-to-fit)
   em vez de esticar até a borda direita da linha, e os ícones alinhados à
   direita (justify-content:flex-end) ficavam presos logo após o texto em
   vez de na extremidade de verdade (Carlos, 01/09/2026: "os icones não
   estão posissionados na extremidade direita da linha"). */
.caso-timeline-corpo { min-width: 0; flex: 1 1 auto; position: relative; }
.caso-timeline-texto { font-size: 12.5px; color: var(--texto); flex: 1; min-width: 0; }
/* Registro recolhível — colapsado corta em 2 linhas; expandido (.tl-expandido
   no .caso-timeline-item) mostra o texto inteiro + o painel de detalhes
   (Carlos, 01/09/2026: "quero que vc faça os registros recolhiveis, quando
   expandidos deve mostrar TODO o conteúdo possivel de obter naquele
   movimento"). */
.caso-timeline-texto-linha { display: flex; align-items: flex-start; gap: 6px; }
.caso-timeline-item:not(.tl-expandido) .caso-timeline-texto { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.tl-expandir-btn { flex: none; background: none; border: none; padding: 2px; margin-top: 1px; color: var(--suave); opacity: .6; cursor: pointer; border-radius: 4px; transition: transform .15s; }
.tl-expandir-btn:hover { opacity: 1; color: var(--azul-claro); background: rgba(0,0,0,.06); }
.caso-timeline-item.tl-expandido .tl-expandir-btn { transform: rotate(180deg); }
.caso-timeline-detalhes { display: none; flex-direction: column; gap: 3px; margin-top: 6px; padding: 8px 10px; border-radius: 7px; background: rgba(0,0,0,.03); font-size: 11.5px; }
.caso-timeline-item.tl-expandido .caso-timeline-detalhes { display: flex; }
.caso-timeline-detalhe-linha { display: flex; gap: 6px; }
.caso-timeline-detalhe-rot { flex: none; min-width: 110px; font-weight: 600; color: var(--suave); }
.caso-timeline-detalhe-linha a { color: var(--azul-claro); }
[data-tema="escuro"] .caso-timeline-detalhes { background: rgba(255,255,255,.05); }
/* IA + destaque + "..." flutuam sobrepostos no canto superior direito, fora
   do fluxo normal — o texto do movimento passa a começar direto no topo,
   sem uma linha própria reservada pros ícones; se o texto for longo o
   bastante, os ícones ficam por CIMA dele (Carlos, 01/09/2026: "prefiro que
   o texto inicie na mesma linha e os icones fiquem sobrepostos ao texto,
   caso algum texto chegue até lá"). */
.caso-timeline-icones-flutuantes { position: absolute; top: -3px; right: 0; z-index: 2; display: flex; align-items: center; gap: 6px; }
/* Fade atrás dos ícones — evita o texto "vazando" por trás deles quando é
   longo o bastante pra alcançar ali; a cor acompanha --tl-linha-bg (base/
   zebra/hover) pra não destoar da linha (Carlos, 01/09/2026: "pode exibir
   um tipo de fade, pra ocultar o texto ali na região dos icones"). Mais
   largo que os ícones em si e um pouco mais alto, cobrindo a 1ª linha do
   texto por baixo. */
.caso-timeline-icones-flutuantes::before {
    content: '';
    position: absolute;
    top: -4px; bottom: -6px; right: -6px; left: -22px;
    z-index: -1;
    background: linear-gradient(to left, var(--tl-linha-bg) 60%, transparent);
}
.caso-timeline-rodape { display: flex; align-items: center; gap: 10px; margin-top: 2px; }
.caso-timeline-data { font-size: 11px; color: var(--suave); }
/* Ícones de ação (ocultar/excluir/IA) mais fortes — opacity .45 deixava eles
   quase invisíveis (Carlos, 01/09/2026: "os icones de deletar e ocultar,
   devem ficar um pouco mais fortes, esta dificil visualizalos"). */
.caso-timeline-excluir-btn { background: none; border: none; padding: 3px; margin: 0; display: inline-flex; color: var(--texto); opacity: .55; cursor: pointer; border-radius: 4px; }
.caso-timeline-excluir-btn:hover { opacity: 1; color: var(--vermelho); background: var(--vermelho-fraco, rgba(209,67,67,.1)); }
.caso-timeline-ocultar-btn { background: none; border: none; padding: 3px; margin: 0; display: inline-flex; color: var(--texto); opacity: .55; cursor: pointer; border-radius: 4px; }
.caso-timeline-ocultar-btn:hover { opacity: 1; color: var(--azul); background: rgba(0,0,0,.06); }
/* Ícone de IA — indica se este movimento entra na leitura da IA (petições
   etc.). Ligado (padrão) = cor normal; desligado = esmaecido + traço,
   deixando claro que a IA está IGNORANDO esse movimento (Carlos,
   01/09/2026: "quando habilitado a IA irá ler esse movimento, quando
   desabilitado a IA nao irá ler esse movimento"). */
.caso-timeline-ia-btn { background: none; border: none; padding: 3px; margin: 0; display: inline-flex; color: var(--texto); opacity: .55; cursor: pointer; border-radius: 4px; }
.caso-timeline-ia-btn:hover { opacity: 1; color: var(--azul-claro); background: rgba(0,0,0,.06); }
/* Ligada = verde (Carlos, 01/09/2026: "quando a IA puder ler o movimento,
   quero que vc identifique o icone de IA em verde"). */
.caso-timeline-ia-btn.tl-ia-ligada { color: #1a9e63; opacity: .8; }
.caso-timeline-ia-btn.tl-ia-ligada:hover { opacity: 1; color: #1a9e63; background: rgba(26,158,99,.1); }
.caso-timeline-ia-btn.tl-ia-desligada { color: var(--suave); opacity: .35; position: relative; }
.caso-timeline-ia-btn.tl-ia-desligada::after { content: ''; position: absolute; left: 2px; right: 2px; top: 50%; height: 1.4px; background: currentColor; transform: rotate(-45deg); }
/* Toast do ocultar/restaurar sem reload (Carlos, 27/08/2026). */
.tl-toast { position: fixed; left: 50%; bottom: 26px; transform: translate(-50%,14px); z-index: 1100; background: var(--azul); color: #fff; font-size: 13.5px; font-family: inherit; padding: 11px 18px; border-radius: 9px; box-shadow: 0 8px 26px rgba(20,40,80,.28); opacity: 0; transition: opacity .28s ease, transform .28s ease; max-width: 90vw; }
.tl-toast.vis { opacity: 1; transform: translate(-50%,0); }
.tl-toast.erro { background: var(--vermelho); }
/* Data (+ "Seq. N" pro eproc) em cima, descrição embaixo — qualquer
   categoria (rodape reaproveitado, só invertida a ordem no DOM), Carlos,
   27/08/2026. */
.caso-timeline-cabecalho { margin-top: 0; margin-bottom: 3px; }
/* Botão "..." (mais opções) — substitui os ícones de ocultar/excluir que
   ficavam sempre visíveis; agora abrem um menu (Carlos, 01/09/2026: "crie
   também um icone de 3 pontinhos e coloque dentro dele as opções de
   ocultar e apagar"). */
.caso-timeline-menu-btn { background: none; border: none; padding: 3px; margin: 0; display: inline-flex; color: var(--texto); opacity: .55; cursor: pointer; border-radius: 4px; }
.caso-timeline-menu-btn:hover { opacity: 1; color: var(--azul-claro); background: rgba(0,0,0,.06); }
/* Anotação de destaque (ex.: "Termo inicial da prescrição") — canto superior
   direito da linha, cor à escolha (Carlos, 01/09/2026). */
.tl-destaque-badge { display: inline-flex; align-items: center; gap: 4px; border: none; border-radius: 5px; padding: 2px 7px; font-size: 10.5px; font-weight: 700; font-family: inherit; cursor: pointer; white-space: nowrap; }
/* Sempre visível — só aparecia no hover, o que escondia a função de quem
   não passasse o mouse ali (Carlos, 01/09/2026: "o icone de marcar o
   movimento, só aparece no over, corrija isso"). */
.tl-destaque-add-btn { display: inline-flex; align-items: center; justify-content: center; background: none; border: none; padding: 2px; color: var(--suave); opacity: .55; cursor: pointer; border-radius: 4px; }
.tl-destaque-add-btn:hover { opacity: 1; color: var(--azul-claro); background: rgba(0,0,0,.06); }
.tl-destaque-pop { z-index: 1200; background: var(--superficie); border: 1px solid var(--borda); border-radius: 10px; box-shadow: 0 10px 30px rgba(20,40,80,.22); padding: 10px; width: 240px; }
.tl-destaque-pop input[type="text"] { width: 100%; box-sizing: border-box; margin-bottom: 8px; }
.tl-destaque-cores { display: flex; gap: 6px; margin-bottom: 10px; }
.tl-destaque-swatch { width: 20px; height: 20px; border-radius: 50%; border: 2px solid transparent; cursor: pointer; padding: 0; }
.tl-destaque-swatch.sel { border-color: var(--texto); }
.tl-destaque-pop-acoes { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
/* Botões de ação (ocultar/excluir) alinhados à direita, canto inferior do
   item (Carlos, 27/08/2026: "quando movemos a data pro outro lado, os
   icones de ocultar e deletar ficaram deslocados, coloqueos alinhados a
   direito no canto inferior"). */
.caso-timeline-acoes { display: flex; justify-content: flex-end; gap: 4px; margin-top: 4px; }
.caso-timeline-cabecalho .caso-timeline-data { font-weight: 600; }
/* Efeito de hover em cada movimento (Carlos, 27/08/2026: "crie também um
   efeito de over pra cada movimento") — agora aplicado na LINHA inteira
   (.caso-timeline-item, ver acima), não só no corpo; cursor de contexto
   porque o botão direito abre o menu de ocultar/editar/excluir. */
.caso-timeline-corpo { cursor: context-menu; }
.tl-acao { background: none; border: none; padding: 0; font-family: inherit; font-size: 11px; font-weight: 600; color: var(--azul-claro); cursor: pointer; text-decoration: underline; }
.tl-form-inline { display: inline; }
.tl-form-editar { margin-top: 8px; }
/* "Ocultar"/"Editar" só pelo menu de contexto (botão direito) — sem botão
   visível no rodapé (Carlos, 24/08/2026: "a opção ocultar deve aparecer
   somente se eu clicar com o botão direito"). context-menu no cursor é o
   sinal visual de que dá pra clicar com o direito ali. */
.tl-clicavel-direito { cursor: context-menu; }

/* Busca + chips na mesma linha, os dois à esquerda, um do lado do outro —
   só descem pra linha de baixo quando não couber (Carlos, 24/08/2026: "os
   chips devem ser alinhados a esquerda, proximo da barra de busca"). */
.tl-busca-chips-linha { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; margin-bottom: 8px; }
/* Busca — EXATAMENTE o mesmo padrão do resto do sistema (.busca-wrap-interno
   + .campo-busca-novo + .busca-submit com a lupa DENTRO do botão, à
   direita — ver clientes/lista.php), só pequena (Carlos, 24/08/2026: "a
   barra de busca da linha do tempo, não é igual as outras... as outras
   barras de busca possuem botão de buscar e não possuem lupa alinhada na
   esquerda"). Botão sem type=submit (filtro já é client-side, ao digitar)
   e tabindex=-1 (puramente visual, pra bater com o padrão). */
.tl-busca-wrap { flex: 0 1 180px; min-width: 120px; }
.caso-timeline-item.tl-escondido-busca { display: none; }

/* Chips de filtro por categoria — à esquerda, colados na busca. */
.caso-timeline-chips { display: flex; flex-wrap: wrap; gap: 6px; flex: 0 1 auto; }
.tl-chip { border: 1.5px solid var(--borda); background: var(--superficie); color: var(--suave); border-radius: 999px; padding: 4px 12px; font-size: 11.5px; font-weight: 600; font-family: inherit; cursor: pointer; transition: all .12s; }
.tl-chip.ativo { border-color: var(--azul-claro); background: var(--teal-bg); color: var(--azul-claro); }
/* Chips de DJEN/DataJud na mesma cor do ícone da categoria — reforça a
   associação visual entre o chip de filtro e o ícone na linha (Carlos,
   01/09/2026: "o chip também pode ter a mesma cor dos icones"). */
.tl-chip-djen.ativo { border-color: #b0356b; background: #fdeef1; color: #b0356b; }
.tl-chip-datajud.ativo { border-color: #0e7c5a; background: #d9f3e9; color: #0e7c5a; }
.tl-chip-ocultos { margin-left: auto; }
.caso-timeline-item.tl-escondido-chip { display: none; }

/* Item oculto — só sócio recebe estes no HTML (ver CasoEvento::linhaDoTempo
   com $incluirOcultos), e mesmo assim ficam escondidos até "Mostrar
   ocultos" ser clicado (Carlos, 24/08/2026: "para os sócios essa ocultação
   ainda será acessível clicando no ícone de ver"). */
.caso-timeline-item.caso-timeline-item-oculto { display: none; }
#colHistoricoCaso.tl-mostrando-ocultos .caso-timeline-item.caso-timeline-item-oculto { display: flex; opacity: .55; }
.caso-timeline-item-oculto .caso-timeline-icone { filter: grayscale(1); }

/* Balõezinhos de conversa (Carlos, 12/08/2026: "quero que vc reformule, use
   a cor predominante do usuário e faça aqueles balaozinhos de conversa
   sabe? como se os usuário estivessem interagindo") — TODO recado (seu ou
   de outra pessoa) usa a MESMA regra de cor: a "Cor de destaque" que a
   pessoa escolheu em Minha Conta, sempre amenizada (fundo bem claro, nunca
   sólido — "más amenizada, fraquinha"), com fallback pro pastel
   determinístico do nome de sempre quando não há cor própria configurada
   (ver corDe()/--bolha-bg/--bolha-fg setados por recado via JS). Foto maior
   (+30%) e sempre à esquerda do balão, inclusive nos seus próprios recados
   (só o balão fica à direita, puxado por margin-left:auto — a foto não
   inverte de lado). */
.caso-recados-lista { max-height: 460px; overflow-y: auto; display: flex; flex-direction: column; gap: 10px; padding: 4px 2px; margin-bottom: 12px; }
.caso-recado { display: flex; gap: 8px; max-width: 82%; }
.caso-recado.propria { margin-left: auto; }
.caso-recado:not(.propria) { margin-right: auto; }
/* Nos próprios recados, a foto vai pro lado oposto do balão — mesmo padrão
   de apps de chat (Carlos, 21/08/2026: "a imagem do usuário que fez o
   comentário, deve aparecer do outro lado do balão de comentário"). */
.caso-recado.propria { flex-direction: row-reverse; }
.caso-recado-avatar { width: 39px; height: 39px; flex: none; margin-top: 2px; }
.caso-recado-coluna { display: flex; flex-direction: column; min-width: 0; }
.caso-recado.propria .caso-recado-coluna { align-items: flex-end; }
.caso-recado-autor { font-size: 11px; font-weight: 600; color: var(--suave); margin: 0 4px 3px; }
.caso-recado.propria .caso-recado-autor { display: none; } /* é sempre você — não precisa repetir */
.caso-recado-bolha {
    background: var(--bolha-bg, #eef1f5); color: var(--bolha-fg, var(--texto));
    padding: 8px 12px; border-radius: 15px 15px 15px 4px; min-width: 0;
}
.caso-recado.propria .caso-recado-bolha { border-radius: 15px 15px 4px 15px; }
.caso-recado-texto { font-size: 13.5px; line-height: 1.4; white-space: pre-wrap; word-break: break-word; color: var(--texto); }
.caso-recado-citacao { font-size: 11.5px; color: var(--bolha-fg, var(--suave)); background: rgba(0,0,0,.08); border-left: 2px solid currentColor; padding: 4px 7px; margin-bottom: 5px; border-radius: 4px; }
.caso-recado-citacao-autor { font-weight: 600; }
.caso-recado-anexo { display: flex; align-items: center; gap: 6px; margin-top: 4px; padding: 6px 8px; background: rgba(0,0,0,.06); border-radius: 8px; text-decoration: none; color: var(--texto); font-size: 12px; }
.caso-recado-anexo:hover { background: rgba(0,0,0,.12); }
.caso-recado-anexo-nome { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 160px; }
.caso-recado-anexo-tamanho { flex: none; opacity: .75; font-size: 11px; }
/* Data na MESMA linha dos botões de ação, não mais dentro do balão nem
   empilhada abaixo deles (Carlos, 21/08/2026: "a data deve aparecer na
   mesma linha dos botoes"). */
.caso-recado-rodape { display: flex; align-items: center; gap: 8px; margin-top: 3px; }
.caso-recado.propria .caso-recado-rodape { align-self: flex-end; flex-direction: row-reverse; }
.caso-recado-data { font-size: 10px; color: var(--suave); }
/* Sem destaque de cor — são ações secundárias (responder/editar/excluir),
   não precisam chamar atenção (Carlos, 21/08/2026: "esses botões não
   merecem destaque, deixeos cinza"). */
.caso-recado-responder { border: none; background: none; padding: 0; margin: 0; font-size: 11px; font-weight: 600; color: var(--suave); cursor: pointer; }
.caso-recado-responder:hover { color: var(--texto); }
.caso-recado-responder:hover { text-decoration: underline; }
/* Editar/excluir recado (B.1) — mesmo botão-link de "Responder", agrupados
   numa linha; excluir em vermelho pra diferenciar visualmente. */
.caso-recado-acoes { display: flex; gap: 6px; }
.caso-recado-excluir { color: var(--suave); }
.caso-recado-excluir:hover { color: var(--texto); }

.caso-recados-citando { display: flex; align-items: center; gap: 10px; padding: 7px 10px; margin-bottom: 8px; background: rgba(0,0,0,.035); border-left: 2px solid var(--azul-claro); border-radius: 4px; font-size: 12px; color: var(--suave); }
.caso-recados-citando-texto { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.caso-recados-citando-texto strong { color: var(--texto); }
.caso-recados-citando-x { border: none; background: none; cursor: pointer; font-size: 16px; line-height: 1; color: var(--suave); padding: 0 2px; }
.caso-recados-citando-x:hover { color: var(--texto); }

.caso-recados-anexo-prev { display: flex; align-items: center; gap: 7px; padding: 6px 10px; margin-bottom: 8px; background: rgba(0,0,0,.035); border-radius: 6px; font-size: 12px; color: var(--suave); }
.caso-recados-anexo-prev-nome { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--texto); }
.caso-recados-anexo-prev-x { border: none; background: none; cursor: pointer; font-size: 16px; line-height: 1; color: var(--suave); padding: 0 2px; }
.caso-recados-anexo-prev-x:hover { color: var(--texto); }

.caso-recados-form { display: flex; flex-direction: column; gap: 8px; }
.caso-recados-form textarea { width: 100%; box-sizing: border-box; padding: 8px 10px; border: 1px solid var(--borda); border-radius: 8px; font-family: inherit; font-size: 13px; color: var(--texto); resize: vertical; }
.caso-recados-form .acoes { display: flex; align-items: center; margin-top: 0; }
/* @menção — lista de colegas ao digitar "@" no recado (Carlos, 13/08/2026). */
.caso-recados-mencao-lista { position: absolute; left: 0; bottom: calc(100% + 4px); min-width: 180px; max-width: 90%; max-height: 220px; overflow-y: auto; background: var(--superficie); border: 1px solid var(--borda); border-radius: 8px; box-shadow: 0 6px 20px rgba(20,40,80,.14); z-index: 20; padding: 4px; }
.caso-recados-mencao-item { display: block; width: 100%; text-align: left; padding: 7px 10px; font-size: 13px; color: var(--texto); background: none; border: none; border-radius: 6px; cursor: pointer; font-family: inherit; }
.caso-recados-mencao-item:hover { background: var(--teal-bg); }
.caso-recados-anexar-btn { flex: none; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; border: 1px solid var(--borda); background: var(--superficie); border-radius: 8px; color: var(--suave); cursor: pointer; }
.caso-recados-anexar-btn:hover { color: var(--azul-claro); border-color: var(--azul-claro); }

/* ---- Blocos móveis da página de caso (casos/detalhe.php) ----
   Cada quadro de nível superior (Dados, Laurel+Arquivos, Painel de recados,
   Financeiro) vira uma unidade arrastável: arraste a alça pra reordenar, ou
   solte ela EM CIMA da alça de outro bloco pra juntar os dois em abas —
   Carlos, 12/08/2026: "quero que os blocos sejam movíveis... ou simplesmente
   colocar em outro bloco junto com outra função". Layout salvo por usuário
   (localStorage), puramente visual — não altera nada no servidor. */
.caso-bloco-movivel { position: relative; }
/* Fica dentro do próprio quadro do bloco agora, na mesma linha do título
   (antes ficava numa faixa vazia À ESQUERDA do bloco, fora dele; depois
   ficou dentro só que acima da linha do título — Carlos, 22/08/2026:
   "o botão de arrastar para reposicionar e o titulo do bloco devem ficar
   na mesma linha"). top:20px alinha com a linha de base do <h3> do bloco
   (padding:20px do .bloco); o título ganha padding-left pra abrir espaço
   e não ficar embaixo do ícone (só os blocos que têm um <h3>/<h4> como
   primeiro filho visível do .bloco — os demais não têm título próprio
   aqui dentro, o ícone só fica no canto). */
.caso-bloco-alca {
    position: absolute; left: 8px; top: 20px; width: 20px; height: 20px;
    display: flex; align-items: center; justify-content: center; color: var(--suave);
    border-radius: 5px; cursor: grab; opacity: .35; transition: opacity .12s, background .12s; z-index: 3;
}
.caso-bloco-alca:hover { opacity: 1; background: var(--cinza-bg, #f0f2f5); }
/* Abre espaço pro ícone de arrastar não ficar embaixo do título (só nos
   blocos móveis — .bloco h3 sozinho, fora dessa página, continua sem
   recuo nenhum). */
.caso-bloco-movivel > .bloco > h3:first-child { padding-left: 12px; }
/* Mesma folga nos outros dois formatos de título que também nascem no
   canto superior esquerdo do bloco, só que aninhados mais fundo (não são
   filho direto do .bloco) — "Dados" (h3.bloco-icone dentro do grid da
   checklist) e "Painel de recados" (h4 da 1ª coluna da atividade) ficavam
   com o próprio ícone embaixo do ícone de arrastar (Carlos, 22/08/2026:
   "os icones do titulo Dados e Paienl de recados estão ficando sobrepostos
   ao icone de arrastar"). */
.caso-bloco-movivel .bloco h3.bloco-icone:first-of-type,
.caso-bloco-movivel .caso-atividade-col:first-child > .caso-atividade-col-titulo,
.caso-bloco-movivel > .bloco-recolhivel > summary { padding-left: 12px; }
/* Indicativo de parcela em atraso, visível com o bloco ainda recolhido
   (Carlos, 22/08/2026: "caso exista alguma parcela em atraso, deve
   aparecer algum indicativo, para que o usuário saiba que existem
   parcelas em atraso"). */
.caso-fin-atraso-badge { display: inline-flex; align-items: center; gap: 4px; margin-left: 4px; padding: 2px 8px; border-radius: 10px; background: #fdeaea; color: #c0392b; font-size: 11px; font-weight: 600; white-space: nowrap; }
.caso-fin-vazio-aviso { display: flex; gap: 10px; align-items: flex-start; padding: 12px 14px; border-radius: 10px; background: #fff7e6; color: #8a6416; }
.caso-fin-vazio-aviso svg { flex: none; margin-top: 1px; }
.caso-fin-vazio-aviso strong { display: block; font-size: 13.5px; }
.caso-fin-vazio-aviso p { margin: 3px 0 0; font-size: 12.5px; opacity: .9; }
.caso-bloco-alca:active { cursor: grabbing; }
.caso-bloco-movivel.caso-bloco-arrastando { opacity: .45; }
.caso-bloco-movivel.caso-bloco-alvo-antes { box-shadow: inset 0 3px 0 var(--azul-claro); }
.caso-bloco-movivel.caso-bloco-alvo-depois { box-shadow: inset 0 -3px 0 var(--azul-claro); }
.caso-bloco-alca.caso-bloco-alvo-mesclar { opacity: 1; background: var(--azul-claro); color: #fff; }
/* Grupo de 2+ blocos juntados em abas (arrastar um bloco pra alça de outro
   — ver JS em casos/detalhe.php). */
.caso-grupo-blocos { margin-bottom: 18px; }
.caso-grupo-blocos .caso-bloco-movivel { margin-bottom: 0; padding-left: 0; }
.caso-grupo-blocos .caso-bloco-movivel .bloco { margin-bottom: 0; border-radius: 0 0 14px 14px; box-shadow: none; border-top: none; }
.caso-grupo-blocos .caso-bloco-alca { display: none; }
.caso-grupo-abas { display: flex; gap: 4px; flex-wrap: wrap; background: var(--superficie); border: 1px solid var(--borda); border-bottom: none; border-radius: 14px 14px 0 0; padding: 6px 6px 0; }
.caso-grupo-aba {
    display: flex; align-items: center; gap: 8px; padding: 8px 10px 10px; border: none; background: none; cursor: pointer;
    font-size: 12.5px; font-weight: 600; color: var(--suave); border-bottom: 2px solid transparent; margin-bottom: -1px; font-family: inherit;
}
.caso-grupo-aba:hover { color: var(--texto); }
.caso-grupo-aba.ativa { color: var(--azul-claro); border-bottom-color: var(--azul-claro); }
.caso-grupo-aba-fechar {
    display: flex; align-items: center; justify-content: center; width: 15px; height: 15px; border-radius: 50%;
    color: var(--suave); opacity: .7;
}
.caso-grupo-aba-fechar:hover { opacity: 1; background: rgba(0,0,0,.08); }

/* ---- Mensagens ---- */
.mensagens { margin-bottom: 16px; }
.msg { padding: 11px 16px; border-radius: var(--radius); margin-bottom: 8px; }
.msg.success { background: #e3f6ee; color: var(--verde); border: 1px solid #b6e3cd; }
.msg.error { background: #fdeaea; color: var(--vermelho); border: 1px solid #f3c6c2; }

/* ---- Login ---- */
.login-wrap { min-height: 100vh; display: flex; align-items: center; justify-content: center; background: var(--login-grad); }
.login-card { background: #fff; padding: 36px; border-radius: 16px; width: 340px; box-shadow: 0 12px 40px rgba(11,40,80,.28); }
.login-logo { display: block; width: 240px; max-width: 100%; margin: 0 auto 8px; }
.login-card p { text-align: center; color: var(--suave); margin: 0 0 24px; font-size: 13px; letter-spacing: .08em; text-transform: uppercase; }
.login-card label { margin-top: 12px; }
.login-card .btn { width: 100%; margin-top: 20px; justify-content: center; }

/* ---- Utilidades ---- */
.vazio { text-align: center; color: #93a3a9; padding: 40px; background: var(--superficie); border: 1px dashed var(--borda); border-radius: 14px; }
.tag { display: inline-block; padding: 2px 9px; border-radius: 20px; font-size: 12px; background: var(--teal-bg); color: var(--azul-claro); }
/* .tag força display:inline-block, o que por si só já sobrepõe o
   display:none do atributo `hidden` nativo (regra do agente de usuário
   sempre perde pra CSS de autor) — o selinho "oculto" aparecia até em itens
   visíveis (Carlos, 27/08/2026: "esse chip também está aparecendo nos
   visiveis"). Precisa de uma regra própria, mais específica, pra `hidden`
   voltar a funcionar nesse elemento. */
.tl-tag-oculto[hidden] { display: none; }
.alerta-dup { background: #fff8e1; border: 1px solid #ffe082; padding: 10px 14px; border-radius: var(--radius); margin-bottom: 14px; font-size: 13px; }
.formset-linha .principal { text-align: center; }
.clicavel { cursor: pointer; }

/* ---- Status do caso ---- */
.status { display: inline-block; padding: 3px 10px; border-radius: 16px; font-size: 12px; font-weight: 600; }
.status-triagem        { background: #eceff1; color: #546e7a; }
.status-a_fazer        { background: #fff8e1; color: #b9770e; }
.status-a_receber      { background: var(--teal-bg); color: var(--azul-claro); }
.status-em_atendimento { background: #e3f2fd; color: #1565c0; }
.status-em_preparacao  { background: #fff8e1; color: #f57f17; }
.status-protocolado    { background: #e3f6ee; color: #0c7a52; }
.status-em_andamento   { background: #e3f6ee; color: var(--verde); }
.status-suspenso       { background: #fbe9e7; color: #d84315; }
.status-arquivado      { background: #eceff1; color: #546e7a; }

/* Select embutido na Lista — muda o status do caso sem abrir o cadastro */
.status-select {
    border: none; border-radius: 16px; padding: 3px 24px 3px 10px; font-size: 12px; font-weight: 600;
    font-family: inherit; cursor: pointer; -webkit-appearance: none; appearance: none;
    background-repeat: no-repeat; background-position: right 8px center; background-size: 10px;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23647084' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
}
.status-select:disabled { opacity: .6; cursor: wait; }
.status-select.status-triagem     { background-color: #eceff1; color: #546e7a; }
.status-select.status-a_fazer     { background-color: #fff8e1; color: #b9770e; }
.status-select.status-protocolado { background-color: #e3f6ee; color: #0c7a52; }
.status-select.status-arquivado   { background-color: #eceff1; color: #546e7a; }
/* status financeiros */
.status-pendente       { background: #fff4e0; color: #b9770e; }
.status-pago           { background: #e3f6ee; color: #0c7a52; }

/* Financeiro do caso embutido via iframe (Carlos, 21/08/2026: "mesmo layout
   lá fo financeiro"). Altura generosa fixa (a página interna tem sua
   própria rolagem/scroll, então não precisa recalcular). Sem borda própria
   — já vive dentro do .bloco da seção, que tem seu próprio quadro; cada
   card de cobrança lá dentro também tem a sua (.det-painel-card); uma
   terceira borda ao redor do iframe só empilhava quadro dentro de quadro
   (Carlos, 22/08/2026: "o relatório aparece dentro de um quadro, que está
   dentro de outro quadro, remova o quadro geral, deixe apenas o
   relatório"). */
.caso-financeiro-iframe { width: 100%; height: 160px; border: none; }

/* Despesa do cliente (desembolso) + reembolso previsto, lado a lado no
   bloco Financeiro do caso — em vez de duas linhas soltas na tabela, deixa
   claro que um é a contrapartida do outro (Carlos, 13/08/2026). Ainda usado
   se algum dia a versão simplificada voltar a ser exibida. */
.par-desemb-reemb { padding: 6px 2px; }
.par-desemb-titulo { font-size: 12.5px; color: var(--suave); margin-bottom: 8px; }
.par-desemb-lados { display: flex; align-items: center; gap: 14px; }
.par-lado { flex: 1; background: var(--cinza-bg); border-radius: 8px; padding: 10px 14px; }
.par-lado-rot { font-size: 11px; text-transform: uppercase; letter-spacing: .03em; color: var(--suave); font-weight: 700; }
.par-lado-valor { font-size: 16px; font-weight: 600; color: var(--texto); margin: 3px 0; }
.par-lado-data { font-size: 12px; color: var(--suave); display: flex; align-items: center; gap: 6px; }
.par-seta { flex: none; color: var(--suave); font-size: 16px; }
@media (max-width: 640px) { .par-desemb-lados { flex-direction: column; align-items: stretch; } .par-seta { display: none; } }
.status-atrasado       { background: #fdeaea; color: #b23535; }
.status-cancelado      { background: #eceff1; color: #90a4ae; }

/* "Over" (hover) padronizado do tema escuro — tabelas (zebra + hover),
   grade financeira e kanban usavam tons claros fixos (#f7f9fc, #e1e6ef,
   #f7faff...) pensados só pro tema claro: no escuro isso deixava a linha
   quase branca com o texto claro por cima, ilegível. Um único par de tons
   (zebra sutil / hover mais forte, ambos sobre --superficie) cobre tabela
   de listagem, grade financeira e cards do kanban de forma igual. */
[data-tema="escuro"] .tabela:not(#grade-fin) tbody tr:nth-child(even):not(:hover):not(.linha-nova) td { background: #212a3d; }
[data-tema="escuro"] .tabela:not(#grade-fin) tbody tr:hover:not(.linha-nova) td,
[data-tema="escuro"] .tabela#grade-fin tbody tr:hover td { background: #29344a; }
[data-tema="escuro"] .grade-fin tbody tr.linha-pago:hover td      { background: #1c3c29 !important; }
[data-tema="escuro"] .grade-fin tbody tr.linha-parcial:hover td   { background: #3d321a !important; }
[data-tema="escuro"] .grade-fin tbody tr.linha-vencido:hover td   { background: #452420 !important; }
[data-tema="escuro"] .grade-fin tbody tr.linha-pendente:hover td  { background: #29344a !important; }
[data-tema="escuro"] .tabela tbody tr.linha-nova td { color: #bcd4f7; background: #1c2c45; }
[data-tema="escuro"] .tabela tbody tr.linha-nova td:first-child { border-left-color: var(--azul-claro); }
[data-tema="escuro"] .kb-col-h:hover,
[data-tema="escuro"] .kb-strip:hover,
[data-tema="escuro"] .kb-protocolo:hover { background: var(--menu-hover); }
[data-tema="escuro"] .kb-col-body.drop-alvo { background: #1c2c45; }
[data-tema="escuro"] .kb-card:hover { background: #212a3d; }
[data-tema="escuro"] .kb-add-col:hover { background: var(--menu-hover); }
[data-tema="escuro"] .kb-col-valor { background: #3a3116; color: #e8c377; }
[data-tema="escuro"] .caso-timeline-item:nth-child(even) { background: #212a3d; --tl-linha-bg: #212a3d; }
[data-tema="escuro"] .caso-timeline-item:hover { background: #29344a; --tl-linha-bg: #29344a; }

/* Navegador de arquivos (.fm-*) — toolbar, itens, seleção e menu de
   contexto usavam tom claro fixo (pensado só pro tema claro). */
[data-tema="escuro"] .fm-toolbar { background: var(--th-bg); }
[data-tema="escuro"] .fm-btn:hover:not(:disabled) { background: var(--menu-hover); }
[data-tema="escuro"] .fm-overflow-item:hover { background: var(--menu-hover); }
[data-tema="escuro"] .fm-item:hover { background: #212a3d; }
[data-tema="escuro"] .fm-item.sel { background: #1c2c45; border-color: var(--azul-claro); }
[data-tema="escuro"] .fm-item.fm-item-aberto-laurel { background: #16301f; border-color: #2c5a3d; }
[data-tema="escuro"] .fm-item-nome.fm-item-nome-editando { background: var(--superficie); }
[data-tema="escuro"] .fm-item-checklist-ok { background: #16301f; border-color: #2c5a3d; }
[data-tema="escuro"] .fm-item-fantasma { border-color: var(--borda); }
[data-tema="escuro"] .fm-item.fm-drop-alvo { background: #1c2c45 !important; border-color: var(--azul-claro) !important; }
[data-tema="escuro"] .fm-btn-perigo:hover:not(:disabled) { background: #3a1d1c; color: #f0958f; }
[data-tema="escuro"] .fm-ctx-item:hover { background: var(--menu-hover); }
[data-tema="escuro"] .fm-ctx-item.perigo:hover { background: #3a1d1c; }
[data-tema="escuro"] .fm-excluir-modal-cancelar:hover { background: var(--borda); }

/* Ajustes finos — tema escuro. Badges/status usam cor pastel fixa (fundo
   claro + texto saturado) que não segue os tokens de tema — sem isso eles
   ficariam brancos "flutuando" sobre o fundo escuro. Mesma paleta de cada
   status, só invertida pra fundo escuro + texto claro. */
[data-tema="escuro"] .status-triagem,
[data-tema="escuro"] .status-select.status-triagem,
[data-tema="escuro"] .status-arquivado,
[data-tema="escuro"] .status-select.status-arquivado,
[data-tema="escuro"] .status-cancelado                { background: #2a3140; color: #aab4c8; }
[data-tema="escuro"] .status-a_fazer,
[data-tema="escuro"] .status-select.status-a_fazer,
[data-tema="escuro"] .status-em_preparacao,
[data-tema="escuro"] .status-pendente,
[data-tema="escuro"] .badge-vencendo                   { background: #3a3116; color: #e8c377; }
[data-tema="escuro"] .status-a_receber                 { background: var(--teal-bg); color: var(--azul); }
[data-tema="escuro"] .status-em_atendimento             { background: #1c3450; color: #8fc0f5; }
[data-tema="escuro"] .status-protocolado,
[data-tema="escuro"] .status-select.status-protocolado,
[data-tema="escuro"] .status-em_andamento,
[data-tema="escuro"] .status-pago,
[data-tema="escuro"] .badge-ok                          { background: #16301f; color: #6fd39c; }
[data-tema="escuro"] .status-suspenso,
[data-tema="escuro"] .status-atrasado                   { background: #3a1d1c; color: #f0958f; }
[data-tema="escuro"] .status-select {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2394a1bd' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
}
[data-tema="escuro"] .legenda-fin .bolinha.pago, [data-tema="escuro"] .grade-rodape-nota .bolinha.pago { background: var(--fin-cor-pago); border-color: #2c5a3d; }
[data-tema="escuro"] .legenda-fin .bolinha.vencido, [data-tema="escuro"] .grade-rodape-nota .bolinha.vencido { background: var(--fin-cor-vencido); border-color: #5a3230; }
[data-tema="escuro"] .legenda-fin .bolinha.pendente, [data-tema="escuro"] .grade-rodape-nota .bolinha.pendente { background: var(--superficie); }
[data-tema="escuro"] .legenda-fin .bolinha.aguarda-nf, [data-tema="escuro"] .grade-rodape-nota .bolinha.aguarda-nf { background: #2c2545; border-color: #4f4074; }
[data-tema="escuro"] .alerta-dup { background: #332a12; border-color: #5a4a1e; }

/* Cartões/superfícies com "background: #fff" fixo (não var(--superficie)) —
   kanban, grade financeira, login, explorer de documentos, etc. */
[data-tema="escuro"] .login-card,
[data-tema="escuro"] .kb-card,
[data-tema="escuro"] .grade-fin .celula:not([type=checkbox]):not([type=radio]):not([type=submit]),
[data-tema="escuro"] .fm-item-nome.fm-item-nome-editando,
[data-tema="escuro"] .resp-avatar-remover,
[data-tema="escuro"] .doc-drive-btn,
[data-tema="escuro"] .drive-caso-aviso-fallback button,
[data-tema="escuro"] .btn-doc-pdf { background: var(--superficie); color: var(--texto); border-color: var(--borda); }
[data-tema="escuro"] .grade-fin .celula:not([type=checkbox]):not([type=radio]):not([type=submit]) { color: var(--suave); }
/* Cabeçalho e rodapé de totais da grade financeira — mesmo tom claro fixo
   (#eef2fb) usado no cabeçalho normal (--th-bg), só que hardcoded aqui. */
[data-tema="escuro"] .grade-fin thead th,
[data-tema="escuro"] .grade-fin tfoot .rodape-totais td { background: var(--th-bg) !important; border-top-color: var(--borda); }
[data-tema="escuro"] .grade-fin tfoot .rodape-totais .tot { color: #9db8e8; }
[data-tema="escuro"] .tot-rotulo { color: var(--suave); }
[data-tema="escuro"] .tot-dif { color: var(--suave); }
[data-tema="escuro"] .tot-dif.dif-negativo { color: #f0958f; }
[data-tema="escuro"] .tot-dif.dif-positivo { color: #6fd39c; }
[data-tema="escuro"] .tot-cota { color: var(--suave); }
[data-tema="escuro"] .tot-qtd { color: var(--suave); }
[data-tema="escuro"] .grade-fin tfoot .rodape-totais .tot.tot-equilibrado { color: #6fd39c; }
[data-tema="escuro"] .grade-fin tfoot .rodape-totais .tot.tot-equilibrado .tot-rotulo { color: #4ecb8e; }
[data-tema="escuro"] .cel-previsto { color: var(--suave); }

/* ---- Honorários ---- */
.honorario { border: 1px solid var(--borda); border-radius: var(--radius); padding: 14px; margin-bottom: 12px; }
details.receber summary { list-style: none; display: inline-block; }
details.receber summary::-webkit-details-marker { display: none; }

/* ---- Financeiro: filtros ---- */
.fin-filtros-wrap { margin-bottom: 6px; display: flex; flex-direction: column; gap: 4px; }
.fin-filtros-wrap .barra-acoes { margin-bottom: 0; flex-direction: column; align-items: stretch; gap: 8px; }

/* Linha 0: breadcrumb + ícones */
.fin-filtros-linha0 { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
.fin-trilha { margin-bottom: 0 !important; }

/* Linha 1: busca + meses + botões */
.fin-topo-direita { display: flex; align-items: center; gap: 6px; flex-shrink: 0; margin-left: auto; }
/* Sem tamanho reduzido pro botão "Novo lançamento" — deve ficar do mesmo
   tamanho padrão de "Novo caso"/"Nova jurisprudência"/etc. em todo o resto
   do sistema (Carlos, 19/08/2026: "parece ter tamanhos diferentes das
   outras paginas"). */


/* Linha 1: meses + busca + gear */
.fin-filtros-linha1 { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; row-gap: 8px; }
.meses-ano-grupo { display: flex; align-items: center; gap: 8px; min-width: 0; flex: 1 1 0; }
.fin-busca-topo { width: 28%; min-width: 160px; max-width: 300px; flex-shrink: 0; margin: 0; }
.meses-nav { display: flex; align-items: center; min-width: 0; overflow: visible; flex: 0 1 auto; }
.meses-grupo { display: flex; align-items: center; gap: 4px; margin: 0; min-width: 0; max-width: 100%; overflow: visible; }
.mes-lista-wrap { overflow: hidden; min-width: 0; border: 1px solid var(--borda); border-radius: 7px; background: var(--superficie); }
.mes-lista { display: flex; align-items: center; gap: 0; overflow-x: hidden; scroll-behavior: smooth; }
.mes-chip { padding: 5px 11px; border: none; border-right: 1px solid var(--borda); border-radius: 0; font-size: 12px; font-weight: 500; color: var(--suave); background: none; white-space: nowrap; flex-shrink: 0; }
.mes-chip:last-child { border-right: none; }
.mes-chip:hover { background: var(--cinza-bg); color: var(--texto); }
.mes-chip.atual { background: var(--azul-claro); color: #fff; font-weight: 600; }
.mes-seta { padding: 4px 6px; color: var(--azul-claro); font-size: 20px; font-weight: 700; line-height: 1; background: none; border: none; cursor: pointer; flex-shrink: 0; display: none; }
.mes-seta:hover { color: var(--azul); }
.ano-picker-wrap { position: relative; flex-shrink: 0; margin-left: 4px; }
.mes-dropdown-wrap { position: relative; flex-shrink: 0; }
.mes-dropdown-wrap > summary { cursor: pointer; }
.mes-dropdown-wrap > .mes-dropdown-painel { display: none; }
.mes-dropdown-wrap[open] > .mes-dropdown-painel { display: flex; }
.mes-dropdown-painel { min-width: 130px; max-height: 260px; overflow-y: auto; }
.ano-btn { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; flex-shrink: 0; font-size: 13px; font-weight: 700; color: var(--texto); background: none; border: 1px solid var(--borda); border-radius: 6px; padding: 4px 9px; cursor: pointer; }
.ano-btn:hover { border-color: var(--azul-claro); color: var(--azul-claro); }
.ano-picker-wrap { position: relative; flex-shrink: 0; }
.ano-painel { position: absolute; right: 0; top: calc(100% + 4px); background: var(--superficie); border: 1px solid var(--borda); border-radius: 10px; box-shadow: 0 4px 16px rgba(20,40,80,.12); padding: 8px; flex-direction: column; gap: 2px; min-width: 90px; z-index: 9999; }
.ano-picker-wrap > .ano-painel { display: none; }
.ano-picker-wrap[open] > .ano-painel { display: flex; }
.ano-picker-wrap > summary { cursor: pointer; }
.ano-opcao { display: block; padding: 6px 14px; border-radius: 6px; font-size: 13px; font-weight: 600; color: var(--suave); text-align: center; }
.ano-opcao:hover { background: var(--teal-bg); color: var(--azul-claro); }
.ano-opcao.hoje { color: var(--texto); }
.ano-opcao.ativo { background: var(--azul-claro); color: #fff; }


/* Engrenagem e ajuda */
.fin-icones-wrap { display: flex; align-items: center; gap: 2px; flex-shrink: 0; }
.fin-densidade-wrap { display: flex; align-items: center; flex-shrink: 0; }
.fin-densidade-unico { background: none; border: none; padding: 4px; border-radius: 6px; color: var(--suave); cursor: pointer; display: flex; align-items: center; }
.fin-densidade-unico:hover { color: var(--azul-claro); background: var(--menu-hover); }
.fin-densidade-unico span { display: none; }
.fin-densidade-unico[data-atual="compacta"] span[data-icone="normal"] { display: inline-flex; }
.fin-densidade-unico[data-atual="normal"] span[data-icone="compacta"] { display: inline-flex; }
.fin-gear-wrap { position: relative; flex-shrink: 0; }
.fin-gear-btn { background: none; border: none; padding: 4px; color: var(--suave); cursor: pointer; display: flex; align-items: center; }
.fin-gear-btn:hover { color: var(--azul-claro); background: none; }
/* Quando a engrenagem mora dentro de um título .bloco-icone (ex.: checklist
   de documentos no cadastro de caso), a regra ".bloco-icone svg" pintava o
   ícone de azul o tempo todo, em vez de cinza-neutro-até-passar-o-mouse
   como em todas as outras engrenagens do sistema (Carlos, 03/08/2026:
   "deixe igual da tela de casos, do kanban, mesma cor e efeito"). */
.bloco-icone .fin-gear-btn svg { width: 16px; height: 16px; color: inherit; }
.fin-gear-painel { position: absolute; right: 0; top: calc(100% + 6px); background: var(--superficie); border: 1px solid var(--borda); border-radius: 10px; box-shadow: 0 4px 16px rgba(20,40,80,.12); padding: 10px 14px; min-width: 210px; z-index: 200; }
/* Dentro do navegador único, .fm tem overflow:hidden (só pra recortar os
   cantos arredondados) — a mesma engrenagem posicionada por "absolute"
   ficaria cortada ali dentro; troca pra "fixed" com coordenadas calculadas
   por JS na abertura (ver DriveExplorer._ligarEngrenagemScanner), igual à
   técnica já usada pro overlay de arrastar entre Laurel e o navegador. */
.fm .fin-gear-painel { position: fixed; top: auto; right: auto; }
.fin-ajuda-painel { min-width: 280px; max-height: 80vh; overflow-y: auto; }
.gear-titulo { font-size: 10.5px; font-weight: 700; text-transform: uppercase; color: var(--suave); letter-spacing: .05em; margin-bottom: 10px; }
.gear-item { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--texto); cursor: pointer; padding: 5px 0; }
.gear-item input[type=checkbox] { width: 15px; height: 15px; cursor: pointer; accent-color: var(--azul-claro); }
.gear-item-row { display: flex; align-items: center; gap: 8px; padding: 5px 0; }
.gear-item-label { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--texto); cursor: pointer; flex: 1; min-width: 0; }
.gear-item-label input[type=checkbox] { width: 15px; height: 15px; cursor: pointer; accent-color: var(--azul-claro); flex: none; }
.gear-som-btn { position: relative; display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; flex: none; border: none; background: none; padding: 0; cursor: pointer; color: var(--azul-claro); border-radius: 6px; transition: color .15s, background .15s, opacity .15s; }
.gear-som-btn:hover { background: var(--menu-hover); }
.gear-som-btn svg { width: 15px; height: 15px; }
.gear-som-btn.mudo { color: var(--suave); opacity: .5; }
.gear-som-btn.mudo::after { content: ''; position: absolute; left: 3px; right: 3px; top: 50%; height: 1.6px; background: currentColor; border-radius: 2px; transform: rotate(-45deg); }
.ajuda-secao { margin-bottom: 2px; }
.ajuda-secao-titulo { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--azul-claro); margin-bottom: 6px; }
.ajuda-item { display: flex; align-items: flex-start; gap: 8px; font-size: 12.5px; color: var(--texto); margin-bottom: 5px; line-height: 1.4; }
.ajuda-item-linha { }
.ajuda-p { font-size: 12.5px; color: var(--texto); line-height: 1.5; margin-bottom: 5px; }
.ajuda-sep { border-top: 1px solid var(--borda); margin: 10px 0; }
.ajuda-bolinha { display: inline-block; width: 10px; height: 10px; border-radius: 3px; flex-shrink: 0; margin-top: 2px; }
.ajuda-bolinha.pago { background: #ecfaf3; border: 1px solid #b7e3cf; }
.ajuda-bolinha.vencido { background: #fdeeed; border: 1px solid #f0c3c0; }
.ajuda-bolinha.pendente { background: var(--superficie); border: 1px solid var(--borda); }
.ajuda-bolinha.aguarda-nf { background: #efe9fb; border: 1px solid #c4b7e8; }
.ajuda-bolinha.entrada { background: #0c7a52; }
.ajuda-bolinha.saida { background: var(--vermelho); }
.ajuda-badge.neg { background: #fdeeed; color: #b91c1c; }
.ajuda-badge.pos { background: #e6f4ee; color: #0c7a52; }

/* Linha 2: filtros rápidos */
.fin-filtros-linha2:not([hidden]) { display: flex; align-items: center; gap: 5px; flex-wrap: wrap; flex-shrink: 0; }
.filtros-sep { color: #d0d8e8; font-size: 14px; padding: 0 3px; }
.filtro-chip { padding: 4px 11px; border: 1px solid var(--borda); border-radius: 14px; font-size: 12px; font-weight: 500; color: var(--suave); background: var(--superficie); white-space: nowrap; transition: all .15s; }
.filtro-chip:hover { border-color: var(--azul-claro); color: var(--azul-claro); }
.filtro-chip.ativo { background: var(--azul-claro); color: #fff; border-color: var(--azul-claro); }
.filtro-chip.vermelho.ativo { background: var(--vermelho); border-color: var(--vermelho); color: #fff; }
.filtro-chip.vermelho:not(.ativo):hover { border-color: var(--vermelho); color: var(--vermelho); }
.filtro-chip-novo:not(.ativo):hover { border-color: var(--azul-claro); color: var(--azul-claro); }
.filtro-chip-apto.ativo { background: var(--verde); border-color: var(--verde); }
.filtro-chip-apto:not(.ativo):hover { border-color: var(--verde); color: var(--verde); }
/* Mesma cor do badge do sininho (#e24b4a) — reforça que é a mesma base de novidades. */
.filtro-chip-novidade.ativo { background: #e24b4a; border-color: #e24b4a; }
.filtro-chip-novidade:not(.ativo):hover { border-color: #e24b4a; color: #e24b4a; }
.filtro-chip-tipo.tipo-honorarios.ativo { background: #0c447c; border-color: #0c447c; }
.filtro-chip-tipo.tipo-honorarios:not(.ativo):hover { border-color: #0c447c; color: #0c447c; }
.filtro-chip-tipo.tipo-despesa.ativo { background: #791f1f; border-color: #791f1f; }
.filtro-chip-tipo.tipo-despesa:not(.ativo):hover { border-color: #791f1f; color: #791f1f; }
.filtro-chip-tipo.tipo-gasto-cliente.ativo { background: #993c1d; border-color: #993c1d; }
.filtro-chip-tipo.tipo-gasto-cliente:not(.ativo):hover { border-color: #993c1d; color: #993c1d; }
.filtro-chip-tipo.tipo-hon-associado.ativo { background: #3c3489; border-color: #3c3489; }
.filtro-chip-tipo.tipo-hon-associado:not(.ativo):hover { border-color: #3c3489; color: #3c3489; }
.filtro-chip-tipo.tipo-imposto.ativo { background: #63380a; border-color: #63380a; }
.filtro-chip-tipo.tipo-imposto:not(.ativo):hover { border-color: #63380a; color: #63380a; }

/* Chips de filtro por advogado (casos/lista.php) — padronizados com os
   demais filtro-chip do sistema; cor por advogado via --cor-adv.
   Carlos, 28/07/2026: transformar bolhas em chips + cores mais antagônicas;
   movidos para a linha de filtros (junto aos chips de status). */
.adv-chip { display: inline-flex; align-items: center; gap: 5px; padding: 3px 10px 3px 8px; border-radius: 20px; border: 1.5px solid var(--cor-adv, var(--borda)); color: var(--cor-adv, var(--suave)); background: transparent; font-size: 12.5px; font-weight: 500; text-decoration: none; transition: background .13s, color .13s; white-space: nowrap; }
.adv-chip:hover { background: color-mix(in srgb, var(--cor-adv, var(--primario)) 10%, transparent); }
.adv-chip.ativo { background: var(--cor-adv, var(--primario)); color: #fff; border-color: var(--cor-adv, var(--primario)); }
.adv-chip.ativo .adv-chip-dot { background: rgba(255,255,255,.6); }
.adv-chip-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--cor-adv, var(--suave)); flex: none; transition: background .13s; }
.adv-chip-limpar { border-color: var(--borda); color: var(--suave); gap: 4px; }
.adv-chip-limpar svg { width: 12px; height: 12px; }
.adv-chip-limpar:hover { border-color: var(--vermelho); color: var(--vermelho); background: transparent; }
.grade-fin td { padding: 3px 10px; font-size: 13.5px; line-height: 1.3; }
.grade-fin tbody td { vertical-align: middle; }
/* Visualização normal (Carlos pediu: linhas mais grossas, igual às demais telas do sistema) */
.grade-fin.densidade-normal td { padding: 13px 16px; font-size: 14.5px; line-height: 1.5; }
.grade-fin .th-conta { font-weight: 500; letter-spacing: 0; }
.grade-fin thead .th-sort { user-select: none; }
.grade-fin thead .th-sort:hover { color: var(--suave); cursor: default; }
.grade-fin thead .th-sort-ativo { color: var(--primario); }
.grade-fin thead .th-seta { font-size: 11px; opacity: 0.7; margin-left: 2px; }

/* Cliente como protagonista da linha */
.grade-fin .cli-cel { font-weight: 400; color: var(--texto); font-size: 14.5px; letter-spacing: .01em; }
.grade-fin .cli-cel .caso-info { font-size: 12px; }
/* Padrão global: nome de cliente sempre em maiúsculo, sem negrito */
.nome-cliente, .cli-nome strong { font-weight: 400; text-transform: uppercase; letter-spacing: .01em; }
.grade-fin .assunto-cel { color: var(--texto); }
.grade-fin .cel-secundaria { color: var(--suave); font-size: 12.5px; white-space: nowrap; }
.sub-proto { color: #7e8a9c; font-size: 12px; font-weight: 600; margin-top: 1px; letter-spacing: .04em; line-height: 1.2; font-variant-numeric: tabular-nums; }

/* Contas em segundo plano: campo enxuto, herda cor da linha */
.grade-fin .cel-conta { background: transparent; }
.grade-fin .celula:not([type=checkbox]):not([type=radio]):not([type=submit]) { width: 88px; padding: 2px 7px; text-align: right; border: 1px solid #e9ecf3; border-radius: 6px; font-family: inherit; font-size: 12.5px; color: #6b7689; background: #fff; }
.grade-fin .celula:hover { color: var(--texto); border-color: #cdd9ec; }
.grade-fin .celula:focus { outline: 2px solid var(--azul-claro); border-color: var(--azul-claro); color: var(--texto); }

.grade-fin .tipo-cel { text-align: center; color: var(--azul-claro); }
/* Valor total — protagonista monetário */
.grade-fin .valor-destaque { text-align: right; font-weight: 400; font-size: 15px; white-space: nowrap; font-variant-numeric: tabular-nums; }
.grade-fin .valor-destaque.entrada { color: #0c7a52; }
.grade-fin .valor-destaque.saida { color: var(--vermelho); }

/* Cabeçalho com o mesmo azulado do rodapé (Carlos, 21/07/2026) — sobrescreve
   só aqui, sem mexer no --th-bg usado por todas as outras tabelas do sistema. */
.grade-fin thead th { background: #eef2fb; }
.grade-fin tfoot .rodape-totais td { background: #eef2fb; border-top: 2px solid #c2d0ee; white-space: nowrap; padding: 10px 12px; vertical-align: top; }
.grade-fin tfoot .rodape-totais .tot { font-weight: 700; color: #3d5a8a; text-align: right; font-size: 15px; }
.grade-fin tfoot .rodape-totais .tot-geral { font-weight: 800; color: var(--azul); text-align: right; font-size: 17px; }
.grade-fin tfoot .rodape-totais .tot-previsto { display: none; }
.tot-rotulo { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: .06em; color: #9aaac4; margin-bottom: 3px; }
.tot-dif { font-size: 10.5px; font-weight: 400; color: #a0aec0; text-align: right; margin-top: 3px; white-space: nowrap; }
.tot-dif.dif-negativo { color: #e05252; }
.tot-dif.dif-positivo { color: #0c7a52; }
.tot-cota { font-size: 12px; color: #7d8ba3; margin-top: 4px; white-space: nowrap; font-weight: 600; }
.tot-qtd { font-size: 10px; color: #a0aec0; margin-top: 1px; white-space: nowrap; }
.grade-fin tfoot .rodape-totais .tot.tot-equilibrado { color: #0c7a52; }
.grade-fin tfoot .rodape-totais .tot.tot-equilibrado .tot-rotulo { color: #6bbfa0; }
.cel-previsto { color: #6b7689; font-size: 12.5px !important; font-style: normal; text-align: right !important; font-family: inherit; white-space: nowrap; }
/* Selo de entrada/saída ao lado do valor previsto — círculo preenchido com
   seta, mais chamativo que um ícone solto, reforço visual rápido além da
   cor do texto (Carlos, 21/07/2026: "facilitar mais ainda a identificação"). */
.mov-chip { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; border-radius: 50%; vertical-align: -3px; margin-right: 4px; color: #fff; }
.mov-chip.entrada { background: #0c7a52; }
.mov-chip.saida { background: var(--vermelho); }

.legenda-fin .sep { color: #d3d8e2; padding: 0 2px; }
.legenda-fin .bolinha, .grade-rodape-nota .bolinha { width: 10px; height: 10px; border-radius: 3px; display: inline-block; }
.legenda-fin .bolinha.pago, .grade-rodape-nota .bolinha.pago { background: #ecfaf3; border: 1px solid #b7e3cf; }
.legenda-fin .bolinha.vencido, .grade-rodape-nota .bolinha.vencido { background: #fdeeed; border: 1px solid #f0c3c0; }
.legenda-fin .bolinha.pendente, .grade-rodape-nota .bolinha.pendente { background: #fff; border: 1px solid var(--borda); }
.legenda-fin .bolinha.aguarda-nf, .grade-rodape-nota .bolinha.aguarda-nf { background: #efe9fb; border: 1px solid #c4b7e8; }
.legenda-fin .bolinha.entrada, .grade-rodape-nota .bolinha.entrada { background: #0c7a52; }
.legenda-fin .bolinha.saida, .grade-rodape-nota .bolinha.saida { background: var(--vermelho); }
/* Cores das linhas no modo "Fundo colorido" (verde=quitado, amarelo=parcial,
   vermelho=vencido, branco=pendente) — customizáveis na engrenagem, por isso
   em variáveis CSS com esses valores como padrão. */
:root {
    --fin-cor-pago: #ecfaf3;
    --fin-cor-parcial: #fef9ec;
    --fin-cor-vencido: #fdeeed;
}
[data-tema="escuro"] {
    --fin-cor-pago: #16301f;
    --fin-cor-parcial: #332a12;
    --fin-cor-vencido: #3a1d1c;
}
/* A aplicação em si (branco por padrão, colorido só com "Fundo colorido"
   marcado) fica em grade.php, junto com as outras formas de visualização
   combináveis — aqui ficam só as variáveis, reaproveitáveis por qualquer uma. */
.linha-pendente td { background: var(--superficie); }
/* Resultado de busca fora do mês/período selecionado (ver Lancamento::listarComContexto) */
.grade-fin tbody tr.linha-fora-do-mes td { opacity: .72; }
/* Marca "hoje": risco vermelho atravessando todas as colunas da PRÓPRIA
   linha do lançamento do dia (borda no topo de cada célula, não uma linha
   divisória à parte com altura própria, que afastava os lançamentos —
   Carlos, 29/07/2026: "sem quebrar o layout" / "deve continuar sendo um
   risco, que atravessa todas as colunas, só não quero que essa linha quebra
   o layout"). */
.linha-hoje-marca td { border-top: 2px solid #e2483d; }
.linha-hoje-marca td:first-child { position: relative; }
.linha-hoje-bolinha {
    position: absolute; left: 10px; top: 0; transform: translateY(-50%);
    background: #e2483d; color: #fff; font-size: 10.8px; font-weight: 700;
    text-transform: uppercase; letter-spacing: .03em; line-height: 1;
    padding: 2px 7px; border-radius: 999px; white-space: nowrap; z-index: 1;
}
/* Engrenagem: opção de ocultar a marca do dia atual (e também some sozinha
   quando a grade é reordenada por outra coluna — ver JS de ordenação). */
body.fin-ocultar-linha-hoje .linha-hoje-marca td,
.linha-hoje-marca.linha-hoje-oculta td { border-top: none !important; }
body.fin-ocultar-linha-hoje .linha-hoje-bolinha,
.linha-hoje-marca.linha-hoje-oculta .linha-hoje-bolinha { display: none; }
/* Engrenagem: opção de ocultar a linha de "adicionar rápido" (Carlos,
   26/07/2026: "checkbox 'Linha adicionar rápido', se marcada irá exibir
   aquela linha... caso contrário oculte"). */
body.fin-ocultar-linha-add #tr-add-trigger { display: none; }
/* Barra inferior de indicadores */
/* Novo lançamento (no final) */

/* ---- KPI: sparklines e tooltips de mês ---- */
.fin-kpi { transition: box-shadow .15s ease, transform .15s ease; }
.fin-kpi:hover { box-shadow: 0 6px 22px rgba(30,50,90,.13) !important; transform: translateY(-2px); }
.mth { position: relative; cursor: pointer; user-select: none; }
.mth .tip {
    display: none; position: absolute; bottom: 140%; left: 50%; transform: translateX(-50%);
    background: #1f2a3d; color: #fff; font-size: 11px; line-height: 1.65;
    padding: 8px 12px; border-radius: 8px; white-space: nowrap;
    pointer-events: none; z-index: 300;
    box-shadow: 0 4px 16px rgba(0,0,0,.25);
    font-family: inherit;
}
.mth .tip::after {
    content: ''; position: absolute; top: 100%; left: 50%; transform: translateX(-50%);
    border: 5px solid transparent; border-top-color: #1f2a3d;
}
.mth:hover .tip { display: block; }
.mth:hover { font-weight: 700 !important; }
.tip-row { display: flex; justify-content: space-between; gap: 16px; }
.tip-lbl { color: #9ab8c8; font-size: 10.5px; }
.tip-val { color: #fff; font-weight: 600; }

/* ---- Barras de relatório ---- */
.barra { background: var(--azul-claro); color: #fff; padding: 3px 10px; border-radius: 4px; font-size: 13px; font-weight: 600; min-width: 24px; }
code { background: var(--teal-bg); padding: 2px 6px; border-radius: 4px; font-size: 12px; font-family: var(--font-mono, monospace); }

/* ---- Timeline de andamentos ---- */
.timeline { list-style: none; margin: 0; padding: 0; }
.timeline li { display: flex; gap: 14px; padding: 10px 0; border-bottom: 1px solid var(--borda); }
.timeline li:last-child { border-bottom: none; }
.timeline .data { min-width: 90px; color: var(--suave); font-size: 13px; font-weight: 600; }
.timeline .autor { color: #93a3a9; font-weight: 400; }

/* ---- Validação de campos ---- */
.campo-erro input:not([type=checkbox]):not([type=radio]),
.campo-erro select,
.campo-erro textarea { border-color: var(--vermelho) !important; background: #fff8f8 !important; }
.campo-ok input:not([type=checkbox]):not([type=radio]),
.campo-ok select,
.campo-ok textarea { border-color: #0c7a52 !important; background-color: #f2faf6 !important; }
.campo-ok input:not([type=checkbox]):not([type=radio]):not([type=date]):not([type=file]):not(.busca-wrap-interno *):not(.campo-busca *) {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%230c7a52' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 10px center;
    background-size: 15px 15px;
    padding-right: 32px !important;
}
/* Autopreenchimento do navegador (Chrome/Edge/Safari) pinta o campo por
   baixo com um box-shadow interno amarelo/azulado que NENHUM background-color
   (nem com !important) consegue sobrepor — por isso um campo autopreenchido
   pelo navegador não ficava verde mesmo com a classe campo-ok certinha
   (Carlos, 02/08/2026: "acabei de fazer um cadastro de cliente, e o
   background dos imputsboxes nao está mais ficando verde"). Sobrescreve esse
   box-shadow com a MESMA cor de fundo que o campo já teria em cada estado —
   neutro, ok ou erro — pra não competir com a validação. */
input:-webkit-autofill, input:-webkit-autofill:hover, input:-webkit-autofill:focus,
select:-webkit-autofill, select:-webkit-autofill:hover, select:-webkit-autofill:focus,
textarea:-webkit-autofill, textarea:-webkit-autofill:hover, textarea:-webkit-autofill:focus {
    -webkit-text-fill-color: var(--texto);
    -webkit-box-shadow: 0 0 0 1000px var(--superficie) inset;
    transition: background-color 9999s ease-in-out 0s;
}
.campo-ok input:-webkit-autofill, .campo-ok select:-webkit-autofill, .campo-ok textarea:-webkit-autofill {
    -webkit-box-shadow: 0 0 0 1000px #f2faf6 inset;
}
.campo-erro input:-webkit-autofill, .campo-erro select:-webkit-autofill, .campo-erro textarea:-webkit-autofill {
    -webkit-box-shadow: 0 0 0 1000px #fff8f8 inset;
}
.msg-erro { display: block; color: var(--vermelho); font-size: 11.5px; margin-top: 3px; min-height: 16px; }
.grade-fin .celula:disabled { background: transparent !important; border-color: transparent !important; color: var(--suave); cursor: default; pointer-events: none; }

@keyframes novaEntrada { 0%,30% { color: #0a6b3f; } 100% { color: inherit; } }
@keyframes novaSaida   { 0%,30% { color: #a01c1c; } 100% { color: inherit; } }
@keyframes novaLinhaFundo  { 0% { background: var(--fundo-nova, #e3f6ee); } 100% { background: transparent; } }
@keyframes novaLinhaEntra  { 0% { opacity: 0; transform: translateY(-6px); } 100% { opacity: 1; transform: translateY(0); } }
.tr-nova-entrada,
.tr-nova-saida { animation: novaLinhaEntra .28s ease; }
.tr-nova-entrada td { animation: novaEntrada 6s ease forwards, novaLinhaFundo 1.8s ease forwards; --fundo-nova: #e3f6ee; }
.tr-nova-entrada .cel-conta input { animation: novaEntrada 6s ease forwards; }
.tr-nova-saida td { animation: novaSaida 6s ease forwards, novaLinhaFundo 1.8s ease forwards; --fundo-nova: #fdeaea; }
.tr-nova-saida .cel-conta input { animation: novaSaida 6s ease forwards; }
@keyframes fadeInOverlay { from { opacity: 0; } to { opacity: 1; } }
@keyframes slideUpBox { from { opacity: 0; transform: translateY(12px) scale(.97); } to { opacity: 1; transform: translateY(0) scale(1); } }

/* Trava a seleção de texto da página inteira durante o arraste do kanban —
   sem isso, passar o cursor por cima de outros cards ia selecionando o texto
   deles. Carlos, 27/07/2026: "está selecionando o texto desses outros
   casos, isso não deve acontecer". */
body.kb-arrastando-ativo { user-select: none; -webkit-user-select: none; }
/* Sem isso, o cursor passando por cima de outros cards durante o arraste
   ativa o :hover deles (o card arrastado tem pointer-events:none, então o
   navegador "enxerga" o que está embaixo) — pisca border/background à toa.
   Carlos, 27/07/2026: "fica ativando o over de casos que passo por cima,
   esse over não deve acontecer quando estou arrastando um caso". */
body.kb-arrastando-ativo .kb-col-body .kb-card { pointer-events: none; }

/* ===== Explorer de pastas estilo Windows (grade de ícones) — usado em
   /arquivos e reaproveitado na prévia do Google Drive do caso
   (app/Views/casos/form.php). Carlos, 02/08/2026: "exiba as pastas como se
   estivéssemos no windows, faça do mesmo jeito que está nos documentos
   internos". ===== */
.fm { border: 1px solid var(--borda); border-radius: 12px; overflow: hidden; background: var(--superficie); }
/* Sem borda quando o navegador é o conteúdo PRINCIPAL da página (ex.:
   /arquivos/drive) — não está dentro de nenhum outro card, então a borda
   só criava uma linha esbranquiçada solta no topo (Carlos, 27/08/2026).
   Instâncias embutidas (.fm.compacto — Laurel, Documentos do Caso) mantêm
   a borda normal, ela é o contorno do próprio painel ali. */
.fm:not(.compacto) { border: none; }
/* flex-wrap:nowrap (não mais wrap) — a toolbar agora encolhe em estágios
   em vez de quebrar linha (busca vira lupa, depois maximizar/engrenagem/
   vista viram "⋮" — ver _ajustarToolbarResponsiva() em drive-explorer.js,
   que mede scrollWidth pra decidir; com wrap ligado aqui o transbordo nunca
   acontecia de verdade, só empurrava tudo pra uma 2ª linha feia). */
.fm-toolbar { display: flex; align-items: center; gap: 3px; flex-wrap: nowrap; padding: 8px 10px; border-bottom: 1px solid var(--borda); background: #f8fafc; overflow: hidden; }
.fm-btn { display: inline-flex; align-items: center; gap: 6px; padding: 6px 10px; border: 1px solid transparent; border-radius: 6px; background: none; color: var(--texto); cursor: pointer; font-family: inherit; font-size: 12.5px; text-decoration: none; }
.fm-btn svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.fm-btn:hover:not(:disabled) { background: #e9eef6; border-color: var(--borda); }
.fm-btn:disabled { opacity: .4; cursor: default; }
.fm-icon-only { padding: 6px; }
.fm-sep { width: 1px; height: 20px; background: var(--borda); margin: 0 3px; }

/* min-width (não só max-width:220px, que já existia) — sem um piso, o
   flex-shrink padrão deixava a busca encolher até quase sumir sozinha,
   nunca chegando a transbordar de verdade, então _ajustarToolbarResponsiva()
   nunca detectava scrollWidth > clientWidth e a lupa colapsada nunca
   aparecia. */
.fm-toolbar .busca-wrap-interno { flex: 1 1 auto; min-width: 90px; margin-left: 8px; }

/* ===== Toolbar responsiva (Carlos, 11/08/2026: "crie os botões voltar,
   avançar e subir pasta, antes da busca... quando não tiver espaço, vá
   encolhendo a busca até tornar uma lupa... os icones de maximizar,
   engrenagem e exibição, quando nao houver espaço, troque por 3
   pontinhos") — ver _ajustarToolbarResponsiva() em drive-explorer.js. ===== */
.fm-toolbar-icones { display: flex; align-items: center; gap: 3px; flex: none; }
.fm-toolbar-busca-icone { display: none; flex: none; }
.fm-toolbar--busca-encolhida .busca-wrap-interno { display: none; }
.fm-toolbar--busca-encolhida .fm-toolbar-busca-icone { display: inline-flex; }
.fm-toolbar-overflow { display: none; position: relative; flex: none; }
.fm-toolbar--icones-encolhidos .fm-toolbar-icones { display: none; }
.fm-toolbar--icones-encolhidos .fm-toolbar-overflow { display: flex; }
.fm-overflow-menu { position: absolute; right: 0; top: calc(100% + 6px); z-index: 40; min-width: 190px; background: var(--superficie); border: 1px solid var(--borda); border-radius: 10px; box-shadow: 0 10px 28px rgba(20,40,80,.16); padding: 4px; }
.fm-overflow-item { display: flex; align-items: center; gap: 10px; width: 100%; padding: 8px 10px; border: none; background: none; border-radius: 6px; color: var(--texto); font-size: 13px; font-family: inherit; cursor: pointer; text-align: left; }
.fm-overflow-item:hover { background: var(--cinza-bg, #f2f4f8); }
.fm-overflow-item svg { flex: none; width: 15px; height: 15px; stroke: currentColor; fill: none; stroke-width: 2; }

/* Modal de busca (campo colapsado -> lupa -> clique abre isto) */
.fm-busca-modal-bg { position: fixed; inset: 0; background: rgba(20,30,50,.45); z-index: 1000; display: flex; align-items: flex-start; justify-content: center; padding: 80px 16px 16px; }
.fm-busca-modal { background: var(--superficie); border-radius: 12px; width: 420px; max-width: 100%; box-shadow: 0 18px 50px rgba(20,40,80,.28); padding: 10px; }
.fm-busca-modal-campo { display: flex; align-items: center; gap: 8px; padding: 8px 10px; border: 1px solid var(--borda); border-radius: 8px; }
.fm-busca-modal-campo svg { flex: none; width: 16px; height: 16px; stroke: var(--suave); fill: none; stroke-width: 2; }
.fm-busca-modal-campo input { flex: 1; border: none; outline: none; font-size: 14px; font-family: inherit; color: var(--texto); background: none; }
/* Modal de confirmação de exclusão do navegador de arquivos — substitui o
   confirm() genérico do navegador por uma modal do próprio sistema, com
   ícone de lixeira em destaque (Carlos, 24/08/2026: "a modal de aviso,
   deve ser do sistema e não aquele padrão genérico do navegador, capriche
   no icone de lixeira"). Mesmo overlay de .fm-busca-modal-bg, centralizado
   verticalmente (não fixo no topo como a busca) por ser uma confirmação
   pontual, não um painel de navegação. */
.fm-excluir-modal-bg { align-items: center; opacity: 0; transition: opacity .15s ease; }
.fm-excluir-modal-bg.aberto { opacity: 1; }
.fm-excluir-modal {
    background: var(--superficie); border-radius: 16px; width: 360px; max-width: 100%;
    box-shadow: 0 24px 60px rgba(20,40,80,.32); padding: 26px 24px 20px; text-align: center;
    transform: scale(.94) translateY(6px); transition: transform .15s ease;
}
.fm-excluir-modal-bg.aberto .fm-excluir-modal { transform: scale(1) translateY(0); }
.fm-excluir-modal-icone {
    width: 52px; height: 52px; border-radius: 50%; background: #fdeaea; color: #d14343;
    display: flex; align-items: center; justify-content: center; margin: 0 auto 14px;
}
.fm-excluir-modal-icone svg { width: 24px; height: 24px; }
.fm-excluir-modal-titulo { font-size: 15.5px; font-weight: 700; color: var(--titulo); margin-bottom: 6px; }
.fm-excluir-modal-desc { font-size: 12.5px; color: var(--suave); line-height: 1.5; margin-bottom: 20px; }
.fm-excluir-modal-acoes { display: flex; gap: 8px; justify-content: center; }
.fm-excluir-modal-acoes button {
    flex: 1; padding: 9px 14px; border-radius: 8px; font-size: 13px; font-weight: 600;
    cursor: pointer; font-family: inherit; border: 1px solid transparent;
}
.fm-excluir-modal-cancelar { background: var(--cinza-bg); color: var(--texto); border-color: var(--borda); }
.fm-excluir-modal-cancelar:hover { background: var(--borda); }
.fm-excluir-modal-confirmar { background: #d14343; color: #fff; }
.fm-excluir-modal-confirmar:hover { background: #b23535; }
/* Modal "Compactar PDF" (menu de contexto do navegador de arquivos, ver
   DriveExplorer.prototype._abrirModalCompactarPdf) — mesmo overlay de
   .fm-busca-modal-bg (reaproveitado), caixa maior por ter mais conteúdo
   (sistema de destino, opções, resultado com partes). */
.fm-compactar-modal { background: var(--superficie); border-radius: 14px; width: 460px; max-width: 100%; max-height: calc(100vh - 120px); overflow-y: auto; box-shadow: 0 18px 50px rgba(20,40,80,.28); }
.fm-compactar-modal-cabe { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 16px 18px; border-bottom: 1px solid var(--borda); }
.fm-compactar-modal-cabe strong { font-size: 15px; color: var(--azul); }
.fm-compactar-modal-cabe button { background: none; border: none; font-size: 20px; line-height: 1; cursor: pointer; color: var(--suave); }
.fm-compactar-modal-corpo { padding: 16px 18px; display: flex; flex-direction: column; gap: 14px; }
.fm-compactar-limite-box { display: flex; align-items: baseline; gap: 8px; padding: 10px 12px; background: var(--cinza-bg); border-radius: 10px; font-size: 12.5px; color: var(--suave); }
.fm-compactar-limite-box strong { font-size: 16px; color: var(--titulo); }
.fm-compactar-check { display: flex; align-items: flex-start; gap: 8px; font-size: 13px; color: var(--texto); cursor: pointer; }
.fm-compactar-etapas { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; font-size: 12.5px; color: var(--suave); }
.fm-compactar-etapas li::before { content: '○ '; }
.fm-compactar-etapas li.ok { color: var(--texto); }
.fm-compactar-etapas li.ok::before { content: '✓ '; color: var(--verde); font-weight: 700; }
.fm-compactar-etapas li.ativa { color: var(--azul-claro); font-weight: 600; }
.fm-compactar-etapas li.ativa::before { content: '● '; }
.fm-compactar-resumo { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
.fm-compactar-resumo > div { background: var(--cinza-bg); border-radius: 8px; padding: 8px 10px; }
.fm-compactar-resumo span { display: block; font-size: 10.5px; text-transform: uppercase; letter-spacing: .04em; color: var(--suave); font-weight: 700; }
.fm-compactar-resumo strong { display: block; margin-top: 2px; font-size: 14px; color: var(--titulo); }
.fm-compactar-partes { display: flex; flex-direction: column; gap: 6px; }
.fm-compactar-parte-linha { display: flex; align-items: center; gap: 8px; font-size: 12.5px; padding: 6px 0; border-bottom: 1px solid var(--borda); }
.fm-compactar-parte-linha .nome { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Tamanho reduzido em 30% (Carlos, 03/08/2026: "diminua o tamanho das
   pastas em 30%") — pastas aninhadas (sub-árvore real, ver .fm-subarvore)
   usam exatamente as mesmas classes, então ficam do mesmo tamanho por
   construção ("as subpastas devem ter o mesmo tamanho"), sem regra própria
   por nível de profundidade. */
/* align-items:start — sem isso, o grid estica cada célula pra bater com a
   mais alta da MESMA linha (comportamento padrão "stretch"), sobrando um
   vão vazio embaixo do ícone/nome nos itens sem a linha de tamanho/data
   (Carlos, 10/08/2026: "esse espaço exagerado no contorno dos arquivos"). */
.fm-area { display: grid; grid-template-columns: repeat(auto-fill, minmax(105px, 1fr)); gap: 5px; padding: 14px; align-items: start; }
/* Modo quadros (grade): ícone + nome centralizados, como um explorador de
   ícones (Carlos, 07/08/2026: "o icone da pasta e arquivos e as descrições
   devem ser alinhadas ao meio"). O modo lista (mais abaixo, .fm.lista)
   continua com alinhamento à esquerda — layout de linha, não de cartão. */
.fm-item { position: relative; display: flex; flex-direction: column; align-items: center; justify-content: flex-start; gap: 2px; padding: 8px 6px; border-radius: 8px; cursor: pointer; border: 1.5px solid transparent; text-align: center; }
/* Altura padrão no modo grade — sem isso, cartões sem a linha de tamanho/
   data (upload pendente, pastas) ficam mais baixos que os com arquivo já
   anexado, e o align-items:start do .fm-area (ver acima) deixa cada um na
   sua própria altura em vez de esticado: certo pra não sobrar vão vazio,
   errado pra alinhar os ícones em fileira (Carlos, 10/08/2026: "ficou tudo
   desalinhado, crie um tamanho padrão"). min-height, não height — nomes de
   3 linhas (raro, line-clamp corta em 2) ainda podem crescer o cartão.
   :not(.lista) É OBRIGATÓRIO — sem ele, esta regra (3 classes: fm+compacto+
   fm-item não conta aqui, é só fm+fm-item = 2) ainda empata em
   especificidade com ".fm.lista .fm-item" (3 classes) só no caso compacto
   (ver a versão compacta abaixo) e, por vir DEPOIS no arquivo, ganhava por
   ordem de origem — todo item do modo Lista (inclusive os chips da
   checklist embutida) ficava esticado pra 88/108px de altura à toa (Carlos,
   10/08/2026: "modo lista, o efeito de over está muito grande na
   vertical" — não era hover, era esse min-height vazando pro modo errado). */
.fm:not(.lista) .fm-item { min-height: 108px; }
.fm-item:hover { background: #f1f5fb; }
/* Tamanho base um pouco maior (Carlos, 06/08/2026: "pode aumentar um pouco
   o tamanho das pastas, pra facilitar a visualização da checklist") — vale
   pro navegador inteiro, já que é um único componente compartilhado; o
   modificador .fm.compacto (mais abaixo) continua menor, pros painéis
   embutidos. */
.fm-item-icone { display: flex; align-items: center; justify-content: center; width: 38px; height: 38px; flex: none; }
.fm-item-icone svg, .fm-item-icone img { width: 100%; height: 100%; filter: drop-shadow(0 1px 1px rgba(20,40,80,.12)); }
/* line-clamp em vez de max-height fixo — max-height sempre reservava o
   espaço de 2 linhas mesmo em nomes de uma linha só, deixando uma folga
   visível antes do tamanho/data abaixo (Carlos, 08/08/2026, com print: "o
   nome do arquivo e os detalhes ainda estão muito distante"); com
   line-clamp a altura acompanha o texto de verdade (1 ou 2 linhas), só
   corta a partir da 3ª. */
.fm-item-nome { font-size: 13.5px; color: var(--texto); word-break: break-word; line-height: 1.3; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
/* Renomear direto na listagem, sem modal (Carlos, 04/08/2026: "permita
   renomear ali direto na escrita da pasta, ainda de abrir modal"). */
.fm-item-nome.fm-item-nome-editando { overflow: visible !important; text-overflow: clip !important; white-space: normal !important; max-height: none !important; background: #fff; outline: 2px solid var(--azul-claro); border-radius: 4px; padding: 1px 4px; cursor: text; }
.fm-item-meta { font-size: 12px; color: var(--suave); }
.fm-item-acoes { display: flex; gap: 6px; margin-top: 2px; }
/* Pasta do caso: fundo levemente destacado + percevejo ao lado do nome —
   trocado do selo de texto pra isso (Carlos, 07/08/2026: escolheu entre 4
   ícones sugeridos — "1. Percevejo (thumbtack)"). */
.fm-item-pasta-caso { background: rgba(30, 64, 121, .06); border-radius: 8px; }
/* Percevejo alinhado à direita do item — sibling de fm-item-nome, não mais
   dentro dele (Carlos, 07/08/2026: "alinhe para a direita"). Em grade
   (coluna) empurra pra direita dentro do cross-axis; em lista (linha)
   empurra pro fim da linha, antes de qualquer botão de ação. */
.fm-item-pin-caso { display: inline-flex; flex: none; color: var(--azul-claro); align-self: flex-end; }
.fm.lista .fm-item-pin-caso { margin-left: auto; align-self: center; }
/* Checklist embutida na pasta ANEXOS PRONTOS (Carlos, 06/08/2026) — item já
   anexado fica verde, igual à checklist avulsa, pra não haver estranhamento
   visual entre os dois lugares. */
.fm-item-checklist-ok { border-style: solid; border-color: #0c7a52; background: #f2faf6; }
/* Check de anexado — mesmo ícone da checklist avulsa, faltava aqui (Carlos,
   08/08/2026: "o quadro fica verde, más falta exibir aquele icone de
   correto que é exibido na checklist independente"). Ocupa o canto que
   antes era da lixeira sempre visível (removida — excluir agora só pelo
   botão direito). */
.fm-item-checklist-check { position: absolute; top: 4px; right: 4px; width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; pointer-events: none; }
.fm.lista .fm-item-checklist-check { position: static; margin-left: auto; }
/* Selo da exigência ad-hoc no slot pendente — canto esquerdo pra não
   disputar espaço com os botões de câmera/scanner, que já ocupam o canto
   direito (Carlos, 10/08/2026: "criar uma exigência especifica... para que
   os usuários saibam que está sendo necessário um novo documento"). */
.fm-item-checklist-adhoc-badge { position: absolute; top: 4px; left: 4px; width: 14px; height: 14px; color: #c9822e; pointer-events: none; }
.fm-item-checklist-adhoc-badge svg { width: 100%; height: 100%; display: block; }
.fm.lista .fm-item-checklist-adhoc-badge { position: static; flex: none; margin: 0; }
/* Enviando: mesmo pulso suave na borda da checklist avulsa (Carlos,
   26/07/2026: "anime melhor o upload dos arquivos"). */
.fm-item-checklist-enviando { pointer-events: none; border-style: solid; animation: checklistPulso 1.3s ease-in-out infinite; }
/* Digitalizando: mesmo feixe de luz correndo (Carlos, 02/08/2026: "quando
   estou digitalizando um documento, pode fazer um efeito de digitalizando
   dentro da imputbox do documento"). */
/* overflow:hidden pra o feixe animado (abaixo) não vazar pra fora do quadro
   — sem isso ele aparecia passando por cima dos itens vizinhos (Carlos,
   06/08/2026: "o efeito de digitalização deve aparecer só dentro do campo
   do checklist"). */
.fm-item-checklist-digitalizando { pointer-events: none; border-style: solid; border-color: var(--azul-claro); overflow: hidden; }
.fm-item-checklist-digitalizando::after {
    content: ''; position: absolute; top: 0; bottom: 0; left: -35%; width: 35%;
    background: linear-gradient(90deg, transparent, rgba(30,64,121,.4), transparent);
    animation: checklistScanBeam 1.1s ease-in-out infinite;
}
/* Botão de digitalizar sempre visível no slot pendente — igual à checklist
   avulsa, que já tinha um ícone de scanner na própria linha, não escondido
   atrás do botão direito (Carlos, 06/08/2026: "deixa mais igual a
   checklist fora do navegador"). */
.fm-item-checklist-scan-btn { position: absolute; top: 4px; right: 4px; width: 22px; height: 22px; padding: 1px; border: none; background: none; color: var(--suave); cursor: pointer; border-radius: 5px; display: flex; align-items: center; justify-content: center; }
.fm-item-checklist-scan-btn:hover { background: rgba(30, 64, 121, .08); color: var(--azul-claro); }
.fm-item-checklist-scan-btn svg { width: 100%; height: 100%; }
.fm.lista .fm-item-checklist-scan-btn { position: static; margin-left: auto; }
.fm-item-checklist-camera-btn { position: absolute; top: 4px; right: 28px; width: 20px; height: 20px; padding: 2px; border: none; background: none; color: var(--suave); cursor: pointer; border-radius: 5px; display: flex; align-items: center; justify-content: center; }
.fm-item-checklist-camera-btn:hover { background: rgba(30, 64, 121, .08); color: var(--azul-claro); }
.fm-item-checklist-camera-btn svg { width: 100%; height: 100%; }
.fm.lista .fm-item-checklist-camera-btn { position: static; margin-left: 4px; order: -1; }
/* Excluir sempre visível no anexo já enviado — igual à checklist avulsa
   (Carlos, 06/08/2026: "depois que o arquivo estiver upado, tem que ter a
   opção de enviar a lixeira também"). */
.fm-item-checklist-del-btn { position: absolute; top: 4px; right: 4px; width: 18px; height: 18px; padding: 2px; border: none; background: none; color: var(--suave); cursor: pointer; border-radius: 5px; display: flex; align-items: center; justify-content: center; }
.fm-item-checklist-del-btn:hover { background: rgba(209, 67, 67, .1); color: #b23535; }
.fm-item-checklist-del-btn svg { width: 100%; height: 100%; }
.fm.lista .fm-item-checklist-del-btn { position: static; margin-left: auto; }
.fm-item-progresso { position: absolute; left: 4px; right: 4px; bottom: 3px; height: 3px; border-radius: 2px; background: rgba(0,0,0,.08); overflow: hidden; }
.fm-item-progresso-barra {
    height: 100%; width: 0%; transition: width .2s ease;
    background: linear-gradient(90deg, var(--azul-claro), #6a9eef, var(--azul-claro));
    background-size: 200% 100%;
    animation: checklistShimmer 1.1s linear infinite;
}
/* Setinha de expandir/recolher — só em pastas reais e navegáveis por clique
   (Carlos, 03/08/2026: "não é pra entrar na pasta, más sim expandir a
   árvore"). Fica sobreposta no canto em modo quadros, e como 1º item da
   linha em modo lista. */
.fm-item-caret { position: absolute; top: 5px; left: 5px; width: 13px; height: 13px; display: flex; align-items: center; justify-content: center; color: var(--suave); transition: transform .15s; pointer-events: none; }
.fm-item-caret.aberto { transform: rotate(90deg); }
/* Item recortado (aguardando colar) fica esmaecido até a colagem ou até
   escolher outro item pra recortar/copiar (Carlos: "permita ainda copiar,
   recortar e colar pastas e arquivos"). */
.fm-item-recortado { opacity: .4; }
/* Sub-árvore de pastas REAIS, expandida inline no lugar de navegar pra
   dentro (mesmas classes .fm-item/.fm-item-icone do nível de cima — só
   recuada, nunca menor). */
.fm-subarvore { grid-column: 1/-1; margin: 2px 0 4px 18px; padding-left: 6px; border-left: 2px solid var(--borda); }
/* Pasta "fantasma" — ainda não existe no Drive, é só a prévia de onde vai
   ser criada (Carlos, 03/08/2026: "é ali que quero que vc crie o preview
   das pastas que serão criadas"). Tracejada + esmaecida, sem hover de
   destaque de rename (não dá pra renomear o que ainda não existe). */
.fm-item-fantasma { border-style: dashed; border-color: #c7cdd6; opacity: .72; }
.fm-item-fantasma .fm-item-icone { opacity: .8; }
.fm-item-fantasma .fm-item-meta { color: var(--azul-claro); }
/* Sub-árvore que aparece expandida logo abaixo de uma pasta fantasma,
   mostrando tudo que ainda falta ser criado dentro dela de uma vez (Carlos,
   03/08/2026: "ela deve ficar expandida, a fim de mostrar a pasta do caso e
   a pasta anexos prontos"). grid-column:1/-1 (via style inline) ocupa a
   largura toda da grade, sem depender de quantas colunas a tela couber. */
.fm-fantasma-arvore { display: flex; flex-direction: column; gap: 2px; padding: 2px 8px 8px; }
/* Mesmo tamanho/cor da pasta fantasma de cima (.fm-item-fantasma, que usa o
   .fm-item-nome normal de 14px) — antes essas linhas usavam 12px cinza
   (var(--suave)), bem menor/mais apagado que "ALTAIR PAULO POTULSKI" logo
   acima, dando a impressão de nível diferente sem motivo (Carlos, 11/08/2026,
   com print: "porque as pastas... estão menores? deixe igual"). opacity:.72
   igual ao .fm-item-fantasma mantém o esmaecido de "ainda não existe" sem
   precisar mudar a cor do texto. */
.fm-fantasma-linha { display: flex; align-items: center; gap: 6px; font-size: 14px; color: var(--texto); padding: 3px 0; opacity: .72; }
.fm-fantasma-linha svg { flex: none; opacity: .8; }
/* No painel compacto (ex.: navegador embutido em Novo Caso), .fm-item-nome
   cai pra 12px (.fm.compacto .fm-item-nome) — acompanha aqui também, senão
   a pasta do cliente (12px ali) ficaria MENOR que estas linhas (14px),
   invertendo o problema original. */
.fm.compacto .fm-fantasma-linha { font-size: 12px; }
.fm-fantasma-tag { margin-left: auto; font-size: 10.5px; color: var(--azul-claro); white-space: nowrap; }
.fm-vazio { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; color: var(--suave); padding: 60px 0; }
/* .fm-area é um grid (ver acima), então um .fm-vazio sozinho virava só mais
   uma célula de grid (largura de 1 coluna, colada no topo por causa do
   align-items:start do grid) em vez de ficar centralizado no painel inteiro
   — o flex-center acima só centraliza o ÍCONE+TEXTO dentro da própria
   célula estreita (Carlos, 31/08/2026, print do navegador de pastas
   mostrando o ícone "Nada aqui ainda." grudado no canto). :only-child
   restringe o ajuste a quando é a ÚNICA coisa na área (vazia/erro/carregando)
   — uma grade cheia de arquivos de verdade continua alinhada ao topo. */
.fm-area > .fm-vazio:only-child { grid-column: 1 / -1; align-self: center; justify-self: center; width: 100%; }
/* Ícone de carregando (não só texto) — a 1ª abertura do Drive é lenta de
   verdade (sem cURL disponível no PHP local, cada chamada paga um
   handshake TLS novo, sem keep-alive) e o texto sozinho parecia travado
   (Carlos, 06/08/2026: "o drive está demorando muito para abrir a primeira
   vez... crie um icone de loading"). */
.fm-spinner { width: 22px; height: 22px; animation: busca-spin .8s linear infinite; }
/* display:flex (não block) só pra .fm-area poder usar gap entre os itens —
   sem isso as linhas ficavam grudadas, sem respiro nenhuma na outra
   (Carlos, 08/08/2026: "entre uma checkbox e outra, não existe espaço").
   Cada item continua ocupando a linha toda (largura 100% por padrão de um
   filho flex em coluna). */
/* align-items:stretch de volta aqui — o modo lista precisa que cada linha
   ocupe a largura toda (senão a área de clique/hover encolhe pro tamanho do
   texto); o align-items:start do .fm-area base é só pro modo grade. */
/* gap:6px — "leve espaço" entre uma linha e outra (Carlos, 10/08/2026: "no
   modo lista... deixe um leve espaço entre um quadro e outro"; antes 3px
   deixava as linhas quase coladas). */
.fm.lista .fm-area { display: flex; flex-direction: column; gap: 6px; padding: 6px; align-items: stretch; }
/* Pasta da checklist embutida (ANEXOS PRONTOS) — caixinhas do tamanho do
   conteúdo, lado a lado com respiro entre elas, em vez de cada uma ocupar
   a linha toda (Carlos, 08/08/2026: "entre as checkboxes, deixe um
   pequeno espaço, o width das checkboxes deve ser apenas o essencial e
   não 100% do espaço possível"). .fm-area-checklist é ligada/desligada em
   JS (DriveExplorer._render) conforme a pasta aberta é ou não a da
   checklist — só afeta essa pasta específica, o resto do navegador
   continua em linha cheia. Largura fixa (não só "shrink to content") pra
   dar uma base estável ao nome/meta quebrarem em 2 linhas por dentro,
   igual já faziam antes. Regra sem `.fm.lista` embaixo cobre também o modo
   Quadros/Grade, que usa `.fm-area` em grid com gap:5px padrão — grudado
   demais entre as caixinhas coloridas (Carlos, 10/08/2026: "os quadros
   continuam aparecendo colados"). ATENÇÃO especificidade: `.fm.lista
   .fm-area` (3 classes) é MAIS específico que `.fm-area.fm-area-checklist`
   (2 classes) — por isso o gap do modo Lista precisa do próprio `gap`
   redeclarado dentro da regra `.fm.lista ...` abaixo, senão o gap:3px do
   modo Lista genérico vence de novo e volta a colar as caixinhas (bug real:
   uma refatoração anterior moveu o gap pra cá e quebrou o modo Lista sem
   perceber, só o modo Quadros continuou funcionando). */
.fm-area.fm-area-checklist { gap: 10px; }
.fm.lista .fm-area.fm-area-checklist { flex-direction: row; flex-wrap: wrap; gap: 8px; align-items: flex-start; align-content: flex-start; }
/* gap/padding PRÓPRIOS aqui, menores que o .fm.lista .fm-item genérico
   (Carlos, 10/08/2026) — a caixinha de 200px é largura fixa; o gap:14px/
   padding:12px maiores (pensados pra linha cheia) não cabiam mais dentro
   dela, e o conteúdo (principalmente o ✓ da checklist) vazava pra cima da
   caixinha vizinha — exatamente o "estragou o espaçamento no modo lista"
   reportado depois de aumentar o espaçamento genérico. */
.fm.lista .fm-area-checklist .fm-item { flex: none; width: 200px; gap: 8px; padding: 4px 8px; }
/* min-width:120px do .fm-item-nome genérico (pensado pra linha CHEIA, com
   espaço de sobra) não cabe na caixinha de 200px — é ele, não o gap/padding,
   quem realmente empurrava o ✓/badge da checklist pra fora da caixinha,
   por cima da vizinha. Sem min-width aqui, o próprio text-overflow:ellipsis
   já existente cuida de truncar nomes longos normalmente. */
.fm.lista .fm-area-checklist .fm-item-nome { min-width: 0; }
/* flex:0 0 200px do .fm-item-meta genérico (coluna fixa da linha CHEIA) é
   maior que a caixinha inteira de 200px — era ele (achado ao investigar o
   ✓ vazando) quem tomava a largura toda e empurrava nome pra 0 e o resto
   pra fora. Aqui vira largura natural, encolhível como o nome. */
.fm.lista .fm-area-checklist .fm-item-meta { flex: 0 1 auto; }
/* Trava nowrap só no item PENDENTE da checklist (Carlos, 11/08/2026, com
   print: "os quadros do checklist" quebrando em duas linhas) — esse item
   não tem meta pra quebrar de propósito, só nome + botão de digitalizar;
   sem essa trava, nome comprido ("Comprovante de residência") empurrava o
   botão pra uma 2ª linha dentro da própria caixinha de 200px, flutuando
   sozinho embaixo. Escopo só em .fm-item-checklist-pendente (não mais em
   .fm-area-checklist .fm-item genérico) porque o item JÁ ANEXADO
   (.fm-item-checklist-ok) tem meta de verdade (tamanho/data) e esse SIM
   deve poder quebrar em 2 linhas — Carlos, 11/08/2026, voltando atrás:
   "quero que nome/detalhes voltem a ficar em 2 linhas no modo lista
   quando faltar espaço" (era sobre o ✓ de documento checado). */
.fm.compacto.lista .fm-area-checklist .fm-item-checklist-pendente { flex-wrap: nowrap; }
.fm.compacto.lista .fm-area-checklist .fm-item-checklist-pendente .fm-item-nome { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Padding vertical reduzido — linha um pouco mais baixa (Carlos,
   08/08/2026: "a checkbox dos documento, pode ser menor verticalmente"). */
/* gap/padding maiores — o ícone ficava espremido perto do nome (Carlos,
   10/08/2026: "o espaçamento horizontal precisa ser maior, a fim de exibir
   o icone de forma correta sem encavalar"). */
.fm.lista .fm-item { flex-direction: row; align-items: center; gap: 14px; text-align: left; padding: 6px 12px; border-radius: 6px; min-height: 0; }
.fm.lista .fm-item-icone { width: 17px; height: 17px; }
/* Nome flexível (cresce pra ocupar o espaço sobrando), tamanho/data em
   coluna fixa — antes o nome tinha largura fixa de 340px, então em painéis
   largos (ex.: Arquivos do escritório em tela cheia) sobrava uma faixa
   morta de centenas de pixels depois da coluna de metadados (Carlos,
   07/08/2026: "o navegador de arquivos deve ocupar todo o espaço
   disponivel"). */
/* .fm-item-corpo agrupa nome+meta num sub-container à parte do ícone —
   display:contents por padrão (grade), então não afeta o card empilhado
   de sempre; só o modo lista abaixo dá comportamento próprio a ele. */
.fm-item-corpo { display: contents; }
/* Modo lista: nome+meta numa linha só, SEMPRE — nunca quebram pra uma 2ª
   linha (decisão final de Carlos, 11/08/2026, depois de tentar o oposto:
   "no modo lista, quando faltar espaço, comece a ocultar o texto dos
   arquivos, da direita para a esquerda"). flex-wrap:nowrap + min-width:0 no
   meta é o que faz o meta encolher e sumir (reticências) ANTES do nome —
   sem o min-width:0, um item flex nunca encolhe além do próprio conteúdo
   mesmo com overflow:hidden, e sem o nowrap ele descia pra uma 2ª linha
   dentro da mesma caixinha; como a linha (.fm-item) tem altura pensada pra
   1 linha só, esse texto extra vazava por cima da linha seguinte — bug
   real, visível em painéis estreitos como o navegador embutido no editor
   (Carlos, 12/08/2026, com print: "eu cliquei em prestar contas, olha como
   ficou o navegador de arquivos"). */
.fm.lista .fm-item-corpo { display: flex; flex-wrap: nowrap; align-items: baseline; flex: 1 1 auto; min-width: 0; column-gap: 10px; }
.fm.lista .fm-item-nome { flex: 1 1 auto; min-width: 100px; font-size: 14px; max-height: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.fm.lista .fm-item-meta { flex: 0 1 auto; min-width: 0; font-size: 12.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.fm.lista .fm-item-acoes { margin-top: 0; margin-left: auto; }
/* .fm.compacto.lista .fm-item-checklist-check: position:static + margin-left:auto
   (não absolute) — cai sempre DEPOIS do meta na mesma linha, nunca por cima
   do texto (Carlos, 11/08/2026, com print: "o icone de correto... fica em
   cima da escrita de horario"). */
/* Seta de expandir/recolher escondida no modo lista (Carlos, 04/08/2026:
   "no modo lista, remova a flexa antes da pasta") — clicar na pasta
   continua expandindo normalmente, só não mostra mais o ícone. */
.fm.lista .fm-item-caret { display: none; }
.fm.lista .fm-subarvore { margin-left: 14px; }
.vista-toggle-unico[data-atual="grade"] span[data-icone="lista"] { display: inline-flex; }
.vista-toggle-unico[data-atual="lista"] span[data-icone="grade"] { display: inline-flex; }

/* Item selecionado (clique simples, fica destacado pra Renomear/Excluir da
   toolbar saberem em qual item agir). */
.fm-item.sel { background: #dceafe; border-color: #9cc2fb; }
/* Arquivo aberto no Laurel agora — marcador PERSISTENTE (sobrevive a
   trocar de pasta, atualizar a lista etc.), diferente do .sel acima (que é
   só o clique do momento e some assim que clica em outro item). Carlos,
   25/08/2026: "se tem um arquivo aberto no laurel, vc deve destacar esse
   arquivo no navegador de arquivos, para o usuário saber o que está
   aberto". */
/* Só cor de fundo/borda — sem texto extra ("Aberto no Laurel") nem
   ::after, que mudavam a ALTURA do item e empurravam os vizinhos na grade,
   parecendo mais um "recarregamento"/reflow do que um destaque (Carlos,
   25/08/2026: "está novamente com aquele problema... recarrega"). */
.fm-item.fm-item-aberto-laurel { background: #eaf7f1; border-color: #8fd4b6; }
/* Feedback imediato ao dar duplo clique num .lau — a leitura do atalho é uma
   chamada de verdade ao Google Drive, que pode demorar vários segundos em
   dias de API lenta; sem isto a tela ficava parada sem nenhum sinal até o
   Laurel aparecer do nada, parecendo um recarregamento (Carlos, 25/08/2026:
   "acabe com isso de uma vez por todas"). */
.fm-item.fm-item-abrindo { opacity: .55; cursor: wait; }
.fm-item.fm-item-abrindo .fm-item-icone { position: relative; }
.fm-item.fm-item-abrindo .fm-item-icone::after {
    content: ''; position: absolute; inset: 0; margin: auto; width: 16px; height: 16px;
    border: 2px solid #c8d6ec; border-top-color: #1e4079; border-radius: 50%;
    animation: fm-girar .7s linear infinite;
}
@keyframes fm-girar { to { transform: rotate(360deg); } }
.fm-btn-perigo:hover:not(:disabled) { background: #fdecea; color: #d14343; }
/* Arrastar-e-soltar — tanto mover item entre pastas quanto soltar arquivo do
   sistema operacional pra fazer upload (Carlos, 04/08/2026: navegador único,
   com paridade total de recursos nas 4 telas). */
.fm-item.fm-arrastando { opacity: .4; }
.fm-item.fm-drop-alvo { background: #dceafe !important; border-color: #4a90d9 !important; outline: 2px dashed #4a90d9; }
.fm-area.fm-drop-alvo { outline: 2px dashed #4a90d9; outline-offset: -6px; background: #ecfaf3; }
/* Modo compacto — painel embutido (Laurel, prévia de caso), ícones/fonte
   menores que a versão de página cheia (Arquivos do escritório). */
.fm.compacto .fm-item-icone { width: 22px; height: 22px; }
.fm.compacto .fm-item-nome { font-size: 12px; }
.fm.compacto .fm-item-meta { font-size: 11px; }
/* Altura padrão do modo grade compacto — proporcional à versão de página
   cheia (ícone/fonte menores, ver .fm-item acima), mesma lógica.
   :not(.lista) obrigatório — ver comentário grande na regra irmã (.fm:not
   (.lista) .fm-item, mais acima) sobre o empate de especificidade que
   vazava esse min-height pro modo Lista. */
.fm.compacto:not(.lista) .fm-item { min-height: 88px; }
.fm.compacto .fm-btn span { display: none; }
.fm.compacto .fm-btn { padding: 6px; }
.fm.compacto .fm-toolbar { padding: 6px 8px; }
/* Menu de contexto — família única reaproveitada em todo lugar que hoje tem
   botão direito (arquivo, pasta, área vazia, item fantasma). Modelada na
   versão mais completa que já existia só no editor Laurel (.doc-ctx-*, com
   modificador de perigo e separador). */
.fm-ctx-menu { position: fixed; z-index: 900; min-width: 190px; max-height: 320px; overflow-y: auto; background: var(--superficie); border: 1px solid var(--borda); border-radius: 8px; box-shadow: 0 8px 28px rgba(20,40,80,.18); padding: 4px; display: none; }
.fm-ctx-menu.aberto { display: block; }
.fm-ctx-item { display: flex; align-items: center; gap: 8px; width: 100%; padding: 7px 10px; border: none; background: none; font-family: inherit; font-size: 12.5px; color: var(--texto); text-align: left; border-radius: 6px; cursor: pointer; }
.fm-ctx-item:hover { background: #eef2f8; }
.fm-ctx-item.perigo { color: #d14343; }
.fm-ctx-item.perigo:hover { background: #fdecea; }
.fm-ctx-item svg { flex: none; width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.fm-ctx-sep { height: 1px; background: var(--borda); margin: 4px 2px; }

/* ===== Casos — alternância Lista / Kanban (ícones no breadcrumb) ===== */
.trilha-linha { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 4px; }
.trilha-linha .trilha { margin-bottom: 0; }
.vista-toggle-unico { flex: none; border: none; background: none; padding: 0; border-radius: 4px; color: var(--suave); cursor: pointer; display: inline-flex; }
.vista-toggle-unico svg { width: 15px; height: 15px; stroke: currentColor; fill: none; stroke-width: 2.2; }
.vista-toggle-unico:hover { background: var(--menu-hover); color: var(--texto); }
.vista-toggle-unico span { display: none; }
.vista-toggle-unico[data-atual="lista"] span[data-icone="kanban"] { display: inline-flex; }
.vista-toggle-unico[data-atual="kanban"] span[data-icone="lista"] { display: inline-flex; }

/* ===== Casos — visão Kanban ===== */
.kanban { margin-top: 2px; }
.kb-board { display: flex; gap: 6px; align-items: flex-start; overflow-x: auto; padding-bottom: 6px; }
/* Coluna sem fundo próprio — funde com o fundo da página, só os cards
   (.kb-card, abaixo) continuam brancos (Carlos, 04/08/2026: "remova o fundo
   branco da coluna, deixando a coluna cinza invisivel, da mesma cor do
   fundo, o branco vai ser apenas nos cards"). */
.kb-col { flex: 1 1 0; min-width: 220px; background: transparent; border: 1px solid transparent; border-radius: 10px; overflow: hidden; }
.kb-col-h { display: flex; align-items: center; gap: 8px; padding: 10px 12px; border-bottom: 1px solid var(--borda); cursor: pointer; user-select: none; }
.kb-col-h:hover { background: #f8fafd; }
.kb-name { font-size: 13px; font-weight: 600; color: var(--texto); flex: 1 1 auto; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.kb-count { background: var(--kb); color: var(--kbt); min-width: 20px; height: 20px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; padding: 0 6px; font-size: 11px; font-weight: 600; flex: none; }
.kb-col-valor { font-size: 11px; font-weight: 700; color: #b9770e; background: #fff8e1; border-radius: 10px; padding: 1px 8px; flex: none; white-space: nowrap; }
/* Ocultar valores (engrenagem da página de casos): some com tudo da tela */
body.casos-ocultar-valores .kb-valor-mascaravel { display: none !important; }
.kb-col-body { padding: 8px; min-height: 44px; display: flex; flex-direction: column; gap: 7px; }
.kb-col-body.drop-alvo { background: #f2f7ff; }
.kb-strip.drop-alvo-faixa { background: #e4ecf9; }
/* Contorno azul da coluna inteira foi removido (Carlos, 27/07/2026: "remova
   aquele efeito azulado no contorno dos blocos") — o destaque de destino
   agora é só o fundo do corpo (.kb-col-body.drop-alvo, acima) + a vaga
   indicando onde o card cai. A classe .drop-alvo-coluna continua sendo
   ligada/desligada no JS (kanban.js em casos/lista.php), só não tem mais
   estilo próprio. */
/* Vaga (placeholder do card arrastado) enquanto ainda está na coluna de
   ORIGEM: cinza clarinho, só ela — os outros casos da coluna continuam
   normais. Carlos, 27/07/2026: "está esmaecendo toda a coluna de origem,
   quero que você esmaeça somente o caso que estou arrastando" (correção do
   pedido anterior, que esmaecia a coluna inteira). Vira azul (estilo padrão
   do .kb-drop-line) assim que o arraste passa pra outra coluna. */
.kb-drop-line.vaga-origem { border-color: #d8dce3; background: #f5f6f8; }

.kb-card { position: relative; display: flex; gap: 8px; background: #fff; border: 1px solid var(--borda); border-radius: 8px; padding: 9px 11px; cursor: grab; touch-action: none; transition: box-shadow .15s, border-color .15s, background .15s; }
.kb-card-topo-acoes { display: flex; align-items: center; justify-content: center; gap: 5px; }
.kb-icone-acao { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; color: #c3cbd6; background: none; border: none; padding: 0; }
.kb-icone-acao svg { width: 14px; height: 14px; stroke: currentColor; fill: none; stroke-width: 2; }
.kb-favorito { cursor: pointer; }
.kb-favorito:hover { color: #d4a017; }
.kb-favorito.ativo { color: #d4a017; }
.kb-favorito.ativo svg { fill: #d4a017; }
.kb-agenda-ind.ativo { color: #1a9e63; }
.kb-agenda-ind.ativo svg { fill: #1a9e63; fill-opacity: .18; }
/* Sinalizador de "pagamento pendente" (caso sem nenhum lançamento financeiro
   registrado) — sempre "ativo" quando aparece, não é um botão (Carlos,
   03/08/2026: "exiba um icone de pagamento pendente em todo caso que não
   tiver um lançamento financeiro registrado"). Mesmo âmbar de .kb-wait.pend. */
.kb-pagamento-pendente { color: #b9770e; cursor: default; }
/* Ícone de pasta sem vínculo no Google Drive — mesmo padrão do
   .kb-pagamento-pendente acima, mas em vermelho pra diferenciar. */
.kb-sem-pasta-drive { color: #c0392b; cursor: default; }
.lista-acoes-col { display: flex; align-items: center; gap: 8px; }
.lista-acoes-col .kb-icone-acao { position: static; }
.kb-card:hover { border-color: var(--azul-claro); background: #f7faff; box-shadow: 0 2px 8px rgba(26,126,197,.1); }
/* Card arrastado: 100% visível (sem opacidade reduzida), só um destaque de
   profundidade — Carlos, 27/07/2026: "não quero que ele fique translúcido,
   deve ficar 100% visível e o card se arraste integralmente para a nova
   coluna". */
.kb-card.arrastando { cursor: grabbing; user-select: none; box-shadow: 0 10px 28px rgba(20,40,80,.28); }
/* Item novo/não lido (criado por outro, ainda não visto) — estilo "e-mail
   não lido" (Gmail), padrão único em todo o sistema: barra sólida navy RETA
   rente à borda esquerda + fundo azul + texto navy em negrito. O mesmo visual
   vale pra card do Kanban, linha de tabela (casos/clientes) e grade do
   Financeiro (esta última tem regras próprias por causa dos inputs/status). */
.kb-card-nova { background: #dde9fa; border-color: transparent; border-left: 4px solid #1e4079; border-radius: 0 8px 8px 0; }
.kb-card-nova, .kb-card-nova * { font-weight: 700 !important; }
.kb-card-nova .kb-cliente { color: #1e4079; }
.kb-card-nova .kb-caso { color: #1e4079; }
.tabela tbody tr.linha-nova td { color: #1e4079; background: #dde9fa; }
/* Negrito em TODO o texto da linha nova — inclusive elementos com font-weight
   próprio (ex.: o link do nome do cliente tem font-weight:500 inline), por
   isso o !important; escopo restrito à linha nova, então não vaza. Exceção:
   a coluna de ações (.acoes-cel — botões "Procuração"/"Hipossuficiência", menu
   de 3 pontinhos e seus itens) não faz sentido em negrito, então fica de fora. */
.tabela tbody tr.linha-nova td, .tabela tbody tr.linha-nova td *:not(.acoes-cel):not(.acoes-cel *) { font-weight: 700 !important; }
/* :where() zera a especificidade — devolve o peso natural de cada elemento
   (ex.: .btn-doc-pdf continua 500) em vez de forçar um valor fixo, e evita
   que o negrito do <td> vaze por herança para quem não tem peso próprio
   (ex.: os itens de texto do menu "⋮"). */
:where(.tabela tbody tr.linha-nova td .acoes-cel, .tabela tbody tr.linha-nova td .acoes-cel *) { font-weight: normal; }
.tabela tbody tr.linha-nova td:first-child { border-left: 4px solid #1e4079; }
.kb-card-main { flex: 1 1 auto; min-width: 0; }
.kb-cliente { font-size: 12.5px; font-weight: 600; color: var(--texto); line-height: 1.25; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.kb-caso { display: inline-block; font-size: 12.5px; font-weight: 500; line-height: 1.3; margin-top: 4px; padding: 2px 8px; border-radius: 5px; background: var(--kbc-bg); color: var(--kbc-texto); border: 1px solid var(--kbc-borda); max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kb-wait { display: flex; width: fit-content; align-items: center; gap: 4px; font-size: 12.5px; font-weight: 600; padding: 2px 8px; border-radius: 6px; margin-top: 6px; }
.kb-wait svg { width: 13px; height: 13px; stroke: currentColor; fill: none; stroke-width: 2; flex: none; }
.kb-wait.pend { background: #fff8e1; color: #b9770e; }
.kb-wait.crit { background: #fdeaea; color: #b23535; }
.kb-wait.calm { background: #eef2f7; color: #65718a; }
.kb-datas { display: flex; flex-direction: column; gap: 1px; margin-top: 5px; }
.kb-datas span { font-size: 12px; color: #7d8898; }
.kb-protocolo { margin-top: 5px; font-size: 12px; color: #7d8898; cursor: text; border-radius: 4px; padding: 1px 3px; margin-left: -3px; }
.kb-protocolo:hover { background: #f1f5fb; }
.kb-protocolo-leitura { cursor: default; }
.kb-protocolo-leitura:hover { background: none; }
.kb-protocolo-rotulo { font-weight: 600; color: #97a3b5; }
.kb-protocolo-valor { color: #4a5568; font-family: 'Courier New', monospace; font-size: 11.5px; }
.kb-protocolo-input { width: 100%; box-sizing: border-box; margin-top: 2px; padding: 3px 6px; border: 1px solid var(--azul-claro); border-radius: 5px; font-family: inherit; font-size: 12px; background: var(--superficie); color: var(--texto); }
.kb-nivel-h { position: relative; display: flex; align-items: center; margin-top: 6px; }
.kb-nivel-flamas { display: flex; align-items: center; gap: 2px; }
.kb-nivel-flama { background: none; border: none; padding: 1px; cursor: pointer; color: #d7dce3; line-height: 0; }
.kb-nivel-flama svg { width: 17px; height: 17px; display: block; }
.kb-nivel-flama.ativo { color: var(--nc, #1a9e63); }
.kb-nivel-flamas-leitura .kb-nivel-flama { cursor: default; }
.kb-nivel-h-grande { margin-top: 4px; }
.kb-nivel-h-grande .kb-nivel-flamas { gap: 6px; }
.kb-nivel-h-grande .kb-nivel-flama { padding: 3px; }
.kb-nivel-h-grande .kb-nivel-flama svg { width: 28px; height: 28px; }
.kb-card-side { flex: none; width: 60px; display: flex; flex-direction: column; align-items: center; gap: 4px; padding-top: 1px; }
.kb-resp-wrap { position: relative; display: flex; flex-direction: column; align-items: center; gap: 2px; }
.kb-resp-select { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; border: none; padding: 0; }
.kb-resp-wrap { gap: 2px; }
.kb-resp-select { cursor: pointer; }
.kb-resp-av { width: 42px; height: 42px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 600; overflow: hidden; flex: none; }
.kb-resp-av img { width: 100%; height: 100%; object-fit: cover; }
.kb-resp-cap { font-size: 10px; color: var(--suave); text-align: center; line-height: 1.1; max-width: 60px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kb-resp-dupla { display: flex; }
.kb-resp-dupla .kb-resp-av { width: 30px; height: 30px; font-size: 11px; border: 2px solid #fff; box-shadow: 0 0 0 1px var(--borda); }
.kb-resp-dupla .kb-resp-av + .kb-resp-av { margin-left: -11px; }
.kb-valor { font-size: 10.5px; font-weight: 700; color: #0c7a52; text-align: center; line-height: 1.15; max-width: 60px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-top: 2px; padding-top: 5px; border-top: 1px dashed var(--borda); width: 100%; }

/* Vaga reservada com o mesmo tamanho do card arrastado — não é mais só uma
   linha fina: como o card real agora sai fisicamente da coluna de origem
   (arraste manual, sem ghost translúcido), o espaço embaixo dela precisa ficar
   reservado do tamanho certo pra não "pular" o layout. Visual esmaecido e
   pontilhado (preview do card, não um alerta azul vivo) — Carlos, 27/07/2026:
   "remova aquele efeito azulado" + "faça um preview esmaecido e pontilhado
   do caso que estou colando". */
.kb-drop-line { box-sizing: border-box; border: 2px dashed #c3ccd9; border-radius: 8px; background: rgba(140,155,180,.08); pointer-events: none; }

/* Cadastro de caso: fotos clicáveis do responsável (Carlos, 21/07/2026) */
.resp-avatares-wrap { display: flex; flex-wrap: nowrap; gap: 14px; margin-top: 4px; overflow: hidden; }
.resp-avatar-opcao { position: relative; display: flex; flex-direction: column; align-items: center; gap: 6px; width: 68px; flex: none; background: none; border: 1.5px solid transparent; cursor: pointer; padding: 8px 4px; border-radius: 10px; transition: background .15s, border-color .15s; }
.resp-avatar-remover { display: none; position: absolute; top: 2px; right: 6px; width: 17px; height: 17px; border-radius: 50%; background: #fff; color: #647084; align-items: center; justify-content: center; box-shadow: 0 0 0 1px var(--borda); }
.resp-avatar-remover svg { width: 10px; height: 10px; }
.resp-avatar-opcao.ativo .resp-avatar-remover { display: flex; }
.resp-avatar-opcao.ativo:hover .resp-avatar-remover { color: var(--vermelho); box-shadow: 0 0 0 1px var(--vermelho); }
.resp-avatar-opcao:hover { background: #f3f5f9; }
.resp-avatar-opcao .kb-resp-av { width: 44px; height: 44px; font-size: 15px; border: 2px solid transparent; transition: background .15s, color .15s; }
.resp-avatar-opcao.ativo { background: var(--azul-claro-bg, #eaf1fd); border-color: var(--azul-claro); }
.resp-avatar-opcao.ativo .kb-resp-av { background: var(--azul-claro) !important; color: #fff !important; }
.resp-avatar-opcao.ativo .kb-resp-av img { opacity: .95; }
.resp-avatar-opcao .resp-avatar-nome { font-size: 11px; color: #647084; text-align: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 64px; }
.resp-avatar-opcao.ativo .resp-avatar-nome { color: var(--azul-claro); font-weight: 600; }

/* Casos/detalhe: responsável em modo leitura no quadro "Dados" — mesmo
   avatar (.kb-resp-av) do cadastro de caso, só sem o picker clicável
   (Carlos, 12/08/2026: "exiba o advogado responsável com imagens, exatamente
   igual a pagina de cadastro do caso"). */
.kb-resp-leitura { display: flex; align-items: center; gap: 8px; margin-top: 4px; }
.kb-resp-leitura-nome { font-size: 13px; color: var(--texto); }

/* Cadastro de caso: checklist de documentos, bloco independente (Carlos, 21/07/2026).
   Duas colunas IGUAIS (50%/50%), cada uma com seu próprio título — esquerda
   "Checklist de documentos", direita "Google Drive do caso" (Carlos,
   02/08/2026: "divida o bloco checklist de documentos em partes iguais, 50%
   para cada"). */
.checklist-caso-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; align-items: start; }
/* Identificação do caso x Linha do tempo: 2/5 - 3/5, não mais 50/50 (Carlos,
   27/08/2026: "o espaço ocupado pelos dados da esquerda, devem ocupar
   apenas 2/5 desse bloco, 3/5 devem ficar para o histórico") — escopado só
   pra esta instância (#blocoDadosCaso), já que .checklist-caso-grid é
   reaproveitada em casos/form.php pro split Checklist/Drive, que continua
   50/50. */
#blocoDadosCaso .checklist-caso-grid { grid-template-columns: 2fr 3fr; }
/* Em telas estreitas as colunas empilham em ordem normal — Linha do tempo
   desce pra baixo do conteúdo do cliente/processo quando falta espaço
   (Carlos, 27/08/2026: "quando faltar espaço, quero que o histórico desça
   pra baixo"). */
@media (max-width: 780px) {
    .checklist-caso-grid { grid-template-columns: 1fr; }
}
/* Checklist independente desligada (padrão) — a coluna some e a
   identificação do cliente ocupa a largura toda em vez de deixar metade da
   grade vazia (Carlos, 08/08/2026: "Exibir checklist independente de
   documentos"). */
.checklist-caso-grid-1col { grid-template-columns: 1fr; }
/* Drive à esquerda, checklist à direita — invertido só na ordem visual
   (Carlos, 06/08/2026: "troque de lugar a checklist de documentos pelo
   google drive do caso"); o HTML continua com a checklist primeiro por
   causa do script grande que acompanha o bloco do Drive logo abaixo dela. */
.checklist-caso-col-checklist { order: 2; }
.checklist-caso-col-drive { order: 1; }
/* Maximizar o navegador (Carlos, 11/08/2026: paridade com casos/detalhe.php)
   — aqui as colunas são lado a lado (não navegador+editor empilhados), então
   maximizar estica a coluna do Drive pra largura toda (empurrando a
   checklist pra próxima linha, o grid já cuida disso sozinho) e dá altura
   maior com rolagem própria ao .fm — sem precisar da cascata flex usada em
   detalhe.php (lá o .fm crescia pra "engolir" o espaço de um irmão
   empilhado; aqui é só uma altura generosa mesmo). */
.checklist-caso-grid.split-maximizado .checklist-caso-col-drive { grid-column: 1/-1; }
.checklist-caso-grid.split-maximizado .checklist-caso-col-drive .fm { height: 70vh; overflow-y: auto; }
/* checklist-docs-grid: layout genérico (grade auto-fill) reaproveitado em
   configuracoes/index.php (seleção de módulos do backup) — não mexer sem
   checar esse outro uso. */
.checklist-docs-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 10px; margin-top: 4px; }
/* Checklist de documentos do CASO: lista de linhas com moldura pontilhada
   (dropzone), esmaecida por padrão — vira sólida e colorida por tipo de
   arquivo (icone_arquivo() no PHP, espelhado em JS em casos/form.php) assim
   que o documento é anexado. "Opção 1" dentre 4 alternativas mostradas em
   chat (Carlos, 02/08/2026: "quero que apareça pontilhada e esmaecida, com
   um iconezinho de upload, quando upado o arquivo, ficará colorido com o
   icone conforme tipo de documento" / "1, implemente"). */
.checklist-docs-lista { display: flex; flex-direction: column; gap: 8px; margin-top: 4px; }
.checklist-doc-linha { position: relative; overflow: hidden; display: flex; align-items: center; gap: 10px; padding: 10px 12px; border: 1.5px dashed #c7cdd6; border-radius: 8px; background: #f5f6f8; color: #9aa2ae; cursor: pointer; font-size: 13px; transition: all .15s; }
.checklist-doc-linha:hover { border-color: var(--azul-claro); color: var(--azul-claro); background: #eef2fb; }
.checklist-doc-linha.arrastando { border-style: solid; border-color: var(--azul-claro); background: #eaf1fd; color: var(--azul-claro); }
.checklist-doc-icone { flex: none; width: 22px; height: 22px; }
.checklist-doc-icone svg { width: 100%; height: 100%; display: block; }
.checklist-doc-nome { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.checklist-doc-tamanho { flex: none; font-size: 11px; color: var(--suave); white-space: nowrap; }
.checklist-doc-data { flex: none; font-size: 11px; color: var(--suave); white-space: nowrap; margin-left: 6px; }
/* Botões de ação por linha (câmera/scanner quando pendente, lixeira quando
   anexado) — mesmo tamanho/hover pra todos (Carlos, 02/08/2026: "remova a
   descrição Clique para anexar" — os ícones já bastam pra indicar a ação). */
.checklist-doc-camera-btn, .checklist-doc-del-btn { flex: none; width: 20px; height: 20px; padding: 3px; border: none; background: none; color: inherit; cursor: pointer; border-radius: 5px; display: flex; align-items: center; justify-content: center; }
.checklist-doc-scan-btn { flex: none; width: 22px; height: 22px; padding: 1px; border: none; background: none; color: inherit; cursor: pointer; border-radius: 5px; display: flex; align-items: center; justify-content: center; }
.checklist-doc-scan-btn:hover, .checklist-doc-camera-btn:hover { background: rgba(30, 64, 121, .08); color: var(--azul-claro); }
.checklist-doc-del-btn:hover { background: rgba(209, 67, 67, .1); color: var(--vermelho); }
.checklist-doc-scan-btn svg, .checklist-doc-camera-btn svg, .checklist-doc-del-btn svg { width: 100%; height: 100%; }
.checklist-doc-check { flex: none; width: 15px; height: 15px; }
.checklist-doc-check svg { width: 100%; height: 100%; display: block; }
/* Edição inline do nome (duplo clique), sem prompt() do navegador — mesmo
   padrão do comprovante em financeiro/cobranca.php. */
.checklist-doc-nome-editando { background: var(--superficie); outline: 2px solid var(--azul-claro); border-radius: 4px; padding: 1px 4px; margin: -1px -4px; cursor: text; }
/* Selo da exigência ad-hoc — criada por um usuário direto num caso (botão
   direito na área vazia da checklist), fora do catálogo global de
   área/subárea (Carlos, 10/08/2026: "criar uma exigência especifica...
   para que os usuários saibam que está sendo necessário um novo
   documento"). Cor âmbar pra não se confundir com o verde de "anexado" nem
   o cinza neutro do pendente comum. */
.checklist-doc-adhoc-badge { flex: none; width: 14px; height: 14px; color: #c9822e; }
.checklist-doc-adhoc-badge svg { width: 100%; height: 100%; display: block; }
.checklist-doc-linha.anexado { border-style: solid; border-color: #0c7a52; background: #f2faf6; color: var(--texto); }
.checklist-doc-linha.anexado:hover { border-color: #0c7a52; color: var(--texto); background: #f2faf6; }
/* Estado "enviando": pulso suave na borda (Carlos, 26/07/2026: "anime melhor
   o upload dos arquivos"). */
@keyframes checklistPulso { 0%, 100% { border-color: #c7cdd6; } 50% { border-color: var(--azul-claro); } }
.checklist-doc-linha.enviando { pointer-events: none; border-style: solid; animation: checklistPulso 1.3s ease-in-out infinite; }
/* Estado "digitalizando": feixe de luz correndo da esquerda pra direita,
   como a barra de luz de um scanner de mesa passando pela página (Carlos,
   02/08/2026: "quando estou digitalizando um documento, pode fazer um
   efeito de digitalizando dentro da imputbox do documento"). Só ativo
   durante a digitalização em si (chamada à ponte) — o upload do resultado
   depois usa o pulso normal (.enviando), já que passa a ser uma transferência
   de rede comum, não mais "a página passando pelo scanner". */
.checklist-doc-linha.digitalizando { pointer-events: none; border-style: solid; border-color: var(--azul-claro); }
@keyframes checklistScanBeam { 0% { left: -35%; } 100% { left: 100%; } }
.checklist-doc-linha.digitalizando::after {
    content: ''; position: absolute; top: 0; bottom: 0; left: -35%; width: 35%;
    background: linear-gradient(90deg, transparent, rgba(30,64,121,.4), transparent);
    animation: checklistScanBeam 1.1s ease-in-out infinite;
}
/* Barra de progresso do upload — fica colada na base da linha (Carlos,
   26/07/2026: "deve aparecer uma barra de progresso indicando a % do
   upload"). Gradiente com brilho correndo (shimmer) reforça "em andamento"
   independente da % real. */
.checklist-doc-progresso { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: rgba(0,0,0,.08); }
@keyframes checklistShimmer { 0% { background-position: 200% 0; } 100% { background-position: 0 0; } }
.checklist-doc-progresso-barra {
    height: 100%; width: 0%; transition: width .2s ease;
    background: linear-gradient(90deg, var(--azul-claro), #6a9eef, var(--azul-claro));
    background-size: 200% 100%;
    animation: checklistShimmer 1.1s linear infinite;
}
/* Selo de sucesso "pipoca" no ícone ao concluir, em vez de trocar de estado seco */
@keyframes checklistPop { 0% { transform: scale(.4); opacity: 0; } 60% { transform: scale(1.15); opacity: 1; } 100% { transform: scale(1); opacity: 1; } }
.checklist-doc-linha.anexado .checklist-doc-icone svg { animation: checklistPop .35s ease-out; }
.checklist-vazio { font-size: 12px; color: var(--suave); text-align: center; padding: 14px 4px; border: 1px dashed var(--borda); border-radius: 8px; }
.checklist-doc-linha.desabilitado { opacity: .55; cursor: not-allowed; }
.checklist-doc-linha.desabilitado:hover { border-color: #c7cdd6; color: #9aa2ae; background: #f5f6f8; }
/* Soltar um arquivo do sistema em cima de um item pendente da checklist
   anexa ele ali direto (Carlos, 06/08/2026: "permita que eu arraste
   documentos para aquele documento"). */
.checklist-doc-linha.checklist-drop-alvo { border-style: solid; border-color: var(--azul-claro); background: #eaf1fb; color: var(--texto); }
/* Faixa vazia sempre presente no fim da lista — sem ela não havia NENHUM
   pixel vazio dentro do grid pra clicar com o botão direito (os itens
   preenchem tudo, sem padding sobrando), então a opção "criar exigência
   específica" ficava inalcançável na prática (Carlos, 10/08/2026). Quase
   invisível em repouso, ganha uma borda pontilhada de leve no hover pra
   avisar que ali também é clicável. */
.checklist-doc-vazio-hint { height: 20px; border-radius: 8px; cursor: context-menu; }
.checklist-doc-vazio-hint:hover { border: 1.5px dashed #c7cdd6; }
.drive-pasta-caso { margin-bottom: 16px; }
.drive-pasta-link { width: 100%; justify-content: center; margin-top: 4px; }
/* Aviso de fallback quando a pasta do caso configurada não existe mais no
   Drive — mesmo padrão visual do .doc-drive-aviso do Laurel (casos/editor.php). */
.drive-caso-aviso-fallback { display: none; align-items: center; gap: 8px; justify-content: space-between; padding: 7px 10px; margin-bottom: 8px; border: 1px solid #f0dca0; border-radius: 8px; background: #fff8ea; color: #8a6414; font-size: 11.5px; line-height: 1.4; }
.drive-caso-aviso-fallback button { flex: none; padding: 4px 10px; border: 1px solid #e8cd82; border-radius: 6px; background: #fff; color: #8a6414; font-size: 11px; font-weight: 600; cursor: pointer; white-space: nowrap; }
.drive-caso-aviso-fallback button:hover { background: #fbe7bd; }
/* Campo "cole a URL da pasta do Drive" — usado tanto no Laurel
   (casos/editor.php) quanto na tela de Casos (partials/drive_explorer_caso.php),
   por isso global (movido do <style> local do editor.php, Carlos, 17/08/2026). */
.doc-drive-btn { border: 1px solid var(--borda); background: #fff; border-radius: 6px; padding: 3px 8px; font-size: 11px; font-family: inherit; cursor: pointer; color: var(--azul-claro); }
.doc-drive-btn:hover { background: #eef4fd; }
.doc-drive-config { display: none; padding: 8px 10px; gap: 6px; border-bottom: 1px solid var(--borda); background: #f8fafd; }
.doc-drive-config input { flex: 1; min-width: 0; padding: 5px 8px; border: 1px solid var(--borda); border-radius: 6px; font-size: 11.5px; font-family: inherit; box-sizing: border-box; }

/* Cópia semitransparente do card que "voa" da coluna de origem até a nova ao
   arrastar no kanban — ver animarViagem() no JS. Fixed pra atravessar por
   cima das outras colunas independente de scroll. */
.kb-ghost-viagem { position: fixed; z-index: 999; pointer-events: none; opacity: .55; box-shadow: 0 6px 16px rgba(20,30,60,.18); cursor: default; }

/* Botão "Novo caso" no fim de cada coluna do Kanban — substitui o botão que
   ficava no topo da página quando a visão é Kanban (Carlos, 04/08/2026: "o
   botão de adicionar irá aparecer no final de cada coluna do kanban"). */
.kb-add-col { display: flex; align-items: center; justify-content: center; gap: 6px; margin: 4px 8px 8px; padding: 8px; border: 1.5px dashed var(--borda); border-radius: 8px; color: var(--suave); font-size: 12.5px; font-weight: 600; text-decoration: none; transition: border-color .15s, color .15s, background .15s; }
.kb-add-col svg { width: 15px; height: 15px; stroke: currentColor; fill: none; stroke-width: 2; flex: none; }
.kb-add-col:hover { border-color: var(--azul-claro); color: var(--azul-claro); background: #f4f8ff; }

/* Advogados em bolinhas — substitui o botão "Novo caso" no topo quando a
   visão é Kanban; clicar filtra os casos daquele advogado (mesmo avatar/cor
   dos cards, ver .kb-resp-av) — Carlos, 04/08/2026: "dando lugar aos
   advogados, que deverão aparecer em bolinhas". */
.kb-advs-bolinhas { display: flex; align-items: center; gap: 6px; margin-left: auto; flex-shrink: 0; }
.kb-adv-bolha { display: inline-flex; border-radius: 50%; text-decoration: none; padding: 2px; border: 2px solid transparent; transition: border-color .15s, transform .1s; }
.kb-adv-bolha:hover { transform: translateY(-1px); }
.kb-adv-bolha .kb-resp-av { width: 32px; height: 32px; font-size: 12px; }
.kb-adv-bolha.ativo { border-color: var(--cor-adv, var(--azul-claro)); }
.kb-adv-bolha-limpar { align-items: center; justify-content: center; width: 32px; height: 32px; color: var(--suave); background: var(--menu-hover); }
.kb-adv-bolha-limpar:hover { color: var(--vermelho); border-color: transparent; }
.kb-adv-bolha-limpar svg { width: 14px; height: 14px; }

.kb-paginacao { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 6px 8px; padding: 8px; border-top: 1px solid var(--borda); }
.kb-pag-contagem { font-size: 12px; color: var(--suave); line-height: 1.3; flex: 1 1 auto; }
.kb-pag-contagem strong { color: var(--texto); }
.kb-pag-controles { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; flex: none; }
.kb-pag-controles a, .kb-pag-controles span:not(.kb-pag-info) { display: inline-flex; align-items: center; justify-content: center; min-width: 26px; height: 26px; padding: 0 5px; border-radius: 6px; border: 1px solid var(--borda); background: var(--superficie); color: var(--suave); flex: none; font-size: 13px; font-weight: 600; }
.kb-pag-controles a:hover { border-color: var(--azul-claro); color: var(--azul-claro); }
.kb-pag-controles svg { width: 14px; height: 14px; }
.kb-pag-controles .ativo { background: var(--azul-claro); border-color: var(--azul-claro); color: #fff; }
.kb-pag-controles .reticencias { border: none; background: none; width: auto; }
.kb-pag-controles .desativado { opacity: .4; }

.kb-strip { display: none; flex-direction: column; align-items: center; gap: 8px; padding: 10px 0; min-height: 190px; cursor: pointer; user-select: none; }
.kb-strip:hover { background: #f8fafd; }
.kb-strip-count { font-size: 11px; font-weight: 600; background: var(--kb); color: var(--kbt); border-radius: 10px; padding: 1px 7px; }
.kb-strip-name { writing-mode: vertical-rl; transform: rotate(180deg); font-size: 12px; font-weight: 600; letter-spacing: .03em; color: var(--texto); }
.kb-col.hcol { flex: none; width: 46px; min-width: 46px; }
.kb-col.hcol .kb-col-h, .kb-col.hcol .kb-col-body, .kb-col.hcol .kb-paginacao, .kb-col.hcol .kb-add-col { display: none; }
.kb-col.hcol .kb-strip { display: flex; }
.kb-empty { font-size: 11.5px; color: #a8b0bd; text-align: center; padding: 14px 6px; }
.kb-toast { position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%); background: #15315e; color: #fff; padding: 10px 18px; border-radius: 8px; font-size: 13px; font-weight: 600; z-index: 9999; box-shadow: 0 4px 16px rgba(0,0,0,.18); max-width: 90vw; }
.kb-toast.sai { opacity: 0; transition: opacity .3s; }
