/* ═══════════════════════════════════════════════════════════════
   APP SHELL — Sidebar + Content layout for internal app pages
   Fiscalização / Sistema Interno
   ═══════════════════════════════════════════════════════════════ */

/* ── Reset body for shell layout ────────────────────────────── */
.app-shell-body {
  padding-top: 0 !important;
  background: var(--bg);
  overflow: hidden;
  /* iOS: impede rubber-band horizontal (sobra à direita) e trava a largura */
  overflow-x: hidden;
  max-width: 100%;
  width: 100%;
  overscroll-behavior: none;
}
/* iOS Safari: o próprio <html> das telas de app não deve rolar/estourar */
html:has(> .app-shell-body) {
  overflow: hidden;
  max-width: 100%;
  height: 100dvh;
}

/* ── Shell wrapper ────────────────────────────────────────────── */
.app-shell {
  display: flex;
  height: 100vh; height: 100dvh;
  overflow: hidden;
}

/* Sombra da placa da marca. Piso literal + `color-mix` no `@supports`, como o
   restante da tinta de marca (ver design.css §7.4). */
:root { --sombra-marca: rgba(15,52,36,.25); }
@supports (color: color-mix(in srgb, red 50%, transparent)) {
  :root { --sombra-marca: color-mix(in srgb, var(--brand-700) 30%, transparent); }
}

/* ── Sidebar ──────────────────────────────────────────────────── */
.app-sidebar {
  width: 280px;
  flex-shrink: 0;
  background: var(--surface);
  border-right: 1px solid var(--border);
  display: flex;
  flex-direction: column;
  height: 100vh; height: 100dvh;
  /* `overflow: visible`, e isso é a raiz de três defeitos.

     Era `hidden`, e recortava tudo o que precisava sair da caixa: o botão de
     recolher (que ficava metade fora), e o menu do usuário no rodapé — um
     dropdown de 190px que no trilho de 52px era cortado pela metade.

     A contenção não se perde: `.sidebar-nav` tem o próprio
     `overflow-y: auto; overflow-x: hidden`, e é ele que rola. Os outros filhos
     (marca, linha do botão, rodapé) têm altura fixa e `flex-shrink: 0`, então
     nada mais tem como transbordar. O `hidden` aqui era cinto e suspensório
     que custava dois controles. */
  overflow: visible;
  position: relative;
  z-index: 50;
  transition: width var(--dur-slow) var(--ease-out),
              transform var(--dur-slow) var(--ease-out);
}

/* ── Estado recolhido (trilho de 52px) ────────────────────────────────────
   O trilho mostra os ícones dos itens da área (core/nav_gov.py), sem rótulo;
   o nome aparece na fita ao passar o mouse ou o foco (`[data-label]::after`,
   mais abaixo). O seletor de área some: expande-se a barra para trocar. */
.app-sidebar.collapsed {
  width: 52px;
}

/* `display: none` e não `opacity: 0; width: 0`.
   Era essa a causa do desalinhamento dos ícones: `.sidebar-label` tem
   `flex: 1`, e `flex-basis: 0 + flex-grow: 1` continua **absorvendo o espaço
   livre** mesmo com `width: 0`. O rótulo invisível empurrava o ícone para fora
   do centro. Fora do fluxo, ele não empurra nada.

   De quebra, deixa de animar `width`, que causa layout thrash a cada
   recolhimento. A transição de largura fica só na `<aside>`. */
.app-sidebar.collapsed .sidebar-label,
.app-sidebar.collapsed .sidebar-assinatura .sidebar-label {
  display: none;
}

/* Os títulos de seção (`<div>`: os módulos da área e "Apoio") saem do trilho. */
.app-sidebar.collapsed div.sidebar-section-label {
  display: none;
}

.app-sidebar.collapsed .nav-item-sidebar {
  justify-content: center;
  padding: .5rem;
  gap: 0;
}
.app-sidebar.collapsed .sidebar-brand {
  justify-content: center;
  padding: 16px 8px 14px;
}
.app-sidebar.collapsed .sidebar-divider {
  margin: 6px 10px;
}

/* ── Sidebar: Brand area — carimbo de prancha ───────────────────
   O órgão em cima, numa placa creme: brasão e logo de prefeitura são coloridos
   e com letra escura, e direto no charcoal sumiam (verde escuro de Serra
   Talhada a 28px). Quem fez a ferramenta assina no pé (`.sidebar-assinatura`). */
.sidebar-brand {
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 12px;
  border-bottom: 1px solid var(--border);
  flex-shrink: 0;
  text-decoration: none;
  color: inherit;
}
.sidebar-brand:hover { color: inherit; }
.sidebar-brand:focus-visible { outline: 2px solid var(--brand-500); outline-offset: -2px; }

/* Sem moldura creme (18/10/2026): a logo vai direto na barra, centrada. Logo
   de letra escura com fundo transparente some no charcoal — o órgão manda a
   versão com fundo próprio ou a negativa. */
.sidebar-brand-placa {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 48px;
}
/* `object-fit: contain`: `img { max-width: 100% }` global esmaga a largura e a
   proporção morre se a altura for fixa. */
/* Logo larga ocupa a largura da placa (a 40px de altura a de Sousa saía com
   97px de largura); brasão alto para em 64px, centrado. */
.sidebar-brand-logo {
  width: 100%;
  max-height: 64px;
  object-fit: contain;
  object-position: center;
}
.sidebar-brand-orgao {
  font-size: var(--fs-sm);
  font-weight: 700;
  line-height: 1.25;
  text-align: center;
  color: var(--fg);
}
.app-sidebar--dark .sidebar-brand-orgao { color: var(--sb-text-str); }
.sidebar-brand-name {
  font-size: var(--fs-xs);
  font-weight: 600;
  color: var(--muted);
  text-align: center;
}
.sidebar-brand-name:empty { display: none; }

/* No trilho a placa vira quadrada; o brasão cabe contido, sem esticar. */
.app-sidebar.collapsed .sidebar-brand { padding: 10px 6px; }
.app-sidebar.collapsed .sidebar-toggle { top: 48px; }
.app-sidebar.collapsed .sidebar-brand-placa { min-height: 40px; }
.app-sidebar.collapsed .sidebar-brand-logo { width: 32px; height: 32px; object-position: center; }
/* No trilho, logo larga vira risco ilegível; o favicon (brasão) fica no lugar. */
.sidebar-brand-icone { display: none; }
.app-sidebar.collapsed .sidebar-brand-placa:has(.sidebar-brand-icone) .sidebar-brand-logo { display: none; }
.app-sidebar.collapsed .sidebar-brand-icone { display: block; width: 32px; height: 32px; object-fit: contain; }
.app-sidebar.collapsed .sidebar-brand-orgao { font-size: 0; }
.app-sidebar.collapsed .sidebar-brand-orgao::first-letter { font-size: var(--fs-sm); }

