/* ------------------------------------------------------------------
   Portal CoreBI Data - tema claro/escuro via data-bs-theme.
   A paleta vem da logo: azul #135494 (Core/Data), verde #02C54A (BI),
   azul-aco #4577A6 (icone de fluxo). Sobrescrevemos as variaveis do
   Bootstrap para que todo componente herde a marca sem CSS extra.
   ------------------------------------------------------------------ */
:root {
  /* --- marca --- */
  --cb-azul:        #135494;
  --cb-azul-claro:  #1b6bb4;
  --cb-azul-escuro: #0d3e6e;
  --cb-aco:         #4577a6;
  --cb-verde:       #02c54a;
  --cb-verde-escuro:#029e3b;

  --cb-sidebar-w: 250px;
  --cb-sidebar-w-min: 64px;
  --cb-radius: 12px;
  --cb-borda: var(--bs-border-color);
  --cb-sombra: 0 1px 2px rgba(16, 33, 52, .04), 0 4px 16px rgba(16, 33, 52, .06);

  /* --- Bootstrap herda a marca --- */
  --bs-primary: var(--cb-azul);
  --bs-primary-rgb: 19, 84, 148;
  --bs-success: var(--cb-verde);
  --bs-success-rgb: 2, 197, 74;
  --bs-link-color: var(--cb-azul);
  --bs-link-hover-color: var(--cb-azul-escuro);
  --bs-border-radius: 10px;
}

/* O Bootstrap deriva botoes/badges destas; sem isso o .btn-primary ignora a marca. */
.btn-primary {
  --bs-btn-bg: var(--cb-azul);            --bs-btn-border-color: var(--cb-azul);
  --bs-btn-hover-bg: var(--cb-azul-escuro);--bs-btn-hover-border-color: var(--cb-azul-escuro);
  --bs-btn-active-bg: var(--cb-azul-escuro);--bs-btn-active-border-color: var(--cb-azul-escuro);
  --bs-btn-disabled-bg: var(--cb-azul);   --bs-btn-disabled-border-color: var(--cb-azul);
}
.btn-outline-primary {
  --bs-btn-color: var(--cb-azul);         --bs-btn-border-color: var(--cb-azul);
  --bs-btn-hover-bg: var(--cb-azul);      --bs-btn-hover-border-color: var(--cb-azul);
  --bs-btn-active-bg: var(--cb-azul);     --bs-btn-active-border-color: var(--cb-azul);
}
.btn-success {
  --bs-btn-bg: var(--cb-verde);           --bs-btn-border-color: var(--cb-verde);
  --bs-btn-hover-bg: var(--cb-verde-escuro);--bs-btn-hover-border-color: var(--cb-verde-escuro);
  --bs-btn-active-bg: var(--cb-verde-escuro);--bs-btn-active-border-color: var(--cb-verde-escuro);
  --bs-btn-color: #fff; --bs-btn-hover-color: #fff; --bs-btn-active-color: #fff;
}
.bg-primary { background-color: var(--cb-azul) !important; }
.text-primary { color: var(--cb-azul) !important; }
.bg-success { background-color: var(--cb-verde) !important; }
.text-success { color: var(--cb-verde-escuro) !important; }
.form-control:focus, .form-select:focus {
  border-color: var(--cb-azul-claro);
  box-shadow: 0 0 0 .2rem rgba(19, 84, 148, .18);
}
.form-check-input:checked { background-color: var(--cb-azul); border-color: var(--cb-azul); }
.spinner-border.text-primary { color: var(--cb-azul) !important; }

body {
  font-family: "Segoe UI", system-ui, -apple-system, "Helvetica Neue", Arial, sans-serif;
  font-size: 0.9375rem;
  background: var(--bs-body-bg);
  -webkit-font-smoothing: antialiased;
}

