/* ============================================================
   SistemaRH - Brand: Dark Navy + Turquoise + Silver Metallic
   ============================================================ */
/* FONTES - rede de seguranca para as paginas que NAO estendem
   `base.html` (login, cadastro, landing, termos, privacidade,
   contacto, redefinir/esqueci senha, MFA): essas nao tem o `<link>`
   do Google Fonts e so' recebem esta folha.

   O `base.html` pede as duas fontes num unico `<link>`, mais rapido
   (o `@import` bloqueia a descoberta da folha ate Google responder) -
   aqui ficam para que nenhuma pagina fique sem a fonte. */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=Plus+Jakarta+Sans:wght@500;600;700;800&display=swap');
:root {
    --navy: #0A1F3F; --navy-light: #132E5B; --navy-dark: #06122B;
    --turquoise: #00B4D8; --turquoise-light: #48CAE4; --turquoise-dark: #0096B0;
    --silver: #C0C8D0; --silver-light: #E0E4E8; --silver-dark: #8A94A0; --white: #FFFFFF;
    --bg-body: #F8FAFC; --bg-sidebar: linear-gradient(180deg, #0A1F3F 0%, #06122B 100%);
    --bg-topbar: #FFFFFF; --bg-card: #FFFFFF; --bg-hover: #F0F4FF; --bg-active: #00B4D8;
    --text-primary: #1A2332; --text-secondary: #5A6878; --text-muted: #64707D; --text-light: #FFFFFF;
    /* Escala Slate: a superficie neutra da aplicacao e os tres tons de
       tinta que as tabelas usam - cabecalho (500), celula (700) e
       fundo (50). Sao as tres cores que fazem o visual premium. */
    --slate-50: #F8FAFC; --slate-100: #F1F5F9; --slate-200: #E2E8F0;
    --text-thead: #475569; --text-cell: #334155; --text-muted-slate: #64748B;
    --border-color: #E2E8F0; --border-radius: 12px; --sidebar-width: 260px; --topbar-height: 64px;
    --accent-blue: #00B4D8; --accent-blue-hover: #0096B0;
    --accent-success: #10B981; --accent-warning: #F59E0B; --accent-danger: #EF4444; --accent-info: #00B4D8;
    --shadow-sm: 0 1px 3px rgba(10,31,63,0.08);
    --shadow-md: 0 4px 16px rgba(10,31,63,0.12);
    --shadow-lg: 0 8px 32px rgba(10,31,63,0.16);
    --transition-speed: 0.25s;
    --bs-table-hover-bg: #F8FAFC;
    --bs-table-hover-color: #334155;
}
*{margin:0;padding:0;box-sizing:border-box}
html,body{margin:0;padding:0;min-height:100vh;font-family:'Inter','Segoe UI',system-ui,-apple-system,sans-serif;background-color:var(--bg-body);color:var(--text-primary);overflow-x:hidden;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
/* TITULOS: Plus Jakarta Sans.
   A interface fica em Inter (numeros alinhados em tabelas e KPI) e
   so' a hierarquia - titulos de pagina, de cartao e de bloco - passa
   para a Plus Jakarta Sans. A forma mais aberta dela da a sensacao de
   produto SaaS sem trocar a fonte de todo o texto corrido. */
h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6,.card-title,.modal-title,.topbar-title,.page-title,.lp-hero h1,.rh-auth__headline{font-family:'Plus Jakarta Sans','Inter',-apple-system,'Segoe UI',system-ui,sans-serif;letter-spacing:-0.015em}
.app-wrapper{display:flex;min-height:100vh}
.sidebar{position:fixed;top:0;left:0;bottom:0;width:var(--sidebar-width);background:var(--bg-sidebar);display:flex;flex-direction:column;z-index:1040;transition:transform var(--transition-speed) ease;overflow-y:auto;overflow-x:hidden;border-right:none;box-shadow:4px 0 24px rgba(10,31,63,0.15)}
.sidebar::-webkit-scrollbar{width:3px}
.sidebar::-webkit-scrollbar-track{background:transparent}
.sidebar::-webkit-scrollbar-thumb{background:rgba(255,255,255,0.15);border-radius:2px}
.sidebar-logo{display:flex;align-items:center;gap:12px;padding:24px 20px 16px;font-size:1.2rem;font-weight:800;color:var(--white)}
.sidebar-logo .logo-icon{width:36px;height:36px;background:linear-gradient(135deg,var(--turquoise)0%,var(--navy-light)100%);border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:1.2rem;color:var(--white);flex-shrink:0;box-shadow:0 2px 8px rgba(0,180,216,0.3)}
.sidebar-brand{background:linear-gradient(135deg,var(--white)0%,var(--turquoise-light)100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;letter-spacing:-0.5px}
.sidebar-brand-sub{font-size:0.65rem;font-weight:400;color:rgba(255,255,255,0.5);display:block;-webkit-text-fill-color:rgba(255,255,255,0.5)}
.sidebar-divider{margin:4px 16px;border-color:rgba(255,255,255,0.08);opacity:1}
.sidebar-nav{flex:1;padding:8px 12px}
.sidebar-nav .nav{gap:2px}
.sidebar-link{display:flex!important;align-items:center;gap:12px;padding:9px 14px!important;border-radius:8px;color:rgba(255,255,255,0.7)!important;font-size:13px;font-weight:500;transition:background-color var(--transition-speed) ease,color var(--transition-speed) ease;text-decoration:none;outline:none}
.sidebar-link:focus-visible{box-shadow:inset 0 0 0 2px var(--turquoise-light)}
.sidebar-link i{width:20px;text-align:center;font-size:1rem;flex-shrink:0;color:rgba(255,255,255,0.55)}
.sidebar-link:hover{background:rgba(255,255,255,0.12);color:#FFFFFF!important}
.sidebar-link:hover i{color:var(--turquoise-light)}
/* ACTIVE: fundo quase transparente, texto branco e filete de 3px. A pilula
   turquesa gritava por atencao numa lista de 29 itens; aqui o unico sinal
   de que estamos na pagina certa e' o filete a esquerda. */
.sidebar-link.active{background:rgba(255,255,255,.06)!important;color:#FFFFFF!important;box-shadow:none;font-weight:500;border-left:3px solid var(--turquoise);padding-left:11px!important}
.sidebar-link.active i{color:var(--turquoise-light)}
.sidebar-link.active span{font-weight:600}
.sidebar-footer{padding:16px 20px;text-align:center}
.main-area{margin-left:var(--sidebar-width);flex:1;display:flex;flex-direction:column;min-height:100vh;width:calc(100% - var(--sidebar-width))}
.topbar{position:sticky;top:0;z-index:1030;display:flex;align-items:center;justify-content:space-between;height:var(--topbar-height);padding:0 28px;background:var(--bg-topbar);border-bottom:1px solid var(--border-color);box-shadow:var(--shadow-sm)}
.topbar-left{display:flex;align-items:center;gap:12px}
.topbar-title{font-size:1.1rem;font-weight:600;color:var(--text-primary)}
.topbar-title i{color:var(--turquoise)}
.topbar-right{display:flex;align-items:center;gap:8px}
.connection-status{display:flex;align-items:center;gap:6px;cursor:default}
.status-dot{display:inline-block;width:9px;height:9px;border-radius:50%;transition:all 0.3s}
.status-online{background-color:var(--accent-success);box-shadow:0 0 8px rgba(16,185,129,0.5)}
.status-offline{background-color:var(--accent-danger);box-shadow:0 0 8px rgba(239,68,68,0.5)}
.flash-container{padding:16px 28px 0}
.flash-container .alert{margin-bottom:8px;border:none;border-radius:var(--border-radius);font-size:0.88rem;box-shadow:var(--shadow-sm)}
.content{flex:1;padding:28px;background:var(--slate-50)}
.card{border:1px solid var(--slate-200);border-radius:12px;box-shadow:0 1px 3px 0 rgba(0,0,0,0.05),0 1px 2px -1px rgba(0,0,0,0.05);background:var(--bg-card);transition:transform 0.2s ease,box-shadow 0.2s ease}
.card-header{background:transparent;border-bottom:1px solid var(--border-color);padding:16px 24px;font-weight:600}
.card-body{padding:24px}
/* Elevacao nos cartoes que SAO um alvo (KPI com link esticado, checklist,
   atalhos). O repouso e' plano; o hover levanta 2 px e abre a sombra.
   Quem nao e' clicavel nao ganha este efeito. */
.dashboard-card{overflow:hidden}
.card-kpi{cursor:pointer}
.card-kpi:hover,.dashboard-card:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,0,0,0.08)}
.card-value{font-size:2rem;font-weight:700}
.card-label{font-size:0.8rem;text-transform:uppercase;letter-spacing:0.5px}
/* O icone do KPI: um disco pastel quadrado, do mesmo tamanho em todos
   os cartoes para a linha de valores ficar alinhada. */
.card-icon{display:flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:12px;flex-shrink:0}
.text-accent-blue{color:#0284C7}

/* CABECALHO DE BOAS-VINDAS (dashboard) -----------------------------------
   A primeira coisa que o utilizador ve ao abrir a aplicacao. Sem ele,
   a pagina comeca logo numa lista de indicadores e nao ha nenhum
   ponto de partida nem saudacao.

   O titulo usa a Plus Jakarta Sans herdada dos titulos e o emoji e'
   isolado num `<span aria-hidden>`: o leitor de ecra' le "Ola, Ana" e
   nao "Ola, Ana, sinal de mao" - a imagem ja diz o resto.

   Em ecra estreito os dois blocos empilham: o nome da empresa passa
   para baixo da saudacao em vez de ser espremido ao lado dela. */
.dashboard-welcome{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:1rem;margin-bottom:1.5rem}
.dashboard-welcome__titulo{font-size:1.25rem;font-weight:700;color:#1E293B;line-height:1.3;margin:0}
.dashboard-welcome__subtitulo{font-size:0.875rem;color:#64748B;line-height:1.5;margin:0}
.dashboard-welcome__empresa{display:inline-flex;align-items:center;gap:.4rem;font-size:.82rem;color:#64748B;background:var(--slate-100);border:1px solid var(--slate-200);border-radius:9999px;padding:.35rem .85rem;white-space:nowrap}
.dashboard-welcome__empresa strong{color:#1E293B;font-weight:600}
.dashboard-welcome__empresa i{color:#0284C7}
@media(max-width:575.98px){.dashboard-welcome{align-items:flex-start}.dashboard-welcome__empresa{width:100%;justify-content:center;white-space:normal}}

/* BOTOES DA BARRA SUPERIOR ----------------------------------------------
   Os botoes da barra (Selecionar empresa, Ajuda, Pesquisa, sino) usavam
   as variantes do Bootstrap, cada uma com a sua cor: o de empresa era
   turquesa, o de ajuda tambem, os restantes cinzentos. Lados a lado,
   tres cores diferentes na mesma fila.

   Aqui passam todos ao mesmo tom Slate-100. Nao se mexe nas classes
   `btn-outline-*` do Bootstrap - sao partilhadas com os botoes de
   ACCAO dentro das paginas (Guardar, Exportar), onde o ciano e' a cor
   de marca e tem de continuar a ser forte. O alcance e' `.topbar`, e
   ainda assim so' o directo-filho, para nao apanhar os itens dos
   menus que caem para fora da barra. */
.topbar > .topbar-right > .dropdown > .btn,
.topbar .topbar-right > .btn,
.topbar .connection-status{
    border:1px solid var(--slate-200);
    border-radius:8px;
    background-color:var(--slate-100);
    color:#334155;
    box-shadow:none;
    transition:background-color 0.15s ease,border-color 0.15s ease,color 0.15s ease
}
/* O hover so' muda o tom: o ciano saturado num botao de 32 px de altura
   obrigava a apontar o rato com cuidado. */
.topbar > .topbar-right > .dropdown > .btn:hover,
.topbar .topbar-right > .btn:hover,
.topbar .connection-status:hover{
    background-color:var(--slate-200);
    border-color:#CBD5E1;
    color:#1E293B
}
.topbar > .topbar-right > .dropdown > .btn:active{background-color:#CBD5E1;color:#1E293B}
/* Foco visivel: e' o que permite navegar a barra toda pelo teclado. A
   regra global de foco mantem-se, esta e' so' uma correccao de cor. */
.topbar > .topbar-right > .dropdown > .btn:focus-visible,
.topbar .topbar-right > .btn:focus-visible{
    border-color:var(--turquoise);
    box-shadow:0 0 0 3px rgba(0,180,216,0.15)
}
/* O ponto de estado mantem a cor - e' a unica coisa que diz se o
   servidor esta vivo. */
.topbar .connection-status{background-color:transparent;border-color:transparent;padding-left:0;padding-right:0}
.topbar .connection-status:hover{background-color:transparent;border-color:transparent}

/* SCROLLBAR --------------------------------------------------------------
   Slate, fina e sem caixilho: a barra do sistema e' larga e cinzenta e
   destoa do resto numa aplicacao que passou a usar Slate.

   O `scrollbar-width`/`scrollbar-color` vem primeiro por ser a forma
   PADRAO (Firefox). O `::-webkit-scrollbar` (Chrome, Edge, Safari) e'
   so' o equivalente - e so' o que permite a barra ser tao fina.

   A barra da sidebar mantem a sua regra propria (L45): ali o fundo e'
   escuro e um tom Slate seria invisivel. */
*{scrollbar-width:thin;scrollbar-color:#CBD5E1 transparent}
::-webkit-scrollbar{width:6px;height:6px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:#CBD5E1;border-radius:9999px}
::-webkit-scrollbar-thumb:hover{background:#94A3B8}
/* A barra da sidebar e' sobre fundo escuro: precisa de contraste
   proprio, senao desaparece. Declara-se DEPOIS da global para ganhar. */
.sidebar::-webkit-scrollbar{width:3px}
.sidebar::-webkit-scrollbar-track{background:transparent}
.sidebar::-webkit-scrollbar-thumb{background:rgba(255,255,255,0.15);border-radius:2px}
.sidebar{scrollbar-color:rgba(255,255,255,0.15) transparent}

/* MODAIS -----------------------------------------------------------------
   Cantos de 16 px e uma sombra que se le como sombra projectada - e
   nao como um brilho - para levantar a janela do fundo.

   O `border` de 1 px e' quase invisivel a olho nu: existe para o
   contorno do modal CLARO sobre um fundo CLARO, onde a sombra sozinha
   nao desenha nenhuma separacao. */
.modal-content{
    border:1px solid var(--slate-200);
    border-radius:16px;
    box-shadow:0 20px 25px -5px rgba(0,0,0,0.1)
}
/* O fundo desfocado separa o modal do conteudo sem escurecer o ecra
   inteiro. O `opacity` do Bootstrap (0.5) e' substituido por 0.4: com
   o `blur` ja a separar, escurecer mais so' tornava o texto de baixo
   ilegivel. O `!important` e' necessario porque o Bootstrap escreve a
   opacidade em `.modal-backdrop.show`, que ja tem especificidade. */
.modal-backdrop{
    backdrop-filter:blur(4px);
    -webkit-backdrop-filter:blur(4px);
    opacity:0.4 !important
}
/* O Bootstrap da uma transicao de `opacity` a propria classe; a nossa
   aceita o mesmo tempo para que o desfoque acompanhe o aparecimento em
   vez de ficar repentinamente aplicado. */
.modal-backdrop{transition:opacity 0.2s ease}

@keyframes fadeIn{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}
/* A entrada do conteudo: 4 px de subida e um fade curto. Nao e' mais do
   que isso - a animacao serve para a pagina nao aparecer "a trancos",
   nao para chamar a atencao. 0.25 s e' o limite: acima disso a
   navegacao entre paginas comeca a parecer lenta. */
.content{animation:fadeIn 0.25s ease-out}
.content, .card{backface-visibility:hidden}
/* Quem pede menos movimento nao o recebe. A regra global de
   `prefers-reduced-motion` acima JA reduz as animacoes a ~0, mas
   declara-se aqui para ficar legivel ao lado do que anula. */
@media (prefers-reduced-motion:reduce){.content{animation:none}}

/* EMPTY STATE -------------------------------------------------------------
   Substitui o "aviso cru" (icone solto + texto cinzenta) que aparecia
   dentro dos cartoes quando nao havia nada a mostrar. Antes era um
   `<i>` grande e uma frase solta, sem hierarquia: o utilizador nao
   sabia se era um aviso ou um estado normal.

   A estrutura e' tres elementos nomeados - `.empty-state-card__icone`,
   `__titulo` e `__descricao` - para que o bloco seja reutilizavel em
   qualquer modulo sem repetir CSS. */
.empty-state-card{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:2.5rem 1.5rem;color:var(--text-muted-slate)}
.empty-state-card__icone{display:flex;align-items:center;justify-content:center;width:48px;height:48px;border-radius:50%;background:var(--slate-100);color:var(--text-muted-slate);font-size:1.25rem;margin-bottom:1rem}
.empty-state-card__titulo{color:#1E293B;font-weight:600;font-size:1rem;margin:0 0 .35rem}
.empty-state-card__descricao{color:#64748B;font-size:.875rem;max-width:46ch;margin:0}
/* Variante de tom: quando o vazio e' uma BOA noticia (nada a vencer),
   o disco e o titulo verdes em vez de neutros. */
.empty-state-card--sucesso .empty-state-card__icone{background:#DCFCE7;color:#15803D}
.empty-state-card--sucesso .empty-state-card__titulo{color:#14532D}
/* `.table-dark` nao e' "tabela escura" nesta aplicacao: e' o nome que
   ficou herdado de quando o tema era escuro. Mantem-se a regra para nao
   partir os 24 templates que a usam, mas passa a descrever uma tabela
   CLARA - por isso o fundo transparente e a tinta do tema, nao branco. */
.table-dark{--bs-table-bg:transparent;--bs-table-color:var(--text-primary);--bs-table-hover-bg:var(--slate-50);
    --bs-table-hover-color:var(--text-cell);color:var(--text-primary)}
/* TABELAS - o mesmo desenho em todas as paginas ----------------------
   O cabecalho deixou de ser uma faixa azul-marinho: passou a ser uma
   faixa Slate-100 com rotulos pequenos em Slate-500. Le-se como um
   cabecalho e nao como um bloco de cor que briga com as badges.

   A tinta do cabecalho e' `var(--text-thead)` (#475569) e NAO branco:
   sobre `#f2f2f2` (o `<thead class="table-light">` do Bootstrap) da
   6.8:1, muito acima dos 4.5:1 que o WCAG AA exige. O branco fixo
   dava 1.12:1 - praticamente invisivel. Tabelas sobre superficie
   realmente escura mantem o branco em `.superficie-escura` (abaixo). */
.table>thead th{color:var(--text-thead);background-color:var(--slate-100);font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:0.05em;padding:0.75rem 1rem;border-bottom:1px solid var(--slate-200);white-space:nowrap}
.table>tbody td{padding:0.875rem 1rem;border-color:var(--slate-100);color:var(--text-cell);vertical-align:middle}
.table>tbody>tr{transition:background-color 0.15s ease}
.table>tbody>tr:hover{background-color:var(--slate-50)}
.table-dark.table-hover>tbody>tr:hover{background-color:var(--slate-50)}
.btn-primary{background:linear-gradient(135deg,var(--turquoise)0%,var(--turquoise-dark)100%);border:none;box-shadow:0 2px 8px rgba(0,180,216,0.3);font-weight:600;padding:10px 20px;border-radius:8px;transition:all 0.2s}
.btn-primary:hover{background:linear-gradient(135deg,var(--turquoise-dark)0%,var(--navy-light)100%);box-shadow:0 4px 16px rgba(0,180,216,0.4);transform:translateY(-1px)}
.btn-outline-primary{color:var(--turquoise);border-color:var(--turquoise);font-weight:600;border-radius:8px}
.btn-outline-primary:hover{background:var(--turquoise);border-color:var(--turquoise);color:var(--white)}
.form-control,.form-select{border-radius:8px;border:1.5px solid var(--border-color);padding:10px 14px;font-size:0.9rem;transition:all 0.2s}
.form-control:focus,.form-select:focus{border-color:var(--turquoise);box-shadow:0 0 0 3px rgba(0,180,216,0.12)}
/* BADGES / PILLS DE ESTADO ----------------------------------------------
   Forma de pilula (9999px) e peso 600: o status tem de se ler de relance
   numa tabela, e um canto vivo rouba a atencao ao texto da linha.

   As cores sao PASTEL com tinta escura, nao cor saturada com branco.
   Branco sobre verde saturado e' 2.5:1 - reprova o WCAG AA. Pastel com
   tinta escura da 5:1 ou mais e le-se melhor numa linha de tabela.

   Os seletores sao `.badge.bg-*` e nao `bg-*` de proposito: o mesmo
   `bg-danger` desenha a barra de forca da senha em `cadastro.html` e
   ali a cor saturada e' a que comunica. */
.badge{border-radius:9999px;font-weight:600;font-size:12px;padding:0.35em 0.8em;line-height:1.4;letter-spacing:0.01em;display:inline-flex;align-items:center;gap:0.35em}
.badge.bg-success{background:#DCFCE7!important;color:#14532D!important}
.badge.bg-warning{background:#FEF3C7!important;color:#78350F!important}
.badge.bg-danger{background:#FEE2E2!important;color:#7F1D1D!important}
.badge.bg-info{background:#CFFAFE!important;color:#0E4A5E!important}
.badge.bg-primary{background:#DBEAFE!important;color:#1E3A8A!important}
.badge.bg-secondary{background:#F1F5F9!important;color:#475569!important}
.badge.bg-light{background:#F1F5F9!important;color:#475569!important}
.badge.bg-dark{background:#E2E8F0!important;color:#1E293B!important}
/* Variante `text-bg-*` (usada no suporte): mesmo tom pastel. */
.badge.text-bg-success{background:#DCFCE7!important;color:#14532D!important}
.badge.text-bg-warning{background:#FEF3C7!important;color:#78350F!important}
.badge.text-bg-danger{background:#FEE2E2!important;color:#7F1D1D!important}
.badge.text-bg-info{background:#CFFAFE!important;color:#0E4A5E!important}
.badge.text-bg-primary{background:#DBEAFE!important;color:#1E3A8A!important}
.badge.text-bg-secondary{background:#F1F5F9!important;color:#475569!important}
.badge.text-bg-light{background:#F1F5F9!important;color:#475569!important}
/* Os badges `-subtle` do Bootstrap ja vem em tom pastel com a tinta
   `*-emphasis` que os acompanha; so falta dar-lhes a forma de pilula,
   que o Bootstrap deixa a 0.25rem. */
.badge.bg-primary-subtle,.badge.bg-success-subtle,.badge.bg-danger-subtle,.badge.bg-warning-subtle,.badge.bg-info-subtle{border-radius:9999px;font-weight:600;font-size:12px;padding:0.35em 0.8em}
/* Badge que e' SO um icone (urgencia de uma tarefa): precisa de uma
   caixa quadrada para o glifo ficar centrado e de uma largura/altura
   iguais - o `padding:0.35em 0.8em` da pill daria uma elipse. */
.badge-icone{width:32px;height:32px;padding:0;justify-content:center;flex-shrink:0}
/* O `text-dark` dos badges (usado em varios templates) mantem-se: sobre
   pastel o texto escuro e' o que se quer. */
.badge.text-dark{color:#1E293B!important}
.bg-success{background-color:var(--accent-success)!important}
.bg-warning{background-color:var(--accent-warning)!important}
.bg-danger{background-color:var(--accent-danger)!important}
.modal-content{border:none;border-radius:var(--border-radius);box-shadow:var(--shadow-lg)}
.modal-header{border-bottom:1px solid var(--border-color);padding:20px 24px}
.modal-body{padding:24px}
.modal-footer{border-top:1px solid var(--border-color);padding:16px 24px}
.table-danger{background-color:rgba(239,68,68,0.06)!important}
.table-warning{background-color:rgba(245,158,11,0.06)!important}
@media(max-width:991.98px){.sidebar{transform:translateX(-100%)}.sidebar.sidebar-open{transform:translateX(0);box-shadow:var(--shadow-lg)}.main-area{margin-left:0;width:100%}}
@media(max-width:575.98px){.topbar{padding:0 16px}.topbar-title{font-size:0.95rem}.content{padding:16px}.flash-container{padding:12px 16px 0}}
@media print {
  /* Ocultar banners, avisos de trial, botoes e widgets na impressao */
  .banner-demo,
  .demo-banner,
  .trial-banner,
  div[class*="demo"],
  div[class*="trial"],
  .alert,
  #copilot-btn,
  #copilot-window,
  .topbar,
  .sidebar,
  .sidebar-overlay,
  .flash-container,
  .btn,
  button,
  header,
  nav,
  footer,
  .no-print {
    display: none !important;
    height: 0 !important;
    margin: 0 !important;
    padding: 0 !important;
  }

  body { background: #fff !important; color: #000 !important; visibility: visible !important; margin: 0 !important; padding: 0 !important; }
  body * { visibility: visible !important; -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; }
  a[href]::after { content: "" !important; }
}

/* `.table-dark` e' um nome herdado: nas 24 paginas que o usam, a tabela
   ja e' CLARA (fundo branco). O que nao e' herdado e' a cabeca azul-
   marinho pintada a mao - e' ela que tirava a limpeza e a legibilidade
   do cabecalho. O cabecalho premium passa a vir de `.table > thead th`. */
.table-dark {
    --bs-table-bg: #FFFFFF;
    --bs-table-color: #1A2332;
    --bs-table-hover-bg: #F8FAFC;
    --bs-table-striped-bg: #F8FAFC;
    background-color: #FFFFFF;
    color: #1A2332;
}
.table-dark td, .table-dark th {
    border-color: var(--slate-100);
}
/* Tabela sobre superficie ESCURA de verdade (por exemplo um relatorio
   impresso com fundo escuro): ai sim o branco e' a unica tinta legivel
   sobre o azul-marinho. Fora desse contexto a regra acima da a
   cabeca clara. */
.superficie-escura .table-dark thead th {
    background: #0A1F3F;
    color: #FFFFFF;
}

/* Login page */
.login-box .card {
    border: 1px solid var(--border-color);
    box-shadow: var(--shadow-lg);
}

/* Input groups fix */
.input-group-text {
    background: var(--bg-hover);
    border: 1.5px solid var(--border-color);
    color: var(--text-secondary);
    border-radius: 8px 0 0 8px;
}

/* A antiga regra `color:#FFFFFF` vivia aqui para tornar o texto visivel
   sobre as cores saturadas. Com as badges em pastel, o branco deixaria
   de se ler - quem decide a tinta agora e' a variante (`.badge.bg-*`).
   A unica excepcao e' a superficie escura, onde o branco sobrevive. */
.superficie-escura .badge{color:#FFFFFF}

/* Card hover in dashboard */
.dashboard-card {
    border: 1px solid var(--border-color) !important;
}

/* Alerts in light theme */
.alert-info {
    background-color: #E0F7FA;
    border-color: #B2EBF2;
    color: #006064;
}
.alert-success {
    background-color: #E8F5E9;
    border-color: #C8E6C9;
    color: #1B5E20;
}
.alert-danger {
    background-color: #FFEBEE;
    border-color: #FFCDD2;
    color: #B71C1C;
}
.alert-warning {
    background-color: #FFF8E1;
    border-color: #FFE082;
    color: #E65100;
}

/* Dropdown menus light */
.dropdown-menu {
    border: 1px solid var(--border-color);
}
.dropdown-item {
    color: var(--text-secondary);
}

/* Modal form text */
.modal-content {
    color: var(--text-primary);
}
.modal-content .form-label {
    color: var(--text-primary);
}

/* Card body default text */
.card-body {
    color: var(--text-primary);
}

/* Topbar company name visibility */
.topbar-title {
    color: var(--text-primary);
}

/* Table row active state (empresa ativa) */
.table-active {
    --bs-table-accent-bg: rgba(0, 180, 216, 0.08) !important;
}


/* Fix bg-dark in light theme */
.bg-dark {
    background-color: #F0F4FF !important;
    color: #1A2332 !important;
}
code.bg-dark, .bg-dark code {
    background-color: #1A2332 !important;
    color: #E0E4E8 !important;
    padding: 8px 12px;
    border-radius: 6px;
    display: block;
}
.bg-dark small, .bg-dark .small {
    color: #5A6878 !important;
}
.bg-dark.text-light, .bg-dark .text-light {
    color: #FFFFFF !important;
}

/* Table dark compatibility */
.table-dark code {
    background-color: rgba(255,255,255,0.1);
    color: #E0E4E8;
}

/* Fix for folha.html holerite boxes */
.p-2.rounded.bg-dark {
    background-color: #F0F4FF !important;
    border: 1px solid #E0E4E8;
}
.p-2.rounded.bg-dark small {
    color: #5A6878 !important;
}
.p-2.rounded.bg-dark .fw-bold {
    color: #1A2332 !important;
}
.p-2.rounded.bg-dark .text-success {
    color: #10B981 !important;
}
.p-2.rounded.bg-dark .text-danger {
    color: #EF4444 !important;
}

/* =====================================================================
   NAVEGACAO AJAX: barra de progresso do topo
   ===================================================================== */
#ajaxProgressBar {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 3px;
    z-index: 2000;
    background: transparent;
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.2s ease;
}
#ajaxProgressBar.ativo {
    opacity: 1;
}
#ajaxProgressBar > span {
    display: block;
    width: 0;
    height: 100%;
    background: linear-gradient(90deg, #00B4D8, #0A1F3F);
    box-shadow: 0 0 8px rgba(0, 180, 216, 0.6);
}
#ajaxProgressBar.ativo > span {
    animation: ajaxProgresso 1.4s ease-out forwards;
}
#ajaxProgressBar.concluido > span {
    width: 100%;
    animation: none;
    transition: width 0.2s ease-out;
}
@keyframes ajaxProgresso {
    0%   { width: 0; }
    35%  { width: 55%; }
    70%  { width: 78%; }
    100% { width: 92%; }
}

/* Estado de carregamento suave do conteudo principal */
#conteudoPrincipal.ajax-carregando {
    opacity: 0.55;
    transition: opacity 0.15s ease-in;
}

/* HOVER DAS LINHAS - alto contraste ------------------------------------
   O `!important` e' preciso para vencer o `.table-hover` do Bootstrap.
   Mas so as CELULAS sao repintadas: a versao anterior alcanzava tambem
   `span` e `div` dentro da linha e, com as badges em pastel, passava o
   rato e apagava a cor do status - a pílula ficava cinzenta no hover.
   A celula muda de tom; o que esta dentro dela mantem a sua cor. */
.table-hover>tbody>tr:hover>*,
table tbody tr:hover>td,
table tbody tr:hover>th {
    background-color: var(--slate-50) !important;
    color: var(--text-cell) !important;
}

/* PADRAO DAVIL Auto System - botoes primaria/exportacao */
/* 1) BOTOES PRINCIPAIS (azul preenchido, alto contraste) */
.btn-primary,
.btn-submit,
button[type="submit"].btn-primary,
a.btn-primary {
    background-color: #00b4d8 !important;
    border-color: #00b4d8 !important;
    border-width: 1px;
    border-style: solid;
    color: #ffffff !important;
    font-weight: 600 !important;
    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1) !important;
    margin-left: 10px;
}
.btn-primary:hover,
.btn-submit:hover,
button[type="submit"].btn-primary:hover,
a.btn-primary:hover {
    background-color: #0096c7 !important;
    border-color: #0096c7 !important;
    color: #ffffff !important;
    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.15) !important;
}
.btn-primary:focus-visible,
.btn-submit:focus-visible {
    outline: 2px solid #0096c7;
    outline-offset: 2px;
}
/* 2) BOTOES EXPORTACAO / SECUNDARIOS (branco + outline ciano, sem sombra) */
.btn-outline-primary,
.btn-exportar,
.btn-export,
a.btn-outline-primary {
    background-color: #ffffff !important;
    color: #00b4d8 !important;
    border: 1px solid #00b4d8 !important;
    font-weight: 600 !important;
    box-shadow: none !important;
}
.btn-outline-primary:hover,
.btn-exportar:hover,
.btn-export:hover,
a.btn-outline-primary:hover {
    background-color: #e6f9fd !important;
    color: #0096c7 !important;
    border-color: #0096c7 !important;
    box-shadow: none !important;
}
.btn-outline-primary i, .btn-exportar i, .btn-export i,
.btn-primary i, .btn-submit i {
    color: inherit !important;
    vertical-align: middle;
    line-height: 1;
}
/* 3) ALINHAMENTO: contentores de botoes na mesma linha com espacamento consistente */
.btn-toolbar, .page-actions, .table-actions, .actions-bar,
.d-flex.align-items-center.gap-2 {
    display: flex !important;
    align-items: center !important;
    gap: 0.5rem !important;
    flex-wrap: wrap;
}
.btn, .btn-primary, .btn-outline-primary, .btn-exportar, .btn-submit {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center;
    gap: 0.4rem;
    white-space: nowrap;
}
.btn i[class*="fa-"], .btn svg {
    vertical-align: middle;
    align-self: center;
    margin: 0;
}

/* FIX dropdown select - seta sem sobrepor texto */
select.form-select,
.form-control select,
select {
    padding-right: 2.25rem !important;
    padding-left: 0.75rem !important;
    min-width: 130px;
    appearance: none;
    -webkit-appearance: none;
    -moz-appearance: none;
    background-position: right 0.75rem center !important;
}

/* ===== MODAIS E TEXTAREA: SCROLL RESPONSIVO ===== */
/* O conteúdo é a única área rolável; header/footer permanecem no limite do modal. */
.modal-dialog,
.modal-dialog-centered,
.modal-dialog-scrollable {
    min-height: 0 !important;
    height: auto !important;
}
.modal-dialog {
    width: calc(100% - 2rem);
    max-width: 800px;
    max-height: 85vh !important;
    margin-top: 2rem !important;
    margin-bottom: 2rem !important;
    display: flex;
    flex-direction: column;
}
.modal-dialog-scrollable {
    height: auto !important;
    max-height: 85vh !important;
}
.modal-content,
.modal-dialog-scrollable .modal-content {
    width: 100%;
    max-height: 85vh !important;
    display: flex !important;
    flex-direction: column !important;
    overflow: hidden !important;
}
.modal-header,
.modal-footer {
    flex: 0 0 auto !important;
    flex-shrink: 0 !important;
}
.modal-body {
    min-height: 0;
    flex: 1 1 auto !important;
    overflow-y: auto !important;
    padding: 1.25rem !important;
    scrollbar-gutter: stable;
}
.modal-dialog-scrollable .modal-body {
    flex: 1 1 auto !important;
    overflow-y: auto !important;
}
/* Nos formulários atuais, o <form> fica entre content e body/footer.
   Transformá-lo também em coluna flex mantém o rodapé dentro do modal. */
.modal-content > form {
    display: flex !important;
    flex-direction: column !important;
    min-height: 0 !important;
    max-height: 85vh !important;
    flex: 1 1 auto !important;
    overflow: hidden !important;
}
.modal-content > form > .modal-header,
.modal-content > form > .modal-footer {
    flex: 0 0 auto !important;
    flex-shrink: 0 !important;
}
.modal-content > form > .modal-body {
    min-height: 0 !important;
    flex: 1 1 auto !important;
    max-height: none !important;
    overflow-y: auto !important;
}
.tab-content {
    overflow: visible !important;
}
.modal-footer {
    padding: 0.75rem 1.25rem !important;
    background-color: #fff;
    border-top: 1px solid #dee2e6;
}
.modal-body::-webkit-scrollbar {
    width: 6px;
}
.modal-body::-webkit-scrollbar-track {
    background: transparent;
}
.modal-body::-webkit-scrollbar-thumb {
    background-color: #cbd5e1;
    border-radius: 4px;
}
.modal-body::-webkit-scrollbar-thumb:hover {
    background-color: #94a3b8;
}
.modal-body {
    scrollbar-width: thin;
    scrollbar-color: #cbd5e1 transparent;
}
textarea.form-control {
    max-height: 120px;
    overflow-y: auto;
    resize: vertical;
    scrollbar-width: thin;
    scrollbar-color: #cbd5e1 transparent;
}
textarea.form-control::-webkit-scrollbar {
    width: 6px;
}
textarea.form-control::-webkit-scrollbar-track {
    background: transparent;
}
textarea.form-control::-webkit-scrollbar-thumb {
    background-color: #cbd5e1;
    border-radius: 4px;
}
@media (max-width: 575.98px) {
    .modal-dialog {
        width: calc(100% - 1rem);
        margin-top: 2rem !important;
        margin-bottom: 2rem !important;
        max-height: 85vh !important;
    }
    .modal-content {
        max-height: 85vh !important;
    }
}

/* ===== TOASTS DINAMICOS + FEEDBACK AJAX (FASE 4) ===== */
.sr-toast-container{top:70px!important;right:16px!important;z-index:1090;width:min(360px,calc(100vw - 32px));pointer-events:none}
.sr-toast-container .toast{pointer-events:auto;border-radius:10px;box-shadow:var(--shadow-lg);margin-bottom:10px;overflow:hidden}
.sr-toast-container .toast-header{background:transparent;border:0;padding:10px 12px 4px;font-size:.8rem}
.sr-toast-container .toast-body{font-size:.86rem;padding:4px 12px 12px;white-space:pre-line}
.sr-toast-container .text-bg-success{color:#fff!important;background-color:var(--accent-success)!important}
.sr-toast-container .text-bg-danger{color:#fff!important;background-color:var(--accent-danger)!important}
.sr-toast-container .text-bg-warning{color:#1A2332!important;background-color:var(--accent-warning)!important}
.sr-toast-container .text-bg-info{color:#fff!important;background-color:var(--accent-info)!important}
.feedback-ajax{font-size:.78rem;margin-top:4px}
.form-control.is-valid,.form-select.is-valid{border-color:#10B981!important;background-image:none!important;box-shadow:none!important}
.form-control.is-invalid,.form-select.is-invalid{border-color:#EF4444!important;background-image:none!important;box-shadow:none!important}
.form-control.is-valid:focus,.form-control.is-invalid:focus{box-shadow:0 0 0 3px rgba(0,180,216,.12)!important}

/* ==========================================================================
   P2 - ACESSIBILIDADE (WCAG 2.1 AA)
   ========================================================================== */

/* --- WCAG 2.4.1: Skip Link (bypass blocks) --- */
.skip-link {
    position: absolute !important;
    top: -100px;
    left: 8px;
    z-index: 2000;
    padding: 12px 20px;
    background: var(--navy);
    color: #fff;
    font-weight: 600;
    border-radius: 0 0 8px 8px;
    text-decoration: none;
    transition: top .2s ease;
}
.skip-link:focus,
.skip-link:focus-visible {
    top: 0 !important;
    color: #fff !important;
    outline: 3px solid var(--turquoise-light) !important;
    outline-offset: 2px;
}

/* --- WCAG 2.4.7: foco visivel em TODOS os elementos interativos --- */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
summary:focus-visible,
[tabindex]:focus-visible,
.nav-link:focus-visible,
.dropdown-item:focus-visible,
.form-check-input:focus-visible,
.page-link:focus-visible,
[role="tab"]:focus-visible {
    outline: 3px solid #0F62FE !important;
    outline-offset: 2px !important;
    border-radius: 4px;
    box-shadow: 0 0 0 5px rgba(0, 178, 216, .35) !important;
}
/* Elementos com fundo escuro necessitam de contorno claro */
.sidebar-link:focus-visible {
    outline: 3px solid #fff !important;
    outline-offset: 2px !important;
    box-shadow: 0 0 0 5px rgba(0, 180, 216, .55) !important;
}
/* O alvo de foco recebe o contorno ao navegarmos com Tab */
main:focus,
#conteudoPrincipal:focus {
    outline: none;
}
main:focus-visible,
#conteudoPrincipal:focus-visible {
    outline: 3px dashed #0F62FE !important;
    outline-offset: -3px !important;
}

/* --- WCAG 2.3.3 / 2.2.2: respeitar preferencia de movimento reduzido --- */
@media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
        animation-duration: .001ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: .001ms !important;
        scroll-behavior: auto !important;
    }
    .modal.fade .modal-dialog { transition: none !important; }
    .sidebar { transition: none !important; }
    .toast { transition: none !important; }
    .fade { transition: none !important; }
}

/* --- Utilitarios visuais (conteudo apenas para leitores de ecra) --- */
.visually-hidden,
.visually-hidden-focusable:not(:focus):not(:focus-within) {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    padding: 0 !important;
    margin: -1px !important;
    overflow: hidden !important;
    clip: rect(0, 0, 0, 0) !important;
    white-space: nowrap !important;
    border: 0 !important;
}

/* ============================================================
   AUTENTICACAO / LOGIN — Split screen (SaaS B2B)
   Coluna esquerda: proposta de valor. Coluna direita: formulario.
   ============================================================ */
.rh-auth{min-height:100vh;background:var(--bg-body)}
.rh-auth__split{min-height:100vh}
/* O gradiente liso deixava um bloco chapado. Sobrepõem-se dois halos
   ciano e um vinheta na base - e' o que da' profundidade sem Peso.
   `background-color` fica por baixo para nao haver alpha sobre branco
   nas zonas onde os radiais ainda nao cobriram. */
.rh-auth__pitch{position:relative;isolation:isolate;overflow:hidden;background-color:var(--navy);background-image:radial-gradient(58% 52% at 10% 6%,rgba(0,180,216,.30),transparent 62%),radial-gradient(46% 44% at 90% 20%,rgba(72,202,228,.20),transparent 60%),radial-gradient(72% 62% at 48% 108%,rgba(6,18,43,.85),transparent 70%),linear-gradient(155deg,var(--navy) 0%,var(--navy-light) 55%,#0C3A6B 100%);color:#fff;display:flex;align-items:center;padding:3rem 2.5rem}
/* Malha vectorial (duas gradientes cruzadas) que esbate para as bordas.
   Fica em `z-index:-1` DENTRO do `isolation:isolate` do pai: assim passa
   por tras do texto sem lhe roubar a pilha, sem `filter` no contentor
   - que arrastaria logo, titulo e icones. */
.rh-auth__pitch::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;background-image:linear-gradient(rgba(255,255,255,.055) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.055) 1px,transparent 1px);background-size:44px 44px;-webkit-mask-image:radial-gradient(78% 68% at 50% 32%,#000,transparent 78%);mask-image:radial-gradient(78% 68% at 50% 32%,#000,transparent 78%)}
.rh-auth__pitch-inner{max-width:520px;margin:0 auto;width:100%}
.rh-auth__marca{display:flex;align-items:center;gap:.7rem;font-size:1.05rem;font-weight:700;color:#fff}
.rh-auth__logo{max-height:42px;width:auto;filter:brightness(0) invert(1)}
.rh-auth__headline{font-size:2rem;font-weight:800;line-height:1.18;color:#fff;letter-spacing:-.6px;margin:0 0 .9rem;max-width:20ch}
.rh-auth__sub{color:#C9D8EA;font-size:1.02rem;line-height:1.55;max-width:44ch;margin:0 0 2rem}
.rh-auth__lista{margin:0 0 1.8rem;display:flex;flex-direction:column;gap:1.05rem}
.rh-auth__lista li{display:flex;gap:.9rem;align-items:flex-start}
.rh-auth__lista i{width:38px;height:38px;flex:0 0 38px;display:grid;place-items:center;border-radius:10px;background:rgba(255,255,255,.12);color:#48CAE4;font-size:.95rem;margin-top:2px}
.rh-auth__lista strong{display:block;color:#fff;font-weight:600;font-size:.98rem}
.rh-auth__lista span{display:block;color:#B6C8DC;font-size:.87rem;line-height:1.45}
.rh-auth__prova{margin:0;color:#9FB6CE;font-size:.82rem;display:flex;align-items:center;gap:.5rem}
/* Minicard de prova social. Flutua no rodape do painel escuro com uma
   borda de luz e vidro baço - apanha o olhar depois de se ler a lista de
   beneficios, que e' quando a pergunta "e' confiavel?" ja' aconteceu. */
.rh-auth__prova-card{margin:1.5rem 0 0;padding:1rem 1.15rem;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.14);border-radius:12px;position:relative;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}
.rh-auth__prova-card blockquote{margin:0;padding-left:1.9rem;font-size:.9rem;line-height:1.5;color:#E4EEF8;font-style:italic}
.rh-auth__prova-card blockquote::before{content:"\201C";position:absolute;top:.55rem;left:.85rem;font-size:2.4rem;line-height:1;color:var(--turquoise);font-family:Georgia,'Times New Roman',serif;opacity:.75}
.rh-auth__prova-card figcaption{margin-top:.5rem;display:flex;align-items:center;gap:.45rem;font-size:.76rem;color:#9FB6CE}
.rh-auth__prova-card figcaption::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--turquoise);flex:0 0 auto}
.rh-auth__prova-card strong{color:#fff;font-weight:600}
.rh-auth__painel{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2.5rem 1.5rem;background:var(--bg-body)}
.rh-auth__form-box{width:100%;max-width:420px;background:#fff;border:1px solid var(--border-color);border-radius:14px;padding:2rem;box-shadow:var(--shadow-md)}
.rh-auth__form-box .alert-dismissible{display:flex;align-items:center;gap:.5rem;padding-right:.75rem}
.rh-auth__form-box .alert-dismissible>.btn-close{position:static;flex:0 0 auto;margin-left:auto;padding:.5rem}
/* ---- Botao de submissao (Entrar / Criar conta) ----
   O `.btn-primary` global ja' escurece no hover, mas aqui ganha-se
   DEGRAU: no painel branco e' o unico ponto de maior contraste da tela,
   por isso o hover tem de ler-se sem ambiguidade.
   Os `!important` sao obrigatorios - a regra global da linha ~523 usa-os,
   e sem os repetir aqui o hover do auth perderia para ela. */
.rh-auth .btn-primary{transition:background .2s ease,box-shadow .2s ease,transform .2s ease}
.rh-auth .btn-primary:hover:not(:disabled){background:linear-gradient(135deg,var(--turquoise-dark) 0%,#007C93 100%)!important;border-color:#007C93!important;box-shadow:0 6px 18px rgba(0,180,216,.38)!important;transform:translateY(-1px)}
.rh-auth .btn-primary:active:not(:disabled){transform:translateY(0);box-shadow:0 2px 6px rgba(0,180,216,.3)!important}
.rh-auth .btn-primary:focus-visible{outline:2px solid var(--turquoise-dark);outline-offset:2px}
.rh-auth__cta{margin-top:1.5rem;padding-top:1.25rem;border-top:1px solid var(--border-color);text-align:center}
.rh-auth__cta p{margin-bottom:.5rem;font-weight:600;color:var(--text-primary)}
.rh-auth__cta small{display:block;margin-top:.6rem;color:var(--text-secondary)}
.rh-auth__footer{margin-top:1.5rem;text-align:center}
.rh-auth__footer nav{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:.45rem}
.rh-auth__footer a{color:var(--text-secondary);font-size:.8rem;text-decoration:none}
.rh-auth__footer a:hover,.rh-auth__footer a:focus-visible{color:var(--turquoise-dark);text-decoration:underline}
.rh-auth__footer span{color:var(--text-muted);font-size:.8rem}
.rh-auth .form-control{min-height:44px}
.rh-auth .form-check-label,.rh-auth .form-label{color:var(--text-primary)}
.rh-auth a{color:var(--turquoise-dark)}
.rh-auth .cad-senha #forca-senha{width:100%;margin-top:8px}
.rh-auth .cad-senha__barra{height:5px;border-radius:999px;overflow:hidden}
.rh-auth .cad-senha__detalhe{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;margin:6px 0 16px}
.rh-auth .cad-senha__detalhe #forca-senha-texto{flex:1 1 auto;text-align:left}
.rh-auth .cad-senha__detalhe #forca-senha-nivel{flex:0 0 auto;text-align:right;white-space:nowrap}

/* ---- Autofill do navegador -------------------------------------------
   O Chrome pinta os campos preenchidos pelo gestor de senhas com um
   amarelo que ignora o `background` do autor. A unica forma de o
   trazer de volta ao cinza do produto e' um `-webkit-box-shadow`
   interior, que ganha a essa regra do user-agent.
   A transicao de 600s na cor de fundo e' o truque classico: sem ela o
   Chrome volta a amarelo alguns segundos DEPOIS do carregamento, num
   campo que a pessoa ja' preencheu - um flash fora do sitio.
   O `-webkit-text-fill-color` e' o que repõe a cor do texto, que o
   amarelo tambem empurra para um tom legivel-so-no-amarelo. */
.rh-auth input:-webkit-autofill,
.rh-auth input:-webkit-autofill:hover,
.rh-auth input:-webkit-autofill:focus,
.rh-auth input:-webkit-autofill:active{
  -webkit-text-fill-color:var(--text-primary);
  -webkit-box-shadow:0 0 0 1000px var(--slate-50) inset;
  box-shadow:0 0 0 1000px var(--slate-50) inset;
  caret-color:var(--text-primary);
  transition:background-color 600000s 0s,color 600000s 0s
}
/* O foco tem de sobreviver ao `box-shadow` gigante de cima: sem esta
   regra, o anel ciano de foco do Bootstrap era tapado e quem navega
   por teclado perdia a pista de onde esta'. Por isso a sombra de fundo
   e' repetida em segundo plano, e o anel de foco em primeiro. */
.rh-auth input:-webkit-autofill:focus{
  border-color:var(--turquoise);
  box-shadow:0 0 0 3px rgba(0,180,216,.12),0 0 0 1000px var(--slate-50) inset
}

/* ---- Login social e divisor (usados no /login e no /cadastro) ----
   Sao do MESMO include (`_botao_google.html`), para que as duas telas
   nao possam divergir: mudar a cor ou o texto num deles muda nos dois.
   O divisor e' texto real, nao `::after`: um leitor de ecra anuncia
   "ou entre com e-mail" e sabe que ha outra forma de entrar. */
.rh-auth__social{margin-bottom:.35rem}
/* `transition` em `all` cobre a cor, a borda e a sombra no mesmo
   tempo - e' o que faz o hover parecer um gesto e nao um corte.
   A sombra e' a unica coisa que cresce: um `transform` aqui levantaria
   o botao e afasta-o do campo de foco, num ecra onde o espaco e' curto.
   O logo do Google e' multicolorido: um filtro herdado de contexto
   transformaria o "G" numa silhueta cinzenta - por isso o `svg` fica
   sem `filter`, e so' recebe `align-self` para centrar na linha. */
.rh-auth__social .btn{font-weight:600;min-height:44px;display:flex;align-items:center;justify-content:center;gap:.55rem;transition:all .2s ease;box-shadow:0 1px 2px rgba(10,31,63,.06)}
.rh-auth__social .btn:hover:not(:disabled){box-shadow:var(--shadow-md);border-color:#C8D2DE;background-color:#fff}
.rh-auth__social .btn svg,.rh-auth__google{flex:0 0 auto;display:block;align-self:center}
.rh-auth__social .btn:disabled{opacity:.55;cursor:not-allowed}
.rh-auth__social-nota{margin:.5rem 0 0;font-size:.78rem;color:var(--text-secondary);display:flex;align-items:center;gap:.35rem;justify-content:center;text-align:center}

.rh-auth__divisor{display:flex;align-items:center;gap:.75rem;margin:1rem 0;color:var(--text-muted);font-size:.78rem;text-transform:uppercase;letter-spacing:.6px}
.rh-auth__divisor::before,.rh-auth__divisor::after{content:"";flex:1 1 auto;height:1px;background:var(--border-color)}

/* NOTA: os selos LGPD/SSL nao vivem no painel escuro (`.rh-auth__selos`
   foi removido: o bloco duplicado que usava a classe foi eliminado do
   /cadastro). Ficam no fim do cartao do formulario, com o contraste do
   Bootstrap sobre fundo branco. */

/* ---- Cadastro: compactacao vertical -------------------------------------
   O /cadastro tem 5 campos + medidor de forca + aceite + selos + CTA.
   Num ecra baixo (portatil de 768px de altura, ja' com a barra do
   browser a descontar) isso transbordava ~275px e obrigava a scroll
   para chegar ao botao - que e' precisamente o botao que a pessoa foi
   fazer ali.
   A estrategia e' encolher a AREA em volta dos campos, nunca o campo:
   o alvo de toque mantem os 44px (WCAG 2.5.8) em alturas normais.
   As duas etapas sao separadas por proposito - `max-height:820px`
   apanha o caso comum do portatil, `max-height:680px` so' o ecra
   realmente aperto, onde ate o alvo de toque cede para 40px. */
/* O painel direito encolhe tambem: com `min-height:100vh` e o cartao
   centrado, eram 40px em cima e em baixo que davam a diferenca.
   Esta regra tem de ficar ANTES do `@media(max-height:820px)` mais
   abaixo: o `.rh-auth__painel--compacto` tem especificidade de classe
   e, vindo depois, ganhava ao `.rh-auth__painel` do media query e
   anulava a compactacao de ecra curto. */
.rh-auth__painel--compacto{padding:2rem 1.5rem}
.rh-auth__form-box--compacto{padding:1.25rem}
.rh-auth__form-box--compacto .rh-brand-logo{height:38px;margin-bottom:.6rem!important}
.rh-auth__form-box--compacto .h4{font-size:1.15rem}
.rh-auth__form-box--compacto .mb-4{margin-bottom:.8rem!important}
.rh-auth__form-box--compacto .mb-3{margin-bottom:.45rem!important}
.rh-auth__form-box--compacto .form-label{margin-bottom:.15rem;font-size:.85rem}
.rh-auth__form-box--compacto .rh-auth__divisor{margin:.6rem 0}
.rh-auth__form-box--compacto .rh-auth__cta{margin-top:.8rem;padding-top:.75rem}
/* A barra dos selos usava `mt-3 pt-3` do Bootstrap (32px juntos) numa
   linha que nao tem mais de 24px de altura util. */
.rh-auth__form-box--compacto .border-top{margin-top:.7rem!important;padding-top:.7rem!important}
/* Uma coluna por omissao - e' o que se ve no mobile e num ecra alto. */
.cad-linha{display:grid;gap:.6rem;margin-bottom:.45rem}
.cad-linha .form-check{margin-bottom:0}
/* Lado a lado so' onde ha' largura a sobrar E falta altura - ver o
   degrau de `max-height:960px` mais abaixo, que e' onde isto se decide. */

/* Ecra alto mas nao muito: o cartao do cadastro ainda nao cabia em 900px
   (faltavam 44px). Este degrau e' separado do de 820px porque a solucao
   e' diferente - aqui NAO se mexem os campos, so' a moldura: os
   grupos Nome/Empresa passam a lado a lado, o que antes so' acontecia
   abaixo dos 820px. Num ecra de 900px de altura ha' largura de sobra
   para os dois campos caberem um ao lado do outro. */
@media(min-width:1200px) and (max-height:960px){
  .cad-linha{grid-template-columns:1fr 1fr;gap:.7rem;margin-bottom:.45rem}
}
/* Portatil: altura de janela <= 820px. O ganho maior vem do padding do
   PAINEL (40px -> 12px de cada lado, 56px de uma vez) e da escala dos
   espacamentos internos. */
@media(max-height:820px){
  .rh-auth__painel{padding:.9rem 1.5rem}
  /* O painel esquerdo tambem encolhe. Sem isto, num ecra baixo ele
     passava a ser a coluna mais alta da linha e a IMPOR scroll a tela
     inteira - a pessoa que so' queria preencher o formulario era
     obrigada a rolar por causa da coluna decorativa. */
  .rh-auth__pitch{padding:1.75rem 2rem}
  .rh-auth__headline{font-size:1.55rem}
  .rh-auth__sub{font-size:.95rem;margin-bottom:1.25rem}
  .rh-auth__lista{gap:.7rem}
  .rh-auth__lista i{width:34px;height:34px;flex:0 0 34px;font-size:.85rem}
  /* `line-height` mais apertado nas descricoes: sao 3 frases de duas
     linhas cada, e 0.03 de leading em cada uma da o que faltava. */
  .rh-auth__lista span{line-height:1.35}
  .rh-auth__lista strong{font-size:.93rem}
  .rh-auth__marca{margin-bottom:1rem!important}
  .rh-auth__prova-card{margin-top:1rem;padding:.75rem .9rem}
  .rh-auth__prova-card blockquote{font-size:.84rem;padding-left:1.7rem}
  .rh-auth__prova-card blockquote::before{font-size:1.9rem;top:.3rem;left:.7rem}
  .rh-auth__prova-card figcaption{font-size:.72rem;margin-top:.35rem}
  .rh-auth__footer{margin-top:1rem}
  .rh-auth__form-box--compacto{padding:1.15rem 1.1rem}
  .rh-auth__form-box--compacto .h4{font-size:1.12rem;margin-bottom:.15rem!important}
  .rh-auth__form-box--compacto .text-secondary{font-size:.82rem}
  .rh-auth__form-box--compacto .mb-4{margin-bottom:.7rem!important}
  .rh-auth__form-box--compacto .mb-3{margin-bottom:.45rem!important}
  .rh-auth__form-box--compacto .mb-2{margin-bottom:.45rem!important}
  .rh-auth__form-box--compacto .form-label{font-size:.8rem;margin-bottom:.1rem}
  .rh-auth__form-box--compacto .rh-auth__social .btn{min-height:40px}
  .rh-auth__form-box--compacto .rh-auth__divisor{margin:.5rem 0;font-size:.72rem}
  .rh-auth__form-box--compacto .rh-auth__cta{margin-top:.75rem;padding-top:.7rem}
  .rh-auth__form-box--compacto .rh-auth__cta p{margin-bottom:.35rem!important}
  /* A borda dos selos e o botao do rodape do cartao encolhem tambem. */
  .rh-auth__form-box--compacto .border-top{margin-top:.6rem!important;padding-top:.6rem!important}
  .rh-auth__form-box--compacto .btn-primary{padding:8px 20px}
  .rh-auth__form-box--compacto .rh-auth__social{margin-bottom:.2rem}
  .rh-auth__form-box--compacto .rh-auth__cta .btn{min-height:40px;padding:8px 20px}
  .rh-auth__form-box--compacto .rh-auth__cta small{font-size:.78rem;margin-top:.4rem}
  /* A nota do botao social e' a unica frase longa do cartao; numa tela
     estreita ela quebrava em 3 linhas e custava ~30px de altura. */
  .rh-auth__form-box--compacto .rh-auth__social-nota{font-size:.72rem;margin-top:.35rem;line-height:1.35}
  .rh-auth__form-box--compacto .cad-linha{margin-bottom:.3rem}
  .rh-auth__form-box--compacto .form-check{margin-bottom:.3rem!important}
  .rh-auth__form-box--compacto .mb-3{margin-bottom:.35rem!important}
}
/* Ecra realmente curto: aqui o alvo de toque ja pode ceder para 40px,
   que continua muito acima do minimo de 24px da WCAG 2.5.8. */
@media(max-height:680px){
  .rh-auth__form-box--compacto{padding:.9rem 1rem}
  .rh-auth__form-box--compacto .form-control{min-height:40px}
  .rh-auth__form-box--compacto .rh-brand-logo{display:none}
}

/* Ecra largo: painel mais estreito para nao esticar o formulario. */
@media(min-width:1200px){.rh-auth__form-box{max-width:440px}}
/* Tablet: mantem as duas colunas mas reduz o padding. */
@media(min-width:768px) and (max-width:991.98px){.rh-auth__pitch{padding:2rem 1.5rem}.rh-auth__headline{font-size:1.55rem}.rh-auth__lista span{font-size:.82rem}}
/* Mobile: uma coluna, proposta de valor acima do formulario. */
@media(max-width:767.98px){
  .rh-auth__pitch{padding:2rem 1.25rem;text-align:center}
  .rh-auth__pitch-inner{max-width:100%}
  .rh-auth__marca{justify-content:center}
  .rh-auth__headline{font-size:1.5rem;max-width:none;margin-inline:auto}
  .rh-auth__sub{margin-inline:auto}
  .rh-auth__lista{gap:.85rem}
  .rh-auth__lista li{text-align:left}
  .rh-auth__prova{justify-content:center}
  .rh-auth__painel{padding:1.5rem 1rem 2rem}
  .rh-auth__form-box{padding:1.5rem}
  .rh-auth__headline,.rh-auth__sub,.rh-auth__lista,.rh-auth__prova,.rh-auth__prova-card{display:none}
  .rh-auth__pitch{min-height:auto;padding:1.25rem 1rem}
  .rh-auth__marca{margin:0}
}
@media(prefers-reduced-motion:reduce){.rh-auth *{transition:none!important;animation:none!important}}

/* ============================================================
   MARCA OFICIAL (SystemRH)
   O wordmark e um SVG com viewBox 4:1, por isso a largura tem de
   ser limitada em conjunto com a altura para nao distorcer nem
   provocar scroll horizontal em ecras pequenos.
   ============================================================ */
.rh-brand-logo{height:48px;width:auto;max-width:100%;object-fit:contain}
.rh-auth__marca-logo{height:44px;width:auto;max-width:260px;object-fit:contain}
.rh-auth__marca{flex-wrap:wrap;gap:.6rem}
@media(max-width:767.98px){.rh-brand-logo{height:40px}.rh-auth__marca-logo{height:36px;max-width:200px}}

/* ============================================================
   BANNER DE TRIAL (FASE 4)
   ============================================================ */
.trial-banner{display:flex;align-items:center;gap:.85rem;flex-wrap:wrap;
  background:linear-gradient(90deg,#0A1F3F,#132E5B) !important;color:#FFFFFF !important;
  padding:.85rem 1.25rem;margin:0 0 1.25rem;border-radius:10px;
  box-shadow:var(--shadow-sm);border-left:4px solid #00D2D3 !important}
.trial-banner>svg,.trial-banner>i{font-size:1.15rem;color:#C9D8EA !important;flex:0 0 auto}
.trial-banner__texto{display:flex;flex-direction:column;line-height:1.35;min-width:0}
.trial-banner__texto strong{color:#FFFFFF !important;font-weight:600;font-size:.92rem}
.trial-banner__texto span{color:#C9D8EA !important;font-size:.84rem}
.trial-banner .btn-light{color:var(--navy);font-weight:600;white-space:nowrap}
.trial-banner .btn-light:hover,.trial-banner .btn-light:focus-visible{background:#E0E4E8;color:var(--navy-dark)}
/* Expirado: tom de alerta, ainda legivel sobre fundo escuro. */
.trial-banner--expirado{background:linear-gradient(90deg,#7A2E12,#9A3412);border-left-color:#F59E0B}
.trial-banner--expirado>i{color:#FCD34D}
.trial-banner--expirado .trial-banner__texto span{color:#FDE4D0}
@media(max-width:575.98px){
  .trial-banner{padding:.75rem 1rem;gap:.6rem}
  .trial-banner__texto strong{font-size:.86rem}
  .trial-banner .ms-auto{margin-left:0;width:100%}
}

/* ==========================================================================
   SIDEBAR RECOLHIDA (desktop) - barra de icones de 76px
   --------------------------------------------------------------------------
   O botao #toggle-sidebar-btn alterna .sidebar-collapsed no <aside> e
   .sidebar-recolhida no .app-wrapper; a preferencia persiste em localStorage
   (ver static/js/main.js). Abaixo de 992px a sidebar continua a ser gaveta
   (.sidebar-open) e o recolhimento nao se aplica.
   ========================================================================== */
:root { --sidebar-collapsed-width: 70px; }

.sidebar-collapsed {
    width: var(--sidebar-collapsed-width);
    /* NAO e' so `overflow-x`: um rotulo mais largo que a coluna
       transbordaria para a area principal. O `hidden` e' o que garante
       que nenhum texto chega a ver-se. E a razao de o flyout estar
       FORA do `<aside>` - aqui dentro era recortado. */
    overflow: hidden;
}
/* Sem transicao na aplicacao inicial evita o "salto" visual ao carregar. */
.sidebar-sem-transicao { transition: none !important; }

/* --- Logotipo: versao expandida (marca) vs recolhida (icone) --- */
.sidebar-logo-recolhido { display: none; }
.sidebar-collapsed .sidebar-logo-expandido { display: none; }
.sidebar-collapsed .sidebar-logo-recolhido { display: block; }
.sidebar-logo { justify-content: flex-start; padding: 24px 22px 16px; }
.sidebar-collapsed .sidebar-logo { justify-content: center; padding: 24px 0 16px; }

/* --- Marca / nome da empresa some quando recolhido (o icone identifica) --- */
.sidebar-collapsed .sidebar-brand { display: none; }

/* --- Links: so o icone, centrado --- */
.sidebar-collapsed .sidebar-nav { padding: 8px 10px; }
.sidebar-collapsed .sidebar-link {
    position: relative;
    display: flex !important;
    align-items: center;
    justify-content: center;
    gap: 0;
    padding: 12px 0 !important;
    margin-bottom: 2px;
    border-radius: 8px;
}
.sidebar-collapsed .sidebar-link i {
    width: auto;
    flex: 0 0 auto;
    font-size: 1.15rem;
    margin: 0;
}
/* =====================================================================
   ESTADO RECOLHIDO: SO ICONES, CENTRADOS
   =====================================================================
   Tudo o que e' texto desaparece - titulos de secao, rotulos dos links e
   a versao no rodape. Fica a coluna de 70px com os icones centrados, e
   os links de cada secao aparecem num flyout ao passar o rato.

   A versao (`v1.0.0`) some de proposito: e' texto, e um texto que
   transborda e' pior do que a informacao que perde.
   ===================================================================== */
/* Recolhida: a secao e' um bloco de 70px. O cabecalho vira o botao
   que abre o flyout - o `padding` largo do titulo tinha de sair, ou
   o icone ficava esmagado dentro dos 34px de altura. */
.sidebar-collapsed .sidebar-secao { padding: 0; margin-top: 6px; }
.sidebar-collapsed .sidebar-secao__cabecalho {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 38px;
    padding: 0 !important;
    margin: 0;
    border-bottom: 0;
    border-radius: 8px;
    cursor: pointer;
    color: rgba(255, 255, 255, 0.55);
    transition: background-color var(--transition-speed) ease, color var(--transition-speed) ease;
}
.sidebar-collapsed .sidebar-secao__cabecalho > i { font-size: 1.05rem; opacity: 1; }
.sidebar-collapsed .sidebar-secao__cabecalho:hover {
    background: rgba(255, 255, 255, 0.12);
    color: #FFFFFF;
}
.sidebar-collapsed .sidebar-secao__cabecalho[aria-expanded="true"] {
    background: rgba(0, 180, 216, 0.22);
    color: #FFFFFF;
}
.sidebar-collapsed .sidebar-secao__cabecalho:focus-visible {
    outline: none;
    box-shadow: inset 0 0 0 2px var(--turquoise-light);
}
.sidebar-collapsed .sidebar-secao__itens { display: none; }

/* Com a barra recolhida o item ACTIVE nao pode levar filete: `3px`
   a esquerda tirava o icone do centro da coluna. Fica um realce. */
.sidebar-collapsed .sidebar-link.active {
    border-left: 0;
    box-shadow: inset 0 0 0 2px var(--turquoise);
    background: rgba(0, 180, 216, 0.18) !important;
}

.sidebar-collapsed .sidebar-link span,
.sidebar-collapsed .sidebar-link .sidebar-link-texto,
.sidebar-collapsed .sidebar-link .fa-chevron-down,
.sidebar-collapsed .sidebar-link .fa-chevron-right,
.sidebar-collapsed .sidebar-secao__cabecalho span,
.sidebar-collapsed .sidebar-footer small,
.sidebar-collapsed .sidebar-divider,
.sidebar-collapsed .dropdown-toggle::after { display: none !important; }
.sidebar-collapsed .sidebar-footer { padding: 8px 0 4px; }

/* Dropdowns nao cabem numa barra de icones. */
.sidebar-collapsed .dropdown-menu { display: none !important; }
.sidebar-collapsed .badge { display: none !important; }

/* --- Flyout: os links da secao, a direita da coluna ------------------ */
.sidebar-flyout {
    position: fixed;
    left: 70px;
    top: 0;
    z-index: 1060;          /* acima da sidebar (1040) e do overlay (1035) */
    min-width: 224px;
    max-height: 80vh;
    overflow-y: auto;
    padding: 6px;
    border-radius: 12px;
    background: #fff;
    box-shadow: 0 12px 34px rgba(10, 31, 63, 0.24);
}
.sidebar-flyout[hidden] { display: none; }
.sidebar-flyout__titulo {
    padding: 7px 10px 8px;
    font-size: 10px;
    font-weight: 700;
    letter-spacing: 0.09em;
    text-transform: uppercase;
    color: #8A98A8;
}
/* O painel e' BRANCO, logo o texto nao pode ser o branco da barra.
   Sem isto os links eram branco sobre branco: invisiveis. */
.sidebar-flyout .sidebar-link {
    color: #2C3E50 !important;
    white-space: nowrap;
    font-size: 13px;
    padding: 8px 12px !important;
}
.sidebar-flyout .sidebar-link:hover {
    background: var(--bg-hover) !important;
    color: var(--navy) !important;
}
/* Os icones dos links DO FLYOUT ficam sempre visiveis: e' uma lista
   flutuante, nao a barra de icones. */
.sidebar-flyout .sidebar-link > i { display: block; color: var(--turquoise-dark); }
.sidebar-flyout .sidebar-link.active {
    background: rgba(0, 180, 216, 0.10) !important;
    border-left: 3px solid var(--turquoise);
    color: var(--navy) !important;
    font-weight: 600;
}

/* No telefone a sidebar e' gaveta: um flyout a 70px do canto nao tem
   onde cair, e a gaveta ja mostra os rotulos. */
@media (max-width: 767.98px) {
    .sidebar-flyout { display: none !important; }
    /* Recolhido em ecra pequeno: fora do ecra, sem faixa cortada. */
    .sidebar.sidebar-collapsed { transform: translateX(-100%) !important; }
}

/* --- Area principal ocupa o espaco restante sem cortar conteudo --- */
.app-wrapper.sidebar-recolhida .main-area {
    margin-left: var(--sidebar-collapsed-width);
    width: calc(100% - var(--sidebar-collapsed-width));
}
/* Fallback para navegadores sem :has() - .main-area e irmao da .sidebar. */
.sidebar-collapsed ~ .main-area {
    margin-left: var(--sidebar-collapsed-width);
    width: calc(100% - var(--sidebar-collapsed-width));
}
.main-area { transition: margin-left var(--transition-speed) ease, width var(--transition-speed) ease; }
.sidebar-sem-transicao ~ .main-area { transition: none; }

/* O botao hamburger e util em qualquer dimensao para poder recolher o menu. */
@media (min-width: 992px) {
    #toggle-sidebar-btn { display: inline-flex !important; }
}
/* No mobile mantem o comportamento de gaveta ja definido mais acima. */
@media (max-width: 991.98px) {
    .app-wrapper.sidebar-recolhida .main-area,
    .sidebar-collapsed ~ .main-area {
        margin-left: 0;
        width: 100%;
    }
}

/* Tooltip do Bootstrap com fundo da marca, legivel sobre a sidebar. */
.sidebar-collapsed .tooltip .tooltip-inner {
    background-color: var(--navy-dark);
    font-size: .8rem;
    padding: 6px 10px;
}

/* ============================================================
   GRAFICOS CHART.JS - ALTURA FIXA DO CONTENTOR
   Com maintainAspectRatio:false, o Chart.js mede o PAI para definir
   a altura do canvas. Se o pai nao tiver altura explicita, herda a
   altura do canvas, que volta a crescer a cada resize: o grafico
   estica-se infinitamente. O contentor tem de ter dimensao.
   ============================================================ */
/* .bi-fig neutro: o canvas fica em fluxo normal e o <details> "ver em
   tabela" aparece DEPOIS dele. .bi-fig--fixa aplica-se so aos graficos
   com maintainAspectRatio:false, em que o Chart.js mede o PAI para
   definir a altura do canvas: sem dimensao explicita no pai, ele herda a
   altura do canvas e cresce a cada resize (estica-se infinitamente). */
.bi-fig { margin: 0; }
.bi-fig--fixa { position: relative; width: 100%; height: 260px; }
.bi-fig--fixa.bi-fig-doughnut { height: 220px; }
.bi-fig--fixa > canvas {
    position: absolute !important;
    top: 0; left: 0;
    width: 100% !important;
    height: 100% !important;
}
@media (max-width: 575.98px) { .bi-fig--fixa { height: 220px; } }

/* Estado vazio dos graficos (dashboard executivo / BI): evita que o
   canvas fique uma caixa branca sem explicacao quando nao ha dados. */
.grafico-vazio {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: .35rem;
    min-height: 200px;
    padding: 1.25rem;
    color: var(--text-secondary);
    text-align: center;
}
.grafico-vazio[hidden] { display: none; }
.grafico-vazio i { color: var(--text-muted); }
.grafico-vazio p { font-size: .9rem; }

/* ============================================================
   LOGO DO SIDEBAR
   O lockup nao tem subtitulo e a altura e fixa: assim o browser
   consegue derivar a largura pela proporcao do viewBox e o texto
   mantem-se nitido. Com width:auto e sem altura, o SVG 4:1
   encolhia e o texto ficava ilegivel (parecendo sobreposto).
   ============================================================ */
.sidebar-logo { justify-content: flex-start; padding: 20px 20px 14px; }
.sidebar-logo-img {
    display: block;
    flex-shrink: 0;
    object-fit: contain;
    border-radius: 6px;
}
.sidebar-logo-expandido { height: 34px; width: auto; max-width: 100%; }
.sidebar-logo-recolhido { display: none; }
.sidebar-collapsed .sidebar-logo { justify-content: center; padding: 20px 0 14px; }
.sidebar-collapsed .sidebar-logo-expandido { display: none; }
.sidebar-collapsed .sidebar-logo-recolhido { display: block; height: 30px; width: 30px; }

/* ============================================================
   FASE 5 - TOUR GUIADO, SUPORTE E ASSINATURA
   ============================================================ */
.srh-tour{position:fixed;inset:0;z-index:1090}
.srh-tour__fundo{position:absolute;inset:0;background:rgba(6,17,31,.72)}
.srh-tour__destaque{position:absolute;border:3px solid var(--turquoise);border-radius:10px;
  box-shadow:0 0 0 9999px rgba(6,17,31,.55),0 0 22px rgba(72,202,228,.55);
  pointer-events:none;transition:all .22s ease}
.srh-tour__caixa{position:absolute;width:340px;max-width:calc(100vw - 32px);
  background:#fff;border-radius:12px;padding:1.1rem 1.25rem;box-shadow:0 12px 40px rgba(0,0,0,.35)}
.srh-tour__passo{font-size:.72rem;letter-spacing:.06em;text-transform:uppercase;
  color:var(--text-secondary);margin:0 0 .25rem}
.srh-tour__titulo{font-size:1.05rem;font-weight:600;margin:0 0 .4rem;color:var(--navy)}
.srh-tour__texto{font-size:.87rem;color:var(--text-secondary);margin:0 0 1rem;line-height:1.5}
.srh-tour__rodape{display:flex;align-items:center;gap:.6rem}
.srh-tour__rodape .srh-tour__contador{margin-left:auto;font-size:.8rem;color:var(--text-secondary)}
.srh-tour-aberto{overflow:hidden}
[data-tour-alto]{position:relative;z-index:1091!important;border-radius:8px}
@media (prefers-reduced-motion:reduce){
  .srh-tour__destaque{transition:none}
}

/* Botao de suporte na topbar */
#btnSuporteTopo{position:relative}
#btnSuporteTopo .badge{position:absolute;top:-4px;right:-4px;font-size:.62rem;padding:.15rem .3rem}

/* Planos: destaque do plano recomendado */
.plan-card{border:2px solid var(--border);border-radius:12px;transition:box-shadow .2s,border-color .2s}
.plan-card:hover{box-shadow:var(--shadow-md)}
.plan-card--destaque{border-color:var(--turquoise);box-shadow:0 6px 24px rgba(72,202,228,.18)}
.plan-card__preco{font-size:1.9rem;font-weight:700;color:var(--navy);line-height:1.1}
.plan-card--destaque .plan-card__preco{color:var(--turquoise-dark,#0e8ba6)}

/* Modo demonstracao (FASE 9): conta sem assinatura. Tom distinto do
   trial para nao confundir "a expirar" com "nunca assinado". */
.trial-banner--demo {
    background: linear-gradient(135deg, #334155 0%, #475569 100%);
    color: #f8fafc;
}
.trial-banner--demo .trial-banner__texto strong { color: #fff; }
.trial-banner--demo .trial-banner__texto span { color: #cbd5e1; }

/* Banner de modo demonstracao (sem assinatura ativa). Classe propria: o
   `trial-banner` e' do periodo de teste e nao pode servir para o aviso de
   "nada assinado", senao um teste (ou o leitor de ecra') confunde os dois. */
.demo-banner {
    background: #fef3c7;
    border: 1px solid #fcd34d;
    color: #78350f;
    border-radius: 10px;
    padding: 12px 16px;
    margin-bottom: 16px;
}
.demo-banner a { font-weight: 600; }

.feedback-flutuante {
    position: fixed;
    right: 92px;
    bottom: 28px;
    z-index: 1045;
    display: inline-flex;
    align-items: center;
    gap: .45rem;
    min-height: 42px;
    padding: .55rem .9rem;
    border: 1px solid #D8E2EC;
    border-radius: 999px;
    background: #fff;
    color: #334155;
    box-shadow: 0 4px 16px rgba(15, 23, 42, .14);
    font-size: .85rem;
    font-weight: 600;
    transition: color .18s ease, border-color .18s ease, transform .18s ease;
}
.feedback-flutuante i { color: #D97706; }
.feedback-flutuante:hover { color: var(--turquoise-dark); border-color: var(--turquoise); transform: translateY(-2px); }
.feedback-estrelas { display: flex; flex-direction: row-reverse; justify-content: flex-end; gap: .2rem; }
.feedback-estrelas input { position: absolute; opacity: 0; pointer-events: none; }
.feedback-estrelas label { color: #CBD5E1; cursor: pointer; font-size: 2rem; line-height: 1.2; transition: color .12s ease; }
.feedback-estrelas input:checked ~ label,
.feedback-estrelas label:hover,
.feedback-estrelas label:hover ~ label { color: #F59E0B; }
.feedback-estrelas input:focus-visible + label { outline: 2px solid var(--turquoise-dark); outline-offset: 2px; border-radius: 3px; }
@media (max-width: 575.98px) {
    .feedback-flutuante { right: 88px; bottom: 20px; min-height: 40px; padding: .5rem .7rem; }
    .feedback-flutuante span { font-size: .78rem; }
}

/* Demo com a contagem ja acima do limite: o aviso tem de se ler como
   "excedeu", nunca como "4 de 3" (parece um erro da aplicacao). */
.demo-banner--excedido {
    background: #fee2e2;
    border: 1px solid #fca5a5;
    color: #7f1d1d;
}

/* ============================================================
   LANDING PAGE (/)
   Usa os mesmos tokens do design system (navy/turquesa/silver).
   ============================================================ */
.landing-body { background: var(--bg-body); }

/* --- Navegacao --- */
.lp-nav { background: var(--navy); padding: .85rem 0;
          box-shadow: 0 2px 16px rgba(6,18,43,.28); position: sticky; top: 0; z-index: 1030; }
.lp-brand img { height: 38px; width: auto; }
.lp-nav .navbar-toggler { border-color: rgba(255,255,255,.35); }
.lp-link { color: rgba(255,255,255,.88); font-weight: 500; }
.lp-link:hover, .lp-link:focus { color: var(--turquoise-light); }
.lp-btn-entrar { border-color: rgba(255,255,255,.5); color: #fff; }
.lp-btn-entrar:hover { background: rgba(255,255,255,.12); color: #fff; }
.lp-btn-teste { background: var(--turquoise); color: var(--navy-dark); font-weight: 600; border: 0; }
.lp-btn-teste:hover { background: var(--turquoise-light); color: var(--navy-dark); }

/* --- Hero ---
   O fundo e' um gradiente de malha: tres `radial-gradient` sobre a
   base escura. Nao e' decoracao por decasao - e' o que faz o
   mockup parecer iluminado de um canto em vez de colado. */
.lp-hero { position: relative; overflow: hidden;
           background:
             radial-gradient(900px 520px at 78% 18%, rgba(0,180,216,.26), transparent 62%),
             radial-gradient(700px 460px at 8% 82%, rgba(72,202,228,.16), transparent 60%),
             linear-gradient(150deg, var(--navy) 0%, var(--navy-light) 55%, #0d3a63 100%);
           color: #fff; padding: 5rem 0 5.5rem; }
.lp-eyebrow { display: inline-block; background: rgba(0,180,216,.16); color: var(--turquoise-light);
              border: 1px solid rgba(0,180,216,.4); border-radius: 999px;
              padding: .35rem .95rem; font-size: .84rem; font-weight: 600; margin-bottom: 1.25rem; }
.lp-titulo { font-size: clamp(2rem, 4.4vw, 3.15rem); font-weight: 800; line-height: 1.14;
             color: #fff; margin-bottom: 1.15rem; letter-spacing: -.02em; }
.lp-destaque { color: var(--turquoise-light); }
.lp-subtitulo { font-size: 1.12rem; color: rgba(255,255,255,.84); max-width: 34rem; margin-bottom: 2rem; }
/* Os dois botoes lado a lado sao mais largos que a coluna de texto: sem
   `flex-wrap` o secundario transbordava e ficava por baixo do mockup. */
.lp-cta { margin-bottom: 1.75rem; flex-wrap: wrap; }
.lp-cta .btn { max-width: 100%; }
.lp-btn-principal { background: var(--turquoise); color: var(--navy-dark); font-weight: 700; border: 0; padding: .8rem 1.7rem; }
.lp-btn-principal:hover { background: var(--turquoise-light); color: var(--navy-dark); }
.lp-btn-secundario { border: 1px solid rgba(255,255,255,.45); color: #fff; }
.lp-btn-secundario:hover { background: rgba(255,255,255,.12); color: #fff; }
.lp-btn-contato { border: 1px solid var(--turquoise); color: var(--turquoise-dark); background: #fff; font-weight: 600; }
.lp-btn-contato:hover { background: #F0FAFC; color: var(--turquoise-dark); }
.lp-garantias { list-style: none; padding: 0; margin: 0; display: flex; flex-wrap: wrap; gap: 1.25rem;
               color: rgba(255,255,255,.78); font-size: .9rem; }
.lp-garantias i { color: var(--turquoise-light); margin-right: .4rem; }

/* Prova social: pilha de retratos sobrepostos + texto. O `margin-left`
   negativo e' o que os empilha sem Position: absoluta - cada retrato
   fica centrado no anterior e o ultimo da a volta da pilha. */
.lp-prova { display: flex; align-items: center; gap: .95rem; margin-top: 1.9rem;
            padding-top: 1.6rem; border-top: 1px solid rgba(255,255,255,.14); }
.lp-prova-avatars { display: inline-flex; align-items: center; flex-shrink: 0; }
.lp-prova-avatars img, .lp-prova-mais { width: 36px; height: 36px; border-radius: 50%;
            border: 2px solid var(--navy); margin-left: -10px; object-fit: cover; }
.lp-prova-avatars img:first-child { margin-left: 0; }
.lp-prova-mais { display: inline-flex; align-items: center; justify-content: center;
                 /* `width: auto` e nao 36px: "500+" nao cabe num circulo
                    do mesmo tamanho dos retratos e transbordava para
                    fora. Pill com `min-width` mantem a sobreposicao. */
                 width: auto; min-width: 36px; padding: 0 .55rem;
                 background: rgba(255,255,255,.16); color: #fff;
                 font-size: .7rem; font-weight: 700; }
.lp-prova-texto { margin: 0; font-size: .92rem; color: rgba(255,255,255,.8); line-height: 1.35; }
.lp-prova-texto strong { color: #fff; font-weight: 800; }

/* --- Mockup do painel ---
   A aurora e' uma `div` a parte, atras, com dois `radial-gradient`.
   Faz o brilho desfocado SEM `filter` no painel - um filtro applies-se
   ao painel inteiro e arrastaria texto, icones e as bordas. */
.lp-mockup-aurora { position: absolute; inset: 6% -6% -8% -6%; z-index: 0; pointer-events: none;
                    background:
                      radial-gradient(46% 46% at 62% 34%, rgba(0,180,216,.55), transparent 70%),
                      radial-gradient(40% 40% at 26% 76%, rgba(72,202,228,.30), transparent 70%);
                    filter: blur(28px); }

/* Sombra em tres camadas: contacto,media e difusa. Uma unica sombra
   grande da um cartao "colado"; a de contacto pequena e' a que da a
   sensacao de estar sobre a superficie. */
.lp-mockup { position: relative; z-index: 1; background: #fff; border-radius: 16px;
             box-shadow:
               0 2px 4px rgba(6,18,43,.18),
               0 12px 28px rgba(6,18,43,.26),
               0 40px 80px rgba(0,180,216,.22),
               inset 0 1px 0 rgba(255,255,255,.9);
             overflow: hidden; }
.lp-mockup-topo { background: var(--silver-light); padding: .6rem .9rem; display: flex; align-items: center; gap: .4rem; }
.lp-dot { width: 10px; height: 10px; border-radius: 50%; background: var(--silver); display: inline-block; }
.lp-mockup-url { margin-left: .6rem; font-size: .76rem; color: var(--text-secondary); background: #fff;
                 border-radius: 6px; padding: .15rem .5rem; }
.lp-mockup-selo { margin-left: auto; display: inline-flex; align-items: center; gap: .3rem;
                  font-size: .66rem; font-weight: 700; letter-spacing: .04em;
                  color: var(--turquoise-dark); background: rgba(0,180,216,.16);
                  border-radius: 999px; padding: .1rem .5rem; }
.lp-mockup-corpo { padding: 1.1rem; display: grid; grid-template-columns: 1fr 1fr; gap: .7rem; }
.lp-kpi { background: var(--bg-body); border-radius: 9px; padding: .65rem .8rem; }
.lp-kpi .lbl { display: block; font-size: .68rem; color: var(--text-secondary); text-transform: uppercase; letter-spacing: .04em; }
.lp-kpi .val { display: block; font-size: 1.15rem; font-weight: 700; color: var(--navy); }
/* A variacao ao lado do numero e' o detalhe que faz um KPI ler-se
   como um dado e nao como um rotulo solto. */
.lp-kpi-trend { display: inline-flex; align-items: center; gap: .25rem; margin-top: .1rem;
                font-size: .66rem; font-weight: 600; color: var(--text-muted-slate); }
.lp-kpi-trend.up { color: var(--accent-success); }
.lp-kpi-trend.down { color: var(--accent-danger); }

/* Micro-tabela dentro do mockup: e' o que separa "um rectangulo com
   numeros" de "uma aplicacao a correr". */
.lp-mockup-tabela { grid-column: 1 / -1; background: #fff; border: 1px solid var(--border-color);
                    border-radius: 9px; overflow: hidden; }
.lp-mt-linha { display: flex; align-items: center; gap: .55rem; padding: .42rem .65rem;
               border-bottom: 1px solid var(--slate-100); }
.lp-mt-linha:last-child { border-bottom: 0; }
.lp-mt-avatar { width: 26px; height: 26px; border-radius: 50%; object-fit: cover; flex-shrink: 0; }
.lp-mt-nome { font-size: .78rem; font-weight: 600; color: var(--navy); flex: 1;
             overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lp-badge { display: inline-flex; align-items: center; gap: .25rem; flex-shrink: 0;
            font-size: .62rem; font-weight: 700; border-radius: 999px; padding: .12rem .5rem; }
.lp-badge i { font-size: .55rem; }
.lp-badge-ok { background: #DCFCE7; color: #15803D; }
.lp-badge-espera { background: #FEF3C7; color: #92400E; }

.lp-grafico { grid-column: 1 / -1; height: 92px; display: flex; align-items: flex-end; gap: .5rem;
              background: var(--bg-body); border-radius: 9px; padding: .7rem; }
.lp-barra { flex: 1; background: linear-gradient(180deg, var(--turquoise-light), var(--turquoise-dark));
            border-radius: 3px 3px 0 0; }
.lp-alerta { grid-column: 1 / -1; background: #FEF3C7; color: #92400E; border-left: 3px solid var(--accent-warning);
             border-radius: 6px; padding: .5rem .7rem; font-size: .82rem; font-weight: 600; }

/* --- Secoes --- */
.lp-seccao { padding: 4.5rem 0; }
.lp-seccao-alt { background: #EEF2F7; }
.lp-seccao-cab { max-width: 46rem; margin: 0 auto 2.75rem; text-align: center; }
.lp-seccao-titulo { font-size: clamp(1.5rem, 2.6vw, 2.1rem); font-weight: 800; color: var(--navy);
                    margin-bottom: .7rem; letter-spacing: -.015em; }
.lp-seccao-sub { color: var(--text-secondary); font-size: 1.02rem; }

/* --- Cards de recursos ---
   A curva e' `.16, 1, .3, 1` (easeOutExpo suave): o cartao acelera
   logo e abranda no fim, em vez da `ease` simetrica que da a
   sensacao de "...e agora volta". A transicao cobre o `transform`
   E a sombra - mexer so' na transform deixa a luz "atras" do rato. */
.lp-card { position: relative; overflow: hidden; background: #fff;
           border: 1px solid var(--border-color); border-radius: var(--border-radius);
           padding: 1.6rem; height: 100%;
           transition: transform .32s cubic-bezier(.16, 1, .3, 1),
                       box-shadow .32s cubic-bezier(.16, 1, .3, 1),
                       border-color .32s ease; }
.lp-card:hover { transform: translateY(-5px);
                box-shadow: 0 10px 26px rgba(10,31,63,.10), 0 22px 48px rgba(10,31,63,.12);
                border-color: var(--turquoise-light); }
/* O realce de texto do `realce()` do template. */
.lp-card-texto strong { color: var(--navy); font-weight: 700; }
/* Filete que cresce a partir da esquerda: da a direccao do gesto
   sem precisar de seta. */
.lp-card-linha { position: absolute; left: 0; right: 0; bottom: 0; height: 3px;
                 background: linear-gradient(90deg, var(--turquoise), var(--turquoise-light));
                 transform: scaleX(0); transform-origin: left;
                 transition: transform .38s cubic-bezier(.16, 1, .3, 1); }
.lp-card:hover .lp-card-linha { transform: scaleX(1); }

/* Icones: fundo pastel + tinta forte do mesmo tom, com um anel
   interior. E' o efeito DuoTone sem `fa-duotone` (que e' PRO). */
.lp-card-icone { display: inline-flex; align-items: center; justify-content: center; width: 48px; height: 48px;
                 border-radius: 13px; font-size: 1.15rem; margin-bottom: .95rem;
                 transition: transform .32s cubic-bezier(.16, 1, .3, 1),
                             box-shadow .32s cubic-bezier(.16, 1, .3, 1); }
.lp-card:hover .lp-card-icone { transform: scale(1.06) rotate(-3deg); }

.lp-card[data-tom="rosa"]     .lp-card-icone { background: #FCE7F3; color: #BE185D; box-shadow: inset 0 0 0 1px rgba(190,24,93,.14); }
.lp-card[data-tom="ambar"]    .lp-card-icone { background: #FEF3C7; color: #B45309; box-shadow: inset 0 0 0 1px rgba(180,83,9,.16); }
.lp-card[data-tom="violeta"]  .lp-card-icone { background: #EDE9FE; color: #6D28D9; box-shadow: inset 0 0 0 1px rgba(109,40,217,.14); }
.lp-card[data-tom="azul"]     .lp-card-icone { background: #DBEAFE; color: #1D4ED8; box-shadow: inset 0 0 0 1px rgba(29,78,216,.14); }
.lp-card[data-tom="esmeralda"] .lp-card-icone { background: #D1FAE5; color: #047857; box-shadow: inset 0 0 0 1px rgba(4,120,87,.14); }
.lp-card[data-tom="ciano"]    .lp-card-icone { background: #CFFAFE; color: #0E7490; box-shadow: inset 0 0 0 1px rgba(14,116,144,.16); }

.lp-card-titulo { font-size: 1.06rem; font-weight: 700; color: var(--navy); margin-bottom: .5rem; }
.lp-card-texto { color: var(--text-secondary); font-size: .93rem; margin: 0; line-height: 1.6; }

/* --- Planos --- */
/* O `padding-top` de 3rem e' IGUAL nos tres cartoes, nao so' no
   destaque. Era o que faltava: com o espaco extra apenas no cartao
   escalado, os tres precos ficavam a alturas diferentes e a tabela de
   planos deixava de se ler em linhas. O espaco reserva o lugar da
   faixa suspensa, que vive FORA do cartao (`top:-14px`). */
.lp-plano { background: #fff; border: 1px solid var(--border-color); border-radius: 16px;
            padding: 3rem 1.6rem 1.9rem; height: 100%; position: relative; }
/* O plano em destaque cresce em LARGURA e nao so' em altura: com
   `scale` a sombra escalaria com ele e ficaria mole. E' por isso que a
   escala vai na COLUNA, e o cartao fica com a sombra e a borda. */
/* O anel turquesa e' `box-shadow`, nao `border: 2px`. Uma borda mais
   grossa mudava a caixa do cartao em 1px e empurrava o texto para
   baixo face aos irmaos; o anel e' desenhado por fora e a caixa
   interior fica igual a dos outros. */
.lp-coluna-destaque { position: relative; z-index: 2; }
.lp-plano-destaque { border-color: var(--turquoise);
                     box-shadow: 0 0 0 2px rgba(0,180,216,.5),
                                 0 14px 32px rgba(10,31,63,.14),
                                 0 34px 70px rgba(0,180,216,.22); }
/* Faixa suspensa: `top` negativo tira-a para fora do cartao, e o
   `translateX(-50%)` com `left:50%` centra-a sem `flex`. O padding
   de cima do cartao e' o espaco vazio que ela ocupa em cima. */
.lp-plano-faixa { position: absolute; top: -14px; left: 50%; transform: translateX(-50%);
                  white-space: nowrap; margin: 0; padding: .34rem .95rem;
                  background: linear-gradient(135deg, var(--turquoise-light), var(--turquoise));
                  color: var(--navy-dark); font-size: .72rem; font-weight: 800;
                  text-transform: uppercase; letter-spacing: .06em;
                  border-radius: 999px;
                  box-shadow: 0 8px 18px rgba(0,150,176,.38); }
.lp-plano-nome { font-size: 1.22rem; font-weight: 700; color: var(--navy); margin-bottom: .3rem; }
.lp-plano-desc { color: var(--text-secondary); font-size: .9rem; min-height: 2.6em; margin-bottom: 1rem; }
.lp-plano-preco { margin-bottom: .2rem; color: var(--navy); display: flex; align-items: baseline;
                  flex-wrap: wrap; gap: .15rem .35rem; }
.lp-moeda { font-size: 1rem; font-weight: 600; }
.lp-valor { font-size: 2.3rem; font-weight: 800; letter-spacing: -.02em; line-height: 1.1; }
.lp-periodo { color: var(--text-secondary); font-size: .92rem; }
.lp-plano-nota { flex-basis: 100%; font-size: .78rem; color: var(--text-secondary); }
.lp-plano-economia { font-size: .82rem; color: var(--text-secondary); margin-bottom: 1.1rem; }
.lp-plano-economia strong { color: #15803D; }
.lp-btn-plano { background: var(--navy); color: #fff; font-weight: 600; border: 0; }
.lp-btn-plano:hover { background: var(--navy-light); color: #fff; }
.lp-plano-lista { list-style: none; padding: 0; margin: 1.2rem 0 0; font-size: .9rem; color: var(--text-secondary); }
.lp-plano-lista li { display: flex; align-items: flex-start; gap: .6rem; padding: .3rem 0; }
/* O `✓` era texto solto; agora e' um disco tintado com o icone
   dentro. Alem de se ler melhor a distancia, o leitor de ecra ja nao
   depende de um caractere que screen readers anunciam de formas
   diferentes. */
.lp-check { flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center;
            width: 20px; height: 20px; margin-top: .1rem; border-radius: 50%;
            background: #DCFCE7; color: #059669; font-size: .58rem; }

/* --- Interruptor Mensal / Anual ---------------------------------
   CSS puro: a `checkbox` esta escondida mas NAO `display:none` (sairia
   do fluxo de foco do teclado). O `~` chega aos irmaos seguintes.

   O estado por omissao e' MENSAAL. E' o que uma landing tem de
   mostrar primeiro: o preco mensal e' o preco de referencia, e o anual
   e' o desconto que se oferece a quem ligar o interruptor. */
.lp-troca-input { position: absolute; width: 1px; height: 1px; margin: -1px;
                  padding: 0; overflow: hidden; clip: rect(0 0 0 0);
                  clip-path: inset(50%); white-space: nowrap; border: 0; }
.lp-troca { display: inline-flex; align-items: center; gap: .85rem; margin-top: 1.5rem;
            padding: .45rem 1rem; background: #fff; border: 1px solid var(--border-color);
            border-radius: 999px; box-shadow: var(--shadow-sm); }
.lp-troca-meses, .lp-troca-anual { display: inline-flex; align-items: center; gap: .4rem;
            font-size: .9rem; font-weight: 600;
            transition: color .2s ease; }
/* Rotulo activo = tinta escura; inactivo = cinza de contexto. */
.lp-troca-meses { color: var(--navy); }
.lp-troca-anual { color: var(--text-muted-slate); }
.lp-troca-input:checked ~ .lp-seccao-cab .lp-troca-meses { color: var(--text-muted-slate); }
.lp-troca-input:checked ~ .lp-seccao-cab .lp-troca-anual { color: var(--navy); }
.lp-troca-poupa { background: #DCFCE7; color: #15803D; font-size: .7rem; font-weight: 700;
                  padding: .1rem .45rem; border-radius: 999px; }
.lp-troca-pista { position: relative; display: inline-flex; align-items: center;
                  width: 46px; height: 26px; border-radius: 999px; cursor: pointer;
                  background: var(--silver);
                  transition: background .26s cubic-bezier(.16, 1, .3, 1); }
.lp-troca-bola { position: absolute; left: 3px; width: 20px; height: 20px; border-radius: 50%;
                 background: #fff; box-shadow: 0 2px 5px rgba(10,31,63,.28);
                 transition: transform .26s cubic-bezier(.16, 1, .3, 1); }
.lp-troca-input:checked ~ .lp-seccao-cab .lp-troca-pista { background: var(--turquoise); }
.lp-troca-input:checked ~ .lp-seccao-cab .lp-troca-bola { transform: translateX(20px); }
/* `:focus-visible` no `input` e' o que se ve: o `label` nao e' focavel
   e um contorno posto no `label` desapareceria ao clicar nele. */
.lp-troca-input:focus-visible ~ .lp-seccao-cab .lp-troca-pista {
  outline: 3px solid rgba(0,180,216,.5); outline-offset: 2px; }

/* Precos: ambos no DOM (o teste de precos le-os, e um ecra sem CSS
   mostra um deles em vez de nenhum). O que muda e' qual esta visivel. */
.lp-preco-anual { display: none; }
.lp-troca-input:checked ~ .row .lp-preco-mensal { display: none; }
.lp-troca-input:checked ~ .row .lp-preco-anual { display: flex; }
.lp-plano-economia { display: none; }
.lp-troca-input:checked ~ .row .lp-plano-economia { display: block; }

/* --- Sobre --- */
.lp-sobre-texto { color: var(--text-secondary); font-size: 1.02rem; margin-bottom: 1.5rem; }
.lp-sobre-lista { list-style: none; padding: 0; margin: 0; }
.lp-sobre-lista li { padding: .55rem 0; color: var(--text-secondary); }
.lp-sobre-lista i { color: var(--turquoise-dark); width: 1.5rem; margin-right: .5rem; }
.lp-sobre-lista strong { color: var(--navy); }
.lp-stat { background: #fff; border: 1px solid var(--border-color); border-radius: var(--border-radius);
           padding: 1.2rem; text-align: center; height: 100%; }
.lp-stat-num { display: block; font-size: 1.7rem; font-weight: 800; color: var(--turquoise-dark); }
.lp-stat-rot { display: block; font-size: .9rem; font-weight: 600; color: var(--navy); }
.lp-stat-sub { display: block; font-size: .78rem; color: var(--text-secondary); }

/* --- Depoimentos --- */
.lp-depoimento { background: #fff; border: 1px solid var(--border-color); border-radius: var(--border-radius);
                 padding: 1.5rem; height: 100%; margin: 0; display: flex; flex-direction: column;
                 transition: transform .32s cubic-bezier(.16, 1, .3, 1),
                             box-shadow .32s cubic-bezier(.16, 1, .3, 1); }
.lp-depoimento:hover { transform: translateY(-5px);
                       box-shadow: 0 10px 26px rgba(10,31,63,.10), 0 22px 48px rgba(10,31,63,.12); }
.lp-estrelas { color: var(--accent-warning); margin-bottom: .8rem; letter-spacing: 2px; }

.lp-depoimento blockquote p { color: var(--text-secondary); font-size: .94rem; margin-bottom: 1.1rem; }
.lp-depoimento figcaption { display: flex; align-items: center; gap: .7rem; margin-top: auto; font-size: .88rem; }
.lp-depoimento figcaption strong { color: var(--navy); }
.lp-depoimento figcaption small { color: var(--text-secondary); }
/* Retrato real: `object-fit` corta a imagem circular sem distorcer,
   e o `box-shadow` interior da um fio de luz na borda. */
.lp-avatar { width: 48px; height: 48px; border-radius: 50%; object-fit: cover;
             flex-shrink: 0; border: 2px solid #fff;
             box-shadow: 0 0 0 1px var(--border-color), 0 4px 10px rgba(10,31,63,.12); }
.lp-dep-quem { display: flex; flex-direction: column; line-height: 1.35; min-width: 0; }
/* Selo de empresa: e' a prova de credibilidade que substitui um link
   de perfil. Nao aponta para lado nenhum de proposito - estas sao
   personas ficticias, e um link para um perfil real seria falso. */
.lp-dep-empresa { display: inline-flex; align-items: center; gap: .3rem; margin-top: .28rem;
                  font-size: .74rem; font-weight: 600; color: var(--text-muted-slate);
                  background: var(--slate-100); border-radius: 999px; padding: .1rem .5rem;
                  align-self: flex-start; max-width: 100%; }
.lp-dep-marca { flex-shrink: 0; color: var(--turquoise-dark); opacity: .9; }

/* --- CTA final --- */
.lp-cta-final { position: relative; overflow: hidden; isolation: isolate;
                background:
                  radial-gradient(700px 340px at 88% 8%, rgba(0,180,216,.30), transparent 62%),
                  radial-gradient(560px 300px at 10% 96%, rgba(72,202,228,.18), transparent 62%),
                  linear-gradient(140deg, var(--navy) 0%, var(--navy-light) 100%);
                color: #fff; border-radius: 20px; padding: 3.4rem 2rem; text-align: center;
                box-shadow: 0 20px 50px rgba(10,31,63,.22); }
/* O padrao fica ATRAS do texto (`z-index:-1` + `isolation:isolate` no
   pai): se viesse a frente, a grelha passava por cima das palavras e
   tirava-lhe a legibilidade. */
.lp-cta-padrao { position: absolute; inset: 0; width: 100%; height: 100%;
                 z-index: -1; pointer-events: none; }
.lp-cta-final > *:not(.lp-cta-padrao) { position: relative; z-index: 1; }
.lp-cta-final .lp-seccao-titulo { color: #fff; }
.lp-cta-final .lp-seccao-sub { color: rgba(255,255,255,.82); max-width: 40rem; margin: 0 auto 1.8rem; }

/* --- Rodape --- */
.lp-rodape { background: var(--navy-dark); color: rgba(255,255,255,.72); padding: 3.2rem 0 1.6rem; }
/* LANDING PAGE: sticky footer */
body.landing-body{display:flex;flex-direction:column;min-height:100vh}
main#conteudoPrincipal{flex:1 0 auto}
footer.lp-rodape{flex-shrink:0}
.lp-rodape-titulo { font-size: .8rem; font-weight: 700; text-transform: uppercase; letter-spacing: .08em;
                    color: #fff; margin-bottom: .9rem; }
.lp-rodape-lista { list-style: none; padding: 0; margin: 0; font-size: .9rem; }
.lp-rodape-lista li { padding: .22rem 0; }
.lp-rodape-lista a, .lp-rodape-sobre a { color: rgba(255,255,255,.72); text-decoration: none; }
.lp-rodape-lista a:hover, .lp-rodape-sobre a:hover { color: var(--turquoise-light); text-decoration: underline; }
.lp-rodape-sobre { font-size: .88rem; max-width: 24rem; }
.lp-rodape-linha { border-color: rgba(255,255,255,.14); margin: 2rem 0 1rem; }
.lp-rodape-copy { font-size: .82rem; color: rgba(255,255,255,.6); margin: 0; }
.lp-rodape-nota { display: block; margin-top: .2rem; font-size: .78rem; opacity: .8; }

/* --- Responsivo ---
   A ordem dos breakpoints desce (991 -> 575): cada bloco só escreve o
   que muda nessa largura, para não ter de reescrever a regra base. */
@media (max-width: 991.98px) {
  .lp-hero { padding: 3.2rem 0 3.6rem; }
  .lp-seccao { padding: 3.4rem 0; }
  .lp-acoes { margin-top: .8rem; }
  .lp-acoes .btn { width: 100%; }
  .lp-sobre-texto { margin-top: 1.5rem; }
  /* A coluna do destaque fica a zero: com `scale` a 1.05 em cima, o
     cartao transbordava as margens do contentor no separador. A
     hierarquia passa a ser a borda turquesa + a faixa. */
  .lp-coluna-destaque { z-index: auto; }
  .lp-mockup-aurora { inset: 0 -4% -6% -4%; }
}
@media (min-width: 992px) {
  /* Só no desktop: em coluna unica o "cartao maior" era so um cartao
     deslocado, sem espaco para a faixa suspensa respirar.
     `transform-origin: top center` e' o que mantem o topo do cartao
     (e a faixa) alinhado com os irmaos: escalar a partir do centro
     empurrava o titulo do plano para baixo e o nome ficava desalinhado
     dos outros dois. O excesso de altura cai no vazio de baixo. */
  .lp-coluna-destaque { transform: scale(1.045); transform-origin: top center; }
}
@media (max-width: 767.98px) {
  .lp-prova { flex-direction: column; align-items: flex-start; gap: .75rem; }
  .lp-troca { flex-wrap: wrap; justify-content: center; gap: .6rem; }
  .lp-troca-anual { flex-wrap: wrap; }
}
@media (max-width: 575.98px) {
  .lp-mockup-corpo { grid-template-columns: 1fr; }
  .lp-mockup-url, .lp-mockup-selo { display: none; }
  .lp-valor { font-size: 1.9rem; }
  .lp-titulo { font-size: 1.9rem; }
  .lp-cta-final { padding: 2.4rem 1.2rem; }
  .lp-cta-final .btn { width: 100%; }
  .lp-plano-faixa { font-size: .66rem; padding: .3rem .75rem; }
  .lp-depoimento figcaption { align-items: flex-start; }
}
/* Quem pede menos movimento nao o recebe: as microinteracoes somem,
   mas a informacao (o filete, a cor do badge) mantem-se - `transform`
   e' o unico que se corta, nunca o `color`. */
@media (prefers-reduced-motion: reduce) {
  .lp-card, .lp-depoimento, .lp-card-icone, .lp-card-linha,
  .lp-troca-pista, .lp-troca-bola, .lp-troca-meses, .lp-troca-anual {
    transition: none;
  }
  .lp-card:hover, .lp-depoimento:hover, .lp-card:hover .lp-card-icone {
    transform: none;
  }
  .lp-card-linha { transform: scaleX(1); }
}

/* O link do backoffice distingue-se do menu do cliente: e a interface do
   dono da plataforma, nao mais um modulo de RH. */
.sidebar-link-superadmin { border-left: 3px solid #7C3AED; }
.sidebar-link-superadmin i { color: #A78BFA; }
.sidebar-link-superadmin.active,
.sidebar-link-superadmin:hover { background: rgba(124, 58, 237, .12); }

/* ============================================================
   DOCUMENTOS LEGAIS (Termos de Uso / Política de Privacidade)
   Documentos longos em coluna estreita: sem isto o texto de um
   contrato fica ilegivel no telemóvel e a tabela estoura a pagina.
   ============================================================ */
.legal-doc { max-width: 860px; }
.legal-doc h2 { font-size: 1.02rem; font-weight: 700; margin: 2rem 0 .6rem;
  padding-bottom: .35rem; border-bottom: 1px solid #E2E4F0; }
.legal-doc h2:first-of-type { margin-top: 1.25rem; }
.legal-doc h3 { font-size: .92rem; font-weight: 700; margin: 1.2rem 0 .35rem; }
.legal-doc p, .legal-doc li { font-size: .93rem; line-height: 1.65; color: #1B1F3B; }
.legal-doc ol, .legal-doc ul { padding-left: 1.35rem; margin: .4rem 0 .8rem; }
.legal-doc li { margin-bottom: .3rem; }
.legal-doc strong { font-weight: 700; }
/* Numeracao de clausulas (1.1, 1.2, ...) preservada como texto. */
.legal-doc .clausula { display: flex; gap: .6rem; margin-bottom: .55rem; }
.legal-doc .clausula > .num { flex: 0 0 2.6rem; font-weight: 600;
  color: #5B6178; font-variant-numeric: tabular-nums; }
.legal-doc .clausula > .txt { flex: 1; min-width: 0; }
/* Marcadores de preenchimento: tem de saltar aos olhos, senao sao
   publicados por esquecimento e invalidam o documento. */
.legal-doc .pendente {
  background: #FEF3C7; border-bottom: 2px dotted #B45309;
  padding: 0 .2rem; border-radius: 3px; font-weight: 600; color: #78350F;
  white-space: normal;
}
.legal-doc .tabela-legal { font-size: .87rem; }
.legal-doc .tabela-legal thead th { background: #F4F5FA; color: #1B1F3B;
  font-size: .74rem; text-transform: uppercase; letter-spacing: .04em;
  white-space: nowrap; }
/* A coluna da categoria e curta: fixar-lhe o minimo rouba metade do
   ecra a categorias longas como "Identificacao e Qualificacao". */
.legal-doc .tabela-legal tbody th { min-width: 9rem; }
.legal-doc .tabela-legal td { vertical-align: top; }
@media (max-width: 575.98px) {
  .legal-doc { font-size: .95rem; }
  /* Com `nowrap` a 1a coluna ocupa quase o ecra inteiro em 360px e a
     base legal fica invisivel. A tabela continua a rolar no wrapper. */
  .legal-doc .tabela-legal thead th { white-space: normal; }
  .legal-doc .tabela-legal tbody th { min-width: 7.5rem; font-size: .78rem; }
  .legal-doc .clausula { flex-direction: column; gap: .1rem; }
  .legal-doc .clausula > .num { flex: none; }
}

/* ============================================================
   IMPERSONACAO - faixa de aviso na aplicacao do CLIENTE
   Sem isto o dono assume a sessao, e o unico botao de saida
   esta no layout do backoffice, que ele deixa de ver.
   ============================================================ */
.faixa-impostor {
  display: flex; flex-wrap: wrap; align-items: center; gap: .5rem 1rem;
  background: #FEF3C7; color: #78350F; font-weight: 600; font-size: .9rem;
  border-bottom: 3px solid #F59E0B; padding: .6rem 1rem;
  position: sticky; top: 0; z-index: 1030;
}
.faixa-impostor .fa-user-secret { color: #B45309; }
.faixa-impostor .btn { margin-left: auto; }
/* =====================================================================
   SIDEBAR: SECCOES ESTATICAS E BLOCO DE ADMINISTRACAO
   =====================================================================
   Agrupamento fixo, sem expansao. Uma lista de 29 ligacoes agrupada em
   divisores fixos le-se de cima a baixo sem nenhum clique; a sanfona
   obrigava a abrir e a fechar para ver o que existia.

   Os cabecalcos sao `aria-hidden`: sao texto de ornamentacao visual que
   o leitor de ecra announcesaria a cada navegacao sem acrescentar nada.
   O agrupamento continua a ser perceptivel pelo titulo de cada link.

   Os icones dos ITENS ficam escondidos por omissao e so aparecem com a
   sidebar recolhida a barra de icones. Retira-los do HTML partia esse
   modo: uma barra de 76px sem um unico icone dentro. O efeito pedido -
   maximum limpeza visual - e' o do menu aberto, que e' o que se ve.
   ===================================================================== */
/* O `li` e' um CONTENTOR: dentro dele vivem o cabecalho e a lista de
   links. Tem de ser bloco. Com `display:flex` os dois ficavam lado a
   lado - o titulo a esquerda, a lista a direita, a transbordar - que
   foi o que se viu na barra. */
.sidebar-secao {
    display: block;
    margin-top: 4px;
}
.sidebar-secao:first-child { margin-top: 0; }

/* O rotulo da secao: icone + nome, em caixa alta. */
.sidebar-secao__cabecalho {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 18px 14px 8px;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.09em;
    text-transform: uppercase;
    color: rgba(255, 255, 255, 0.4);
    border-radius: 8px;
    border-bottom: 1px solid rgba(255, 255, 255, .1);
    margin: 0 2px 5px;
    user-select: none;
}
.sidebar-secao:first-child .sidebar-secao__cabecalho { padding-top: 6px; }
/* So o icone do CABECALHO encolhe. `.sidebar-secao i` apanhava tambem
   os icones dos links e deixava-os a 0.72rem. */
.sidebar-secao__cabecalho > i { font-size: 0.72rem; opacity: 0.85; flex: 0 0 auto; }

/* Icone do item: escondido por omissao, visivel na barra recolhida. */
.sidebar-menu .sidebar-link > i { display: none; }
.sidebar-collapsed .sidebar-menu .sidebar-link > i { display: block; }

/* --- Bloco de administracao ------------------------------------------- */
.sidebar-admin {
    margin: 14px 12px 4px;
    padding: 10px 6px 8px;
    border: 1px solid rgba(255, 255, 255, 0.12);
    border-radius: 10px;
    background: rgba(255, 255, 255, 0.04);
}
.sidebar-admin__titulo {
    display: flex; align-items: center; gap: 7px;
    padding: 0 8px 8px;
    font-size: 10px; font-weight: 700; letter-spacing: 0.09em;
    text-transform: uppercase; color: rgba(255, 255, 255, 0.45);
}
.sidebar-admin .sidebar-link { font-size: 12.5px; padding: 8px 12px !important; }

/* Recolhida: o bloco encolhe para a coluna de icones. O texto do
   titulo desaparece e o icone do link fica centrado. A moldura
   (borda e fundo) sao decoracao de um bloco largo: numa coluna de
   70px so ocupavam espaco e empurravam o conteudo. */
.sidebar-collapsed .sidebar-admin {
    margin: 10px 0 4px;
    padding: 0;
    border: 0;
    background: none;
}
.sidebar-collapsed .sidebar-admin__titulo { display: none !important; }
.sidebar-collapsed .sidebar-admin .sidebar-link { padding: 12px 0 !important; }

/* =====================================================================
   MEU PERFIL: avatar, abas e cartoes
   =====================================================================
   DIMENSOES FIXAS E `overflow: hidden`

   A fotografia tem largura e altura fixas e o `object-fit: cover` corta
   ao quadrado. Sem isso, uma imagem que falha deixa o browser desenhar
   o TEXTO `alt` no lugar dela - e esse texto ("Fotografia de perfil de
   Alysson") era o que partia o botao da topbar e o layout do menu.

   O `overflow: hidden` garante que nada transborda a caixa, mesmo que
   o `alt` apareca por um instante antes do `onerror` disparar.

   O avatar sem fotografia e' um disco com as INICIAIS. Um icone
   generico nao dizia quem era, e com varias contas abertas no mesmo
   ecra (suporte multi-empresa) a distinciaciao e' o que interessa. */
.topbar-avatar {
    width: 32px; height: 32px;
    flex: 0 0 32px;
    flex-shrink: 0;
    border-radius: 50%;
    overflow: hidden;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.avatar-preview {
    width: 46px; height: 46px;
    flex: 0 0 46px;
    border-radius: 50%;
    overflow: hidden;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: var(--bg-hover);
    color: var(--text-secondary);
}
.avatar-grande {
    width: 120px; height: 120px;
    margin: 0 auto;
    border-radius: 50%;
    overflow: hidden;
    display: flex;
    align-items: center;
    justify-content: center;
}
/* A imagem preenche a caixa e corta ao quadrado. */
.avatar-img {
    width: 100%; height: 100%;
    object-fit: cover;
    display: block;
}
/* ESTA regra e' a que mantem o cabecalho com 24 px.

   `.avatar-img` acima diz `width/height: 100%` e vem DEPOIS de
   `.topbar-avatar`. Com a MESMA especificidade (0,1,0), o que aparece
   por ultimo ganha - logo o `height:100%` vencia o `height:24px`.

   E o que acontecia: o botao do cabecalho ficava com a ALTURA NATURAL
   da fotografia (um retrato e' alto), ou seja, um oval de meio
   centimetro de largura por varios de altura, e o cabecalho inteiro
   esticava ao carregar uma imagem.

   Por isso as caixas de tamanho fixo sao escritas aqui, com as DUAS
   classes: a especificidade passa a 0,2,0 e ganha ao `.avatar-img`. */
/* O avatar da topbar tem 32 px, e o `!important` e' obrigatorio.

   `.avatar-preview.avatar-img` (46 px) vem DEPOIS desta regra no
   ficheiro. Sem `!important`, um elemento que tivesse as duas classes
   ficaria com 46 px dentro de um botao que assume 32 - e voltava a
   esticar a barra. O `!important` garante que o tamanho do cabecalho
   e' o ultimo a falar, aconteca o que acontecer mais abaixo. */
.topbar-avatar.avatar-img,
.topbar-avatar.avatar-iniciais {
    flex: 0 0 32px !important;
    width: 32px !important;
    height: 32px !important;
    max-width: 32px !important;
    max-height: 32px !important;
    border-radius: 50% !important;
    object-fit: cover !important;
    overflow: hidden !important;
}

/* ---- BOTAO DO PERFIL NA TOPBAR: LARGURA COMPACTA E ESTAVEL ----
   CAUSA RAIZ do botao "esticado": o `style.css` e' servido SEM
   cache-buster, e o Flask entrega `/static/` com cache de 12 horas.
   O browser continuava a desenhar a versao antiga desta folha, onde o
   botao nao tinha limite nenhum. A correccao do CSS so aparece depois
   de o browser reler o ficheiro - e e' por isso que o `?v=` foi
   acrescentado ao `<link>` em `base.html`.

   Estas regras usam `!important` de proposito: o botao e' um item flex
   dentro de `.topbar-right`, e sem `!important` qualquer regra do
   Bootstrap ou um utilitario de spacing aplicado depois voltaria a
   estica-lo. Aqui o objectivo e' que ISTO seja o ultimo a falar,
   aconteca o que acontecer no resto da folha. */
#perfilDropdown,
.topbar-avatar-wrapper {
    width: auto !important;
    max-width: fit-content !important;
    flex: 0 0 auto !important;
    margin-left: auto !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    /* `min-width: 0` e' o que AUTORIZA o encolhimento: um item flex
       tem `min-width: auto` por omissao e nunca encolhe abaixo do
       conteudo, o que tornaria as regras acima inertes. */
    min-width: 0 !important;
    overflow: hidden !important;
    /* A caixa nunca cresce com a fotografia: um retrato e' alto, e sem
       isto voltava a esticar a barra verticalmente. */
    height: auto !important;
    max-height: none !important;
}
/* A caixa que envolve o botao. Mesma razao, e sem `:has()` - o
   suporte e' desigual entre navegadores e a proteccao desapareceria
   em alguns sem aviso. */
.topbar-right > .dropdown {
    flex: 0 0 auto !important;
    width: auto !important;
    max-width: fit-content !important;
    min-width: 0 !important;
}
/* A imagem nunca empurra o botao: 32 px e' o tamanho do avatar.
   `object-fit: cover` + `overflow: hidden` sao o que garante que a
   fotografia preenche o circulo em vez de ser distorcida. */
#perfilDropdown .topbar-avatar,
#perfilDropdown .avatar-img,
.topbar-avatar-wrapper .topbar-avatar {
    width: 32px !important;
    height: 32px !important;
    max-width: 32px !important;
    max-height: 32px !important;
    flex: 0 0 32px !important;
    border-radius: 50% !important;
    object-fit: cover !important;
    overflow: hidden !important;
}

/* ---- RESPONSIVIDADE ----
   Em ecrans estreitos a barra encolhe, e o avatar e' a ultima coisa
   que pode desaparecer: e' a saida para o menu e para "Sair". Por isso
   fica SEMPRE visivel e clicavel, em qualquer largura. */
@media (max-width: 767.98px) {
    /* Reduz-se o espaco em volta, nunca o avatar. */
    .topbar-right { gap: 4px !important; }
    .topbar-right > .dropdown { flex: 0 0 auto !important; width: auto !important; }
    /* Proibido explicitamente: sem isto uma regra herdada (ou um
       `d-none` por engano no template) deixaria o avatar invisivel
       no telemóvel. */
    #perfilDropdown,
    #perfilDropdown .topbar-avatar,
    .topbar-avatar-wrapper,
    .topbar-avatar-wrapper .topbar-avatar {
        display: inline-flex !important;
        visibility: visible !important;
        opacity: 1 !important;
    }
    /* A seta do menu tambem tem de continuar visivel: e' o que diz ao
       utilizador que o avatar abre uma lista. */
    #perfilDropdown.dropdown-toggle::after,
    #perfilDropdown .dropdown-toggle::after {
        display: inline-block !important;
        visibility: visible !important;
        margin-left: .35rem !important;
    }
    /* O avatar mantem o tamanho - encolhe-lo para 16 px borderline
       deixaria de se reconhecer. */
    #perfilDropdown .topbar-avatar {
        width: 32px !important;
        height: 32px !important;
        flex: 0 0 32px !important;
    }
}

.avatar-preview.avatar-img,
.avatar-preview.avatar-iniciais {
    flex: 0 0 46px;
    width: 46px;
    height: 46px;
}
/* As iniciais: disco cinzento com a letra ao centro. */
.avatar-iniciais {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: var(--bg-hover);
    color: var(--text-secondary);
    font-weight: 700;
    line-height: 1;
    text-align: center;
    border-radius: 50%;
    overflow: hidden;
}
/* As iniciais crescem com o disco: 0.62rem era a escala do avatar de
   24 px e ficavam pequenas dentro dos 32 px. */
.topbar-avatar.avatar-iniciais { font-size: .78rem; }
.avatar-preview.avatar-iniciais { font-size: .95rem; }
.avatar-grande.avatar-iniciais { font-size: 2.2rem; }
/* A imagem que falhou deu lugar ao disco: mantem o tamanho para o
   botao da topbar nao mudar de largura quando a foto carrega. */
.avatar-quebrado { flex-shrink: 0; }
/* A FOTO AMPLIADA, no modal do menu do utilizador.

   Aqui a imagem NAO e' cortada ao quadrado: o objectivo e' ver a foto
   como ela e'. Por isso `contain`, e nao `cover`.

   Os limites (`max-width`/`max-height`) sao o que impede que uma foto
   de 4000x3000 px empurre o modal para fora do ecra - e o `height:auto`
   mantem a proporcao em vez de a deformar. */
.avatar-ampliado {
    max-width: 100%;
    max-height: 70vh;
    width: auto;
    height: auto;
    object-fit: contain;
    border-radius: 12px;
    background: var(--bg-hover);
    margin: 0 auto;
}
/* As iniciais em grande, para quem nao tem fotografia. A caixa e'
   quadrada e limitada como a imagem: as iniciais nunca devem alargar
   o modal. */
.avatar-ampliado.avatar-iniciais {
    width: min(320px, 78vw);
    height: min(320px, 78vw);
    max-height: 70vh;
    font-size: 4rem;
}
/* O avatar do perfil como BOTAO que abre a foto em grande.

   O `button` do Bootstrap traz padding, borda e um `line-height` que
   desalinham o disco. Aqui a caixa circular de 120 px e' restaurada e
   o botao ganha so o que lhe compete: cursor e foco visivel - um
   botao que abre um modal tem de parecer botao. */
.avatar-ampliavel {
    cursor: pointer;
    line-height: 1;
}
.avatar-ampliavel:focus-visible {
    outline: 2px solid var(--turquoise);
    outline-offset: 3px;
}
/* --- O "X" que remove a fotografia, no canto do avatar ---------------
   Substitui o botao textual "Remover foto": uma accao rara que
   competia com "Alterar Foto" pela atencao. Em 28 px, encostado ao
   canto, faz o mesmo trabalho sem ocupar espaco.

   O `position:absolute` e' possivel porque o contentor
   (`.position-relative` no template) e' o ponto de referencia - e nao
   a pagina, o que deixaria o botao solto num canto qualquer. */
.avatar-remover-foto {
    position: absolute;
    top: 4px;
    right: 4px;
    width: 28px;
    height: 28px;
    padding: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: none;
    border-radius: 50%;
    /* Fica acima do avatar: sem isto o clique ia para a imagem, que
       abre o modal. */
    z-index: 2;
    cursor: pointer;
    font-size: .8rem;
    line-height: 1;
    color: var(--text-light);
    background: var(--text-secondary);
    box-shadow: var(--shadow-sm);
    /* Um circulo sobre fotografia precisa de contorno: sem isto o
       "X" desaparece em cima de uma foto escura. */
    outline: 2px solid var(--bg-card);
    transition: background-color var(--transition-speed) ease;
}
.avatar-remover-foto:hover,
.avatar-remover-foto:focus-visible {
    background: var(--accent-danger);
    color: var(--text-light);
}
.avatar-remover-foto:focus-visible {
    outline: 2px solid var(--text-primary);
}
/* Alvo de toque confortavel: 28 px e' pequeno para um dedo. A area
   cresce sem a forma crescer, para nao tapar mais photographia. */
@media (pointer: coarse) {
    .avatar-remover-foto {
        width: 40px;
        height: 40px;
        top: 0;
        right: 0;
        font-size: 1.1rem;
    }
}
/* As abas do perfil: a activa tem de ler-se sem depender so da cor. */
#abasPerfil .nav-link { color: var(--text-secondary); }
#abasPerfil .nav-link.active {
    color: var(--navy);
    font-weight: 600;
    border-bottom-color: var(--turquoise);
}

/* --- Overlay (so no mobile) ---------------------------------------------- */
.sidebar-overlay {
    position: fixed; inset: 0; background: rgba(10,31,63,0.45);
    opacity: 0; visibility: hidden; z-index: 1035;   /* abaixo da sidebar (1040), acima do conteudo */
    transition: opacity var(--transition-speed) ease, visibility 0s linear var(--transition-speed);
}
.sidebar-overlay.visivel { opacity: 1; visibility: visible; transition-delay: 0s, 0s; }

/* --- Onboarding do Portal do Colaborador ------------------------------- */
.portal-onboarding {
    position: relative;
    isolation: isolate;
    padding: 1.25rem 3.25rem 1.1rem 1.25rem;
    color: var(--bs-body-color);
    background: var(--bs-tertiary-bg, #f8f9fa);
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: .75rem;
    box-shadow: 0 .125rem .375rem rgba(15, 23, 42, .04);
}
.portal-onboarding__close {
    position: absolute;
    top: .75rem;
    right: .75rem;
}
.portal-onboarding__progress { max-width: 22rem; }
.portal-onboarding__progress .progress {
    height: .35rem;
    background-color: var(--bs-secondary-bg, #e9ecef);
}
#portalStartTour {
    position: relative;
    min-height: 40px;
    touch-action: manipulation;
    pointer-events: auto;
}

/* No desktop nao ha gaveta, logo nao ha nada a sobrepor. */
@media (min-width: 992px) { .sidebar-overlay { display: none; } }

/* --- Sidebar recolhida: os cabececalhos encolhem, os grupos abrem-se ----- */
/* Com a sidebar reduzida a 76px nao ha espaco para um cabecalho de grupo.
   Esconder a sanfona deixaria os itens inacessiveis, por isso cada grupo
   encolhe para so o icone e mantem os itens visiveis. */

/* Quem pede menos movimento nao o recebe. */
@media (prefers-reduced-motion: reduce) {
    .sidebar-overlay, .sidebar-link { transition: none !important; }
}


/* =====================================================================
   ÚLTIMO BLOCO DO FICHEIRO - ISOLAMENTO FORÇADO DA ÁREA DE PERFIL

   Fica no fim de propósito: em CSS, com especificidade igual, ganha a
   regra que vem por último. Qualquer regra do Bootstrap, ou um
   utilitário de spacing acrescentado depois, deixaria de poder
   alargar esta caixa.

   Inclui `#perfilDropdown *` porque o alvo não é só a caixa: um
   `<img>` ou um `<span>` com `width:100%` dentro do botão herda a
   largura do pai e volta a empurrá-la.
   ===================================================================== */
.topbar-user-area,
#perfilDropdown,
#perfilDropdown *,
a#perfilDropdown.dropdown-toggle {
    width: auto !important;
    max-width: fit-content !important;
    min-width: 0 !important;
    flex: 0 0 auto !important;
    flex-grow: 0 !important;
    box-sizing: border-box !important;
}

/* O botão em si. Sem `border:none` a moldura do Bootstrap desenha-se
   à volta de uma caixa compacta - o que é o aspecto pretendido, mas
   só se a caixa for compacta. */
#perfilDropdown {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    padding: 4px 8px !important;
    background: transparent !important;
}

/* O avatar: 32 px, sempre. O `width:100%` herdado de `.avatar-img` e'
   substituído aqui - e' ele que, dentro de um item flex, se resolve
   contra o pai e produz a caixa gigante.

   `object-fit: cover` e `overflow: hidden` vao AQUI, e nao so no
   `.avatar-img` generico: sem eles a fotografia e' distorcida pela
   caixa quadrada ou transborda o circulo. E porque esta regra leva
   `!important`, as dimensoes nao podiam ficar a cargo de uma regra de
   especificidade menor. */
#perfilDropdown .topbar-avatar,
#perfilDropdown .avatar-img,
#perfilDropdown .avatar-iniciais,
.topbar-user-area .topbar-avatar,
.topbar-user-area .avatar-img,
.topbar-user-area .avatar-iniciais {
    width: 32px !important;
    max-width: 32px !important;
    height: 32px !important;
    max-height: 32px !important;
    flex: 0 0 32px !important;
    flex-shrink: 0 !important;
    border-radius: 50% !important;
    object-fit: cover !important;
    overflow: hidden !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
}

/* Proteção mobile: o avatar é a saída para o menu e para "Sair".
   Não pode desaparecer nem ficar cortada. */
@media (max-width: 767.98px) {
    .topbar-user-area,
    #perfilDropdown,
    #perfilDropdown .topbar-avatar {
        display: inline-flex !important;
        visibility: visible !important;
        opacity: 1 !important;
    }
    /* A seta diz ao utilizador que o avatar abre uma lista. */
    #perfilDropdown.dropdown-toggle::after {
        display: inline-block !important;
        visibility: visible !important;
        margin-left: .35rem !important;
    }
    /* Reduz o espaço em volta, nunca o avatar. */
    .topbar-right { gap: 4px !important; }
}

/* ===== GESTAO DE PESSOAS:Empty states, checklist e dados cadastrais =====
   O `.vazio` vivia dentro de um `<style>` do `dashboard_executivo.html`.
   Com o mesmo desenho em candidatos, rescisao, treinamentos, crachas e
   eSocial, uma copia por pagina passava a ser a norma - e cada copia
   divergia num px. Vive aqui, uma vez, e os templates usam a mesma
   classe. A regra do `min-height` e' o que impede o cartao de encolher
   quando o conteudo troca. */
.vazio{display:flex;flex-direction:column;align-items:center;justify-content:center;
       gap:.35rem;min-height:230px;text-align:center;padding:1rem .5rem}
.vazio__img{width:148px;height:111px;opacity:.95}
.vazio__titulo{font-weight:600;color:#1A2332;margin:0}
.vazio__texto{font-size:.8rem;color:#8A94A0;margin:0;max-width:34ch}
.vazio__cta{margin-top:.35rem}

/* Variante dentro de uma tabela larga (`/rescisao`, `/treinamentos`).
   A tabela pode ter 10 colunas e 1200px: um bloco vazio `text-center`
   fica centrado nessa largura toda e aparece cortado no ecra estreito.
   `position:sticky` com `left:0` ancora a mensagem na janela em vez de
   a no meio da tabela. */
.vazio-tabela{position:sticky;left:0;width:min(100vw,100%)}
.vazio-tabela .vazio{min-height:0;padding:1.5rem .5rem}

/* Checklist do eSocial: marca a esquerda, texto flexivel, badge a
   direita. O badge nunca encolhe, para as naturezas ficarem alinhadas
   numa coluna. */
.checklist{list-style:none;padding:0;margin:0}
.checklist li{display:flex;align-items:flex-start;gap:.6rem;
              padding:.5rem 0;border-bottom:1px solid var(--border-color)}
.checklist li:first-child{padding-top:0}
.checklist li:last-child{border-bottom:0;padding-bottom:0}
.checklist__marca{flex:0 0 auto;margin-top:.15rem;color:var(--slate-400)}
.checklist__texto{flex:1 1 auto;min-width:0;font-size:.88rem;line-height:1.4}
.checklist .badge{flex:0 0 auto;white-space:nowrap;font-weight:600}

/* Dados cadastrais do eSocial: razao social e CNPJ como identidade da
   empresa, e o resto como lista rotulo/valor. */
.dados-cad__razao{font-weight:600;color:#1A2332;font-size:.95rem;line-height:1.3}
.dados-cad__cnpj{font-size:.8rem;color:#8A94A0;font-variant-numeric:tabular-nums}
.dados-cad__lista{margin:0;font-size:.85rem}
.dados-cad__lista>div{display:flex;justify-content:space-between;gap:.75rem;
                      padding:.4rem 0;border-top:1px solid var(--border-color)}
.dados-cad__lista dt{color:#8A94A0;font-weight:400;flex:0 0 auto}
.dados-cad__lista dd{margin:0;font-weight:500;text-align:right;
                     min-width:0;word-break:break-word}

/* Validade de uma certificacao: a coluna que decide se o NR ainda esta
   em dia. A vencida ganha o mesmo vermelho do Status - sao a mesma
   informacao vista de dois lados. */
.validade-cell{font-variant-numeric:tabular-nums;font-weight:600}
.validade-cell--vencida{color:#DC2626}

/* ===== TOPBAR NO TELEFONE =========================================
   A 390 px a barra de controlos (troca de empresa, pesquisa,
   notificacoes, estado, ajuda, avatar) era mais larga do que o ecra.
   Com `justify-content:flex-end`, o excesso transbordava para a
   ESQUERDA e o seletor de empresa ficava em `left:-60 px`, por cima do
   titulo da pagina - o titulo e o botao apareciam sobrepostos.

   A correcao nao e' encolher tudo: e' dar espaco ao titulo (trunca em
   vez de transbordar) e tirar da barra o que nao e' essencial num
   telefone. O `d-none` que o botao Ajuda ja traz na marca nao
   chegava - medido no browser, continuava com `display:flex`. */
@media (max-width: 575.98px) {
    /* `flex:1 1 auto` faz a esquerda reclamar primeiro o espaco livre. Sem
       isto, as DUAS pontas encolhem a parte e o titulo fica com ~25 px
       ("Re..."), quando o que sobrava dava perfeitamente para ele. */
    .topbar-left { min-width: 0; flex: 1 1 auto; }
    .topbar-title {
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
        min-width: 0;
    }
    /* O estado e a ajuda ficam acessiveis noutros sitios (o rodape e o
       menu de suporte); nao ha informacao que se perca. */
    .topbar-right .connection-status,
    .topbar-right [data-rotulo-ajuda] { display: none !important; }
    .topbar-right > .dropdown { margin-right: 0 !important; }
    .topbar-right > .btn { margin-right: 0 !important; }
}

/* ===== MODULO OPERACIONAL & FOLHA — Design System Senior ===== */

/* Tabelas padrao (substitui table-dark) */
.table-senior { width:100%; border-collapse:collapse; }
.table-senior thead th {
  background:#f8fafc; color:#475569;
  font-size:.75rem; font-weight:600; text-transform:uppercase;
  letter-spacing:.04em; padding:12px 16px; border-bottom:2px solid #e2e8f0;
  white-space:nowrap;
}
.table-senior thead th:first-child { padding-left:20px; }
.table-senior thead th:last-child { padding-right:20px; }
.table-senior tbody td {
  color:#1e293b; padding:10px 16px; border-bottom:1px solid #e2e8f0;
  font-size:.875rem; vertical-align:middle;
}
.table-senior tbody td:first-child { padding-left:20px; }
.table-senior tbody td:last-child { padding-right:20px; }
.table-senior tbody tr:hover { background:#f8fafc; }
.table-senior tbody tr:last-child td { border-bottom:none; }

/* Badges padrao (pill suave) */
.badge-senior { display:inline-block; padding:2px 10px; font-size:.7rem;
  font-weight:600; border-radius:100px; line-height:1.5; }
.badge-senior-success { background:#dcfce7; color:#166534; }
.badge-senior-warning { background:#fef3c7; color:#92400e; }
.badge-senior-danger { background:#fee2e2; color:#991b1b; }
.badge-senior-info { background:#e0f2fe; color:#075985; }
.badge-senior-neutral { background:#f1f5f9; color:#475569; }

/* KPIs padrao */
.kpi-senior {
  background:#fff; border:1px solid #e2e8f0; border-radius:10px;
  padding:16px 20px; box-shadow:0 1px 3px rgba(0,0,0,.06);
  text-align:center; height:100%;
}
.kpi-senior .kpi-label {
  font-size:.75rem; text-transform:uppercase; letter-spacing:.04em;
  color:#64748b; margin-bottom:4px;
}
.kpi-senior .kpi-value {
  font-size:1.5rem; font-weight:700; color:#0f172a;
  margin:0; line-height:1.2;
}
.kpi-senior .kpi-sub {
  font-size:.78rem; color:#94a3b8; margin-top:2px;
}
.kpi-senior.kpi-danger .kpi-value { color:#dc2626; }
.kpi-senior.kpi-success .kpi-value { color:#16a34a; }
.kpi-senior.kpi-warning .kpi-value { color:#d97706; }

/* Empty State padrao */
.empty-senior {
  text-align:center; padding:48px 20px;
}
.empty-senior .empty-icon {
  font-size:2.5rem; color:#cbd5e1; margin-bottom:12px;
}
.empty-senior .empty-title {
  font-size:.95rem; font-weight:600; color:#475569; margin-bottom:4px;
}
.empty-senior .empty-text {
  font-size:.82rem; color:#94a3b8; margin:0;
}

/* ===== CRACHAS: pre-visualizacao ===================================
   O `card-body` usava `justify-content:center` sem altura reservada: ao
   escolher um colaborador, a caixa mudava de tamanho a cada troca. A
   moldura reserva o lugar e mostra as medidas do CR80 (86x54), para o
   cartao se ler como um cartao e nao como uma imagem solta. */
.cracha-previa{display:flex;flex-direction:column;align-items:center}
.cracha-previa__moldura{
    display:flex;align-items:center;justify-content:center;
    width:100%;min-height:220px;padding:.75rem;
    background:var(--slate-50);border:1px dashed var(--slate-200);
    border-radius:10px;
}
.cracha-previa__img{max-width:340px;height:auto;border-radius:6px;
                     box-shadow:0 1px 3px rgba(0,0,0,.12)}
@media (prefers-reduced-motion:no-preference){
    .cracha-previa__img{transition:box-shadow .2s ease,transform .2s ease}
    .cracha-previa__img:not(.d-none){box-shadow:0 6px 18px rgba(10,31,63,.14)}
}

/* No telefone, o seletor de empresa ficava so com o icone: o rotulo
   "Empresa" tirava cerca de 60 px ao titulo da pagina, que ficava com
   duas letras. O botao e o tooltip continuam a dizer do que se trata. */
@media (max-width: 575.98px) {
    .topbar-empresa__rotulo { display: none; }
}

/* ======================================================================
   MODULO OPERACIONAL & FOLHA — Design System Senior Enterprise
   ====================================================================== */

/* --- Tabelas padrao (substitui table-dark) --- */
.table-senior { width:100%; border-collapse:collapse; }
.table-senior thead th {
  background:#f8fafc; color:#475569;
  font-size:.75rem; font-weight:600; text-transform:uppercase;
  letter-spacing:.04em; padding:12px 16px; border-bottom:2px solid #e2e8f0;
  white-space:nowrap; text-align:start;
}
.table-senior thead th:first-child { padding-left:20px; }
.table-senior thead th:last-child { padding-right:20px; }
.table-senior tbody td {
  color:#1e293b; padding:10px 16px; border-bottom:1px solid #e2e8f0;
  font-size:.875rem; vertical-align:middle;
}
.table-senior tbody td:first-child { padding-left:20px; }
.table-senior tbody td:last-child { padding-right:20px; }
.table-senior tbody tr:hover { background:#f8fafc; }
.table-senior tbody tr:last-child td { border-bottom:none; }

/* --- Badges padrao (pill suave) --- */
.badge-senior { display:inline-block; padding:2px 10px; font-size:.7rem;
  font-weight:600; border-radius:100px; line-height:1.5; }
.badge-senior-success { background:#dcfce7; color:#166534; }
.badge-senior-warning { background:#fef3c7; color:#92400e; }
.badge-senior-danger { background:#fee2e2; color:#991b1b; }
.badge-senior-info { background:#e0f2fe; color:#075985; }
.badge-senior-neutral { background:#f1f5f9; color:#475569; }

/* --- KPIs padrao --- */
.kpi-senior {
  background:#fff; border:1px solid #e2e8f0; border-radius:10px;
  padding:16px 20px; box-shadow:0 1px 3px rgba(0,0,0,.06);
  text-align:center; height:100%;
}
.kpi-senior .kpi-label {
  font-size:.75rem; text-transform:uppercase; letter-spacing:.04em;
  color:#64748b; margin-bottom:4px;
}
.kpi-senior .kpi-value {
  font-size:1.5rem; font-weight:700; color:#0f172a;
  margin:0; line-height:1.2;
}
.kpi-senior .kpi-sub {
  font-size:.78rem; color:#94a3b8; margin-top:2px;
}
.kpi-senior.kpi-danger .kpi-value { color:#dc2626; }
.kpi-senior.kpi-success .kpi-value { color:#16a34a; }
.kpi-senior.kpi-warning .kpi-value { color:#d97706; }

/* --- Empty State padrao --- */
.empty-senior {
  text-align:center; padding:48px 20px;
}
.empty-senior .empty-icon {
  font-size:2.5rem; color:#cbd5e1; margin-bottom:12px;
}
.empty-senior .empty-title {
  font-size:.95rem; font-weight:600; color:#475569; margin-bottom:4px;
}
.empty-senior .empty-text {
  font-size:.82rem; color:#94a3b8; margin:0;
}




/* ============================================================
   RESPONSIVO MOBILE (<= 480px) — iPhone 11 Pro e semelhantes
   ============================================================ */
@media (max-width: 480px) {

  .sidebar { width: 85vw; max-width: 320px; }

  .sidebar-overlay {
    background: rgba(0,0,0,0.5);
    backdrop-filter: blur(4px);
    -webkit-backdrop-filter: blur(4px);
  }

  .topbar { gap: 0; padding: 0 12px !important; height: 52px !important; }
  .topbar-left { gap: 6px; min-width: 0; }
  .topbar-title {
    font-size: .92rem;
    max-width: 30vw;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .topbar-title i { display: none; }
  .topbar-right { gap: 6px !important; }

  #trocaEmpresaBtn {
    padding: 4px 8px !important;
    font-size: 0;
    min-width: 34px;
    display: flex;
    align-items: center;
    justify-content: center;
  }
  #trocaEmpresaBtn i { font-size: 1rem; margin: 0 !important; }
  #trocaEmpresaBtn span { display: none !important; }
  #trocaEmpresaBtn::after { display: none !important; }

  .topbar-right a[href*="ajuda"],
  .topbar-right a[href*="suporte"] {
    font-size: 0;
    padding: 4px !important;
    min-width: 34px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
  }
  .topbar-right a[href*="ajuda"] i,
  .topbar-right a[href*="suporte"] i {
    font-size: 1.1rem;
    margin: 0 !important;
  }

  #perfilDropdown {
    padding: 4px !important;
    min-width: 34px;
    display: flex;
    align-items: center;
    justify-content: center;
  }
  #perfilDropdown.dropdown-toggle::after { display: none !important; }
  #perfilDropdown .topbar-avatar { width: 28px; height: 28px; font-size: .78rem; }

  #toggle-sidebar-btn {
    padding: 4px 6px !important;
    font-size: .9rem;
    min-width: 32px;
  }

  #copilot-btn {
    bottom: calc(16px + env(safe-area-inset-bottom)) !important;
    right: 16px !important;
    width: 52px !important;
    height: 52px !important;
  }
}

/* Tabelas de acompanhamento e listas de dados no mobile. */
.portal-requests-table > :not(caption) > * > *,
.collaborators-table > :not(caption) > * > * {
    padding-top: .875rem;
    padding-bottom: .875rem;
}
.portal-request-description,
.portal-request-card__description,
.collaborator-card,
.collaborator-card__details dd {
    min-width: 0;
    overflow-wrap: anywhere;
    word-break: normal;
}
.portal-request-cards,
.collaborator-cards {
    display: grid;
    gap: .75rem;
    padding: .75rem;
}
.portal-request-card,
.collaborator-card {
    min-width: 0;
    padding: 1rem;
    border: 1px solid var(--slate-200);
    border-radius: 12px;
    background: var(--bg-card);
    box-shadow: 0 1px 3px rgba(15, 23, 42, .05);
}
.portal-request-card__heading,
.collaborator-card__heading {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: .75rem;
}
.portal-request-card__heading h3,
.collaborator-card__name {
    min-width: 0;
    overflow-wrap: anywhere;
    font-weight: 600;
}
.portal-request-card__description {
    margin: .75rem 0;
    color: var(--text-secondary, #64748B);
}
.portal-request-card__date {
    display: flex;
    justify-content: space-between;
    gap: .5rem;
    padding-top: .65rem;
    border-top: 1px solid var(--slate-200);
    color: #64748B;
    font-size: .875rem;
}
.portal-request-card__date time {
    color: #334155;
    font-weight: 600;
    white-space: nowrap;
}
.collaborator-card__name {
    display: flex;
    align-items: flex-start;
    gap: .65rem;
}
.collaborator-card__name input {
    flex: 0 0 auto;
    margin-top: .25rem;
}
.collaborator-card-select-all {
    display: flex;
    align-items: center;
    gap: .55rem;
    padding: .25rem .25rem .1rem;
    color: #475569;
    font-size: .875rem;
}
.collaborator-card-select-all input { flex: 0 0 auto; }
.collaborator-card__role {
    margin: .45rem 0 .85rem 1.55rem;
    color: #64748B;
    overflow-wrap: anywhere;
}
.collaborator-card__details {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: .75rem;
    margin: 0;
}
.collaborator-card__details > div { min-width: 0; }
.collaborator-card__details dt {
    color: #64748B;
    font-size: .75rem;
    font-weight: 500;
}
.collaborator-card__details dd {
    margin: .15rem 0 0;
    color: #1E293B;
    font-size: .875rem;
    font-weight: 600;
}
.collaborator-card__actions {
    display: flex;
    justify-content: flex-end;
    margin-top: .85rem;
    padding-top: .75rem;
    border-top: 1px solid var(--slate-200);
}

/* O drawer mobile também é a localização dos controlos secundários do topo. */
.sidebar-mobile-tools {
    padding: .5rem 1rem .75rem;
    border-bottom: 1px solid rgba(255, 255, 255, .1);
}
.sidebar-mobile-selector {
    margin-top: .5rem;
    color: rgba(255, 255, 255, .9);
}
.sidebar-mobile-selector summary {
    padding: .65rem .75rem;
    border: 1px solid rgba(255, 255, 255, .18);
    border-radius: 8px;
    cursor: pointer;
    font-size: .9rem;
    list-style: none;
}
.sidebar-mobile-selector summary::-webkit-details-marker { display: none; }
.sidebar-mobile-selector summary::after {
    content: "\f107";
    float: right;
    font-family: "Font Awesome 6 Free";
    font-weight: 900;
}
.sidebar-mobile-selector[open] summary::after { content: "\f106"; }
.sidebar-mobile-selector__items {
    display: grid;
    gap: .25rem;
    max-height: 35vh;
    margin-top: .35rem;
    overflow-y: auto;
}
.sidebar-mobile-selector__item {
    display: block;
    width: 100%;
    padding: .55rem .75rem;
    border: 0;
    border-radius: 6px;
    background: transparent;
    color: rgba(255, 255, 255, .85);
    text-align: left;
    text-decoration: none;
    overflow-wrap: anywhere;
}
.sidebar-mobile-selector__item:hover,
.sidebar-mobile-selector__item:focus-visible,
.sidebar-mobile-selector__item.is-active {
    background: rgba(255, 255, 255, .12);
    color: #fff;
}
.sidebar-mobile-selector__item small {
    display: block;
    color: rgba(255, 255, 255, .6);
}

@media (max-width: 767.98px) {
    .topbar .mobile-hide-control { display: none !important; }
    .topbar { gap: .5rem; }
    .topbar-left { flex: 1 1 auto; min-width: 0; }
    .topbar-title {
        min-width: 0;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
    }
    .topbar-right { flex: 0 0 auto; margin-left: auto; }
    .portal-request-cards,
    .collaborator-cards { padding: .75rem; }
}
@media (max-width: 359.98px) {
    .collaborator-card__details { grid-template-columns: minmax(0, 1fr); }

  #copilot-window {
    position: fixed !important;
    top: 0 !important;
    left: 0 !important;
    right: 0 !important;
    bottom: 0 !important;
    width: 100vw !important;
    height: 100vh !important;
    max-width: 100% !important;
    max-height: 100% !important;
    border-radius: 0 !important;
    z-index: 99999 !important;
  }

  #copilot-input-area {
    padding-bottom: calc(12px + env(safe-area-inset-bottom)) !important;
  }
}
/* ==============================================================
   RECIBO E AVISO DE FÉRIAS (unidade de impressão)
   ============================================================ */
.recibo-ferias{page-break-inside:avoid;max-width:760px;margin:0 auto}
.recibo-ferias-cabecalho{text-align:center;border-bottom:3px solid #0A1F3F;padding-bottom:18px;margin-bottom:24px}
.recibo-ferias-razao{font-size:1.15rem;font-weight:700;color:#0A1F3F;margin:0}
.recibo-ferias-cnpj{font-size:.8rem;color:#555;margin:3px 0 0}
.recibo-ferias-titulo{font-size:1.35rem;font-weight:800;color:#0A1F3F;margin:16px 0 6px}
.recibo-ferias-destino{font-size:.95rem;color:#555;margin:0}
.recibo-ferias-dados{margin:18px 0}
.recibo-ferias-tabela{width:100%;border-collapse:collapse;margin:12px 0}
.recibo-ferias-tabela caption{display:table-caption;text-align:left}
.recibo-ferias-tabela th,.recibo-ferias-tabela td{border:1px solid #cbd5e1;padding:9px 12px;text-align:left}
.recibo-ferias-tabela th{background:#0A1F3F;color:#fff}
.recibo-ferias-tabela tr.proven td{background:#F0F4FF}
.recibo-ferias-tabela tr.desconto td{background:#FCF2F2}
.recibo-ferias-tabela tr.total td{background:#DBEAFE;font-weight:bold;font-size:1.05em}
.recibo-ferias-tabela td.right{text-align:right;font-variant-numeric:tabular-nums}
.recibo-ferias-quita{margin:22px 0 6px;text-align:justify}
.assinaturas{display:flex;gap:40px;margin-top:25px}
.assinatura-colaborador,.assinatura-responsavel{flex:1;text-align:center;min-width:0}
.assinatura-linha{border-top:1px solid #333;height:36px;margin-bottom:8px}
.assinatura-dados{font-size:.95rem}
.assinatura-data{font-size:.8rem;color:#555;margin-top:3px}

@media print {
  /* Oculta toda a página por padrão. */
  body * {
    visibility: hidden !important;
  }
  /* Visível apenas o recibo dentro da modal (e o container alternativo). */
  #modalReciboFerias, #modalReciboFerias *,
  #modalReciboDecimo, #modalReciboDecimo *,
  .recibo-container, .recibo-container * {
    visibility: visible !important;
  }
  /* O card Bootstrap é `position: fixed` com `overflow-y: auto` e o corpo
     `.modal-dialog` traz `max-width:500px; margin:auto; transform`. Sem
     resetar TODA a cadeia, o print saí cortado: só o topo da caixa aparece
     e o resto fica em branco. Aqui o conteúdo é absoluto no canto e forçado
     a fluir (overflow/height livres) para caber na folha A4. */
  #modalReciboFerias,
  #modalReciboDecimo {
    position: absolute !important;
    top: 0 !important;
    left: 0 !important;
    width: 100% !important;
    max-width: 100% !important;
    height: auto !important;
    max-height: none !important;
    margin: 0 !important;
    padding: 0 !important;
    background: #ffffff !important;
    box-shadow: none !important;
    border: none !important;
    transform: none !important;
    overflow: visible !important;
  }
  .modal-dialog {
    width: 100% !important;
    max-width: 100% !important;
    margin: 0 !important;
    transform: none !important;
  }
  .modal-content {
    border: none !important;
    box-shadow: none !important;
    background: #ffffff !important;
    overflow: visible !important;
    height: auto !important;
  }
  .modal-body {
    padding: 0 !important;
    overflow: visible !important;
    height: auto !important;
  }
  .recibo-ferias {
    max-width: 100% !important;
    margin: 0 !important;
    font-size: 12px !important;
    page-break-inside: avoid;
  }
  /* Compactação vertical: células magras, margens menores e fonte 12px
     para o recibo inteiro caber em UMA folha A4. */
  .recibo-ferias-tabela th, .recibo-ferias-tabela td {
    padding: 4px 8px !important;
  }
  .recibo-ferias-cabecalho {
    padding-bottom: 10px !important;
    margin-bottom: 12px !important;
  }
  .recibo-ferias-titulo {
    font-size: 1.15rem !important;
    margin: 10px 0 4px !important;
  }
  .recibo-ferias-dados { margin: 12px 0 !important; }
  .recibo-ferias-quita { margin: 15px 0 4px !important; }
  .assinaturas { margin-top: 15px !important; }
  /* Cores do recibo (cabeçalho azul-marinho e totais) na impressão. */
  .recibo-ferias-tabela th,
  .recibo-ferias-tabela tr.total td {
    -webkit-print-color-adjust: exact;
    print-color-adjust: exact;
  }
  .modal-header, .modal-footer, .modal-header .btn-close,
  .no-print, .btn, nav, aside, header, footer {
    display: none !important;
  }
}

/* Sidebar collapse */
#sidebar.collapsed .sidebar-text,
#sidebar.collapsed span:not(.icon) {
    display: none !important;
}
#sidebar.collapsed {
/* Sidebar collapse (colaborador) */
#sidebar.collapsed .sidebar-text,
#sidebar.collapsed .nav-link span:not(.icon) {
    display: none !important;
}
#sidebar.collapsed {
    width: 5rem !important;
/* Sidebar collapse (colaborador) - regras estritas */
#sidebar.collapsed .sidebar-text,
#sidebar.collapsed .nav-text,
#sidebar.collapsed span:not(.icon) {
    display: none !important;
}
#sidebar.collapsed {
    width: 4.5rem !important;
    min-width: 4.5rem !important;
}
#sidebar.collapsed .nav-link,
#sidebar.collapsed a {
    justify-content: center !important;
    padding-left: 0 !important;
    padding-right: 0 !important;
}
.main-content, .content-wrapper {
    margin-left: 4.5rem;
}
}
.main-content, .content-wrapper {
    width: 100%;
    flex: 1;
}
    width: 4.5rem !important;
}
#sidebar {
    transition: width 0.3s ease;
}
main, .content-wrapper, .flex-1 {
    transition: all 0.3s ease;
}

/* SystemRH UI foundation: controls, type scale, and empty states. */
:root {
    --ui-text: #1F2937;
    --ui-border: #D1D5DB;
    --ui-primary: #007C93;
    --ui-primary-hover: #006879;
    --ui-danger: #B54750;
    --ui-danger-hover: #963943;
}
html, body { font-size: 15px; }
h1, h2, h3, h4, h5, h6, .card-title, .modal-title {
    color: var(--ui-text);
    font-weight: 600;
}
.card-body { padding: 1.5rem; }
.card-body.p-0 { padding: 0 !important; }
.card-header { padding: 1rem 1.5rem; color: var(--ui-text); }

.btn {
    min-height: 40px;
    padding: .5rem .9rem;
    border-radius: 8px;
    transition: color .18s ease, background-color .18s ease, border-color .18s ease,
                box-shadow .18s ease, transform .18s ease;
    margin-left: 0;
}
.btn-sm {
    min-height: 34px;
    padding: .35rem .7rem;
}
.btn-primary,
.btn-primary:visited,
.btn-submit,
button[type="submit"].btn-primary,
a.btn-primary {
    background: var(--ui-primary) !important;
    background-image: none !important;
    border: 1px solid var(--ui-primary) !important;
    border-radius: 8px;
    color: #fff !important;
    font-weight: 600 !important;
    box-shadow: 0 2px 5px rgba(0, 124, 147, .2) !important;
}
.btn-primary:hover:not(:disabled),
.btn-submit:hover:not(:disabled),
button[type="submit"].btn-primary:hover:not(:disabled),
a.btn-primary:hover {
    background: var(--ui-primary-hover) !important;
    border-color: var(--ui-primary-hover) !important;
    color: #fff !important;
    box-shadow: 0 4px 10px rgba(0, 104, 121, .22) !important;
    transform: translateY(-1px);
}
.btn-primary:active:not(:disabled),
.btn-submit:active:not(:disabled) { transform: translateY(0); }
.btn-primary:focus-visible,
.btn-submit:focus-visible {
    outline: 3px solid rgba(0, 180, 216, .35);
    outline-offset: 2px;
}
.btn-outline-primary {
    color: var(--ui-primary) !important;
    border-color: var(--ui-primary) !important;
    background: #fff !important;
}
.btn-outline-primary:hover:not(:disabled) {
    color: var(--ui-primary-hover) !important;
    border-color: var(--ui-primary-hover) !important;
    background: #F0FAFB !important;
}
.btn-secondary,
.btn-outline-secondary {
    color: #475569 !important;
    border-color: #CBD5E1 !important;
}
.btn-secondary { background: #E9EEF3 !important; }
.btn-secondary:hover:not(:disabled),
.btn-outline-secondary:hover:not(:disabled) {
    color: #1F2937 !important;
    border-color: #94A3B8 !important;
    background: #F1F5F9 !important;
}
.btn-danger {
    background: var(--ui-danger) !important;
    border-color: var(--ui-danger) !important;
}
.btn-danger:hover:not(:disabled) {
    background: var(--ui-danger-hover) !important;
    border-color: var(--ui-danger-hover) !important;
}
.btn-outline-danger {
    color: var(--ui-danger) !important;
    border-color: #D9A0A5 !important;
}
.btn-outline-danger:hover:not(:disabled) {
    color: #8F3039 !important;
    border-color: #C77B82 !important;
    background: #FFF5F5 !important;
}

.form-control,
.form-select {
    min-height: 40px;
    border: 1px solid var(--ui-border) !important;
    border-radius: 8px !important;
    color: #1F2937;
    font-size: .9375rem;
    transition: border-color .18s ease, box-shadow .18s ease;
}
textarea.form-control { min-height: auto; }
.form-control:focus,
.form-select:focus {
    border-color: #008BA3 !important;
    box-shadow: 0 0 0 .2rem rgba(0, 180, 216, .2) !important;
}
.form-label { color: #374151; font-weight: 500; }

.modal-footer {
    position: sticky;
    bottom: 0;
    z-index: 2;
    gap: .5rem;
    box-shadow: 0 -4px 12px rgba(15, 23, 42, .06);
    padding: .875rem 1.25rem !important;
    background: #fff;
}
.modal-footer > .btn,
.modal-footer > form { margin-bottom: 0; }
.colaborador-mobile-step { min-width: 0; }
.colaborador-mobile-step .form-select { width: 100%; }

.vazio,
.empty-senior {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: .55rem;
    padding: 2.5rem 1.25rem;
    text-align: center;
}
.vazio__titulo,
.empty-senior .empty-title {
    color: var(--ui-text);
    font-size: 1rem;
    font-weight: 600;
}
.vazio__texto,
.empty-senior .empty-text {
    max-width: 44ch;
    color: #64748B;
    font-size: .9375rem;
    line-height: 1.5;
}
.vazio__img { width: 120px; height: auto; max-height: 100px; object-fit: contain; }
.vazio__cta { margin-top: .5rem; }
.empty-senior .empty-icon { color: #94A3B8; font-size: 2rem; margin: 0; }

@media (max-width: 767.98px) {
    .card-body:not(.p-0) { padding: 1.125rem; }
    .card-header { padding: .875rem 1.125rem; }
    .modal-footer {
        padding-bottom: calc(.875rem + env(safe-area-inset-bottom)) !important;
    }
    .colaborador-tabs { display: none !important; }
    .colaborador-mobile-step { display: block !important; }
}
@media (max-width: 480px) {
    .btn:not(.btn-sm) { white-space: normal; }
    .modal-footer { flex-wrap: wrap; }
    .modal-footer > .btn,
    .modal-footer > form > .btn { min-height: 42px; }
}