/* ── Sidebar: Navigation ─────────────────────────────────────── */
.sidebar-nav {
  flex: 1;
  overflow-y: auto;
  overflow-x: hidden;
  padding: 10px 8px;
  scrollbar-width: thin;
  scrollbar-color: var(--border) transparent;
}
.sidebar-nav::-webkit-scrollbar { width: 4px; }
.sidebar-nav::-webkit-scrollbar-thumb { background: var(--border); border-radius: var(--r-xs); }

/* Rótulo estrutural da barra: nome do bloco contratado e "Apoio".
   Não é destino — separa. Versalete miúdo, cor de apoio, e o `--fs-3xs` (8px)
   que existe na escala por causa dele (ver a nota em design.css). */
.sidebar-section-label {
  font-size: var(--fs-3xs);
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--muted-2);
  padding: 11px 8px 3px;
  transition: opacity var(--dur-base);
}

/* O bloco abre uma seção comercial inteira — respiro maior que o de "Apoio",
   que é só a última gaveta. Sem fio próprio: o `.sidebar-divider` logo acima
   já separa, e um fio ao lado de rótulo que quebra em três linhas fica
   pendurado na primeira. */
.sidebar-bloco-label {
  padding-top: 16px;
}

.nav-item-sidebar {
  display: flex;
  align-items: center;
  gap: 9px;
  padding: .48rem .7rem;
  border-radius: var(--r-md);
  font-size: var(--fs-nav);
  font-weight: 500;
  color: var(--fg-2);
  text-decoration: none;
  cursor: pointer;
  white-space: nowrap;
  transition: background var(--dur-fast), color var(--dur-fast);
  margin-bottom: 1px;
  position: relative;
}

.nav-item-sidebar:hover {
  background: var(--surface-2);
  color: var(--fg);
  text-decoration: none;
}

.nav-item-sidebar.active {
  background: var(--brand-50);
  color: var(--brand-600);
  font-weight: 600;
}
.nav-item-sidebar.active::before {
  content: '';
  position: absolute;
  left: 0;
  top: 20%;
  bottom: 20%;
  width: 2.5px;
  /* 2px e não `--r-xs` (4px): o raio da escala é maior que a própria largura da
     barra, e a arredondaria até virar borrão. Indicador de fio não é container,
     e não segue a escala de container. */
  border-radius: 0 2px 2px 0;
  background: var(--brand-500);
}

.nav-item-sidebar i {
  font-size: var(--fs-md);
  flex-shrink: 0;
  width: 18px;
  text-align: center;
}

.sidebar-label {
  flex: 1;
  /* O rótulo herdava o corpo de texto (15px), que num menu vertical pesa mais
     que numa linha de leitura: o olho percorre a lista, não lê. 13px mantém a
     legibilidade e devolve ar entre os itens. */
  font-size: var(--fs-nav);
  /* Sem transição: os três rótulos saem por `display: none` no estado
     recolhido, então nem opacidade nem largura tinham o que animar — era
     código morto herdado da versão que usava `opacity: 0; width: 0`, e
     animar `width` é justamente o que causava o layout thrash. */
}

/* Badge contador */
.nav-badge {
  margin-left: auto;
  font-size: var(--fs-2xs);
  font-weight: 700;
  background: var(--brand-500);
  color: var(--on-accent);
  padding: 1px 6px;
  border-radius: var(--r-full);
  min-width: 18px;
  text-align: center;
  flex-shrink: 0;
}
.nav-badge.warn { background: var(--accent-warm); }
.nav-badge.danger { background: var(--accent-red); }

/* Divider between sections */
.sidebar-divider {
  height: 1px;
  background: var(--border);
  margin: 8px 8px;
}

.sidebar-chevron {
  margin-left: auto;
  font-size: var(--fs-2xs);
  flex-shrink: 0;
  transition: transform var(--dur-fast);
}

.app-sidebar.collapsed .sidebar-chevron {
  display: none;
}

/* ── Sidebar: botão de recolher ───────────────────────────────────────────
   Montado na borda da barra, com metade para fora — que é onde a mão procura.

   Essa posição sempre foi a intenção e nunca funcionou: a `<aside>` tinha
   `overflow: hidden` e recortava a metade externa. Recorte acontece **antes**
   do empilhamento, então nenhum `z-index` alcançava — subir de 10 para 60 não
   mudou nada, e não podia. Com a `<aside>` em `overflow: visible` a protrusão
   é legítima.

   `z-index` acima do próprio empilhamento da barra (50), porque a metade de
   fora encosta no conteúdo da página. */
.sidebar-toggle {
  position: absolute;
  right: -13px;
  /* Na régua sob a placa da prefeitura, não em cima do logo. */
  top: 72px;
  z-index: 60;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  background: var(--surface);
  border: 1px solid var(--border);
  box-shadow: var(--sh-sm);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: background var(--dur-fast), color var(--dur-fast),
              border-color var(--dur-fast), box-shadow var(--dur-fast);
  color: var(--muted);
  flex-shrink: 0;
}
.sidebar-toggle:hover {
  background: var(--brand-tint);
  border-color: var(--brand-500);
  color: var(--brand-600);
  box-shadow: var(--sh-md);
}
.sidebar-toggle:focus-visible {
  outline: 2px solid var(--brand-500);
  outline-offset: 2px;
  color: var(--fg);
}
.sidebar-toggle i {
  font-size: var(--fs-nav);
  transition: transform var(--dur-slow) var(--ease-out);
}
.app-sidebar.collapsed .sidebar-toggle i {
  transform: rotate(180deg);
}

/* ── Sidebar: rótulo em fita no trilho (o mesmo de casco2.css) ───────────
   Todo item do menu traz `data-label`; no trilho, o nome aparece ao lado do
   ícone. CSS puro, ancorado em `position: fixed`: `.sidebar-nav` tem
   `overflow-y: auto`, e pseudo-elemento comum seria recortado pela rolagem —
   `fixed` sai dela, e `left` vem da largura do trilho. Era um
   `bootstrap.Tooltip`; o Bootstrap JS não cresce (DESIGN.md §4.1).
   Só no trilho recolhido: com a barra aberta o rótulo já está escrito. */
