html, body { margin: 0; height: 100%; }

/* ------------------------------------------------------------------ *
 * Estilo "denso/compact" — versão conservadora. A primeira tentativa
 * sobrescrevia padding/min-height de .mud-nav-link e .mud-list-item com
 * seletores genéricos demais, e isso é o provável culpado de a árvore do
 * menu (MudNavGroup aninhado) ter parado de indentar corretamente — esses
 * componentes calculam o recuo de cada nível a partir do próprio padding.
 * Por isso aqui só tocamos componentes "seguros" (sem hierarquia/indentação
 * própria): botões, inputs e células de tabela. Para o menu, a densidade
 * correta é Dense="true" nos próprios componentes Mud (já usado no SideBar).
 * ------------------------------------------------------------------ */
.mud-button-root { padding-top: 4px; padding-bottom: 4px; }
.mud-input-control .mud-input { min-height: 36px; }
.mud-table-cell { padding-top: 6px; padding-bottom: 6px; }
.mud-toolbar { min-height: 48px; }

/* Altura da topbar / largura da sidebar colapsada — um valor só controlando os
   dois (sempre foram "pareados" de propósito, ver .app-sidebar--collapsed
   abaixo). CRÍTICO: ao mudar esse valor, é preciso redefinir a MESMA CSS var
   (--mud-appbar-height) que o MudDrawer usa para se posicionar com
   ClipMode="Always" (ele fica em top: var(--mud-appbar-height)). Sem isso, a
   appbar muda de tamanho mas o drawer continua começando na altura antiga —
   exatamente o gap visto nas screenshots antes desta correção. Mesmo padrão
   de bug das correções de largura: toda vez que sobrescrevemos uma dimensão
   do Mud via CSS puro, a CSS var correspondente também precisa ser
   redefinida, porque outros componentes (aqui o drawer, antes o
   main-content) leem a var, não o CSS computado. Por isso esse valor tem UMA
   fonte só (--app-chrome-size) em vez do literal repetido em 5 lugares
   diferentes — 44px (denso demais, causa do "embolado" relatado) virou 56px. */
:root {
  --app-chrome-size: 56px;          /* altura da topbar */
  --app-sidebar-collapsed: 64px;    /* largura da sidebar no modo mini (cabe a caixinha do ícone) */
  --mud-appbar-height: var(--app-chrome-size) !important;
}
.app-topbar.mud-appbar,
.app-topbar .mud-toolbar {
  min-height: var(--app-chrome-size) !important;
  height: var(--app-chrome-size) !important;
}

/* ------------------------------------------------------------------ *
 * Topbar: BRANCA com texto escuro e uma borda inferior sutil (mockup).
 * A cor vem da paleta (AppbarBackground/AppbarText no MainLayout); aqui
 * só reforçamos a borda, o espaçamento dos ícones e o campo de busca.
 * ------------------------------------------------------------------ */