[data-bs-theme="dark"] {
  --cb-sombra: 0 1px 2px rgba(0,0,0,.3), 0 6px 20px rgba(0,0,0,.28);
  /* No escuro o azul da marca fica pesado: clareamos so o tom de apoio. */
  --bs-link-color: #6ba7de;
  --bs-link-hover-color: #8fbfe9;
}
[data-bs-theme="dark"] body { background: #10141a; }
[data-bs-theme="dark"] .card,
[data-bs-theme="dark"] .cb-sidebar,
[data-bs-theme="dark"] .cb-topo { background: #171c24; }
[data-bs-theme="dark"] .text-primary { color: #6ba7de !important; }
[data-bs-theme="light"] body { background: #f4f6f9; }

/* ---------- estrutura ---------- */
.cb-app { display: flex; min-height: 100vh; }

.cb-sidebar {
  width: var(--cb-sidebar-w);
  flex: 0 0 var(--cb-sidebar-w);
  border-right: 1px solid var(--cb-borda);
  background: var(--bs-body-bg);
  position: sticky; top: 0; height: 100vh;
  display: flex; flex-direction: column;
  transition: width .18s ease, flex-basis .18s ease;
  overflow: hidden;
}
.cb-app.cb-colapsada .cb-sidebar { width: var(--cb-sidebar-w-min); flex-basis: var(--cb-sidebar-w-min); }
.cb-app.cb-colapsada .cb-rotulo { display: none; }
.cb-app.cb-colapsada .cb-marca-texto { display: none; }

.cb-marca {
  display: flex; align-items: center; gap: .6rem;
  padding: .85rem 1rem; border-bottom: 1px solid var(--cb-borda);
  min-height: 61px;
}
/* Marca isolada (circulo + cilindro) recortada da logo.
   Expandida mostra a logo inteira; recolhida, so o simbolo -- nunca os dois,
   senao a logo fica espremida e ilegivel. */
.cb-marca-logo {
  width: 32px; height: 32px; flex: 0 0 32px;
  background: url("/assets/img/marca.png") center/contain no-repeat;
  display: none;
}
.cb-marca-full { height: 30px; width: auto; display: block; }
/* O azul do "Core" e' escuro demais para fundo escuro: cada tema usa sua variante.
   Duas <img> alternadas -- mais previsivel que trocar `content` da mesma imagem. */
.cb-so-escuro { display: none; }
[data-bs-theme="dark"] .cb-so-claro  { display: none; }
[data-bs-theme="dark"] .cb-so-escuro { display: block; }
.cb-app.cb-colapsada .cb-marca { justify-content: center; padding-inline: 0; }
.cb-app.cb-colapsada .cb-marca-logo { display: block; }

.cb-nav { padding: .6rem; overflow-y: auto; flex: 1; }
.cb-nav a {
  position: relative;
  display: flex; align-items: center; gap: .7rem;
  padding: .55rem .7rem; margin-bottom: .15rem;
  border-radius: 8px; color: var(--bs-secondary-color); text-decoration: none; white-space: nowrap;
  transition: background .14s ease, color .14s ease;
}
.cb-nav a:hover { background: var(--bs-tertiary-bg); color: var(--bs-body-color); }
.cb-nav a.ativo {
  background: rgba(19, 84, 148, .09);
  color: var(--cb-azul); font-weight: 600;
}
/* Barra de acento a esquerda do item ativo, nas cores da marca. */
.cb-nav a.ativo::before {
  content: ""; position: absolute; left: -.6rem; top: 50%; transform: translateY(-50%);
  width: 3px; height: 60%; border-radius: 0 3px 3px 0;
  background: linear-gradient(180deg, var(--cb-azul), var(--cb-verde));
}
.cb-nav a.ativo i { color: var(--cb-azul); }
[data-bs-theme="dark"] .cb-nav a.ativo { background: rgba(107, 167, 222, .12); color: #8fbfe9; }
[data-bs-theme="dark"] .cb-nav a.ativo i { color: #8fbfe9; }
.cb-nav a i { font-size: 1.05rem; width: 1.2rem; text-align: center; }
.cb-nav .cb-secao { font-size: .7rem; text-transform: uppercase; letter-spacing: .08em; color: var(--bs-secondary-color); padding: .9rem .7rem .3rem; }

.cb-conteudo { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; }
.cb-topo {
  display: flex; align-items: center; gap: .75rem;
  padding: .6rem 1rem; border-bottom: 1px solid var(--cb-borda);
  background: var(--bs-body-bg); position: sticky; top: 0; z-index: 20;
}
.cb-main { padding: 1.25rem; flex: 1; }

/* ---------- componentes ---------- */
.card {
  border-radius: var(--cb-radius); border-color: var(--cb-borda);
  box-shadow: var(--cb-sombra);
}
.card-header {
  background: transparent; border-bottom: 1px solid var(--cb-borda);
  font-weight: 600; padding: .8rem 1rem;
}
.cb-card-metrica { position: relative; overflow: hidden; }
/* Fio superior nas cores da marca -- assina o card sem poluir. */
.cb-card-metrica::after {
  content: ""; position: absolute; inset: 0 0 auto 0; height: 3px;
  background: linear-gradient(90deg, var(--cb-azul), var(--cb-aco) 55%, var(--cb-verde));
  opacity: .85;
}
.cb-card-metrica .cb-valor { font-size: 1.9rem; font-weight: 700; line-height: 1.1; letter-spacing: -.02em; }
.cb-card-metrica .cb-rotulo-metrica { font-size: .78rem; text-transform: uppercase; letter-spacing: .05em; color: var(--bs-secondary-color); }
.cb-icone-metrica { width: 42px; height: 42px; border-radius: 10px; display: grid; place-items: center; font-size: 1.25rem; }

.table > :not(caption) > * > * { padding: .55rem .6rem; }
.table thead th { font-size: .74rem; text-transform: uppercase; letter-spacing: .04em; color: var(--bs-secondary-color); font-weight: 600; }

/* ---------- tabela com menu de acoes ----------
   `.table-responsive` resolve a largura com `overflow-x: auto`, mas esse mesmo
   overflow recorta o dropdown da ultima coluna: o menu abria para fora da tela
   e ainda empurrava barra de rolagem horizontal. Aqui a tabela cabe sozinha --
   o conteudo longo quebra em vez de esticar -- e o menu vai com
   `data-bs-strategy="fixed"` na view, flutuando acima do layout. */
.cb-tabela { width: 100%; }
.cb-tabela > :not(caption) > * > * { overflow-wrap: anywhere; }
.cb-tabela .cb-mono { word-break: break-all; }
/* a coluna de acoes nao pode encolher nem quebrar o botao */
.cb-tabela .cb-col-acoes { width: 1%; white-space: nowrap; }
code, pre, .cb-mono, textarea.cb-sql { font-family: "Cascadia Mono", Consolas, "SF Mono", Menlo, monospace; }
textarea.cb-sql { font-size: .85rem; line-height: 1.45; tab-size: 2; }

.cb-badge-ponto { width: .55rem; height: .55rem; border-radius: 50%; display: inline-block; }

/* ---------- grafico SVG ---------- */
.cb-grafico { width: 100%; height: 220px; }
.cb-grafico .barra { fill: var(--bs-primary); }
.cb-grafico .barra-erro { fill: var(--bs-danger); }
.cb-grafico text { font-size: 10px; fill: var(--bs-secondary-color); }
.cb-grafico line { stroke: var(--cb-borda); }

/* ---------- editor lista (drag and drop) ---------- */
.cb-arrastavel { cursor: grab; }
.cb-arrastando { opacity: .45; }
.cb-alvo-drop { outline: 2px dashed var(--bs-primary); outline-offset: -2px; }

/* ---------- canvas estilo n8n ---------- */
.cb-canvas-wrap {
  position: relative; overflow: hidden; height: 68vh; min-height: 420px;
  border: 1px solid var(--cb-borda); border-radius: var(--cb-radius);
  background-color: var(--bs-tertiary-bg);
  background-image: radial-gradient(var(--bs-border-color) 1px, transparent 1px);
  background-size: 18px 18px;
  user-select: none; touch-action: none;
}
.cb-canvas-mundo { position: absolute; inset: 0; transform-origin: 0 0; }
.cb-canvas-svg { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; pointer-events: none; }
.cb-aresta { fill: none; stroke: var(--bs-secondary-color); stroke-width: 2; }
.cb-aresta.cb-aresta-hover { stroke: var(--bs-danger); stroke-width: 3; pointer-events: stroke; cursor: pointer; }
.cb-aresta-alvo { stroke: transparent; stroke-width: 14; fill: none; pointer-events: stroke; cursor: pointer; }
.cb-no {
  position: absolute; width: 200px; background: var(--bs-body-bg);
  border: 1px solid var(--cb-borda); border-radius: 10px; padding: .55rem .65rem;
  cursor: grab; box-shadow: 0 1px 2px rgba(0,0,0,.12);
}
.cb-no.cb-selecionado { border-color: var(--bs-primary); box-shadow: 0 0 0 2px var(--bs-primary-bg-subtle); }
.cb-no-titulo { font-weight: 600; font-size: .85rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cb-no-sub { font-size: .72rem; color: var(--bs-secondary-color); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cb-porta {
  position: absolute; width: 14px; height: 14px; border-radius: 50%;
  background: var(--bs-body-bg); border: 2px solid var(--bs-primary); top: 50%; margin-top: -7px; cursor: crosshair;
}
.cb-porta-entrada { left: -8px; }
.cb-porta-saida { right: -8px; }
.cb-canvas-ferramentas { position: absolute; right: .6rem; bottom: .6rem; z-index: 5; display: flex; gap: .3rem; }
/* A dica precisa parar antes das ferramentas de zoom, senao passa por baixo delas. */
.cb-canvas-dica {
  position: absolute; left: .6rem; bottom: .6rem; z-index: 5;
  font-size: .75rem; color: var(--bs-secondary-color);
  max-width: calc(100% - 10rem); line-height: 1.35;
}

/* ---------- logs ---------- */
.cb-logs { max-height: 62vh; overflow-y: auto; font-size: .82rem; }
.cb-log-linha { padding: .18rem .4rem; border-bottom: 1px solid var(--cb-borda); display: flex; gap: .6rem; }
.cb-log-nivel { flex: 0 0 76px; font-weight: 600; text-transform: uppercase; font-size: .7rem; padding-top: .12rem; }
.cb-nivel-error, .cb-nivel-critical { color: var(--bs-danger); }
.cb-nivel-warning { color: var(--bs-warning); }
.cb-nivel-info { color: var(--bs-info); }
.cb-nivel-debug { color: var(--bs-secondary-color); }

/* ---------- diversos ---------- */
.cb-segredo { word-break: break-all; }
.cb-timeline { list-style: none; padding-left: 0; margin: 0; }
.cb-timeline li { position: relative; padding: .5rem 0 .5rem 1.6rem; border-left: 2px solid var(--cb-borda); margin-left: .4rem; }
.cb-timeline li::before { content: ""; position: absolute; left: -7px; top: .95rem; width: 12px; height: 12px; border-radius: 50%; background: var(--bs-secondary-color); }
.cb-timeline li.st-sucesso::before { background: var(--bs-success); }
.cb-timeline li.st-erro::before { background: var(--bs-danger); }
.cb-timeline li.st-executando::before { background: var(--bs-primary); }

@media (max-width: 900px) {
  .cb-sidebar { position: fixed; z-index: 1040; left: 0; box-shadow: 0 0 24px rgba(0,0,0,.3); }
  .cb-app:not(.cb-mobile-aberta) .cb-sidebar { transform: translateX(-100%); }
  .cb-conteudo { width: 100%; }
}

/* ---------- painel do cliente: cadastros ---------- */
.min-w-0 { min-width: 0; }
.cb-titulo-grupo { font-size: .78rem; text-transform: uppercase; letter-spacing: .08em; color: var(--bs-secondary-color); margin: 0 0 .6rem; }
.cb-card-recurso { transition: transform .12s ease, border-color .12s ease; }
.cb-card-recurso:hover { transform: translateY(-2px); border-color: var(--cb-aco); }
.cb-busca { max-width: 280px; }
.cb-grade-wrap { overflow: auto; max-height: calc(100vh - 290px); min-height: 180px; }
.cb-grade thead th { position: sticky; top: 0; z-index: 2; background: var(--bs-body-bg); box-shadow: inset 0 -1px 0 var(--cb-borda); }
.cb-grade tfoot td { position: sticky; bottom: 0; background: var(--bs-tertiary-bg); font-weight: 600; box-shadow: inset 0 1px 0 var(--cb-borda); }
.cb-grade td { white-space: nowrap; }
.cb-grade .cb-linha { cursor: pointer; }
/* Acoes presas a direita: no orcamento (17 colunas) ficavam fora da tela. */
.cb-grade .cb-col-acoes { position: sticky; right: 0; z-index: 1; background: var(--bs-body-bg); box-shadow: inset 1px 0 0 var(--cb-borda); }
.cb-grade thead .cb-col-acoes { z-index: 3; }
.cb-grade tfoot td:last-child { right: 0; }
.cb-grade .cb-linha:hover .cb-col-acoes { background: var(--bs-tertiary-bg); }
.cb-grade .cb-linha:focus-visible { outline: 2px solid var(--cb-azul); outline-offset: -2px; }
.cb-num { font-variant-numeric: tabular-nums; }
.cb-ordem-btn { all: unset; cursor: pointer; }
.cb-ordem-btn:focus-visible { outline: 2px solid var(--cb-azul); border-radius: 4px; }
.cb-ordem-inativa { opacity: .35; }
.cb-grade-vazia { padding: 3rem 1rem; text-align: center; }
.cb-grade-vazia > .bi { font-size: 2.2rem; color: var(--bs-secondary-color); }
.cb-ajuda { max-width: 56rem; }
.cb-fase-num { flex: 0 0 1.75rem; height: 1.75rem; border-radius: 50%; display: grid; place-items: center; font-size: .8rem; font-weight: 600; background: var(--bs-secondary-bg); color: var(--bs-secondary-color); }
.cb-grade-carregando { position: absolute; top: .6rem; right: .8rem; z-index: 3; }
.cb-matriz td { min-width: 120px; }
.cb-matriz th[scope=row] { width: 3.5rem; }

/* ==================================================================
   Area RELATORIOS -- catalogo (espelha o BI Explorer) e visualizador.
   ================================================================== */
.cb-rel-tabs .nav-link { color: var(--bs-secondary-color); font-weight: 500; }
.cb-rel-tabs .nav-link.active { color: var(--cb-azul); border-bottom-width: 2px; }

.cb-grupo-bolha { flex: 0 0 2.25rem; height: 2.25rem; border-radius: 10px; display: grid; place-items: center; font-weight: 700; }
.cb-sub { border: 1px solid var(--cb-borda); border-radius: 10px; margin-bottom: .4rem; overflow: hidden; }
.cb-sub-cabeca { width: 100%; display: flex; align-items: center; gap: .5rem; padding: .5rem .6rem; background: transparent; border: 0; color: inherit; }
.cb-sub-cabeca:hover { background: var(--bs-tertiary-bg); }
.cb-sub-cabeca[aria-expanded="true"] .cb-sub-chevron { transform: rotate(180deg); }
.cb-sub-chevron { transition: transform .15s ease; font-size: .8rem; }
.cb-sub-tag { flex: 0 0 1.5rem; height: 1.5rem; border-radius: 6px; display: grid; place-items: center; font-size: .75rem; font-weight: 700; }
.cb-sub-corpo { padding: .25rem .4rem .5rem; }
.cb-rel-linha { display: flex; align-items: center; gap: .5rem; padding: .4rem .5rem; border-radius: 8px; color: inherit; text-decoration: none; }
.cb-rel-linha:hover { background: var(--bs-tertiary-bg); color: var(--cb-azul); }

/* ---- Visualizador em tela cheia ---- */
.cb-viewer-body { margin: 0; height: 100vh; overflow: hidden; }
.cb-viewer { display: flex; flex-direction: column; height: 100vh; }
.cb-viewer-topo { display: flex; align-items: center; gap: .5rem; padding: .4rem .6rem; background: var(--cb-azul-escuro); color: #fff; }
.cb-viewer-topo .btn-light { --bs-btn-bg: rgba(255,255,255,.12); --bs-btn-border-color: transparent; --bs-btn-color: #fff; --bs-btn-hover-bg: rgba(255,255,255,.22); --bs-btn-hover-color: #fff; }
.cb-viewer-topo .dropdown-toggle { max-width: 48vw; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cb-viewer-palco { position: relative; flex: 1; min-height: 0; background: var(--bs-body-bg); }
.cb-embed { position: absolute; inset: 0; }
.cb-embed iframe { border: 0; width: 100%; height: 100%; }
/* Cobre o iframe (opaco, por cima) ate o relatorio renderizar: assim o carregamento
   proprio do Power BI nao aparece, so o nosso. */
.cb-embed-estado { position: absolute; inset: 0; z-index: 2; background: var(--bs-body-bg); transition: opacity .25s ease; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; padding: 2rem; }
.cb-viewer-paginas { display: flex; align-items: center; gap: .25rem; padding: .25rem .4rem; background: var(--bs-tertiary-bg); border-top: 1px solid var(--cb-borda); }
.cb-pag-trilho { display: flex; gap: .25rem; overflow-x: auto; scrollbar-width: thin; flex: 1; }
.cb-pag-trilho::-webkit-scrollbar { height: 4px; }
.cb-pag { white-space: nowrap; border: 0; background: transparent; padding: .35rem .7rem; border-radius: 8px 8px 0 0; color: var(--bs-secondary-color); font-size: .85rem; border-bottom: 2px solid transparent; }
.cb-pag:hover { background: var(--bs-body-bg); }
.cb-pag.ativa { color: var(--cb-azul); font-weight: 600; border-bottom-color: var(--cb-verde); background: var(--bs-body-bg); }
.cb-pag-seta { flex: 0 0 auto; border: 0; background: transparent; color: var(--bs-secondary-color); padding: .2rem .35rem; }

/* ==================================================================
   HOME DO ADMIN -- dashboard analitico (dashboard.js).
   ================================================================== */
.cb-dash {
  --cb-ok: var(--cb-azul);
  --cb-falha: #e5484d;
  --cb-outro: #a0abb8;
  --cb-info: #3ba5d8;
  --cb-linhas: var(--cb-verde-escuro);
  --cb-dur: #7c5cd6;
  --cb-pbi: #e8a317;
  --cb-rel: var(--cb-aco);
}
[data-bs-theme="dark"] .cb-dash {
  --cb-ok: #4d94db; --cb-falha: #f2666a; --cb-outro: #5d6876;
  --cb-linhas: #2fd471; --cb-dur: #a08af0; --cb-rel: #7fa7cf;
}

/* revelar ao rolar */
.cb-revela { opacity: 0; transform: translateY(14px); transition: opacity .55s ease, transform .55s cubic-bezier(.2,.7,.2,1); transition-delay: var(--atraso, 0ms); }
.cb-revela.cb-visivel { opacity: 1; transform: none; }

/* ---- hero ---- */
.cb-hero {
  position: relative; overflow: hidden; isolation: isolate;
  display: grid; grid-template-columns: 1fr auto; gap: 1rem 1.5rem; align-items: center;
  padding: 1.4rem 1.5rem; margin-bottom: 1rem; border-radius: calc(var(--cb-radius) + 4px);
  color: #fff;
  background: linear-gradient(120deg, var(--cb-azul-escuro) 0%, var(--cb-azul) 48%, #1a7f8f 100%);
  box-shadow: 0 10px 30px -12px rgba(13, 62, 110, .55);
}
.cb-hero-brilho {
  position: absolute; inset: -40% -10% auto auto; width: 60%; aspect-ratio: 1; z-index: -1;
  background: radial-gradient(circle, rgba(2,197,74,.45), transparent 62%);
  animation: cb-flutua 14s ease-in-out infinite alternate;
}
.cb-hero::after {
  content: ""; position: absolute; inset: 0; z-index: -1; opacity: .12;
  background-image: radial-gradient(rgba(255,255,255,.9) 1px, transparent 1px); background-size: 16px 16px;
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 70%); mask-image: linear-gradient(90deg, transparent, #000 70%);
}
@keyframes cb-flutua { from { transform: translate(0,0) scale(1); } to { transform: translate(-18%, 22%) scale(1.15); } }
.cb-hero-sauda { font-size: .85rem; opacity: .8; }
.cb-hero-titulo { font-size: 1.45rem; font-weight: 700; margin: .1rem 0 .35rem; letter-spacing: -.01em; }
.cb-hero-sub { font-size: .8rem; display: flex; gap: .5rem; align-items: center; opacity: .9; }
.cb-ao-vivo { display: inline-flex; align-items: center; gap: .35rem; font-weight: 600; text-transform: uppercase; letter-spacing: .06em; font-size: .7rem; }
.cb-ao-vivo-ponto { width: .5rem; height: .5rem; border-radius: 50%; background: var(--cb-verde); animation: cb-pulsa 2s infinite; }
.cb-ao-vivo-off .cb-ao-vivo-ponto { background: #f5a524; animation: none; }
@keyframes cb-pulsa { 0% { box-shadow: 0 0 0 0 rgba(2,197,74,.6); } 70% { box-shadow: 0 0 0 8px rgba(2,197,74,0); } 100% { box-shadow: 0 0 0 0 rgba(2,197,74,0); } }
.cb-hero-chips { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: .5rem; }
.cb-chip {
  display: inline-flex; align-items: center; gap: .45rem; padding: .4rem .75rem; border-radius: 999px;
  background: rgba(255,255,255,.12); border: 1px solid rgba(255,255,255,.18); backdrop-filter: blur(6px);
  font-size: .82rem; transition: background .2s ease, transform .2s ease;
}
.cb-chip:hover { background: rgba(255,255,255,.2); transform: translateY(-1px); }
.cb-chip b { font-variant-numeric: tabular-nums; }
.cb-chip-alerta { background: rgba(229,72,77,.35); border-color: rgba(255,160,160,.5); }
.cb-chip-ativo i { animation: cb-gira 1.6s linear infinite; }
@keyframes cb-gira { to { transform: rotate(360deg); } }
.cb-hero-periodo { grid-row: 1; grid-column: 2; display: inline-flex; padding: 3px; border-radius: 10px; background: rgba(0,0,0,.18); align-self: start; }
.cb-hero-periodo button { border: 0; background: transparent; color: rgba(255,255,255,.8); padding: .3rem .7rem; border-radius: 8px; font-size: .82rem; font-weight: 600; transition: background .15s, color .15s; }
.cb-hero-periodo button:hover { color: #fff; }
.cb-hero-periodo button.ativo { background: #fff; color: var(--cb-azul-escuro); }

/* ---- KPIs ---- */
.cb-kpis { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1rem; margin-bottom: 1rem; }
.cb-kpi {
  --k: var(--cb-azul);
  position: relative; overflow: hidden; padding: 1rem 1rem 0; border-radius: var(--cb-radius);
  background: var(--bs-body-bg); border: 1px solid var(--cb-borda); box-shadow: var(--cb-sombra);
  transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease, opacity .55s ease;
  transition-delay: 0ms, 0ms, 0ms, var(--atraso, 0ms);
}
[data-bs-theme="dark"] .cb-kpi { background: #171c24; }
.cb-kpi.cb-visivel:hover { transform: translateY(-3px); box-shadow: 0 12px 28px -14px color-mix(in srgb, var(--k) 60%, transparent); border-color: color-mix(in srgb, var(--k) 40%, var(--cb-borda)); }
.cb-kpi-azul  { --k: var(--cb-ok); }
.cb-kpi-verde { --k: var(--cb-linhas); }
.cb-kpi-aco   { --k: var(--cb-rel); }
.cb-kpi-roxo  { --k: var(--cb-dur); }
.cb-kpi-topo { display: flex; align-items: center; gap: .5rem; }
.cb-kpi-icone { width: 30px; height: 30px; border-radius: 8px; display: grid; place-items: center; color: var(--k); background: color-mix(in srgb, var(--k) 13%, transparent); }
.cb-kpi-rotulo { font-size: .76rem; text-transform: uppercase; letter-spacing: .05em; color: var(--bs-secondary-color); font-weight: 600; }
.cb-kpi-delta { margin-left: auto; font-size: .74rem; font-weight: 700; padding: .1rem .4rem; border-radius: 6px; display: inline-flex; gap: .15rem; align-items: center; }
.cb-kpi-delta.bom  { color: var(--cb-verde-escuro); background: rgba(2,197,74,.12); }
.cb-kpi-delta.ruim { color: var(--cb-falha); background: rgba(229,72,77,.12); }
[data-bs-theme="dark"] .cb-kpi-delta.bom { color: #2fd471; }
.cb-kpi-valor { font-size: 2rem; font-weight: 700; letter-spacing: -.02em; line-height: 1.15; margin-top: .5rem; font-variant-numeric: tabular-nums; }
.cb-kpi-sub { font-size: .76rem; color: var(--bs-secondary-color); min-height: 1.1rem; }
.cb-spark { display: block; width: calc(100% + 2rem); margin: .4rem -1rem 0; height: 42px; }
.cb-spark-area { fill: color-mix(in srgb, var(--k, var(--cb-rel)) 16%, transparent); }
.cb-spark-linha { fill: none; stroke: var(--k, var(--cb-rel)); stroke-width: 1.8; }
.cb-spark-largo { width: 100%; margin: .2rem 0 0; height: 48px; --k: var(--cb-rel); }

/* ---- controles segmentados ---- */
.cb-seg { display: inline-flex; padding: 2px; border-radius: 9px; background: var(--bs-tertiary-bg); border: 1px solid var(--cb-borda); }
.cb-seg button { border: 0; background: transparent; color: var(--bs-secondary-color); padding: .2rem .65rem; border-radius: 7px; font-size: .78rem; font-weight: 600; transition: all .15s ease; }
.cb-seg button:hover { color: var(--bs-body-color); }
.cb-seg button.ativo { background: var(--bs-body-bg); color: var(--cb-azul); box-shadow: 0 1px 3px rgba(0,0,0,.12); }
[data-bs-theme="dark"] .cb-seg button.ativo { background: #232a35; color: #8fbfe9; }

/* ---- legendas e cores ---- */
.cb-legenda { display: flex; flex-wrap: wrap; gap: .35rem 1rem; font-size: .76rem; color: var(--bs-secondary-color); margin-bottom: .4rem; }
.cb-leg { display: inline-flex; align-items: center; gap: .35rem; }
.cb-leg-cor { width: .65rem; height: .65rem; border-radius: 3px; display: inline-block; background: currentColor; }
.cb-c-ok { --c: var(--cb-ok); }
.cb-c-falha { --c: var(--cb-falha); }
.cb-c-outro { --c: var(--cb-outro); }
.cb-c-info { --c: var(--cb-info); }
.cb-c-linhas { --c: var(--cb-linhas); }
.cb-c-dur { --c: var(--cb-dur); }
.cb-leg-cor[class*="cb-c-"], .cb-empilhada > [class*="cb-c-"] { background: var(--c); }

/* ---- grafico principal ---- */
.cb-grafico-wrap { position: relative; }
.cb-grafico2 { display: block; width: 100%; overflow: visible; touch-action: pan-y; }
.cb-g-grade { stroke: var(--cb-borda); stroke-dasharray: 2 4; }
.cb-g-eixo { font-size: 10.5px; fill: var(--bs-secondary-color); font-variant-numeric: tabular-nums; }
.cb-g-barra { fill: var(--c); transition: opacity .15s ease; transform-box: fill-box; transform-origin: bottom; }
.cb-g-barra.apagada { opacity: .3; }
.cb-anima .cb-g-barra { animation: cb-cresce .6s cubic-bezier(.2,.7,.2,1) both; animation-delay: calc(var(--i) * 18ms); }
@keyframes cb-cresce { from { transform: scaleY(0); } to { transform: scaleY(1); } }
.cb-g-linha { fill: none; stroke: var(--c); stroke-width: 2.4; stroke-linecap: round; }
.cb-g-ponto { fill: var(--bs-body-bg); stroke: var(--c); stroke-width: 2; }
stop[class*="cb-c-"] { stop-color: var(--c); }
.cb-anima .cb-g-linha { stroke-dasharray: 1; stroke-dashoffset: 1; animation: cb-traca 1s ease forwards; }
.cb-anima .cb-g-area, .cb-anima .cb-g-ponto { animation: cb-aparece .6s .5s ease both; }
@keyframes cb-traca { to { stroke-dashoffset: 0; } }
@keyframes cb-aparece { from { opacity: 0; } to { opacity: 1; } }
.cb-g-guia { stroke: var(--bs-secondary-color); stroke-dasharray: 3 3; pointer-events: none; transition: opacity .12s; }
.cb-tooltip {
  position: absolute; z-index: 5; pointer-events: none; min-width: 170px;
  padding: .55rem .7rem; border-radius: 10px; font-size: .78rem;
  background: rgba(16, 24, 36, .92); color: #fff; box-shadow: 0 8px 24px rgba(0,0,0,.25); backdrop-filter: blur(4px);
}
.cb-tip-titulo { font-weight: 700; margin-bottom: .3rem; text-transform: capitalize; }
.cb-tip-linha { display: flex; align-items: center; gap: .4rem; }
.cb-tip-linha b { margin-left: auto; padding-left: 1rem; font-variant-numeric: tabular-nums; }

/* ---- agentes ---- */
.cb-lista-agentes { list-style: none; margin: 0; padding: 0; max-height: 330px; overflow-y: auto; }
.cb-agente { display: flex; align-items: center; gap: .7rem; padding: .65rem 1rem; border-bottom: 1px solid var(--cb-borda); transition: background .15s; }
.cb-agente:last-child { border-bottom: 0; }
.cb-agente:hover { background: var(--bs-tertiary-bg); }
.cb-agente-nome { font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cb-agente-meta { font-size: .74rem; color: var(--bs-secondary-color); display: flex; gap: .35rem; align-items: center; justify-content: inherit; }
.text-end .cb-agente-meta { justify-content: flex-end; margin-top: .2rem; }
.cb-agente-ponto { flex: 0 0 auto; width: .7rem; height: .7rem; border-radius: 50%; background: var(--cb-outro); position: relative; display: inline-block; }
.cb-agente-ponto.pequeno { width: .5rem; height: .5rem; }
.cb-agente-ponto.est-online { background: var(--cb-verde); animation: cb-pulsa 2.2s infinite; }
.cb-agente-ponto.est-ocupado { background: var(--cb-azul-claro); box-shadow: 0 0 0 3px rgba(27,107,180,.25); }
.cb-agente-ponto.est-erro { background: var(--cb-falha); }
.cb-agente-ponto.est-sem-agente { background: transparent; border: 1.5px dashed var(--cb-outro); }
.cb-tag { font-size: .68rem; font-weight: 600; padding: .05rem .4rem; border-radius: 5px; background: var(--bs-tertiary-bg); border: 1px solid var(--cb-borda); color: var(--bs-secondary-color); white-space: nowrap; }

/* ---- blocos de painel (Power BI / Relatorios) ---- */
.cb-stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: .6rem; }
.cb-stat { display: flex; align-items: center; gap: .55rem; padding: .6rem .65rem; border-radius: 10px; background: var(--bs-tertiary-bg); transition: transform .15s ease; min-width: 0; }
.cb-stat:hover { transform: translateY(-2px); }
.cb-stat > .bi { font-size: 1.1rem; color: var(--cb-aco); }
.cb-card-pbi .cb-stat > .bi, .cb-cor-pbi { color: var(--cb-pbi); }
.cb-stat-valor { font-weight: 700; font-size: 1.1rem; line-height: 1.1; font-variant-numeric: tabular-nums; }
.cb-stat-rotulo { font-size: .7rem; color: var(--bs-secondary-color); line-height: 1.2; }
.cb-bloco { margin-top: 1rem; }
.cb-bloco-titulo { display: flex; align-items: baseline; gap: .5rem; font-size: .74rem; text-transform: uppercase; letter-spacing: .05em; font-weight: 600; color: var(--bs-secondary-color); margin-bottom: .45rem; }
.cb-empilhada { display: flex; height: 10px; border-radius: 99px; overflow: hidden; gap: 2px; background: var(--bs-tertiary-bg); }
.cb-empilhada > span { min-width: 4px; transition: filter .15s; animation: cb-estica .8s cubic-bezier(.2,.7,.2,1) both; transform-origin: left; }
.cb-empilhada > span:hover { filter: brightness(1.15); }
@keyframes cb-estica { from { transform: scaleX(0); } to { transform: scaleX(1); } }
.cb-mini-colunas { display: block; width: 100%; height: 38px; margin-top: .6rem; }
.cb-mini-colunas .cb-c-pbi { fill: var(--cb-pbi); opacity: .85; }
.cb-mini-colunas rect:hover { opacity: 1; }
.cb-lista-simples { list-style: none; padding: 0; margin: 0; }
.cb-lista-simples li { display: flex; align-items: center; gap: .6rem; padding: .45rem 0; border-bottom: 1px dashed var(--cb-borda); }
.cb-lista-simples li:last-child { border-bottom: 0; }
.cb-frescor { flex: 0 0 auto; width: .6rem; height: .6rem; border-radius: 50%; }
.cb-frescor.fresco { background: var(--cb-verde); box-shadow: 0 0 0 3px rgba(2,197,74,.18); }
.cb-frescor.morno { background: #f5a524; }
.cb-frescor.velho { background: var(--cb-outro); }

.cb-anel-wrap { display: flex; align-items: center; gap: .45rem; padding: .35rem .5rem; border-radius: 10px; background: var(--bs-tertiary-bg); min-width: 0; }
.cb-anel { width: 44px; height: 44px; flex: 0 0 44px; transform: rotate(-90deg); }
.cb-anel circle { fill: none; stroke-width: 7; }
.cb-anel-fundo { stroke: var(--cb-borda); }
.cb-anel-valor { stroke: var(--cb-verde); stroke-linecap: round; transition: stroke-dashoffset 1.1s cubic-bezier(.2,.7,.2,1); }
.cb-anel-texto { transform: rotate(90deg); transform-origin: 32px 32px; font-size: 15px; font-weight: 700; fill: var(--bs-body-color); }

.cb-ranking { list-style: none; padding: 0; margin: 0; }
.cb-ranking-link { display: flex; align-items: center; gap: .65rem; padding: .45rem .5rem; margin: 0 -.5rem; border-radius: 9px; color: inherit; text-decoration: none; transition: background .15s; }
.cb-ranking-link:hover { background: var(--bs-tertiary-bg); color: inherit; }
.cb-ranking-pos { flex: 0 0 1.6rem; height: 1.6rem; border-radius: 7px; display: grid; place-items: center; font-size: .75rem; font-weight: 700; background: color-mix(in srgb, var(--cb-rel) 15%, transparent); color: var(--cb-rel); }
.cb-ranking li:first-child .cb-ranking-pos { background: linear-gradient(135deg, var(--cb-azul), var(--cb-verde)); color: #fff; }
.cb-ranking-abrir { opacity: 0; transition: opacity .15s, transform .15s; color: var(--cb-azul); }
.cb-ranking-link:hover .cb-ranking-abrir { opacity: 1; transform: translateX(2px); }

/* ---- barras inline ---- */
.cb-mini-barra { height: 6px; border-radius: 99px; background: var(--bs-tertiary-bg); overflow: hidden; margin: .25rem 0; }
.cb-mini-barra > span { display: block; height: 100%; border-radius: inherit; background: var(--cb-outro); animation: cb-estica .9s cubic-bezier(.2,.7,.2,1) both; transform-origin: left; }
.cb-mini-barra > .ok { background: var(--cb-verde); }
.cb-mini-barra > .aviso { background: #f5a524; }
.cb-mini-barra > .erro { background: var(--cb-falha); }
.cb-mini-barra > .linhas { background: var(--cb-linhas); opacity: .75; }
.cb-mini-barra > .rel { background: linear-gradient(90deg, var(--cb-azul), var(--cb-rel)); }

/* ---- tabelas do dashboard ---- */
.cb-tabela-dash td { vertical-align: middle; }
.cb-tabela-dash .cb-col-taxa { min-width: 150px; }
.cb-tabela-dash .cb-col-linhas { min-width: 110px; }
.cb-tabela-dash .cb-col-etapas { min-width: 120px; }
.cb-linha-link { cursor: pointer; }
.cb-linha-link td:first-child { position: relative; }
.cb-linha-link:hover td:first-child::before { content: ""; position: absolute; left: 0; top: 20%; bottom: 20%; width: 3px; border-radius: 0 3px 3px 0; background: linear-gradient(180deg, var(--cb-azul), var(--cb-verde)); }
.cb-novo > td { animation: cb-destaque 2.4s ease; }
@keyframes cb-destaque { 0%, 30% { background: rgba(2,197,74,.16); } 100% { background: transparent; } }

/* ---- mapa de calor ---- */
.cb-calor-grade { display: grid; grid-template-columns: 2.2rem repeat(24, minmax(0, 1fr)); gap: 3px; align-items: center; }
.cb-calor-hora { font-size: .62rem; color: var(--bs-secondary-color); text-align: left; }
.cb-calor-dia { font-size: .7rem; color: var(--bs-secondary-color); }
.cb-calor-cel { display: inline-block; aspect-ratio: 1; border-radius: 3px; background: var(--bs-tertiary-bg); transition: transform .12s ease; animation: cb-aparece .4s ease both; animation-delay: var(--d, 0ms); position: relative; }
.cb-calor-cel:hover { transform: scale(1.35); z-index: 1; box-shadow: 0 2px 8px rgba(0,0,0,.25); }
.cb-calor-cel.n1 { background: color-mix(in srgb, var(--cb-ok) 25%, var(--bs-tertiary-bg)); }
.cb-calor-cel.n2 { background: color-mix(in srgb, var(--cb-ok) 50%, var(--bs-tertiary-bg)); }
.cb-calor-cel.n3 { background: color-mix(in srgb, var(--cb-ok) 75%, var(--bs-tertiary-bg)); }
.cb-calor-cel.n4 { background: var(--cb-ok); }
.cb-calor-cel.tem-erro::after { content: ""; position: absolute; right: 1px; top: 1px; width: 35%; height: 35%; border-radius: 50%; background: var(--cb-falha); }
.cb-calor-escala { display: flex; align-items: center; gap: 3px; margin-top: .8rem; font-size: .7rem; color: var(--bs-secondary-color); }
.cb-calor-escala .cb-calor-cel { width: 12px; animation: none; }
.cb-calor-escala .cb-calor-cel:hover { transform: none; box-shadow: none; }

/* ---- saude por empresa ---- */
.cb-saude { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: .6rem; }
.cb-saude-item { display: flex; align-items: center; gap: .7rem; padding: .6rem .7rem; border: 1px solid var(--cb-borda); border-radius: 11px; transition: transform .15s ease, border-color .15s ease; min-width: 0; }
.cb-saude-item:hover { transform: translateY(-2px); border-color: var(--cb-aco); }
.cb-saude-grafico { position: relative; flex: 0 0 46px; width: 46px; height: 46px; }
.cb-saude-anel { width: 100%; height: 100%; transform: rotate(-90deg); }
.cb-saude-anel circle { fill: none; stroke-width: 4.5; }
.cb-saude-anel .fundo { stroke: var(--bs-tertiary-bg); }
.cb-saude-anel .valor { stroke-linecap: round; transition: stroke-dashoffset 1.1s cubic-bezier(.2,.7,.2,1); }
.cb-saude-anel.ok .valor { stroke: var(--cb-verde); }
.cb-saude-anel.aviso .valor { stroke: #f5a524; }
.cb-saude-anel.erro .valor { stroke: var(--cb-falha); }
.cb-saude-pct { position: absolute; inset: 0; display: grid; place-items: center; font-size: .7rem; font-weight: 700; font-variant-numeric: tabular-nums; }

/* ---- agenda ---- */
.cb-agenda { list-style: none; padding: 0; margin: 0; }
.cb-agenda li { display: flex; align-items: center; gap: .8rem; padding: .6rem 1rem; border-bottom: 1px solid var(--cb-borda); transition: background .15s; }
.cb-agenda li:last-child { border-bottom: 0; }
.cb-agenda li:hover { background: var(--bs-tertiary-bg); }
.cb-agenda-data { flex: 0 0 3.4rem; text-align: center; padding: .3rem 0; border-radius: 9px; background: color-mix(in srgb, var(--cb-azul) 10%, transparent); line-height: 1.15; }
.cb-agenda-data b { display: block; color: var(--cb-azul); font-variant-numeric: tabular-nums; }
[data-bs-theme="dark"] .cb-agenda-data b { color: #8fbfe9; }
.cb-agenda-data span { font-size: .68rem; color: var(--bs-secondary-color); }
.cb-agenda-falta { color: var(--cb-verde-escuro); }
[data-bs-theme="dark"] .cb-agenda-falta { color: #2fd471; }
.cb-agenda-atrasado .cb-agenda-data { background: rgba(229,72,77,.12); }
.cb-agenda-atrasado .cb-agenda-data b, .cb-agenda-atrasado .cb-agenda-falta { color: var(--cb-falha) !important; }

/* ---- vazio ---- */
.cb-vazio { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .3rem; padding: 1.6rem 1rem; color: var(--bs-secondary-color); text-align: center; font-size: .86rem; margin: 0; list-style: none; }
.cb-vazio > .bi { font-size: 1.7rem; opacity: .6; }

@media (max-width: 1199.98px) { .cb-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 575.98px) {
  .cb-kpis, .cb-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .6rem; }
  .cb-hero { grid-template-columns: 1fr; padding: 1.1rem; }
  .cb-hero-periodo { grid-row: auto; grid-column: 1; justify-self: start; }
  .cb-kpi-valor { font-size: 1.55rem; }
  .cb-calor-hora { font-size: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .cb-dash *, .cb-dash *::before, .cb-dash *::after { animation: none !important; transition: none !important; }
  .cb-revela { opacity: 1; transform: none; }
}

/* ---------- carregamento com a marca ----------
   Mesmo papel da logo de carregamento do Power BI: a marca no centro, um anel
   azul/verde girando em volta. Um elemento so (<div class="cb-loader">), o anel
   e a marca saem dos pseudo-elementos. Tamanho por --cb-loader-tam. */
.cb-loader {
  --cb-loader-tam: 64px;
  position: relative; display: inline-block; flex: 0 0 auto;
  width: var(--cb-loader-tam); height: var(--cb-loader-tam);
}
.cb-loader::before {
  content: ""; position: absolute; inset: 0; border-radius: 50%;
  border: max(2px, calc(var(--cb-loader-tam) * .05)) solid rgba(19, 84, 148, .12);
  border-top-color: var(--cb-azul); border-right-color: var(--cb-verde);
  animation: cb-loader-gira .9s linear infinite;
}
.cb-loader::after {
  content: ""; position: absolute; inset: 20%;
  background: url("/assets/img/marca.png") center/contain no-repeat;
  animation: cb-loader-pulsa 1.8s ease-in-out infinite;
}
[data-bs-theme="dark"] .cb-loader::before { border-color: rgba(255, 255, 255, .1); border-top-color: var(--cb-azul-claro); border-right-color: var(--cb-verde); }
.cb-loader-sm { --cb-loader-tam: 22px; }
.cb-loader-lg { --cb-loader-tam: 88px; }
@keyframes cb-loader-gira { to { transform: rotate(360deg); } }
@keyframes cb-loader-pulsa { 0%, 100% { transform: scale(.92); opacity: .85; } 50% { transform: scale(1); opacity: 1; } }

/* Tela inteira: troca de pagina e envio de formulario (app.js). Aparece com
   atraso para nao piscar em pagina rapida. */
.cb-carregando-tela {
  position: fixed; inset: 0; z-index: 2000;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .75rem;
  background: rgba(var(--bs-body-bg-rgb), .72); backdrop-filter: blur(2px);
  opacity: 0; pointer-events: none; transition: opacity .18s ease;
}
.cb-carregando-tela.ativo { opacity: 1; pointer-events: auto; }

@media (prefers-reduced-motion: reduce) {
  .cb-loader::before { animation-duration: 2.4s; }
  .cb-loader::after { animation: none; }
}