.app-sidebar.collapsed [data-label] { position: relative; }
.app-sidebar.collapsed [data-label]:hover::after,
.app-sidebar.collapsed [data-label]:focus-visible::after {
  content: attr(data-label);
  position: fixed; left: var(--sb-min, 52px); z-index: 1100;
  margin-left: 8px; padding: 5px 10px;
  background: var(--rotier-charcoal-dark, #2F3835); color: #F4F1EC;
  border-radius: var(--r-sm); font-size: var(--fs-xs); white-space: nowrap;
  pointer-events: none;
}


/* ── Sidebar: assinatura do produto ──────────────────────────────
   O pé da barra era a conta do servidor, que foi para o topo
   (`includes/usuario_topbar.html`). */
.sidebar-assinatura {
  display: flex;
  align-items: center;
  gap: 9px;
  padding: 12px 14px;
  border-top: 1px solid var(--border);
  flex-shrink: 0;
  line-height: 1.2;
}
.sidebar-assinatura-simbolo { width: 20px; height: auto; flex-shrink: 0; }
.sidebar-assinatura b { display: block; font-size: var(--fs-sm); font-weight: 700; color: var(--fg); }
.sidebar-assinatura small { display: block; font-family: var(--font-mono, "DM Mono", monospace); font-size: var(--fs-2xs); color: var(--muted); }
.app-sidebar.collapsed .sidebar-assinatura { justify-content: center; padding: 12px 4px; }

/* Retrato no lugar das iniciais. `object-fit: cover` recorta pelo centro em vez
   de achatar, e o `background` some — a foto não precisa do preenchimento sage
   que existe para dar contraste à letra. */
.sidebar-avatar-foto {
  object-fit: cover;
  background: var(--surface-2);
  border: 1px solid var(--border);
}

.sidebar-avatar {
  width: 30px;
  height: 30px;
  border-radius: 50%;
  background: var(--brand-500);
  color: var(--on-accent);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: var(--fs-xs);
  font-weight: 700;
  flex-shrink: 0;
}


/* Quick action links in footer */
.sidebar-quick-actions {
  display: flex;
  gap: 4px;
  margin-top: 6px;
  padding: 0 4px;
}
.sidebar-quick-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  border-radius: var(--r-sm);
  color: var(--muted);
  text-decoration: none;
  font-size: var(--fs-base);
  transition: background var(--dur-fast), color var(--dur-fast);
}
.sidebar-quick-btn:hover {
  background: var(--surface-2);
  color: var(--fg);
}
.sidebar-quick-btn.danger:hover {
  background: var(--danger-subtle);
  color: var(--danger);
}

/* ── Main content area ────────────────────────────────────────── */
.app-main {
  flex: 1;
  display: flex;
  flex-direction: column;
  height: 100vh; height: 100dvh;
  overflow: hidden;
  min-width: 0;
}

/* ── Topbar (per-page header) ─────────────────────────────────── */
.app-topbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 0 24px;
  height: 52px;
  /* Superfície própria e régua embaixo (decisão de 18/10/2026). Em creme, a
     faixa se fundia ao conteúdo: trilha, busca e sino pareciam o topo da
     página, e não o casco que fica parado enquanto ela rola. A superfície é a
     mesma dos cards, então a barra lê como moldura, não como mais um bloco. */
  background: var(--surface);
  border-bottom: 1px solid var(--border);
  flex-shrink: 0;
}

.app-topbar-left {
  display: flex;
  align-items: center;
  gap: 10px;
  min-width: 0;
}

.app-topbar-right {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-shrink: 0;
}

/* `.topbar-title` saiu: era o título da página repetido na faixa, e o título
   real mora no cabeçalho do conteúdo, logo abaixo. A faixa agora carrega a
   trilha — a informação que o título não dava. */
.topbar-breadcrumb {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: var(--fs-sm);
  color: var(--muted);
  min-width: 0;              /* deixa o último trecho encurtar em vez de empurrar */
}
/* O trecho atual é o único em cor de texto: a trilha é contexto em cinza, e o
   "você está aqui" precisa se separar dela sem virar manchete. */
.topbar-breadcrumb b {
  font-weight: 600;
  color: var(--fg);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  min-width: 0;
}
.topbar-breadcrumb a,
.topbar-breadcrumb > span:not(.sep) { white-space: nowrap; flex-shrink: 0; }
.topbar-breadcrumb a {
  color: var(--muted);
  text-decoration: none;
  border-radius: var(--r-sm);
  text-underline-offset: 3px;
}
.topbar-breadcrumb a:hover { color: var(--fg); text-decoration: underline; }
.topbar-breadcrumb a:focus-visible { outline: 2px solid var(--brand-500); outline-offset: 2px; }
/* Separador no cinza do texto, atenuado, e não na cor da borda: no creme a
   régua sumia e os trechos viravam uma frase só. Decorativo, mas tem de ser
   visto — e `--muted` acompanha o tema escuro sozinho. */
.topbar-breadcrumb .sep {
  color: var(--muted);
  opacity: .6;
  font-size: var(--fs-base);
  flex-shrink: 0;
}
/* No celular o grupo do menu é o primeiro a sair: quem está numa obra precisa
   do link de volta e do nome, não do cabeçalho da sidebar. */
@media (max-width: 575.98px) {
  .topbar-breadcrumb > span:not(.sep):first-child,
  .topbar-breadcrumb > span:not(.sep):first-child + .sep { display: none; }
}

/* ── Page content ─────────────────────────────────────────────── */
.app-content {
  flex: 1;
  overflow-y: auto;
  overflow-x: hidden;
  padding: 20px 24px 32px;
}

/* ── Status / page-title override ────────────────────────────── */
/* Hide old page-title when inside app-shell */
.app-shell .page-title { display: none !important; }

/* Section padding override */
.app-shell .section { padding: 0 !important; }

/* container-xl inside shell: full width */
.app-shell .container-xl {
  max-width: 100% !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
}

/* ── Topbar mobile trigger ────────────────────────────────────── */
.sidebar-mobile-toggle {
  display: none;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  border: none;
  background: none;
  border-radius: var(--r-md);
  color: var(--fg);
  font-size: var(--fs-lg);
  cursor: pointer;
  flex-shrink: 0;
}
.sidebar-mobile-toggle:hover { background: var(--surface-2); }

/* ── Topbar status pill (module indicator) ───────────────────── */
.topbar-module-pill {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 3px 10px;
  border-radius: var(--r-full);
  font-size: var(--fs-xs);
  font-weight: 600;
  background: var(--brand-50);
  color: var(--brand-600);
  letter-spacing: .01em;
  flex-shrink: 0;
}

/* ── KPI cards override inside shell ─────────────────────────── */
.app-shell .kpi-card {
  padding: 14px 16px;
}
.app-shell .kpi-value {
  font-size: 24px;
}

/* ── Button sm overrides ──────────────────────────────────────── */
.btn-topbar {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: .3rem .75rem;
  font-size: var(--fs-sm);
  font-weight: 600;
  border-radius: var(--r-md);
  border: 1px solid var(--border);
  background: var(--surface);
  color: var(--fg-2);
  text-decoration: none;
  cursor: pointer;
  transition: background var(--dur-fast), border-color var(--dur-fast), color var(--dur-fast);
  white-space: nowrap;
}
.btn-topbar:hover {
  background: var(--surface-2);
  color: var(--fg);
  border-color: var(--border);
}
.btn-topbar-primary {
  background: var(--brand-500);
  color: var(--on-accent);
  border-color: var(--brand-500);
}
.btn-topbar-primary:hover {
  background: var(--brand-600);
  color: var(--on-accent);
  border-color: var(--brand-600);
}

/* ── Mobile overlay ───────────────────────────────────────────── */
.sidebar-overlay {
  display: none;
  position: fixed;
  inset: 0;
  /* Base do overlay escuro do DESIGN.md §4 (17,24,32), e não preto puro:
     véu de fundo é da mesma família do painel escuro que ele acompanha. */
  background: rgba(17,24,32,.4);
  z-index: 45;
}