.app-topbar.mud-appbar {
  background-color: var(--mud-palette-appbar-background) !important;
  color: var(--mud-palette-appbar-text) !important;
  border-bottom: 1px solid var(--mud-palette-lines-default, #E6E9EF);
  margin: 0;
}
.app-topbar.mud-appbar > * { color: inherit; }
.app-topbar.mud-appbar .mud-icon-root,
.app-topbar.mud-appbar .mud-typography { color: inherit; }
/* Margem horizontal entre os ícones de ação à direita. */
.app-topbar .mud-icon-button-root { margin-left: 8px; }
.app-topbar .mud-icon-button-root:first-of-type { margin-left: 0; }
.app-topbar-empresa { font-weight: 600; margin-left: 4px; }

/* Campo de busca (topbar, à direita antes do tema). "Pílula" cinza-clara +
   painel de pré-resultados ancorado abaixo. Ver TopbarSearch.razor. */
.app-topbar-search {
  position: relative;
  display: flex; align-items: center; gap: 8px;
  width: 320px;
  margin-right: 8px;
  padding: 7px 12px;
  border-radius: 10px;
  background: #F1F3F7;
  border: 1px solid transparent;
  transition: border-color .15s ease, background .15s ease;
}
.app-topbar-search:focus-within { background: #FFFFFF; border-color: color-mix(in srgb, var(--mud-palette-primary) 45%, transparent); }
.app-topbar-search__icon { color: var(--mud-palette-text-secondary); }
.app-topbar-search__clear { color: var(--mud-palette-text-secondary); cursor: pointer; }
.app-topbar-search__input {
  border: 0; outline: 0; background: transparent; width: 100%;
  font-size: 14px; color: var(--mud-palette-text-primary);
  font-family: inherit;
}
.app-topbar-search__input::placeholder { color: var(--mud-palette-text-secondary); }

/* Painel de pré-resultados ancorado abaixo do campo. */
.app-topbar-search__panel {
  position: absolute; top: calc(100% + 8px); left: 0; right: 0;
  z-index: 1401; /* acima do AppBar (1200) e do conteúdo */
  background: var(--mud-palette-surface);
  border: 1px solid var(--mud-palette-lines-default, #E6E9EF);
  border-radius: 12px;
  box-shadow: 0 12px 32px rgba(20,30,60,.14);
  padding: 8px;
  max-height: 60vh; overflow-y: auto;
  animation: topbar-search-in .14s ease;
}
@keyframes topbar-search-in { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: translateY(0); } }
.app-topbar-search__hint { font-size: 12px; color: var(--mud-palette-text-secondary); padding: 4px 8px 8px; }
.app-topbar-search__group { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .4px; color: var(--mud-palette-text-secondary); padding: 8px 8px 2px; }
.app-topbar-search__result { display: flex; align-items: center; gap: 8px; padding: 8px; border-radius: 8px; cursor: pointer; font-size: 14px; color: var(--mud-palette-text-primary); }
.app-topbar-search__result:hover { background: color-mix(in srgb, var(--mud-palette-primary) 8%, transparent); }
.app-topbar-search__footer { font-size: 12px; color: var(--mud-palette-text-secondary); text-align: center; padding: 8px 0 4px; border-top: 1px solid var(--mud-palette-lines-default, #EEF1F5); margin-top: 6px; }

/* Painel de notificações (MudMenu do sino na topbar). */
.topbar-notif { width: 320px; max-width: 88vw; padding: 4px; }
.topbar-notif__head { font-weight: 700; font-size: 14px; padding: 8px 10px; }
.topbar-notif__item { display: flex; gap: 10px; padding: 10px; border-top: 1px solid var(--mud-palette-lines-default, #EEF1F5); }
.topbar-notif__icon { margin-top: 2px; }
.topbar-notif__text { font-size: 13px; line-height: 1.35; color: var(--mud-palette-text-primary); }
.topbar-notif__time { font-size: 12px; color: var(--mud-palette-text-secondary); margin-top: 2px; }
.topbar-notif__foot { text-align: center; font-size: 12px; font-weight: 600; color: var(--mud-palette-primary); padding: 10px; cursor: pointer; border-top: 1px solid var(--mud-palette-lines-default, #EEF1F5); }

/* ------------------------------------------------------------------ *
 * Sidebar: azul-MARINHO (DrawerBackground na paleta), texto/ícone claros.
 * ------------------------------------------------------------------ */
.app-sidebar.mud-drawer {
  background-color: var(--mud-palette-drawer-background) !important;
  color: var(--mud-palette-drawer-text) !important;
  border-right: none;
  transition: width .15s ease;
  margin: 0;
  display: flex;
  flex-direction: column;
  /* Fallback direto: força o drawer a começar exatamente onde a topbar termina. */
  top: var(--app-chrome-size) !important;
  height: calc(100% - var(--app-chrome-size)) !important;
}
.app-sidebar.mud-drawer .mud-icon-root,
.app-sidebar.mud-drawer .mud-typography,
.app-sidebar.mud-drawer .mud-nav-link,
.app-sidebar.mud-drawer .mud-nav-group-title { color: inherit; }

/* Header (brand) da sidebar. */
.app-sidebar-brand {
  display: flex; align-items: center; gap: 10px;
  height: var(--app-chrome-size); flex-shrink: 0;
  padding: 0 14px;
  border-bottom: 1px solid rgba(255,255,255,.08);
}
.app-sidebar--collapsed .app-sidebar-brand { justify-content: center; padding: 0; }
.app-sidebar-brand__logo { border-radius: 6px; }
.app-sidebar-brand__title { font-weight: 700; letter-spacing: .2px; white-space: nowrap; }
.app-sidebar-brand__collapse { color: rgba(255,255,255,.7) !important; }
.app-sidebar-brand__collapse:hover { color: #FFFFFF !important; }

/* Corpo (árvore) cresce, footer (Ajuda) fica fixo no fim. */
.app-sidebar-body { flex: 1 1 auto; overflow-y: auto; overflow-x: hidden; min-height: 0; padding: 6px; }

/* ---- Itens de navegação: "caixinha" com hover/ativo ---- */
.app-sidebar .mud-nav-link {
  border-radius: 8px;
  margin: 2px 0;
}
.app-sidebar .mud-nav-link:hover { background: rgba(255,255,255,.06); }
.app-sidebar .mud-nav-group > .mud-nav-link:hover { background: rgba(255,255,255,.06); }
/* Item "Início" ativo (sem módulo aberto) OU item do módulo central aberto —
   mesmo destaque: fundo azul do acento, texto/ícone brancos. */
.app-sidebar-inicio--active .mud-nav-link,
.sidebar-item--active > .mud-nav-link {
  background: var(--mud-palette-primary) !important;
  color: #FFFFFF !important;
  font-weight: 600;
}
.app-sidebar-inicio--active .mud-nav-link .mud-icon-root,
.sidebar-item--active > .mud-nav-link .mud-icon-root { color: #FFFFFF !important; }

/* Modo mini (colapsado): ícones em coluna, cada um numa "caixinha" com borda. */
.app-sidebar-mini-body .mud-tooltip-root {
  display: flex !important;
  justify-content: center;
  width: 100% !important;
}
.mini-nav-icon {
  margin: 10px auto;
  border: 1px solid rgba(255,255,255,.10);
  border-radius: 10px;
  background: rgba(255,255,255,.04);
  color: rgba(255,255,255,.8) !important;
  transition: background .15s ease, border-color .15s ease;
}
.mini-nav-icon:hover { background: rgba(255,255,255,.12); border-color: rgba(255,255,255,.25); }
.mini-nav-icon--active {
  background: var(--mud-palette-primary) !important;
  border-color: var(--mud-palette-primary) !important;
  color: #FFFFFF !important;
}
.app-sidebar-mini-body { cursor: pointer; }

/* Footer fixo (Ajuda e Suporte). */
.app-sidebar-footer {
  flex-shrink: 0;
  padding: 6px;
  border-top: 1px solid rgba(255,255,255,.08);
}
.app-sidebar--collapsed .app-sidebar-footer { display: flex; justify-content: center; }

/* CRÍTICO: ícones de navegação no modo mini (colapsado) precisam ficar em
   coluna, um abaixo do outro — igual a qualquer sidebar.
   A causa raiz do bug era o wrapper do MudTooltip (.mud-tooltip-root), que o
   MudBlazor renderiza como display:inline-block/width:fit-content por
   padrão — então os ícones (cada um envolto por um MudTooltip) flutuavam
   lado a lado na coluna estreita da sidebar em vez de empilhar. A correção
   principal é Inline="false" no MudTooltip (ver SideBarItem.razor); o
   seletor abaixo é só um fallback de segurança, redundante quando o
   parâmetro está setado, mas inofensivo. */
.app-sidebar-mini-body .mud-tooltip-root {
  display: flex !important;
  justify-content: center;
  width: 100% !important;
}
.mini-nav-icon {
  margin: 8px 0;
}
.app-sidebar-mini-body { cursor: pointer; }

/* Largura: o parâmetro Width do MudDrawer é IGNORADO pelo próprio componente
   quando Variant=Persistent e IsFixed=true (padrão) — limitação documentada
   do MudBlazor (a CSS var --mud-drawer-width só é escrita quando
   "!IsFixed || Variant == Temporary"). Por isso definimos a largura real E a
   própria CSS var aqui: a largura real para o elemento do drawer em si, e a
   var porque é ela que o MudMainContent lê internamente para calcular sua
   margin-left — sem redefini-la, o conteúdo central nunca acompanharia. */
.app-sidebar.app-sidebar--expanded {
  width: 280px !important;
  --mud-drawer-width: 280px;
}
/* Colapsada: mesma medida (--app-chrome-size) da altura da topbar — pedido
   explícito, para os dois "eixos" do shell combinarem. A topbar centraliza
   seus ícones verticalmente dentro dessa altura; aqui centralizamos
   horizontalmente dentro da mesma largura. */
.app-sidebar.app-sidebar--collapsed {
  width: var(--app-sidebar-collapsed) !important;
  --mud-drawer-width: var(--app-sidebar-collapsed);
}

/* Nota: a regra que existia aqui forçava o wrapper do MudMenu a ocupar a
   linha inteira, porque antes ele envolvia o MudNavLink (ActivatorContent).
   Isso mudou — o context-menu do item de menu agora é um MudMenu SEM
   ActivatorContent, controlado via @ref (ver SideBarItem.razor), então o
   MudNavLink é irmão do MudMenu, não filho, e já é block-level por natureza
   própria. Não sobrou nenhum CSS pra "desinlinar" aqui. */

/* Tela de escolha de empresa (EscolherEmpresa.razor) */
.empresa-picker { max-width: 960px; margin: 0 auto; padding: 40px 20px; }
.empresa-picker-header { text-align: center; margin-bottom: 24px; }
.empresa-picker-toolbar { display: flex; gap: 16px; align-items: center; flex-wrap: wrap; }
.empresa-picker-search { flex: 1 1 260px; }
.empresa-card { cursor: pointer; transition: all .2s; padding: 8px; }
.empresa-card:hover { transform: translateY(-3px); box-shadow: 0 8px 20px rgba(0,0,0,.1); }
.empresa-card--inativa { opacity: .65; }
.empresa-icon {
  width: 48px; height: 48px; border-radius: 8px; flex-shrink: 0; overflow: hidden;
  display: flex; align-items: center; justify-content: center;
  background: var(--mud-palette-primary-hover, rgba(47,95,224,.08));
}
.empresa-icon img { width: 100%; height: 100%; object-fit: cover; }
.empresa-icon__fallback { color: var(--mud-palette-primary, #2F5FE0); font-size: 20px; }

/* Modal quase full-screen (ModuleWidget.razor) — Chat/MagIA. A máscara cobre
   a tela INTEIRA (top: 0), inclusive a topbar — assim clicar em qualquer lugar
   fora do painel (topbar incluída) fecha o modal (pedido do usuário). Clicar
   na máscara só esconde (Fechar()) — o iframe por trás nunca é desmontado, é
   por isso que abrir de novo não recarrega nada. O painel (.module-modal) tem
   @onclick:stopPropagation, então clicar nele não fecha. */
.module-modal-backdrop {
  position: fixed;
  top: 0; left: 0; right: 0; bottom: 0;
  /* Entre Dialog (1300) e Popover (1400) do tema (ver MudTheme.ZIndex em
     MainLayout.razor) — assim o menu de conta (Favoritos/Perfil/Trocar
     Empresa/Sair), que é um Popover, sempre aparece por cima da máscara,
     mesmo com o modal do Chat/MagIA aberto. */
  z-index: 1350;
  display: flex; align-items: center; justify-content: center;
  background: rgba(15, 17, 26, .55);
  backdrop-filter: blur(1px);
  opacity: 0;
  pointer-events: none;
  transition: opacity .18s ease;
}
.module-modal-backdrop--visible { opacity: 1; pointer-events: auto; }
.module-modal {
  width: 94%;
  height: 92%;
  max-width: 1600px;
  background: var(--mud-palette-surface, #fff);
  border-radius: 14px;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  box-shadow: 0 30px 70px rgba(0,0,0,.4);
  transform: scale(.96) translateY(10px);
  transition: transform .18s ease;
}
.module-modal-backdrop--visible .module-modal { transform: scale(1) translateY(0); }
.module-modal__body { flex: 1 1 auto; position: relative; overflow: hidden; }
.module-widget-frame { width: 100%; height: 100%; border: 0; display: block; }

/* Tela de carregamento animada (BootScreen.razor) — aparece antes de
   qualquer coisa (login/redirect), então é CSS puro, sem MudBlazor. */
.app-boot-screen {
  position: fixed; inset: 0; z-index: 1000000;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 24px;
  background: var(--mud-palette-background, #0f172a);
  font-family: 'DM Sans', sans-serif;
}
.app-boot-screen__logo-wrap {
  position: relative;
  width: 96px; height: 96px;
  display: flex; align-items: center; justify-content: center;
}
.app-boot-screen__logo {
  width: 48px; height: 48px; object-fit: contain;
  animation: app-boot-pulse 1.8s ease-in-out infinite;
  position: relative; z-index: 1;
}
.app-boot-screen__ring {
  position: absolute; inset: 0;
  border-radius: 50%;
  border: 2px solid transparent;
  border-top-color: var(--mud-palette-primary, #2F5FE0);
  border-right-color: var(--mud-palette-primary, #2F5FE0);
  animation: app-boot-spin 1.4s linear infinite;
}
.app-boot-screen__ring--delay {
  inset: 14px;
  opacity: .5;
  animation-duration: 2s;
  animation-direction: reverse;
}
.app-boot-screen__text {
  color: var(--mud-palette-text-primary, #cbd5e1);
  font-size: 14px; font-weight: 500; letter-spacing: .3px;
}
.app-boot-screen__dots span {
  display: inline-block;
  animation: app-boot-dots 1.4s infinite;
  animation-fill-mode: both;
}
.app-boot-screen__dots span:nth-child(2) { animation-delay: .2s; }
.app-boot-screen__dots span:nth-child(3) { animation-delay: .4s; }

@keyframes app-boot-pulse {
  0%, 100% { transform: scale(1); opacity: 1; }
  50% { transform: scale(1.12); opacity: .8; }
}
@keyframes app-boot-spin { to { transform: rotate(360deg); } }
@keyframes app-boot-dots {
  0%, 80%, 100% { opacity: 0; }
  40% { opacity: 1; }
}

/* Overlay de carregamento global (ver App.razor + Protec.SistemaV2-bridge.js) —
   HTML/CSS puro, fora do controle do Blazor de propósito: precisa continuar
   funcionando não importa se o circuito está no meio de um render, uma
   navegação de página real, ou o que for. */
.global-loading-overlay {
  display: none;
  position: fixed; inset: 0; z-index: 999999;
  background: rgba(15, 17, 26, 0.55);
  backdrop-filter: blur(2px);
  align-items: center; justify-content: center;
  flex-direction: column; gap: 16px;
  font-family: 'DM Sans', sans-serif;
}
.global-loading-overlay.is-visible { display: flex; }
.global-loading-overlay__spinner {
  width: 40px; height: 40px; border-radius: 50%;
  border: 3px solid rgba(255,255,255,.25); border-top-color: #fff;
  animation: empresa-loading-spin .7s linear infinite;
}
.global-loading-overlay__text { color: #fff; font-size: 14px; font-weight: 500; }
@keyframes empresa-loading-spin { to { transform: rotate(360deg); } }
#module-host {
  position: absolute;
  inset: 0;
  /* `isolation: isolate` cria um contexto de empilhamento próprio e isolado
     para o iframe. Iframes cross-origin às vezes são compostos pelo
     navegador de um jeito que não respeita 100% a ordem normal de z-index
     da página — isolar o container evita que ele "vaze" para cima de
     elementos do shell (topbar, sidebar, menus, diálogos) mesmo que algum
     z-index seja recalculado dinamicamente. */
  isolation: isolate;
  z-index: 0;
}
.module-frame {
  width: 100%;
  height: 100%;
  border: 0;
  display: block;
  background: transparent;
}

/* Topbar/sidebar/popovers: a ordem de camadas agora é definida no tema
   (MainLayout.razor, MudTheme.ZIndex) — é lá que o MudBlazor realmente lê
   os valores (CSS var + cálculo em JS), então não duplicamos/competimos com
   z-index fixo aqui. Ver o comentário em MainLayout.razor para o porquê. */

/* CORREÇÃO: o container central não estava preenchendo a página (nem
   largura nem altura) porque dependia do modelo de caixa "normal" do
   MudMainContent (margin-left + width:auto) — que, nesta combinação de
   AppBar fixa + Drawer com largura customizada (44/280px, fora do
   --mud-drawer-width padrão do Mud), não estica sozinho até as bordas.
   Troca pra position:fixed com os 4 lados explícitos: cobre exatamente o
   espaço entre a topbar (top) e as bordas da tela (right/bottom), com
   `left` controlado pelo estado do sidebar — determinístico, não depende
   de nenhum cálculo de largura/altura implícito do Mud. */
.app-main-content {
  position: fixed;
  top: var(--app-chrome-size);    /* logo abaixo da topbar (mesma altura fixada acima) */
  right: 0;
  bottom: 0;
  overflow: auto;
  box-sizing: border-box;
  transition: left .15s ease;
}
.app-main-content.app-main-content--sidebar-expanded  { left: 280px; }
.app-main-content.app-main-content--sidebar-collapsed { left: var(--app-sidebar-collapsed); }

/* O MudBlazor tem uma regra própria —
   `.mud-drawer-open-persistent-left:not(.mud-drawer-open-persistent-right)
   .mud-main-content { margin-left: var(--mud-drawer-width-left); }` — que
   dispara sempre que o MudDrawer é Variant="Persistent" com Open=true (é o
   nosso caso: o sidebar "abre/fecha" mudando a LARGURA via CSS, não o
   Open, então pro Mud ele está sempre aberto). Isso SOMA com o `left` que
   já definimos acima, empurrando o container ainda mais mesmo com o
   sidebar colapsado (240px de --mud-drawer-width-left por cima do left:44px).
   Como controlamos todo o posicionamento horizontal via `left`, zeramos
   esse margin-left nativo aqui — não mexemos na variável global porque
   outra coisa pode depender dela. */
.mud-main-content.app-main-content { margin-left: 0 !important; }

/* ------------------------------------------------------------------ *
 * Empty state da área central (signature do shell).
 * Restrição deliberada: nada de hero chamativo — é um plano de fundo
 * "respirável" que some assim que um módulo carrega. Um grid sutil de
 * pontos + um halo radial suave que herda a cor primária do tema.
 * ------------------------------------------------------------------ */
.module-empty {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  text-align: center;
  overflow: hidden;
  background:
    radial-gradient(120% 120% at 50% 0%,
      color-mix(in srgb, var(--mud-palette-primary) 8%, transparent) 0%,
      transparent 60%),
    var(--mud-palette-background);
}
.module-empty::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image: radial-gradient(
    color-mix(in srgb, var(--mud-palette-text-primary) 12%, transparent) 1px,
    transparent 1px);
  background-size: 22px 22px;
  -webkit-mask-image: radial-gradient(80% 60% at 50% 45%, #000 0%, transparent 75%);
          mask-image: radial-gradient(80% 60% at 50% 45%, #000 0%, transparent 75%);
  opacity: .5;
}
.module-empty__inner { position: relative; max-width: 28rem; padding: 1.5rem; }
.module-empty__title { font-weight: 500; letter-spacing: .2px; }
.module-empty__hint  { opacity: .6; margin-top: .35rem; }

/* ================================================================== *
 * Home dashboard (HomeDashboard.razor) — tela central logo após login/
 * escolha de empresa. Reproduz o mockup: saudação + data, 4 cards de
 * estatística, "Acesso rápido" (favoritos) + coluna de alertas/aniver-
 * sariantes, e footer. Tudo com dados placeholder por enquanto.
 * ================================================================== */
.home-dashboard {
  position: absolute; inset: 0; overflow-y: auto;
  /* Acima do #module-host (z-index:0), que é irmão e vem depois no DOM — sem
     isso, o container vazio do iframe ficaria por cima e bloquearia os cliques
     dos cards de favorito. Só é renderizado quando NÃO há módulo aberto. */
  z-index: 1;
  padding: 28px 32px;
  background: var(--mud-palette-background);
}
.home-dashboard, .home-dashboard * { box-sizing: border-box; }

.home-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 22px; }
.home-greeting { margin: 0; font-size: 26px; font-weight: 700; color: var(--mud-palette-text-primary); }
.home-subtitle { margin: 4px 0 0; color: var(--mud-palette-text-secondary); font-size: 14px; }
.home-topright { display: flex; align-items: center; gap: 14px; flex-shrink: 0; }
.home-date { display: flex; align-items: center; gap: 8px; color: var(--mud-palette-text-secondary); font-size: 13px; white-space: nowrap; }
.home-date__day { font-weight: 600; color: var(--mud-palette-text-primary); }
.home-date__time { text-align: right; font-variant-numeric: tabular-nums; }

/* Widget de clima (ao lado da data). */
.home-clima {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 12px; border-radius: 12px;
  background: var(--mud-palette-surface);
  border: 1px solid var(--mud-palette-lines-default, #E6E9EF);
  white-space: nowrap;
}
.home-clima__icon { color: var(--mud-palette-primary); }
.home-clima__temp { font-weight: 700; font-size: 15px; color: var(--mud-palette-text-primary); }
.home-clima__local { font-size: 13px; color: var(--mud-palette-text-secondary); }

/* Contagem no cabeçalho dos painéis + link "Ver todos/todas" clicável. */
.home-panel__count {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 20px; height: 20px; padding: 0 6px; margin-left: 4px;
  border-radius: 10px; font-size: 12px; font-weight: 700;
  background: color-mix(in srgb, var(--mud-palette-primary) 12%, transparent);
  color: var(--mud-palette-primary);
}
.home-panel__link { cursor: pointer; }
.home-panel__link:hover { text-decoration: underline; }

/* Cards de estatística */
.home-stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 24px; }
.home-stat {
  display: flex; align-items: center; gap: 14px;
  padding: 16px 18px; border-radius: 14px;
  background: var(--mud-palette-surface);
  border: 1px solid var(--mud-palette-lines-default, #E6E9EF);
}
.home-stat__icon { width: 44px; height: 44px; border-radius: 12px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.home-stat__label { font-size: 13px; color: var(--mud-palette-text-secondary); }
.home-stat__value { font-size: 26px; font-weight: 700; line-height: 1.1; color: var(--mud-palette-text-primary); }
.home-stat__hint { font-size: 12px; color: var(--mud-palette-text-secondary); }

/* Colunas: acesso rápido (principal) + alertas/aniversariantes (lateral) */
.home-columns { display: grid; grid-template-columns: minmax(0, 1fr) 340px; gap: 22px; align-items: start; }
.home-section-head { margin-bottom: 12px; }
.home-section-title { margin: 0; font-size: 18px; font-weight: 700; color: var(--mud-palette-text-primary); }
.home-section-sub { margin: 2px 0 0; font-size: 13px; color: var(--mud-palette-text-secondary); }

/* Acesso rápido (favoritos) */
.home-fav-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 14px; }
.home-fav-card {
  position: relative; cursor: pointer;
  padding: 16px; border-radius: 14px;
  background: var(--mud-palette-surface);
  border: 1px solid var(--mud-palette-lines-default, #E6E9EF);
  transition: transform .12s ease, box-shadow .12s ease, border-color .12s ease;
}
.home-fav-card:hover { transform: translateY(-2px); box-shadow: 0 8px 22px rgba(20,30,60,.08); border-color: color-mix(in srgb, var(--mud-palette-primary) 40%, transparent); }
.home-fav-card__icon {
  width: 40px; height: 40px; border-radius: 10px; margin-bottom: 12px;
  display: flex; align-items: center; justify-content: center;
  background: color-mix(in srgb, var(--mud-palette-primary) 10%, transparent);
  color: var(--mud-palette-primary);
}
.home-fav-card__chevron { position: absolute; top: 14px; right: 12px; color: var(--mud-palette-text-secondary); }
.home-fav-card__title { font-weight: 600; font-size: 14px; color: var(--mud-palette-text-primary); }

/* Empty state do acesso rápido */
.home-empty {
  display: flex; flex-direction: column; align-items: center; text-align: center;
  gap: 8px; padding: 40px 24px; border-radius: 14px;
  background: var(--mud-palette-surface);
  border: 1px dashed var(--mud-palette-lines-default, #D8DEE9);
}
.home-empty__title { font-weight: 600; color: var(--mud-palette-text-primary); }
.home-empty__hint { font-size: 13px; color: var(--mud-palette-text-secondary); max-width: 30rem; }

/* Painéis da coluna lateral */
.home-panel {
  padding: 16px 18px; border-radius: 14px; margin-bottom: 18px;
  background: var(--mud-palette-surface);
  border: 1px solid var(--mud-palette-lines-default, #E6E9EF);
}
.home-panel__head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; }
.home-panel__title { font-weight: 700; font-size: 15px; color: var(--mud-palette-text-primary); }
.home-panel__link { font-size: 12px; font-weight: 600; color: var(--mud-palette-primary); cursor: pointer; }

.home-alert { display: flex; gap: 10px; padding: 10px 0; border-top: 1px solid var(--mud-palette-lines-default, #EEF1F5); }
.home-alert:first-of-type { border-top: none; }
.home-alert__icon { margin-top: 2px; }
.home-alert__text { font-size: 13px; color: var(--mud-palette-text-primary); line-height: 1.35; }
.home-alert__time { font-size: 12px; color: var(--mud-palette-text-secondary); margin-top: 2px; }

.home-birthday { display: flex; align-items: center; gap: 12px; padding: 10px 0; border-top: 1px solid var(--mud-palette-lines-default, #EEF1F5); }
.home-birthday:first-of-type { border-top: none; }
.home-birthday__body { flex: 1 1 auto; min-width: 0; }
.home-birthday__name { font-size: 14px; font-weight: 600; color: var(--mud-palette-text-primary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.home-birthday__meta { font-size: 12px; color: var(--mud-palette-text-secondary); }
.home-birthday__cake { color: var(--mud-palette-primary); }

.home-footer {
  display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap;
  margin-top: 28px; padding-top: 16px;
  border-top: 1px solid var(--mud-palette-lines-default, #E6E9EF);
  font-size: 12px; color: var(--mud-palette-text-secondary);
}

/* Responsivo: colunas empilham em telas estreitas. */
@media (max-width: 1100px) {
  .home-columns { grid-template-columns: 1fr; }
  .home-stats { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 640px) {
  .home-stats { grid-template-columns: 1fr; }
  .home-dashboard { padding: 20px 16px; }
}

/* Densidade de tabela (componente sem indentação hierárquica, seguro) */
.mud-table-dense .mud-table-cell { padding-top: 4px; padding-bottom: 4px; }