/* ── Responsive ───────────────────────────────────────────────── */
@media (max-width: 991px) {
  .app-sidebar {
    position: fixed;
    top: 0;
    left: 0;
    height: 100vh; height: 100dvh;
    z-index: 50;
    transform: translateX(-100%);
    width: 240px !important;
  }
  .app-sidebar.mobile-open {
    transform: translateX(0);
    box-shadow: var(--sh-xl);
  }
  .app-sidebar .sidebar-label,
  .app-sidebar .sidebar-section-label,
  .app-sidebar .sidebar-assinatura .sidebar-label {
    opacity: 1 !important;
    width: auto !important;
    pointer-events: auto !important;
  }
  .app-sidebar .nav-item-sidebar {
    padding: .55rem .75rem !important;
    justify-content: flex-start !important;
  }
  .app-sidebar .sidebar-brand {
    justify-content: flex-start !important;
  }
  /* Em tela estreita a barra desliza inteira por cima do conteúdo; um
     botão de recolher montado na borda ficaria solto no meio da tela. */
  .sidebar-toggle { display: none; }
  .sidebar-mobile-toggle { display: flex; }
  .sidebar-overlay.active { display: block; }
  .app-main { width: 100%; }
  .app-topbar { padding: 0 16px; }
  .app-content { padding: 16px 16px 48px; }
}

/* ── Rótulo em fita dos itens recolhidos ──────────────────────────────────
   Havia aqui um tooltip em `::after` com `content: attr(data-label)`, e ele
   **nunca apareceu**: `.sidebar-nav` tem `overflow-y: auto`, e pseudo-elemento
   não escapa de ancestral com scroll. Ficava recortado na borda da barra, do
   mesmo jeito que o botão de recolher ficava.

   A fita voltou a ser `::after`, agora em `position: fixed`, que escapa da
   rolagem (ver o bloco "rótulo em fita no trilho" acima).

   `position: relative` continua porque a barra do item ativo (`::before`) usa. */
.app-sidebar.collapsed .nav-item-sidebar {
  position: relative;
}

/* ═══════════════════════════════════════════════════════════════
   Sidebar — variante ESCURA (charcoal) · design system Rotier
   Aplicada via classe .app-sidebar--dark (ex.: shell de Licitações).
   Não afeta as sidebars claras (Fiscalização etc.).
   ═══════════════════════════════════════════════════════════════ */
.app-sidebar--dark {
  --sb-bg:        #2f3835;  /* charcoal-dark */
  --sb-text:      rgba(255,255,255,.74);
  --sb-text-str:  #ffffff;
  /* .60 e não .42: a 42% o rótulo dava 3,53:1 sobre o charcoal — abaixo dos
     4,5:1 que o WCAG AA exige para texto pequeno, e o eMAG é obrigação legal
     deste produto, não preferência. A 60% dá 5,46:1 e continua um degrau
     abaixo de `--sb-text` (7,41:1), que é o que separa o rótulo estrutural do
     grupo que se clica. */
  --sb-muted:     rgba(255,255,255,.60);
  --sb-border:    rgba(255,255,255,.09);
  --sb-hover:     rgba(255,255,255,.07);
  /* Piso literal + `color-mix` no `@supports` abaixo: assim o item ativo da
     sidebar escura ganha a cor do município em vez de ficar sage fixo. */
  --sb-active-bg: rgba(143,168,130,.16);
  --sb-active-fg: #bacbb0;               /* sage-light */
  --sb-accent:    #8fa882;               /* sage */

  background: var(--sb-bg);
  border-right: 1px solid var(--sb-border);
}

@supports (color: color-mix(in srgb, red 50%, transparent)) {
  .app-sidebar--dark {
    --sb-active-bg: color-mix(in srgb, var(--brand-500) 16%, transparent);
  }
}

/* Marca */
.app-sidebar--dark .sidebar-brand { border-bottom-color: var(--sb-border); }
.app-sidebar--dark .sidebar-brand-name { color: var(--sb-muted); }
.app-sidebar--dark .sidebar-assinatura { border-top-color: var(--sb-border); }
.app-sidebar--dark .sidebar-assinatura b { color: var(--sb-text-str); }
.app-sidebar--dark .sidebar-assinatura small { color: var(--sb-muted); }
/* O símbolo tem contorno charcoal e some na barra escura. Em silhueta branca
   os vãos transparentes entre as formas mantêm o desenho. */
.app-sidebar--dark .sidebar-assinatura-simbolo { filter: brightness(0) invert(1); opacity: .9; }

/* Scrollbar */
.app-sidebar--dark .sidebar-nav { scrollbar-color: rgba(255,255,255,.18) transparent; }
.app-sidebar--dark .sidebar-nav::-webkit-scrollbar-thumb { background: rgba(255,255,255,.18); }

/* Rótulos de seção — estruturais (bloco contratado, "Apoio"). */
.app-sidebar--dark .sidebar-section-label { color: var(--sb-muted); }

/* Conta sem grupo (core/nav_gov.py): o aviso ocupa o lugar das seções da área. */
.sidebar-sem-grupo { font-size: var(--fs-xs); line-height: 1.45; margin: 12px 8px; }
.app-sidebar--dark .sidebar-sem-grupo { color: var(--sb-text); }


/* Itens de navegação */
.app-sidebar--dark .nav-item-sidebar { color: var(--sb-text); }
.app-sidebar--dark .nav-item-sidebar:hover {
  background: var(--sb-hover);
  color: var(--sb-text-str);
}
.app-sidebar--dark .nav-item-sidebar.active {
  background: var(--sb-active-bg);
  color: var(--sb-active-fg);
}
.app-sidebar--dark .nav-item-sidebar.active::before { background: var(--sb-accent); }

/* Divisores */
.app-sidebar--dark .sidebar-divider { background: var(--sb-border); }

/* Botão de recolher */
.app-sidebar--dark .sidebar-toggle {
  background: var(--brand-800);
  border-color: var(--sb-border);
  color: var(--sb-text);
}
/* Fundo **sólido** no hover, e é o ponto todo desta regra.
   `--sb-active-bg` é `color-mix(… 16%, transparent)` — serve para o item ativo,
   que fica dentro da barra e tem o charcoal atrás. Este botão vive metade fora
   dela (`right: -13px`), então fundo translúcido deixava ver a divisa entre a
   barra escura e o conteúdo claro: no hover o botão perdia o corpo justamente
   quando o ponteiro dizia que ia clicar nele.

   `--brand-700` é um degrau mais claro que o `--brand-800` do repouso — hover
   que ilumina, como no resto do sistema — e dá 4,78:1 com o sage-light.

   `border-color` e `box-shadow` também precisam vir daqui: a regra base
   `.sidebar-toggle:hover` os define para a barra clara, e sem redefinir sobrava
   contorno verde-claro e sombra de tema claro sobre fundo escuro. */
.app-sidebar--dark .sidebar-toggle:hover {
  background: var(--brand-700);
  border-color: var(--sb-accent);
  /* Branco puro e não o sage-light: o ícone acende de #cccfcb para #ffffff, e
     é esse contraste (8,2:1) que faz o hover ser percebido — o salto de fundo
     entre `--brand-800` e `--brand-700` sozinho é sutil demais.

     `--brand-500` daria salto muito maior, e foi descartado: a Regra do Tenant
     o sobrepõe com a cor da prefeitura, e não há como garantir contraste com
     uma cor que o município escolhe. Fundo de hover não é lugar para token que
     muda por cliente. */
  color: var(--sb-text-str);
  box-shadow: 0 2px 8px rgba(0,0,0,.35);
}
.app-sidebar--dark .sidebar-toggle:focus-visible {
  outline: 2px solid var(--sb-accent);
  outline-offset: 2px;
  color: var(--sb-text-str);
}

/* Rodapé / usuário */


/* ============================================================
   Sino de alertas (Rotier Territum §12.3) + suporte Alpine x-cloak
   ============================================================ */
[x-cloak] { display: none !important; }

.sino-alertas { position: relative; }
.sino-btn {
  position: relative; background: transparent; border: 0; cursor: pointer;
  /* `--ink-600` nunca foi definido em lugar nenhum, então o fallback
     `var(--fg-2)` — cinza do Tailwind — sempre vencia, e o sino renderizava
     fora da paleta em toda página. É o papel de `--fg-2`. */
  width: 38px; height: 38px; border-radius: var(--r-lg); color: var(--fg-2);
  display: inline-flex; align-items: center; justify-content: center; font-size: var(--fs-lg);
  /* A classe também veste um `<a>` (a ajuda em `includes/ajuda_topbar.html`,
     que sem tour aponta para o suporte). Sem isto o link vinha sublinhado ao
     lado do sino, e dois ícones vizinhos com acabamento diferente é o detalhe
     que faz a barra parecer montada por pessoas diferentes. */
  text-decoration: none;
}
.sino-btn:hover { background: var(--surface-2); }
.sino-badge {
  position: absolute; top: 3px; right: 3px; min-width: 16px; height: 16px;
  padding: 0 4px; border-radius: var(--r-full); background: var(--danger); color: var(--on-accent);
  font-size: var(--fs-xs); font-weight: 700; line-height: 16px; text-align: center;
}
.sino-dropdown {
  position: absolute; right: 0; top: calc(100% + 8px); width: 340px; z-index: 1050;
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg);
  box-shadow: var(--sh-lg); overflow: hidden;
}
.sino-header { display: flex; justify-content: space-between; align-items: center;
  padding: 10px 14px; border-bottom: 1px solid var(--border); font-size: var(--fs-base); }
.sino-lista { max-height: 360px; overflow-y: auto; }
.sino-item { display: flex; gap: 10px; align-items: flex-start; padding: 10px 14px;
  text-decoration: none; color: inherit; border-bottom: 1px solid var(--surface-2); }
.sino-item:hover { background: var(--surface-2); }
.sino-item--novo { background: color-mix(in srgb, var(--info) 8%, var(--surface)); }
.sino-dot { width: 8px; height: 8px; border-radius: 50%; margin-top: 6px; flex: 0 0 auto; background: var(--muted); }
.sino-dot--info { background: var(--info); }
.sino-dot--aviso { background: var(--warn); }
.sino-dot--critico { background: var(--danger); }
.sino-texto { display: flex; flex-direction: column; gap: 2px; }
.sino-titulo { font-size: var(--fs-base); font-weight: 500; }
/* Idem `--ink-500`: token fantasma. Data de alerta é texto secundário. */
.sino-data { font-size: var(--fs-sm); color: var(--muted); }
.sino-vazio { padding: 18px 14px; font-size: var(--fs-base); text-align: center; }
.sino-footer { display: block; padding: 10px 14px; text-align: center; font-size: var(--fs-nav);
  text-decoration: none; color: var(--brand-600); border-top: 1px solid var(--border); }
.sino-footer:hover { background: var(--surface-2); }

/* ============================================================
   Hub do Rotier Territum (gov_hub.html) — pipeline do roteiro
   ============================================================ */
.gov-pipeline { display: flex; align-items: stretch; flex-wrap: wrap; gap: 4px; }
.gov-step {
  flex: 1 1 0; min-width: 120px; display: flex; flex-direction: column; align-items: center;
  gap: 4px; padding: 12px 8px; border: 1px solid var(--border); border-radius: var(--r-lg);
  text-decoration: none; color: var(--fg-2); background: var(--surface);
  transition: border-color .15s, box-shadow .15s, transform .1s; text-align: center;
}
.gov-step:hover { border-color: var(--brand-500); box-shadow: var(--sh-md);
  transform: translateY(-1px); text-decoration: none; color: var(--brand-600); }
.gov-step i.bi { font-size: 20px; }
.gov-step-num {
  width: 22px; height: 22px; border-radius: 50%; background: var(--brand-500); color: var(--on-accent);
  font-size: var(--fs-sm); font-weight: 700; display: inline-flex; align-items: center; justify-content: center;
}
.gov-step-name { font-size: var(--fs-sm); font-weight: 600; }
.gov-step-arrow { display: flex; align-items: center; color: var(--muted); }
.hub-atencao {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 8px 14px; border: 1px solid var(--border); border-radius: var(--r-md);
  background: var(--surface); color: var(--fg-2); text-decoration: none;
  font-size: var(--fs-base); transition: border-color .15s;
}
.hub-atencao:hover { border-color: var(--stone); color: var(--fg); }
.gov-card-num {
  width: 20px; height: 20px; border-radius: 50%; background: var(--brand-50);
  color: var(--brand-600); font-size: var(--fs-xs); font-weight: 700;
  display: inline-flex; align-items: center; justify-content: center;
}
@media (max-width: 700px) {
  .gov-pipeline { flex-direction: column; }
  .gov-step { flex-direction: row; justify-content: flex-start; }
  .gov-step-arrow { transform: rotate(90deg); align-self: center; }
  /* Ações dos cards de módulo empilham full-width — alinhadas e touch-friendly. */
  .gov-card-actions { flex-direction: column; }
  .gov-card-actions .btn { display: flex; align-items: center; justify-content: flex-start; width: 100%; }
}

/* ── Links na paleta do design system (sem azul do Bootstrap) ─────────────
   Sobrescreve as CSS vars de link do Bootstrap 5 e destaca links de conteúdo. */
:root {
  --bs-link-color: var(--brand-600, var(--brand-700));
  --bs-link-hover-color: var(--brand-500, #5e7257);
  --bs-link-color-rgb: 74, 92, 67;
  --bs-link-hover-color-rgb: 94, 114, 87;
}
a { color: var(--brand-600, var(--brand-700)); text-underline-offset: 2px; }
a:hover, a:focus { color: var(--brand-500, #5e7257); }
/* Utilitários Bootstrap que usam azul */
.text-primary { color: var(--brand-500, #5e7257) !important; }
.btn-link { color: var(--brand-600, var(--brand-700)); }
.btn-link:hover { color: var(--brand-500, #5e7257); }
/* Links de conteúdo (dentro de cards/tabelas): destaque de "clicável" no hover */
.card a:not(.btn):not(.nav-link):not(.badge),
table a:not(.btn):not(.badge) { text-decoration: none; font-weight: 500; }
.card a:not(.btn):not(.nav-link):not(.badge):hover,
table a:not(.btn):not(.badge):hover { text-decoration: underline; }
/* Componentes que definem cor própria não são afetados (nav-item-sidebar, btn, badge). */

/* ── Micro-feedback tátil: botão "afunda" no clique ── */
.btn:active { transform: translateY(1px); }
.hover-lift { transition: box-shadow var(--app-transition,.2s), transform var(--app-transition,.2s); }
.hover-lift:hover { transform: translateY(-2px); box-shadow: var(--sh-md) !important; }

/* ── Skeleton loader p/ gráficos (enquanto o Chart.js CDN carrega) ── */
.chart-skeleton { position: relative; border-radius: var(--r-md, 8px); overflow: hidden;
  background: var(--surface-2); }
.chart-skeleton::after { content: ""; position: absolute; inset: 0;
  pointer-events: none; /* overlay de carregamento NUNCA come o hover/clique do gráfico */
  background: linear-gradient(90deg, transparent, rgba(255,255,255,.55), transparent);
  transform: translateX(-100%); animation: chart-shimmer 1.3s ease-in-out infinite; }
@keyframes chart-shimmer { 100% { transform: translateX(100%); } }
.chart-ready.chart-skeleton { background: transparent; }
.chart-ready.chart-skeleton::after { display: none; }


/* ── Cabeçalho de cartão com ações ────────────────────────────────────────
   O padrão "título à esquerda, botões à direita" (justify-content-between) não
   cabe em 390px: os botões saíam pela direita e o overflow-x:hidden do
   .app-content os escondia. Quebrar a linha mantém tudo alcançável. */
.card-header.d-flex,
.card-header .d-flex,
.page-actions {
  flex-wrap: wrap;
  gap: .5rem;
}

/* Barra de ações da tela (bloco topbar_right): em telas estreitas os botões
   empilham em vez de sumirem na borda. */
.page-actions {
  display: flex;
  align-items: center;
}

@media (max-width: 575.98px) {
  /* Valor monetário não parte no meio do número: "R$ 1.250.000," numa linha e
     "00" na outra é ilegível. Ele encolhe para caber inteiro no cartão. */
  /* Os utilitários fs-* do Bootstrap vêm com !important; para vencer sem
     aumentar a especificidade artificialmente, a regra também usa. */
  .mono.fs-5, .mono.fs-4, .kpi-value.mono, .stat-value.mono {
    white-space: nowrap;
    font-size: clamp(.95rem, 4.2vw, 1.25rem) !important;
  }
}

/* ── Movimento reduzido ───────────────────────────────────────────────────
   O arquivo não tinha este bloco, e a barra anima largura, transform e
   rotação. Quem marcou "reduzir movimento" no sistema operacional está
   pedindo para não receber isso — e num app que o servidor usa o dia inteiro
   o pedido é de conforto, não de estética. Os estados continuam todos
   funcionando; só deixam de ser animados. */
@media (prefers-reduced-motion: reduce) {
  .app-sidebar,
  .sidebar-toggle i,
  .sidebar-chevron,
  .sidebar-overlay,
  .nav-item-sidebar {
    transition: none !important;
  }
}

/* ═══════════════════════════════════════════════════════════════════
   TRANSIÇÃO ENTRE TELAS — o casco não pisca

   Este arquivo é carregado só pelo `base_gov.html` (e por quem estende ele:
   fiscalização, sysadmin). É de propósito: a View Transition entre documentos
   só acontece quando **as duas** páginas declaram a opção. Escopando a regra
   aqui, navegar dentro do sistema anima; sair para o portal público, para o
   mapa em tela cheia ou para um PDF não anima — nenhum desses carrega este
   arquivo, e nenhum deles se parece o bastante com a tela anterior para que
   um cross-fade signifique alguma coisa.

   Firefox ainda não implementa; lá a regra inteira é ignorada e a navegação
   volta a ser o corte seco de sempre. Não há fallback a escrever.
   ═══════════════════════════════════════════════════════════════════ */
@view-transition { navigation: auto; }

/* Nomear congela. Só o que NÃO muda entre duas telas do sistema ganha nome:
   a barra lateral, a trilha do topo, a barra de carregamento e a faixa de
   cookies são idênticas nas duas páginas, e animá-las é redesenhar o que não
   mudou — que é exatamente a piscada que esta seção existe para remover.

   O conteúdo fica DE FORA da lista, e isso é a decisão importante aqui.
   Nomear `.app-content` seria o caminho óbvio, e quebra a tela: um elemento
   com `view-transition-name` passa a formar contexto de empilhamento, e o
   conteúdo hospeda coisas que precisam pintar por cima da lateral — o
   `.geo-toast` e o `#vm-painel` do visualizador são `position: fixed` com
   z-index 4000 e 1040 contra os 50 da lateral. Dentro de um contexto novo
   esses números deixam de valer contra o lado de fora e os dois somem atrás
   da barra. Medido no Chrome 151, não deduzido.

   Sem nome, o conteúdo cai no instantâneo da RAIZ — que é tudo o que sobrou
   depois de recortar os nomeados. O efeito visto é o mesmo (só o conteúdo
   atravessa), e nenhum contexto de empilhamento é criado.

   Cada nome precisa ser ÚNICO no documento: dois elementos com o mesmo
   `view-transition-name` abortam a transição inteira, em silêncio, sem erro
   no console. Por isso todos os seletores abaixo são de elemento único do
   casco, nunca de classe utilitária. */
.app-sidebar      { view-transition-name: casco-lateral; }
.app-topbar       { view-transition-name: casco-trilha; }
/* `#carregando-barra` saiu do produto; a `view-transition-name` dela foi junto. */
.aviso-cookies    { view-transition-name: casco-cookies; }

/* A trilha do topo era estática e sem z-index. O nome acabou de torná-la um
   contexto de empilhamento, e isso muda onde o painel do sino de alertas
   (`.sino-dropdown`, z-index 1050) é pintado: fechado dentro do novo contexto,
   os 1050 passam a valer só lá dentro, e a trilha inteira — painel junto —
   volta a ser pintada na camada de bloco normal, ou seja, ANTES do
   `.app-content` que vem depois dela no documento. O painel abriria por baixo
   do conteúdo da página.

   Daí a camada explícita. Quarenta, e não sessenta: acima do conteúdo, que é
   estático, e abaixo do véu do menu lateral (45) e da própria lateral (50).
   Abaixo de 992px a lateral vira gaveta por cima da tela, e uma trilha em 60
   ficaria pintada em cima do véu escuro — visível e clicável através de um
   fundo que existe justamente para bloquear a tela. */
.app-topbar { position: relative; z-index: 40; }

/* PARADAS. `animation: none` nos dois lados deixaria os dois instantâneos
   empilhados em opacidade cheia — o antigo precisa sair, só não animado. */
::view-transition-old(casco-lateral),
::view-transition-old(casco-trilha),
::view-transition-old(casco-barra),
::view-transition-old(casco-cookies) { animation: none; opacity: 0; }
::view-transition-new(casco-lateral),
::view-transition-new(casco-trilha),
::view-transition-new(casco-barra),
::view-transition-new(casco-cookies) { animation: none; opacity: 1; }

/* A RAIZ é o conteúdo. A saída é mais curta que a entrada de propósito: o que
   sai já não interessa, e prolongar os dois lados no mesmo tempo produz o
   meio lavado em que nenhuma das duas telas está legível. Sem deslocamento
   vertical — a tela nova nasce no lugar dela; movimento aqui competiria com a
   rolagem que a pessoa acabou de fazer. Fica dentro dos 150–300ms ease-out
   que o DESIGN.md fixa como teto de energia do sistema. */
::view-transition-old(root) {
  animation: casco-conteudo-sai var(--dur-fast) var(--ease-out) both;
}
::view-transition-new(root) {
  animation: casco-conteudo-entra var(--dur-base) var(--ease-out) both;
}
@keyframes casco-conteudo-sai   { to   { opacity: 0; } }
@keyframes casco-conteudo-entra { from { opacity: 0; } }

@media (prefers-reduced-motion: reduce) {
  /* O pedido é "não me anime", não "não navegue". A transição continua
     acontecendo — sem ela o `::view-transition-old` ficaria por cima da
     página nova pelos 250ms padrão, que é pior que o corte seco. Ela só passa
     a durar o bastante para ninguém ver. */
  ::view-transition-old(root),
  ::view-transition-new(root) { animation-duration: 1ms; }
}

/* ═══════════════════════════════════════════════════════════════
   Navegação por área de trabalho + paleta Ctrl+K (17/10/2026,
   docs/design/mockups/navegacao-por-papel.html). A barra mostra a área da
   pessoa; o seletor fica no topo dela; a paleta é um <dialog> no corpo.
   ═══════════════════════════════════════════════════════════════ */
.sidebar-area { position: relative; margin: 4px 8px 8px; }
.sidebar-area-btn {
  width: 100%; display: flex; align-items: center; gap: 8px;
  padding: 8px 10px; border: 1px solid var(--border); border-radius: var(--r-md);
  background: transparent; color: var(--fg); text-align: left; font: inherit;
}
.sidebar-area-btn small { display: block; font-size: var(--fs-3xs); font-weight: 600; letter-spacing: .12em; text-transform: uppercase; color: var(--muted); }
.sidebar-area-btn b { display: block; font-size: var(--fs-nav); font-weight: 600; }
.sidebar-area-btn .sidebar-chevron { margin-left: auto; }
.sidebar-area-unica { border-color: transparent; padding-left: 8px; }
.sidebar-area-menu {
  position: absolute; left: 0; right: 0; top: calc(100% + 4px); z-index: 5;
  padding: 6px; background: var(--surface); color: var(--fg);
  border: 1px solid var(--border); border-radius: var(--r-md); box-shadow: var(--sh-xl);
}
.sidebar-area-menu [role="option"] { display: block; padding: 8px 10px; border-radius: var(--r-sm); font-size: var(--fs-nav); font-weight: 500; color: inherit; text-decoration: none; }
.sidebar-area-menu [role="option"] small { display: block; font-size: var(--fs-xs); color: var(--muted); font-weight: 400; }
.sidebar-area-menu [role="option"] em { font-style: normal; font-size: var(--fs-xs); color: var(--brand-500); }
.sidebar-area-menu [role="option"]:hover, .sidebar-area-menu [role="option"]:focus-visible { background: var(--surface-2); outline: none; }
.sidebar-area-menu [role="option"]:focus-visible { box-shadow: var(--sh-focus); }
.sidebar-area-menu [aria-selected="true"] { font-weight: 700; }
.sidebar-inicio { font-weight: 600; }
/* Contador de pendência no item (core/nav_gov.py, cache de 60 s). Zero não vira badge. */
.sidebar-contador { margin-left: auto; font-family: var(--app-font-mono); font-size: var(--fs-2xs); font-weight: 500; min-width: 20px; padding: 1px 6px; border-radius: var(--r-full); background: var(--surface-2); color: var(--fg-2); text-align: center; }
.nav-item-sidebar.active .sidebar-contador { background: var(--brand-600); color: var(--on-accent); }
.app-sidebar--dark .sidebar-contador,
.app-sidebar--dark .nav-item-sidebar.active .sidebar-contador { background: var(--sb-hover); color: var(--sb-text-str); }
.app-sidebar.collapsed .sidebar-contador { display: none; }   /* trilho de 52px não cabe */
.app-sidebar.collapsed .sidebar-area { display: none; }   /* trilho de 52px: expande para trocar */

.app-sidebar--dark .sidebar-area-btn { border-color: var(--sb-border); color: var(--sb-text-str); }
.app-sidebar--dark .sidebar-area-btn:hover { background: var(--sb-hover); }
.app-sidebar--dark .sidebar-area-btn small { color: var(--sb-muted); }
.app-sidebar--dark .sidebar-area-btn:focus-visible { outline: 2px solid var(--sb-accent); outline-offset: 2px; }
/* O menu é claro mesmo na barra escura: é uma superfície flutuante, como o
   menu do usuário no rodapé. Os `--sb-*` não entram nele. */

.topbar-busca {
  display: inline-flex; align-items: center; gap: 8px; height: 34px; padding: 0 10px 0 12px;
  border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--surface);
  color: var(--muted); font-size: var(--fs-sm); min-width: 240px; text-align: left;
}
.topbar-busca:hover { border-color: var(--muted-2); color: var(--fg); }
.topbar-busca:focus-visible { outline: none; box-shadow: var(--sh-focus); }
.topbar-busca-texto { flex: 1; }
.topbar-busca kbd, .paleta kbd { font-family: var(--app-font-mono); font-size: var(--fs-xs); padding: 1px 6px; border: 1px solid var(--border); border-bottom-width: 2px; border-radius: var(--r-xs); background: var(--surface); color: var(--fg-2); }

.paleta { width: min(560px, calc(100vw - 32px)); padding: 0; border: 0; border-radius: var(--r-lg); box-shadow: var(--sh-xl); background: var(--surface); color: var(--fg); margin-top: 12vh; }
.paleta::backdrop { background: rgba(47, 56, 53, .45); }
.paleta input { width: 100%; border: 0; border-bottom: 1px solid var(--border-2); padding: 14px 18px; font: inherit; font-size: var(--fs-md); color: var(--fg); background: transparent; outline: none; }
#paleta-lista { max-height: min(52vh, 420px); overflow-y: auto; padding: 6px; }
.paleta-grupo { font-size: var(--fs-2xs); font-weight: 600; letter-spacing: .12em; text-transform: uppercase; color: var(--muted); padding: 10px 12px 4px; }
.paleta [role="option"] { display: flex; align-items: baseline; gap: 10px; padding: 8px 12px; border-radius: var(--r-sm); font-size: var(--fs-nav); cursor: pointer; color: inherit; text-decoration: none; }
.paleta [role="option"] small { margin-left: auto; font-size: var(--fs-sm); color: var(--muted); }
.paleta [aria-selected="true"] { background: color-mix(in srgb, var(--brand-500) 14%, transparent); }
.paleta-vazio { padding: 16px 12px; font-size: var(--fs-nav); color: var(--muted); }
.paleta-rodape { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 0; padding: 8px 14px; border-top: 1px solid var(--border-2); font-size: var(--fs-xs); color: var(--muted); }

@media (max-width: 991px) {
  .topbar-busca { min-width: 0; padding: 0 9px; }
  .topbar-busca-texto, .topbar-busca kbd { display: none; }
}

/* ── Início da área (core/inicio_area.html, 18/10/2026) ─────────────────── */
.inicio-grid { display: grid; grid-template-columns: 1.5fr 1fr; gap: 20px; margin-top: 20px; align-items: start; }
@media (max-width: 991px) { .inicio-grid { grid-template-columns: 1fr; } }
.inicio-cabeca { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; padding: 14px 18px; border-bottom: 1px solid var(--border); }
.inicio-cabeca h2 { font-size: var(--fs-base); font-weight: 700; margin: 0; }
.inicio-cabeca > span { font-size: var(--fs-xs); color: var(--muted); }
.inicio-tarefas { list-style: none; margin: 0; padding: 0; }
.inicio-tarefas li { display: flex; align-items: center; gap: 12px; padding: 12px 18px; border-bottom: 1px solid var(--border); }
.inicio-tarefas li:last-child { border-bottom: 0; }
.inicio-tarefas .txt { flex: 1; min-width: 0; font-size: var(--fs-sm); overflow-wrap: anywhere; }
.inicio-tarefas .txt small { display: block; font-size: var(--fs-xs); color: var(--muted); }
.inicio-tarefas a { font-size: var(--fs-sm); font-weight: 600; color: var(--brand-600); white-space: nowrap; }
.inicio-tarefas a:hover { text-decoration: underline; }
.tag-prazo { font-size: var(--fs-2xs); font-weight: 600; border-radius: var(--r-sm); padding: 2px 7px; white-space: nowrap; background: var(--surface-2); color: var(--fg-2); }
.tag-prazo.tag-atrasado { background: var(--danger-subtle); color: var(--danger); }
.tag-prazo.tag-hoje { background: var(--brand-50); color: var(--brand-700); }
.inicio-numeros { display: grid; grid-template-columns: 1fr 1fr; gap: 1px; margin: 0; background: var(--border); border-radius: 0 0 var(--r-md) var(--r-md); overflow: hidden; }
.inicio-numeros > div { background: var(--surface); padding: 14px 18px; min-width: 0; }
.inicio-numeros dt { font-size: var(--fs-xs); font-weight: 400; color: var(--muted); }
.inicio-numeros dd { margin: 2px 0 0; font-family: var(--app-font-mono); font-size: var(--fs-md); font-weight: 500; color: var(--fg); overflow-wrap: anywhere; }
.inicio-numeros dd a { color: inherit; text-decoration: underline; text-decoration-color: var(--border-2); text-underline-offset: 3px; }
.inicio-numeros dd .u { font-size: var(--fs-xs); color: var(--muted); margin-left: 2px; }
.inicio-sem-numeros { margin: 0; padding: 14px 18px; font-size: var(--fs-sm); color: var(--muted); }

/* ── Cartão Vínculos (includes/vinculos.html) ─────────────────────────── */
.vinculos li + li { border-top: 1px solid var(--border); }
.vinculos li a { display: flex; align-items: center; gap: 8px; padding: 10px 16px; color: var(--fg); text-decoration: none; font-size: var(--fs-sm); }
.vinculos li a:hover { background: var(--surface-2); }
.vinculos li a:focus-visible { outline: none; box-shadow: var(--sh-focus); }
.vinculos li a > i { color: var(--muted); }
.vinculos li a .mono { color: var(--fg-2); }

/* ── Conta do servidor no topo (includes/usuario_topbar.html) ─── */
.topbar-usuario { position: relative; }
.topbar-usuario-btn {
  display: inline-flex; align-items: center; gap: 8px;
  height: 38px; padding: 0 8px 0 4px; margin-left: 4px;
  background: transparent; border: 0; border-radius: var(--r-lg);
  color: var(--fg); font: inherit; font-size: var(--fs-sm); font-weight: 600; cursor: pointer;
}
.topbar-usuario-btn:hover { background: var(--surface-2); }
.topbar-usuario-btn:focus-visible { outline: none; box-shadow: var(--sh-focus); }
.topbar-usuario-nome { max-width: 14ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.topbar-usuario-seta { font-size: var(--fs-xs); color: var(--muted); }
.topbar-usuario-menu {
  position: absolute; right: 0; top: calc(100% + 8px); min-width: 220px; z-index: 1050;
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg);
  box-shadow: var(--sh-lg); padding: 6px; font-size: var(--fs-sm);
}
.topbar-usuario-quem { padding: 8px 10px 10px; border-bottom: 1px solid var(--border); margin-bottom: 4px; }
.topbar-usuario-quem strong { display: block; color: var(--fg); }
.topbar-usuario-quem span { color: var(--muted); font-size: var(--fs-xs); }
.topbar-usuario-menu form { margin: 0; }
.topbar-usuario-item {
  display: flex; align-items: center; gap: 8px; width: 100%; padding: 8px 10px;
  border: 0; border-radius: var(--r-md); background: transparent; color: var(--fg);
  font: inherit; text-align: left; text-decoration: none; cursor: pointer;
}
.topbar-usuario-item:hover { background: var(--surface-2); color: var(--fg); }
.topbar-usuario-item:focus-visible { outline: none; box-shadow: var(--sh-focus); }
.topbar-usuario-sair { color: var(--danger); }
.topbar-usuario-sair:hover { color: var(--danger); }
/* Porta para o Suporte (includes/ajuda_topbar.html). */
.topbar-suporte {
  display: inline-flex; align-items: center; gap: 7px; height: 34px; padding: 0 12px;
  border: 1px solid var(--border); border-radius: var(--r-lg);
  color: var(--fg); font-size: var(--fs-sm); font-weight: 600; text-decoration: none; white-space: nowrap;
}
.topbar-suporte:hover { background: var(--surface-2); color: var(--fg); }
.topbar-suporte:focus-visible { outline: none; box-shadow: var(--sh-focus); }
@media (max-width: 991.98px) {
  .topbar-suporte { width: 38px; height: 38px; padding: 0; justify-content: center; border: 0; font-size: var(--fs-lg); }
  .topbar-suporte-texto { display: none; }
  .topbar-usuario-nome, .topbar-usuario-seta { display: none; }
  .topbar-usuario-btn { padding: 0 4px; margin-left: 0; }
}
