/* SWOT · Ducon — folha única do app (layout, componentes e telas).
   Tema "claro e leve" (tema A adotado; alternativas em public/css/temas/), com as telas no cinza Ducon (--ducon-cinza #EBF0F4, do manual da marca)
   e cards/painéis/tabelas brancos por cima; o menu lateral (degradê marinho→índigo) fica fixo à esquerda no desktop.
   Logo: isotipo + "ducon", sem "SEGUROS" (manual da marca, págs. 1 e 10), SVG vetorial — /img/logo-ducon-branca.svg (só sobre
   fundo escuro: nav, login), /img/logo-ducon-escura.svg (#030511, papel: .so-impressao) e /img/isotipo-ducon.svg (branco, reserva).
   Tokens da identidade Ducon (ver CLAUDE.md); nunca usar o azul do site. Fora dos tokens, cores derivadas só por rgba() da cor-base.
   Fontes: Inter (texto) + Plus Jakarta Sans (títulos) — carregadas por <link> nos Blades (layouts/hub, auth/login, errors/*). */

:root {
    /* identidade Ducon (tokens obrigatórios) */
    --ducon-indigo: #4B53FF;
    --ducon-indigo-escuro: #3941D6;
    --ducon-azul-forte: #3740FF;
    --ducon-ciano: #04D9FB;
    --ducon-marinho: #2A336C;
    --ducon-preto: #030511;
    --ducon-cinza: #EBF0F4;         /* fundo das telas: cinza claro / off-white do manual da marca (marca-duconseg.css) */
    --ducon-cinza-claro: #F3F6F8;   /* segundo nível, derivado: #EBF0F4 a 60% sobre branco (fundos internos suaves) */

    --tinta-1: #E9EBFF;
    --tinta-2: #F0F1FF;
    --tinta-3: #DCE0FF;

    /* superfícies e texto: página no cinza Ducon, cards/painéis/tabelas brancos por cima (ver CLAUDE.md) */
    --fundo: var(--ducon-cinza);              /* página e área principal */
    --fundo-2: var(--ducon-cinza-claro);      /* dentro do branco: hover de linha/botão, notas, rodapés, formulário tracejado, trilhos */
    --fundo-zebra: rgba(235, 240, 244, 0.35); /* --ducon-cinza a 35% sobre o branco da tabela ≈ #F8FAFB (entre o branco e o hover #F3F6F8) */
    --superficie: #FFFFFF;
    --texto: #1B1D21;                         /* 14,7:1 sobre o cinza */
    --texto-2: #4B5058;                       /* 7,1:1 sobre o cinza, 7,5:1 sobre o cinza-claro */
    --borda: #D7DDEA;                         /* borda neutra do manual da marca: contorno dos cards brancos sobre o cinza */
    --borda-forte: #D3D7E6;
    --borda-suave: var(--ducon-cinza);        /* divisórias internas dos cards brancos */
    --placeholder: #6B7079;   /* = --cancelada, 4,98:1 sobre branco — só em campo branco (sobre o cinza cairia a 4,3:1) */
    --borda-campo: rgba(42, 51, 108, 0.6);   /* campo em repouso ≈ #7F85A7: 3,6:1 sobre branco, 3,3:1 sobre o cinza-claro do formulário tracejado (WCAG 1.4.11) */

    /* status: cor-base + texto escuro (quando o texto vai sobre tinta); tintas, bordas e halos são rgba() da base */
    --concluida: #2E7D4F;
    --concluida-texto: #1F5A38;                 /* 8,2:1 sobre branco; a base ficaria em 4,3:1 sobre a tinta */
    --concluida-fundo: rgba(46, 125, 79, 0.12);
    --andamento: #2F5FA8;                       /* 5,3:1 sobre a própria tinta */
    --andamento-fundo: rgba(47, 95, 168, 0.12);
    --atrasada: #C9821A;
    --atrasada-texto: #6E4700;
    --atrasada-fundo: #FBEFD3;
    --atrasada-borda: rgba(201, 130, 26, 0.45);
    --atrasada-suave: rgba(201, 130, 26, 0.07);
    --cancelada: #6B7079;
    --cancelada-texto: var(--texto-2);          /* --cancelada sobre tinta ficaria < 4,5:1 */
    --cancelada-fundo: rgba(107, 112, 121, 0.14);
    --perigo: #A33A2C;                          /* único vermelho: erro, ameaça, sinal grave (6,6:1 sobre branco, 5,6:1 sobre a tinta) */
    --perigo-fundo: rgba(163, 58, 44, 0.10);
    --perigo-borda: rgba(163, 58, 44, 0.35);

    /* degradês da marca */
    --degrade-nav: linear-gradient(180deg, #2A336C 0%, #3941D6 100%);
    --brilho-nav: radial-gradient(140% 42% at 50% -6%, rgba(4, 217, 251, 0.30), rgba(4, 217, 251, 0) 70%);
    --degrade-ativo: linear-gradient(90deg, #3740FF, #4B53FF);
    --degrade-kpi: linear-gradient(90deg, #3740FF, #04D9FB);
    --degrade-concluida: linear-gradient(90deg, #2E7D4F, #4CAF74);
    --degrade-atrasada: linear-gradient(90deg, #C9821A, #E3A94D);
    /* degradês "contidos" só para segmentos com número branco dentro (barra empilhada e sua legenda): ≥ 4,6:1 */
    --degrade-concluida-contido: linear-gradient(90deg, #2E7D4F, #318451);
    --degrade-andamento-contido: linear-gradient(90deg, #2F5FA8, #3740FF);

    /* tipografia */
    --fonte: 'Inter', system-ui, "Segoe UI", sans-serif;
    --fonte-titulo: 'Plus Jakarta Sans', system-ui, "Segoe UI", sans-serif;

    /* alturas de controle (botões, campos, abas, chip do usuário) */
    --controle: 40px;
    --controle-p: 32px;

    /* raios e sombras (sobre o cinza o branco já separa o card: sombras leves, em rgba() do marinho) */
    --raio: 16px;
    --raio-m: 10px;
    --raio-s: 8px;
    --raio-pill: 999px;
    --sombra-1: 0 1px 2px rgba(42, 51, 108, 0.06);
    --sombra-2: 0 2px 4px rgba(42, 51, 108, 0.05), 0 6px 14px rgba(42, 51, 108, 0.08);
    --sombra-3: 0 4px 8px rgba(42, 51, 108, 0.06), 0 14px 32px rgba(42, 51, 108, 0.14);
    --sombra-primario: 0 1px 2px rgba(55, 64, 255, 0.25), 0 6px 14px rgba(75, 83, 255, 0.22);
    --anel-foco: 0 0 0 4px rgba(75, 83, 255, 0.18);
    --faixa: 3px;   /* faixa lateral de status (reforço visual) */
    --transicao: 150ms ease;

    /* ícones da nav (SVG inline em máscara, pintados com currentColor); escolhidos por data-icone no Blade */
    --icone-dashboard: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='3' width='7' height='9' rx='1.5'/%3E%3Crect x='14' y='3' width='7' height='5' rx='1.5'/%3E%3Crect x='14' y='12' width='7' height='9' rx='1.5'/%3E%3Crect x='3' y='16' width='7' height='5' rx='1.5'/%3E%3C/svg%3E");
    --icone-visao: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12z'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3C/svg%3E");
    --icone-swot: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 3v18M3 12h18'/%3E%3C/svg%3E");
    --icone-planos: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 7l2 2 4-4M3 17l2 2 4-4M12 7h9M12 17h9'/%3E%3C/svg%3E");
    --icone-admin: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9' cy='8' r='4'/%3E%3Cpath d='M2 21v-1a7 7 0 0 1 14 0v1'/%3E%3Cpath d='M16 4a4 4 0 0 1 0 8M22 21v-1a7 7 0 0 0-5-6.7'/%3E%3C/svg%3E");
    --icone-config: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3Cpath d='M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z'/%3E%3C/svg%3E");
    /* ícones das áreas de Configurações (cards do hub): e-mail, setores (prédio), usuários (= --icone-admin), anos (calendário) */
    --icone-email: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='14' rx='2'/%3E%3Cpath d='M3 7l9 6 9-6'/%3E%3C/svg%3E");
    --icone-setores: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16'/%3E%3Cpath d='M16 9h2a2 2 0 0 1 2 2v10'/%3E%3Cpath d='M3 21h18M8 7h4M8 11h4M8 15h4'/%3E%3C/svg%3E");
    --icone-anos: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='17' rx='2'/%3E%3Cpath d='M3 9h18M8 2v4M16 2v4'/%3E%3C/svg%3E");
    --icone-avisos: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9'/%3E%3Cpath d='M10.3 21a1.94 1.94 0 0 0 3.4 0'/%3E%3C/svg%3E");
    /* menu da barra do topo (abaixo de 900px, <details class="nav-movel">): três traços; aberto, um X */
    --icone-menu: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M4 7h16M4 12h16M4 17h16'/%3E%3C/svg%3E");
    --icone-fechar: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M6 6l12 12M18 6L6 18'/%3E%3C/svg%3E");
}

/* ---------- Reset mínimo ---------- */
*, *::before, *::after { box-sizing: border-box; }
html, body { margin: 0; }
body {
    font-family: var(--fonte);
    font-size: 14px;
    line-height: 1.55;
    color: var(--texto);
    background: var(--fundo);
    font-variant-numeric: tabular-nums;   /* colunas numéricas alinham (KPIs, tabelas, datas) */
    -webkit-font-smoothing: antialiased;
    text-rendering: optimizeLegibility;
}
h1, h2, h3, p, ol, ul { margin: 0; }
h1, h2, h3 { font-family: var(--fonte-titulo); font-weight: 600; letter-spacing: -0.01em; }
a { color: inherit; text-decoration: none; transition: color var(--transicao); }
a:hover { text-decoration: underline; text-underline-offset: 2px; }
button, input, select, textarea { font: inherit; color: inherit; }
:focus-visible { outline: 2px solid var(--ducon-azul-forte); outline-offset: 2px; border-radius: 4px; }
.texto-secundario { font-size: 12px; color: var(--texto-2); }

/* ---------- Estrutura: nav 232px à esquerda + conteúdo que rola ---------- */
.hub { display: flex; height: 100vh; }

.nav {
    width: 232px;
    flex: none;
    padding: 24px 14px;
    display: flex;
    flex-direction: column;
    gap: 18px;
    overflow-y: auto;
    background: var(--brilho-nav), var(--degrade-nav);
    color: #FFFFFF;
}
.nav :focus-visible { outline-color: var(--ducon-ciano); }
.nav-marca { padding: 0 10px; display: flex; flex-direction: column; gap: 2px; }
/* a logo é o link para o início (rota "inicio" → dashboard do ano atual); anel branco no foco. No HTML ela vem depois do
   "SWOT" (ordem da barra do topo: menu · SWOT · logo); na coluna do desktop, order: -1 a põe acima do nome */
.nav-logo-link { order: -1; display: block; align-self: flex-start; margin: 0 0 10px; border-radius: 6px; line-height: 0; transition: opacity var(--transicao); }
.nav-logo-link:hover { opacity: 0.85; }
.nav .nav-logo-link:focus-visible { outline: 2px solid #FFFFFF; outline-offset: 4px; }
.nav-logo { display: block; width: auto; height: 32px; }   /* isotipo + "ducon" (viewBox 513,6×143,5) → ≈ 115×32; cabe nos 232px − 2×14 − 2×10 = 184px */
.nav-titulo { font-family: var(--fonte-titulo); font-size: 17px; font-weight: 700; line-height: 1.15; letter-spacing: -0.01em; color: #FFFFFF; }
.nav-subtitulo { font-size: 11px; font-weight: 500; color: var(--tinta-3); letter-spacing: 0.06em; text-transform: uppercase; }   /* 5,6:1 sobre o ponto mais claro do degradê */
.nav-links { display: flex; flex-direction: column; gap: 4px; }
.nav-links a {
    display: flex;
    align-items: center;
    gap: 10px;
    min-height: 38px;
    padding: 8px 12px;
    border-radius: var(--raio-pill);
    color: var(--tinta-1);   /* 6,1:1 sobre o ponto mais claro do degradê */
    font-weight: 500;
    transition: background var(--transicao), color var(--transicao);
}
/* ícone antes do texto, só quando o Blade informa data-icone (degrada para "sem ícone") */
.nav-links a[data-icone]::before {
    content: "";
    flex: none;
    width: 16px;
    height: 16px;
    background: currentColor;
    -webkit-mask: var(--icone) center / contain no-repeat;
    mask: var(--icone) center / contain no-repeat;
    opacity: 0.85;
}
.nav-links a[data-icone="dashboard"] { --icone: var(--icone-dashboard); }
.nav-links a[data-icone="visao-geral"] { --icone: var(--icone-visao); }
.nav-links a[data-icone="swot"] { --icone: var(--icone-swot); }
.nav-links a[data-icone="planos"] { --icone: var(--icone-planos); }
.nav-links a[data-icone="config"] { --icone: var(--icone-config); }
.nav-links a:hover { background: rgba(255, 255, 255, 0.1); color: #FFFFFF; text-decoration: none; }
.nav-links a:hover::before, .nav-links a.nav-ativo::before { opacity: 1; }
.nav-links a.nav-ativo { background: var(--degrade-ativo); color: #FFFFFF; font-weight: 600; box-shadow: 0 6px 16px rgba(3, 5, 17, 0.25); }
/* menu <details> da barra do topo: só abaixo de 900px (ver @media); no desktop a coluna .nav > .nav-links fica sempre à vista */
.nav-movel { display: none; }

.conteudo { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.principal { flex: 1; min-height: 0; overflow-y: auto; padding: 24px 28px 40px; }

/* ---------- Cabeçalho: h1 Jakarta, abas de ano, resumo, ações, chip do usuário ---------- */
.cabecalho {
    min-height: 68px;
    flex: none;
    padding: 12px 28px;
    display: flex;
    align-items: center;
    gap: 16px;
    border-bottom: 1px solid var(--borda);
    background: var(--superficie);
}
.cabecalho-conteudo { flex: 1; min-width: 0; display: flex; align-items: center; flex-wrap: wrap; gap: 8px 16px; }
.cabecalho h1 { font-family: var(--fonte-titulo); font-size: 28px; font-weight: 600; line-height: 1.2; letter-spacing: -0.02em; color: var(--texto); }
.resumo { font-size: 13px; color: var(--texto-2); }
.acoes { margin-left: auto; display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
.cabecalho .acoes .botao { height: var(--controle); }

/* abas (anos, filtro de setores…): controle segmentado com a ativa em pill índigo */
.abas {
    display: inline-flex;
    align-items: center;
    gap: 2px;
    padding: 3px;
    border: 1px solid var(--borda);
    border-radius: var(--raio-pill);
    font-size: 13px;
    background: var(--fundo-2);
}
.abas > * { min-height: var(--controle-p); display: inline-flex; align-items: center; padding: 6px 14px; border-radius: var(--raio-pill); color: var(--texto-2); font-weight: 500; white-space: nowrap; transition: background var(--transicao), color var(--transicao); }
.abas > a:hover { background: var(--superficie); color: var(--texto); text-decoration: none; }
.abas > .aba-ativa { background: var(--degrade-ativo); color: #FFFFFF; font-weight: 600; box-shadow: 0 2px 6px rgba(55, 64, 255, 0.28); }
.abas > .aba-nova { color: var(--ducon-azul-forte); font-weight: 600; }
.aba-sufixo { margin-left: 4px; font-size: 11px; font-weight: 400; opacity: .85; }   /* "· encerrado" */

.menu-usuario { position: relative; flex: none; }
.menu-usuario > summary {
    list-style: none;
    width: var(--controle);
    height: var(--controle);
    border-radius: 50%;
    background: var(--degrade-ativo);
    color: #FFFFFF;
    font-size: 12px;
    font-weight: 600;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    user-select: none;
    box-shadow: var(--sombra-primario);
    transition: transform var(--transicao), box-shadow var(--transicao);
}
.menu-usuario > summary:hover { transform: translateY(-1px); }
.menu-usuario > summary::-webkit-details-marker { display: none; }
.menu-usuario-painel {
    position: absolute;
    right: 0;
    top: calc(100% + 10px);
    z-index: 20;
    min-width: 240px;
    padding: 14px 16px;
    display: flex;
    flex-direction: column;
    gap: 6px;
    background: var(--superficie);
    border: 1px solid var(--borda);
    border-radius: 12px;
    box-shadow: var(--sombra-3);
}

/* ---------- Chip do usuário (componentes/avatar): foto sobre as iniciais — cabeçalho, tabela de usuários, ranking ----------
   A foto é o original quando o PHP não tem gd (App\Servicos\FotosDeUsuario): o recorte redondo é o object-fit daqui.
   Se a <img> falhar, o onerror a remove e as iniciais (já no chip, por baixo) aparecem. */
.avatar { position: relative; overflow: hidden; flex: none; border-radius: 50%; }
.avatar img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center; border-radius: 50%; background: var(--superficie); }
.avatar-tabela, .avatar-previa, .avatar-menu, .avatar-grande { display: inline-flex; align-items: center; justify-content: center; background: var(--degrade-ativo); color: #FFFFFF; font-weight: 600; }
.avatar-tabela { width: 28px; height: 28px; font-size: 11px; }
.avatar-previa, .avatar-menu { width: 48px; height: 48px; font-size: 16px; box-shadow: var(--sombra-primario); }
.avatar-grande { width: 128px; height: 128px; font-family: var(--fonte-titulo); font-size: 40px; box-shadow: var(--sombra-primario); }

/* "Minha foto": a foto/iniciais do chip (painel do cabeçalho) é link para /minha-foto (MinhaFotoController) */
.menu-usuario-quem { display: flex; align-items: center; gap: 12px; min-width: 0; padding-bottom: 10px; margin-bottom: 2px; border-bottom: 1px solid var(--borda-suave); }
.menu-usuario-nome { display: flex; flex-direction: column; gap: 2px; min-width: 0; overflow-wrap: break-word; }
.menu-usuario-foto { flex: none; display: inline-flex; border-radius: 50%; transition: transform var(--transicao), filter var(--transicao); }
.menu-usuario-foto:hover { text-decoration: none; transform: translateY(-1px); filter: brightness(1.06); }
.menu-usuario-foto:focus-visible { outline: 2px solid var(--ducon-azul-forte); outline-offset: 2px; }
.menu-usuario-item { display: flex; align-items: center; min-height: var(--controle-p); margin: 0 -8px; padding: 0 8px; border-radius: var(--raio-s); color: var(--texto); font-weight: 500; }
.menu-usuario-item:hover { background: var(--fundo-2); text-decoration: none; }
.minha-foto { max-width: 640px; gap: 18px; }
.minha-foto-atual { display: flex; align-items: center; flex-wrap: wrap; gap: 16px 20px; min-width: 0; }
.minha-foto-quem { display: flex; flex-direction: column; gap: 4px; min-width: 0; overflow-wrap: break-word; }
.minha-foto .campo input[type="file"] { height: auto; min-height: var(--controle); padding: 6px 8px; font-size: 12px; color: var(--texto-2); }
.celula-usuario { display: flex; align-items: center; gap: 8px; min-width: 0; }
.celula-usuario > span:last-child { min-width: 0; overflow-wrap: break-word; }   /* quebra entre palavras: "anywhere" (td:first-child) deixava a coluna com 1 letra de largura mínima */
.campos-linha .campo-foto { grid-column: 1 / -1; }   /* linha inteira: o seletor de arquivo não cabe em meia coluna */
.campo-foto-linha { display: flex; align-items: center; gap: 12px; min-width: 0; }
.campo .campo-foto-linha input[type="file"] { flex: 1; height: auto; min-height: var(--controle); padding: 6px 8px; font-size: 12px; color: var(--texto-2); }
.campo input[type="file"]::file-selector-button {
    margin-right: 10px;
    height: var(--controle-p);
    padding: 0 12px;
    border-radius: var(--raio-pill);
    border: 1px solid var(--borda-forte);
    background: var(--fundo-2);
    color: var(--texto);
    font: inherit;
    font-weight: 600;
    cursor: pointer;
}
.campo input[type="file"]::file-selector-button:hover { border-color: var(--cancelada); }

/* ---------- Botões ---------- */
.botao {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    height: var(--controle);
    padding: 0 16px;
    border-radius: var(--raio-m);
    border: 1px solid var(--borda-forte);
    background: var(--superficie);
    color: var(--texto);
    font-size: 13px;
    font-weight: 500;
    white-space: nowrap;
    cursor: pointer;
    box-shadow: var(--sombra-1);
    transition: transform var(--transicao), box-shadow var(--transicao), background var(--transicao), border-color var(--transicao), filter var(--transicao);
}
.botao:hover { text-decoration: none; background: var(--fundo-2); transform: translateY(-1px); box-shadow: var(--sombra-2); }
.botao:active { transform: translateY(0); box-shadow: var(--sombra-1); }
.botao-secundario { background: var(--superficie); }
.botao-primario { border-color: transparent; background: var(--degrade-ativo); color: #FFFFFF; padding: 0 18px; font-weight: 600; box-shadow: var(--sombra-primario); }
.botao-primario:hover { background: var(--degrade-ativo); border-color: transparent; filter: brightness(1.06); box-shadow: 0 2px 4px rgba(55, 64, 255, 0.25), 0 10px 22px rgba(75, 83, 255, 0.3); }
/* foco inequívoco sobre o degradê: anel branco + anel índigo */
.botao-primario:focus-visible { outline: 3px solid #FFFFFF; outline-offset: 0; box-shadow: 0 0 0 6px var(--ducon-azul-forte); }
.botao-perigo { border-color: var(--perigo-borda); color: var(--perigo); }
.botao-perigo:hover { background: var(--perigo-fundo); border-color: rgba(163, 58, 44, 0.55); }
.botao-pequeno { height: var(--controle-p); padding: 0 12px; border-radius: var(--raio-s); font-size: 12px; font-weight: 500; }
.botao-bloco { width: 100%; }
.botao-icone {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: none;
    width: var(--controle-p);
    height: var(--controle-p);
    border-radius: var(--raio-s);
    border: 1px solid var(--borda);
    background: var(--superficie);
    color: var(--texto-2);
    cursor: pointer;
    transition: border-color var(--transicao), color var(--transicao), background var(--transicao);
}
.botao-icone:hover { border-color: var(--borda-forte); background: var(--fundo-2); color: var(--texto); text-decoration: none; }
.botoes { display: flex; gap: 8px; }
.botoes .botao-primario { flex: 1; }

/* ---------- Cards, KPIs, notas ---------- */
.card {
    background: var(--superficie);
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    box-shadow: var(--sombra-1);
    padding: 16px 18px;
    display: flex;
    flex-direction: column;
    gap: 10px;
}
.card h2 { font-family: var(--fonte-titulo); font-size: 15px; font-weight: 600; letter-spacing: -0.005em; }
.nota { font-size: 12px; color: var(--texto-2); padding: 10px 12px; border-radius: var(--raio-m); background: var(--fundo-2); border: 1px solid var(--borda-suave); }

.kpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 14px; }
.kpi {
    display: flex;
    flex-direction: column;
    gap: 4px;
    padding: 16px 18px;
    border-radius: var(--raio);
    border: 1px solid var(--borda);
    box-shadow: var(--sombra-1);
    background: var(--degrade-kpi) top / 100% 3px no-repeat, var(--superficie);
    transition: transform var(--transicao), box-shadow var(--transicao), border-color var(--transicao);
}
a.kpi:hover { text-decoration: none; border-color: var(--borda-forte); transform: translateY(-1px); box-shadow: var(--sombra-2); }
.kpi-rotulo { font-size: 11px; font-weight: 500; color: var(--texto-2); text-transform: uppercase; letter-spacing: 0.06em; }
.kpi-valor { font-family: var(--fonte-titulo); font-size: 30px; font-weight: 700; line-height: 1.1; letter-spacing: -0.02em; }
.kpi-nota { font-size: 12px; color: var(--texto-2); }
.kpi-alerta { background: var(--degrade-atrasada) top / 100% 3px no-repeat, linear-gradient(var(--atrasada-suave), var(--atrasada-suave)), var(--superficie); border-color: var(--atrasada-borda); }
.kpi-alerta .kpi-rotulo, .kpi-alerta .kpi-valor { color: var(--atrasada-texto); }

.passos { display: flex; flex-direction: column; gap: 6px; padding: 0; list-style: none; font-size: 13px; }
.passos li { display: flex; gap: 10px; }
.passo-numero {
    width: 22px;
    height: 22px;
    flex: none;
    border-radius: 50%;
    background: var(--degrade-ativo);
    color: #FFFFFF;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 11px;
    font-weight: 600;
}

/* ---------- SWOT: quadrantes 2×2 + painel lateral ---------- */
.swot { display: flex; align-items: flex-start; gap: 18px; }
.quadrantes { flex: 1; min-width: 0; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
.quadrante {
    display: flex;
    flex-direction: column;
    background: var(--superficie);
    border: 1px solid var(--borda);
    border-top: 3px solid var(--cor-quadrante, var(--ducon-indigo));   /* borda real: imprime sem "imprimir fundos" */
    border-radius: var(--raio);
    box-shadow: var(--sombra-1);
    overflow: hidden;
}
.quadrante-forca { --cor-quadrante: var(--concluida); }
.quadrante-fraqueza { --cor-quadrante: var(--atrasada); }
.quadrante-oportunidade { --cor-quadrante: var(--ducon-indigo); }
.quadrante-ameaca { --cor-quadrante: var(--perigo); }
.quadrante-topo { display: flex; align-items: center; gap: 8px; padding: 13px 16px 11px; border-bottom: 1px solid var(--borda-suave); }
.quadrante-topo h2 { font-family: var(--fonte-titulo); font-size: 15px; font-weight: 600; }
.quadrante-conta { font-size: 12px; font-weight: 500; color: var(--texto-2); padding: 1px 8px; border-radius: var(--raio-pill); background: var(--fundo); }
.quadrante-topo .botao { margin-left: auto; }
.quadrante-itens { display: flex; flex-direction: column; gap: 6px; padding: 12px; font-size: 13px; }
.vazio { padding: 10px 12px; font-size: 13px; color: var(--texto-2); }

/* a linha quebra: se o texto ficaria com menos de 150px, pílula + lápis (.item-swot-fim) descem para a 2ª linha, à direita */
.item-swot { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; padding: 9px 12px; border-radius: var(--raio-m); border: 1px solid var(--borda); background: var(--superficie); transition: background var(--transicao), border-color var(--transicao), box-shadow var(--transicao); }
.item-swot:hover { background: var(--fundo-2); border-color: var(--borda-forte); }
.item-swot-sem { border-color: var(--atrasada-borda); background: var(--atrasada-suave); }
.item-swot-sem:hover { background: var(--atrasada-fundo); border-color: var(--atrasada-borda); }
.item-swot-ativo, .item-swot-ativo:hover { border-color: var(--ducon-azul-forte); background: var(--tinta-2); box-shadow: 0 0 0 3px rgba(75, 83, 255, 0.12); }
.cod { flex: none; min-width: 28px; font-size: 11px; font-weight: 600; color: var(--texto-2); letter-spacing: 0.02em; }
/* até 2 linhas (o texto completo fica no title e no painel de edição) */
.item-swot-texto { flex: 1 1 150px; min-width: 0; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2; overflow-wrap: anywhere; }

/* pílulas: vínculo SWOT → plano e status de ação (badge com ponto colorido) */
.vinculo, .badge {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 3px 10px;
    border-radius: var(--raio-pill);
    font-size: 11px;
    font-weight: 600;
    line-height: 1.4;
    white-space: nowrap;
}
.badge::before { content: ""; width: 6px; height: 6px; flex: none; border-radius: 50%; background: currentColor; opacity: .9; }
.vinculo { background: var(--tinta-1); color: var(--ducon-marinho); }
.vinculo-sem { background: var(--atrasada-fundo); color: var(--atrasada-texto); }
.vinculo-acompanhar { background: var(--fundo); color: var(--texto-2); }
/* vínculos clicáveis: alvo de 32px sem engordar a linha (margem negativa compensa) */
.item-swot-fim { display: flex; align-items: center; gap: 10px; flex: none; max-width: 100%; margin-left: auto; }
.item-swot-fim > a.vinculo, .tabela a.vinculo { min-height: 32px; margin: -6px 0; }
.badge-a_fazer { background: var(--fundo); color: var(--texto-2); }
.badge-em_andamento { background: var(--andamento-fundo); color: var(--andamento); }
.badge-concluida { background: var(--concluida-fundo); color: var(--concluida-texto); }
.badge-atrasada { background: var(--atrasada-fundo); color: var(--atrasada-texto); }
.badge-cancelada { background: var(--cancelada-fundo); color: var(--cancelada-texto); }

.painel { width: 350px; flex: none; display: flex; flex-direction: column; gap: 14px; }
/* "Mover para outro setor" (só Gestão), no fim do painel de edição do item */
.mover-setor { display: flex; flex-direction: column; gap: 6px; margin-top: 4px; padding-top: 12px; border-top: 1px solid var(--borda-suave); }
.mover-setor .form-linha .campo { flex: 1; width: auto; }

/* ---------- Formulários ---------- */
.formulario { display: flex; flex-direction: column; gap: 10px; }
.campo { display: flex; flex-direction: column; gap: 5px; min-width: 0; font-size: 12px; font-weight: 500; color: var(--texto-2); }
.campo input:not([type="checkbox"]):not([type="radio"]),
.campo select,
.campo textarea {
    width: 100%;
    height: var(--controle);
    padding: 0 12px;
    border-radius: var(--raio-m);
    border: 1px solid var(--borda-campo);   /* ≥ 3:1: a borda é a única pista do campo (branco sobre card branco) */
    background: var(--superficie);
    color: var(--texto);
    font-size: 13px;
    font-weight: 400;
    box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
    transition: border-color var(--transicao), box-shadow var(--transicao);
}
.campo input:not([type="checkbox"]):not([type="radio"]):hover,
.campo select:hover,
.campo textarea:hover { border-color: var(--cancelada); }
.campo input:not([type="checkbox"]):not([type="radio"]):focus,
.campo select:focus,
.campo textarea:focus { outline: none; border-color: var(--ducon-indigo); box-shadow: var(--anel-foco); }
.campo input::placeholder, .campo textarea::placeholder { color: var(--placeholder); opacity: 1; }
.campo select { padding: 0 10px; }
.campo textarea { height: auto; min-height: 72px; padding: 10px 12px; resize: vertical; line-height: 1.5; }
.campo [aria-invalid="true"] { border-color: var(--perigo); box-shadow: 0 0 0 4px rgba(163, 58, 44, 0.14); }
.campo-ajuda { font-size: 11px; font-weight: 400; line-height: 1.35; color: var(--texto-2); }   /* ajuda curta entre rótulo e campo (aria-describedby) */
.campo-erro { font-size: 12px; font-weight: 500; color: var(--perigo); }
.campos-linha { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; }
.opcoes {
    display: flex;
    flex-direction: column;
    gap: 2px;
    max-height: 184px;
    overflow-y: auto;
    padding: 6px;
    border: 1px solid var(--borda-campo);
    border-radius: var(--raio-m);
    background: var(--superficie);
}
.opcoes:focus-within { border-color: var(--ducon-indigo); box-shadow: var(--anel-foco); }
.opcao { display: flex; align-items: flex-start; gap: 8px; min-height: 32px; padding: 6px 8px; border-radius: var(--raio-s); font-size: 13px; font-weight: 400; color: var(--texto); cursor: pointer; transition: background var(--transicao); }
.opcao:hover { background: var(--tinta-2); }
.opcao input { margin: 2px 0 0; flex: none; accent-color: var(--ducon-azul-forte); }
.link { font-size: 12px; font-weight: 600; color: var(--ducon-azul-forte); }
.link:hover { color: var(--ducon-indigo-escuro); }

/* ---------- Tabela e barras de progresso ---------- */
.tabela { width: 100%; border-collapse: collapse; font-size: 13px; }
.tabela th {
    text-align: left;
    padding: 10px 10px;
    font-size: 11px;
    font-weight: 600;
    color: var(--texto-2);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    white-space: nowrap;
    background: transparent;
    border-bottom: 1px solid var(--borda);
}
.tabela td { padding: 11px 10px; border-top: 1px solid var(--borda-suave); vertical-align: top; }
.tabela th:first-child, .tabela td:first-child { padding-left: 18px; }
.tabela th:last-child, .tabela td:last-child { padding-right: 18px; }
.tabela tbody tr:nth-child(even) { background: var(--fundo-zebra); }
.tabela tbody tr { transition: background var(--transicao); }
.tabela tbody tr:hover { background: var(--fundo-2); }
/* "Abrir"/"Atualizar": pill de 32px (alvo de toque) sem engordar a linha */
.tabela .link { display: inline-flex; align-items: center; min-height: 32px; padding: 0 10px; margin: -6px 0; border-radius: var(--raio-pill); background: var(--tinta-2); }
.tabela .link:hover { background: var(--tinta-1); text-decoration: none; }
/* faixa lateral de status nas linhas (reforço visual; sem :has() a linha fica só com badge/fundo) */
.tabela tbody tr.linha-atrasada > td:first-child { box-shadow: inset var(--faixa) 0 0 var(--atrasada); }
.tabela tbody tr:has(.badge-concluida) > td:first-child { box-shadow: inset var(--faixa) 0 0 var(--concluida); }
.tabela tbody tr:has(.badge-em_andamento) > td:first-child { box-shadow: inset var(--faixa) 0 0 var(--andamento); }
.tabela tbody tr:has(.badge-cancelada) > td:first-child { box-shadow: inset var(--faixa) 0 0 var(--cancelada); }
.tabela tbody tr:has(.badge-atrasada) > td:first-child { box-shadow: inset var(--faixa) 0 0 var(--atrasada); }
.tabela tbody tr:has(.badge-vence) > td:first-child { box-shadow: inset var(--faixa) 0 0 var(--atrasada-borda); }

.barra { display: flex; gap: 2px; height: 10px; border-radius: 5px; overflow: hidden; background: var(--tinta-3); }
.barra > span { display: block; height: 100%; }
.barra-concluida { background: var(--degrade-concluida); }
.barra-andamento { background: var(--degrade-kpi); }   /* filete da marca nas barras finas */
.barra-atrasada { background: var(--degrade-atrasada); }

/* ---------- Planejamento: lista de planos (400px acima de 1200px) + plano selecionado ---------- */
.planejamento { display: flex; align-items: flex-start; gap: 18px; }
.plano-lista { flex: none; display: flex; flex-direction: column; gap: 12px; }
.rotulo-secao { font-size: 12px; font-weight: 600; color: var(--texto-2); text-transform: uppercase; letter-spacing: 0.06em; }

.plano-card {
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding: 16px 18px;
    border-radius: var(--raio);
    border: 1px solid var(--borda);
    box-shadow: var(--sombra-1);
    background: var(--degrade-kpi) top / 100% 3px no-repeat, var(--superficie);
    transition: transform var(--transicao), box-shadow var(--transicao), border-color var(--transicao), background var(--transicao);
}
.plano-card:hover { text-decoration: none; border-color: var(--borda-forte); transform: translateY(-1px); box-shadow: var(--sombra-2); }
.plano-card-ativo, .plano-card-ativo:hover { background: var(--degrade-ativo) top / 100% 3px no-repeat, var(--tinta-2); border-color: var(--ducon-azul-forte); box-shadow: 0 0 0 3px rgba(75, 83, 255, 0.12); transform: none; }
.plano-card-topo { display: flex; align-items: baseline; gap: 8px; }
.plano-card-titulo { min-width: 0; font-weight: 600; overflow-wrap: anywhere; }
.plano-card-resp { margin-left: auto; flex: none; max-width: 45%; font-size: 12px; color: var(--texto-2); text-align: right; }
.plano-card-progresso { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--texto-2); }
.plano-card-progresso .barra { flex: 1 1 60px; height: 6px; border-radius: 3px; background: var(--borda); }
.plano-card-progresso .barra > span { border-radius: 3px; }

/* chips dos itens de origem: F/O índigo, Fr âmbar, A vermelho */
.chips { display: flex; flex-wrap: wrap; gap: 4px; }
.chip {
    display: inline-block;
    max-width: 100%;
    padding: 2px 9px;
    border-radius: var(--raio-pill);
    font-size: 11px;
    font-weight: 600;
    line-height: 1.5;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    background: var(--tinta-1);
    color: var(--ducon-marinho);
}
.chip-fraqueza { background: var(--atrasada-fundo); color: var(--atrasada-texto); }
.chip-ameaca { background: var(--perigo-fundo); color: var(--perigo); }
.aviso-sem-plano { padding: 10px 12px; border-radius: var(--raio-m); background: linear-gradient(var(--atrasada-suave), var(--atrasada-suave)), var(--superficie); border: 1px solid var(--atrasada-borda); font-size: 12px; color: var(--atrasada-texto); }
.aviso-sem-plano a { display: inline-flex; align-items: center; min-height: 32px; margin: -6px 0; padding: 0 9px; border-radius: var(--raio-pill); background: var(--atrasada-fundo); color: var(--atrasada-texto); font-weight: 600; }
.aviso-sem-plano a:hover { text-decoration: none; background: var(--atrasada-borda); }

.plano-detalhe {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    background: var(--superficie);
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    box-shadow: var(--sombra-1);
    overflow: hidden;
}
.plano-detalhe-topo { display: flex; align-items: center; gap: 10px; padding: 16px 20px; border-bottom: 1px solid var(--borda-suave); }
.plano-detalhe-topo h2, .plano-vazio h2 { font-family: var(--fonte-titulo); font-size: 20px; font-weight: 600; line-height: 1.25; letter-spacing: -0.015em; }
.plano-detalhe-topo .botao { margin-left: auto; height: 36px; font-weight: 500; }
.plano-vazio { padding: 32px 20px; display: flex; flex-direction: column; align-items: flex-start; gap: 10px; }
.plano-rodape { margin-top: 12px; padding: 12px 20px; border-top: 1px solid var(--borda-suave); font-size: 12px; color: var(--texto-2); background: var(--fundo-2); }

/* tabela de ações: descrição + linha secundária (observação / "Atrasada há N dias…"); abaixo de 640px vira cartões (.tabela-cartoes).
   Regra das tabelas com table-layout: fixed: min-width = soma das colunas fixas + ≥ 140px para a coluna flexível, só no bloco
   de tablet em diante (min-width 641px, em Responsivo) — senão a coluna flexível fica com 0px (defeito da tabela de usuários no celular). */
.tabela-rolagem { overflow-x: auto; }
.acoes-tabela { table-layout: fixed; }
.acoes-tabela .col-responsavel { width: 140px; }
.acoes-tabela .col-prazo { width: 96px; }   /* "28/02/2027" (prazo de outro ano) numa linha */
.acoes-tabela .col-status { width: 124px; }
.acoes-tabela .col-abrir { width: 88px; }
.acao-titulo { display: block; font-weight: 500; overflow-wrap: anywhere; }
.acao-linha2 { display: block; font-size: 11px; color: var(--texto-2); overflow-wrap: anywhere; }
.tabela tbody tr.linha-atrasada { background: var(--atrasada-suave); }
.tabela tbody tr.linha-atrasada:hover { background: var(--atrasada-fundo); }
.linha-atrasada .acao-linha2 { color: var(--atrasada-texto); }
.prazo-atrasado { color: var(--perigo); font-weight: 600; }
.tabela tbody tr.linha-aberta, .tabela tbody tr.linha-edicao { background: var(--tinta-2); }
.tabela tbody tr.linha-edicao > td { border-top: 0; padding-top: 4px; padding-bottom: 16px; }

/* formulários em caixa tracejada (novo plano, nova ação) e grade 2fr 1fr 1fr do mockup */
.form-tracejado { margin: 14px 20px 0; padding: 14px 16px; border-radius: 12px; border: 1px dashed var(--borda-forte); background: var(--fundo-2); display: flex; flex-direction: column; gap: 10px; }
.form-titulo { font-family: var(--fonte-titulo); font-size: 13px; font-weight: 600; }
.campos-acao { display: grid; grid-template-columns: 2fr 1fr 1fr; gap: 10px; align-items: end; }
.campos-acao-fim { align-items: end; }
.botoes-inicio .botao-primario { flex: none; }

/* ---------- Dashboard (d2-*): KPIs com sparkline, gráficos SVG do servidor (App\Servicos\Graficos), insights ----------
   Os gráficos são <svg class="d2-svg"> com viewBox fixo que escalam com o card (width: 100%); as cores por papel vêm do
   próprio SVG (fill), então imprimem sem "gráficos de fundo". Legendas em HTML (.legenda). As grades usam só
   minmax(0, 1fr): nada força largura mínima (1366px sem rolagem horizontal — DashboardTest::test_layout_cabe_em_1366px…). */
.dash { display: flex; flex-direction: column; gap: 16px; }   /* wrapper também da visão geral */
.card-topo { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 10px; }
.card-topo .legenda, .card-topo .link { margin-left: auto; }
.card-topo .link { display: inline-flex; align-items: center; min-height: 32px; margin: -6px 0; }
.card-lista { padding: 0; gap: 0; overflow: hidden; }
.card-lista > .card-topo { padding: 14px 18px; border-bottom: 1px solid var(--borda-suave); }
.kpi-pct { font-family: var(--fonte); font-size: 14px; font-weight: 500; letter-spacing: 0; color: var(--texto-2); }
.texto-atrasada { color: var(--atrasada-texto); }
.prazo-data { min-width: 44px; flex: none; font-weight: 600; }
.prazo-proximo { color: var(--atrasada-texto); }

.legenda { display: inline-flex; flex-wrap: wrap; gap: 4px 12px; font-size: 11px; font-weight: 500; color: var(--texto-2); }
.legenda > span { display: inline-flex; align-items: center; gap: 5px; }
.legenda-cor { width: 9px; height: 9px; flex: none; border-radius: 3px; }
.legenda-cor.legenda-linha { width: 14px; height: 2px; border-radius: 1px; }
.legenda-hachura { background: repeating-linear-gradient(45deg, var(--borda-forte) 0 2px, var(--fundo-2) 2px 4.2px); }
.legenda-faixa { background: rgba(201, 130, 26, 0.28); }
.legenda-vazia { background: rgba(75, 83, 255, 0.07); box-shadow: inset 0 0 0 1px var(--borda); }

/* barra empilhada HTML (visão geral): um segmento por situação, com o número dentro */
.barra-empilhada { flex: 1; min-width: 0; display: flex; gap: 2px; height: 22px; border-radius: 6px; overflow: hidden; background: var(--fundo); }
.barra-empilhada > span { min-width: 18px; display: inline-flex; align-items: center; justify-content: center; color: #FFFFFF; font-weight: 600; }
/* degradês contidos (branco ≥ 4,6:1) — e a legenda usa os mesmos, para legenda = barra */
.barra-empilhada > .barra-concluida, .legenda-cor.barra-concluida { background: var(--degrade-concluida-contido); }
.barra-empilhada > .barra-andamento, .legenda-cor.barra-andamento { background: var(--degrade-andamento-contido); }
.barra-empilhada > .barra-atrasada { color: var(--texto); }

.sinal-ponto { width: 9px; height: 9px; flex: none; margin-top: 6px; border-radius: 50%; background: var(--ducon-azul-forte); box-shadow: 0 0 0 3px rgba(75, 83, 255, 0.14); }
.sinal-ponto-info { background: var(--ducon-marinho); box-shadow: 0 0 0 3px rgba(42, 51, 108, 0.14); }
.sinal-ponto-perigo { background: var(--perigo); box-shadow: 0 0 0 3px rgba(163, 58, 44, 0.16); }
.sinal-ponto-alerta { background: var(--atrasada); box-shadow: 0 0 0 3px rgba(201, 130, 26, 0.18); }
.sinal-ponto-ok { background: var(--concluida); box-shadow: 0 0 0 3px rgba(46, 125, 79, 0.16); }

.d2 { display: flex; flex-direction: column; gap: 16px; }
.d2 svg text { font-family: var(--fonte); }
.d2-svg { display: block; width: 100%; height: auto; overflow: visible; }
.d2-rolagem { overflow-x: auto; overscroll-behavior-x: contain; }   /* gráficos largos (ritmo, prazos por mês): abaixo de 640px rolam no card */
.d2-eixo { font-size: 11px; font-weight: 500; fill: var(--texto-2); font-variant-numeric: tabular-nums; }
.d2-rot { font-size: 11.5px; font-weight: 500; fill: var(--texto-2); }
.d2-forte { font-weight: 600; fill: var(--texto); }
.d2-dentro { font-size: 11px; font-weight: 600; }

/* cabeçalho: contagem de ações nas pílulas de setor + "Atualizado hoje" */
.abas .aba-conta { margin-left: 6px; padding: 0 6px; border-radius: var(--raio-pill); background: var(--superficie); border: 1px solid var(--borda); font-size: 10.5px; font-weight: 600; line-height: 16px; color: var(--texto-2); }
.d2-atualizado { display: inline-flex; align-items: center; gap: 7px; height: 30px; padding: 0 12px; border-radius: var(--raio-pill); background: var(--fundo-2); border: 1px solid var(--borda); font-size: 12px; font-weight: 500; color: var(--texto-2); white-space: nowrap; }
.d2-atualizado::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--concluida); box-shadow: 0 0 0 3px var(--concluida-fundo); }

/* KPIs: número grande + nota + sparkline (12 semanas) + rodapé "desde dd/mm · variação" */
.d2-kpis { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 14px; }
.d2-kpi { position: relative; gap: 2px; padding: 14px 16px 10px; min-width: 0; color: inherit; }
.d2-kpi .kpi-valor { font-size: 32px; font-variant-numeric: proportional-nums; margin-top: 2px; }
.d2-kpi .kpi-nota { min-height: 34px; line-height: 1.4; }
.kpi-alerta .kpi-nota { color: var(--atrasada-texto); }
.d2-spark-caixa { position: relative; height: 36px; margin: 4px 0; }
.d2-spark { display: block; width: 100%; height: 36px; }
.d2-spark-fim { position: absolute; left: var(--x); top: var(--y); width: 9px; height: 9px; margin: -4.5px 0 0 -4.5px; border-radius: 50%; box-shadow: 0 0 0 2px #FFFFFF; }
.d2-spark-aviso { display: flex; align-items: center; min-height: 36px; margin: 4px 0; padding: 4px 8px; border-radius: var(--raio-s); background: var(--fundo-2); font-size: 11px; line-height: 1.35; color: var(--texto-2); }
.kpi-alerta .d2-spark-aviso { background: var(--superficie); }
.d2-kpi-rodape { display: flex; justify-content: space-between; align-items: center; gap: 6px; padding-top: 6px; border-top: 1px solid var(--borda-suave); font-size: 10.5px; color: var(--texto-2); white-space: nowrap; }
.kpi-alerta .d2-kpi-rodape { border-top-color: var(--atrasada-borda); }

/* grade de cards */
.d2-grade { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; }
.d2-span2 { grid-column: span 2; }
.d2-card { gap: 12px; min-width: 0; }
.d2-card .card-topo { align-items: flex-start; }
.d2-card .card-topo h2 { margin-right: auto; }
.d2-card .card-topo .legenda { margin-left: 0; padding-top: 3px; }
.d2-sub { display: block; font-family: var(--fonte); font-size: 12px; font-weight: 400; letter-spacing: 0; color: var(--texto-2); margin-top: 1px; }
.d2-rodape { margin-top: auto; padding-top: 10px; border-top: 1px solid var(--borda-suave); font-size: 11.5px; line-height: 1.5; color: var(--texto-2); overflow-wrap: anywhere; }
.d2-rodape b { color: var(--texto); font-weight: 600; }

/* rosca de status: 160px (128px abaixo de 1440px) + legenda em coluna */
.d2-rosca-caixa { display: flex; align-items: center; gap: 14px; flex: 1; }
.d2-rosca { width: 160px; height: 160px; flex: none; }
.d2-rosca-num { font-family: var(--fonte-titulo) !important; font-size: 32px; font-weight: 700; fill: var(--texto); }
.d2-rosca-leg { flex: 1; min-width: 0; display: flex; flex-direction: column; font-size: 12px; }
.d2-rosca-linha { display: flex; align-items: center; gap: 8px; min-height: 29px; border-bottom: 1px solid var(--borda-suave); }
.d2-rosca-linha:last-child { border-bottom: 0; }
.d2-rosca-rot { flex: 1; min-width: 0; color: var(--texto); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.d2-rosca-linha b { font-family: var(--fonte-titulo); font-size: 14px; font-weight: 700; min-width: 16px; text-align: right; }
.d2-rosca-pct { width: 32px; flex: none; text-align: right; color: var(--texto-2); font-size: 11.5px; }

/* ações por setor */
.d2-setores { display: flex; flex-direction: column; gap: 14px; }
.d2-setor { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.d2-setor-topo { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; font-size: 13px; }
.d2-setor-nome { min-width: 0; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.d2-setor-total { flex: none; font-size: 12px; color: var(--texto-2); }
.d2-setor-total b { font-family: var(--fonte-titulo); font-size: 14px; color: var(--texto); }
.d2-setor-sub { font-size: 11.5px; color: var(--texto-2); }

/* funil */
.d2-funil { display: flex; flex-direction: column; }
.d2-funil-etapa { display: flex; flex-direction: column; gap: 4px; }
.d2-funil-topo { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; font-size: 12.5px; font-weight: 500; }
.d2-funil-topo b { font-family: var(--fonte-titulo); font-size: 15px; font-weight: 700; color: var(--texto); }
.d2-funil-topo span:last-child { color: var(--texto-2); font-size: 11.5px; white-space: nowrap; }
.d2-funil-conv { display: flex; align-items: center; justify-content: center; gap: 6px; margin: 6px 0 4px; font-size: 11px; font-weight: 500; color: var(--texto-2); text-align: center; }
.d2-funil-conv span { color: var(--ducon-indigo); font-weight: 700; }

/* ranking de responsáveis: iniciais (usuário do SWOT em índigo; texto livre com contorno), barrinha e números */
.d2-rank { display: flex; flex-direction: column; }
.d2-rank-linha { display: flex; align-items: center; gap: 10px; min-height: 38px; padding: 4px 0; border-bottom: 1px solid var(--borda-suave); font-size: 12px; }
.d2-rank-linha:last-child { border-bottom: 0; }
.d2-av { width: 24px; height: 24px; flex: none; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: 9px; font-weight: 700; letter-spacing: .02em; color: var(--texto-2); border: 1.5px solid var(--borda-forte); background: var(--superficie); }
.d2-av-usuario { border: 0; background: var(--degrade-ativo); color: #FFFFFF; }
.d2-rank-meio { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.d2-rank-nome { font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.d2-rank-barra { display: block; width: 100%; height: 8px; }
.d2-rank-num { width: 78px; flex: none; display: flex; flex-direction: column; align-items: flex-end; line-height: 1.3; color: var(--texto-2); font-size: 11px; white-space: nowrap; }
.d2-rank-num b { font-family: var(--fonte-titulo); font-size: 14px; font-weight: 700; color: var(--texto); }
.d2-rank-num small { font-size: 10.5px; }
.d2-rank-num .d2-rank-zero { color: var(--concluida-texto); }
.d2-rank-leg { display: flex; flex-wrap: wrap; gap: 4px 14px; }
.d2-rank-leg > span { display: inline-flex; align-items: center; gap: 6px; }
.d2-rank-leg .d2-av { width: 13px; height: 13px; }

/* insights automáticos */
.d2-secao { display: flex; align-items: baseline; flex-wrap: wrap; gap: 4px 10px; margin-top: 4px; }
.d2-secao h2 { font-family: var(--fonte-titulo); font-size: 17px; font-weight: 700; }
.d2-secao span { font-size: 12px; color: var(--texto-2); }
.d2-insights { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 16px; }
.d2-insight { gap: 8px; min-width: 0; background: var(--degrade-kpi) top / 100% 3px no-repeat, var(--superficie); }
.d2-insight-topo { display: flex; align-items: center; gap: 9px; }
.d2-insight-topo .sinal-ponto { margin-top: 0; }
.d2-insight-tag { font-size: 11px; font-weight: 600; color: var(--texto-2); text-transform: uppercase; letter-spacing: .06em; }
.d2-insight h3 { font-family: var(--fonte-titulo); font-size: 15px; font-weight: 700; line-height: 1.3; letter-spacing: -0.01em; overflow-wrap: anywhere; }
.d2-insight p { flex: 1; font-size: 12.5px; line-height: 1.5; color: var(--texto-2); overflow-wrap: anywhere; }
.d2-fim { font-size: 11.5px; color: var(--texto-2); padding: 2px 2px 0; }

/* ---------- Visão geral (gestão): cards por setor, ações que precisam de atenção, vínculos pendentes ---------- */
.texto-concluida { color: var(--concluida-texto); }
.texto-perigo { color: var(--perigo); }
.celula-cortada { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.card-rodape { margin-top: auto; padding: 12px 18px; border-top: 1px solid var(--borda-suave); background: var(--fundo-2); font-size: 12px; color: var(--texto-2); }

/* card de setor: nome Jakarta, três números (itens · planos · ações), barra empilhada e rodapé âmbar dos itens sem plano */
.setor-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(300px, 100%), 1fr)); gap: 16px; }   /* min(): celular de 320px não transborda */
.setor-card {
    display: flex;
    flex-direction: column;
    gap: 12px;
    padding: 18px 20px;
    border-radius: var(--raio);
    border: 1px solid var(--borda);
    box-shadow: var(--sombra-1);
    background: var(--degrade-kpi) top / 100% 3px no-repeat, var(--superficie);
    transition: transform var(--transicao), box-shadow var(--transicao), border-color var(--transicao);
}
.setor-card-topo { display: flex; align-items: baseline; flex-wrap: wrap; gap: 2px 8px; }
.setor-card-nome { font-family: var(--fonte-titulo); font-size: 20px; font-weight: 700; line-height: 1.2; letter-spacing: -0.015em; }
.setor-card-numeros { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; font-size: 12px; color: var(--texto-2); }
.setor-card-numero { display: flex; flex-direction: column; padding: 10px; border-radius: var(--raio-m); background: var(--fundo-2); border: 1px solid var(--borda-suave); }
.setor-card-valor { font-family: var(--fonte-titulo); font-size: 20px; font-weight: 700; line-height: 1.2; letter-spacing: -0.01em; color: var(--texto); }
.setor-card-barra { display: flex; align-items: center; gap: 8px; font-size: 12px; }
.setor-card-atrasadas { flex: none; font-weight: 600; white-space: nowrap; }
.setor-card-rodape { font-size: 12px; color: var(--atrasada-texto); overflow-wrap: anywhere; }
a.setor-card:hover { text-decoration: none; border-color: var(--borda-forte); transform: translateY(-1px); box-shadow: var(--sombra-2); }
a.setor-card:hover .setor-card-nome { text-decoration: underline; text-underline-offset: 3px; }

/* "+ Novo setor": caixa tracejada */
.setor-card-novo {
    min-height: 160px;
    padding: 18px 20px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 6px;
    border-radius: var(--raio);
    border: 1px dashed var(--borda-forte);
    background: var(--fundo-2);   /* vaga clara sobre o cinza: texto-2 7,5:1, azul-forte 5,8:1 */
    color: var(--texto-2);
    text-align: center;
    transition: background var(--transicao), border-color var(--transicao);
}
a.setor-card-novo:hover { text-decoration: none; background: var(--tinta-2); border-color: var(--ducon-indigo); }
.setor-card-novo-mais { font-size: 30px; line-height: 1; color: var(--ducon-azul-forte); }
.setor-card-novo-titulo { font-weight: 600; color: var(--ducon-azul-forte); }

.visao-grade { display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); gap: 16px; }
/* sem rolagem no desktop: a grade empilha em ≤1500px; prazo "dd/mm/aaaa" cabe nos 96px (e ainda quebra depois do mês, <wbr>,
   se faltar espaço) e o badge "Atrasada NNN d" quebra em 2 linhas em vez de vazar da célula; abaixo de 640px a tabela vira cartões */
.tabela-atencao { table-layout: fixed; }
.tabela-atencao .col-setor { width: 96px; }
.tabela-atencao .col-plano { width: 120px; }
.tabela-atencao .col-responsavel { width: 110px; }
.tabela-atencao .col-prazo { width: 96px; }
.tabela-atencao .col-status { width: 112px; }
.tabela-atencao .prazo-data { padding-left: 10px; }
.tabela-atencao .badge { white-space: normal; max-width: 100%; }
.badge-vence { background: var(--tinta-1); color: var(--ducon-marinho); }

.pendencias { display: flex; flex-direction: column; padding: 6px 18px; font-size: 13px; }
.pendencia { display: flex; flex-direction: column; gap: 2px; min-height: 36px; padding: 10px 0 10px 10px; border-bottom: 1px solid var(--borda-suave); box-shadow: inset var(--faixa) 0 0 var(--atrasada-borda); }
.pendencia:last-child { border-bottom: 0; }
.pendencia-titulo { font-weight: 500; overflow-wrap: anywhere; }
.pendencia-detalhe { font-size: 12px; }
a.pendencia:hover { text-decoration: none; }
a.pendencia:hover .pendencia-titulo { text-decoration: underline; color: var(--ducon-azul-forte); }

/* ---------- Configurações → Setores / Usuários / Anos: tabelas, badges de perfil, novo ano ---------- */
.admin { display: flex; flex-direction: column; gap: 18px; }
/* Setores / Usuários / Anos: a lista com "+ Novo …" numa barra acima; Novo/Editar são telas próprias (.admin-form) */
.admin-barra { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 12px; }
.admin-form, .card-perfis { max-width: 880px; }
.anos-area { max-width: 880px; }
.tabela-admin { table-layout: fixed; }
.tabela-admin th { white-space: normal; }   /* "Gestor do setor", "SWOT · planos · ações" e "Perfil · responde por" quebram em vez de encostar no vizinho */
.tabela-admin td:first-child { font-weight: 500; overflow-wrap: anywhere; }
.tabela-admin .col-gestor { width: 120px; }
.tabela-admin .col-numero { width: 84px; }   /* "USUÁRIOS" (uma palavra, não quebra) */
.tabela-admin .col-contagem { width: 120px; }
.tabela-admin .col-email { width: 150px; }
.tabela-admin .col-setor { width: 130px; }
.tabela-admin .celula-setores { overflow-wrap: anywhere; }   /* vários setores (" · "): quebra a linha em vez de cortar */
.tabela-admin .col-perfil { width: 128px; }
.tabela-admin .col-acoes-usuario { width: 88px; }   /* Editar e Excluir empilhados: a coluna do nome não perde largura */
.tabela-admin .col-acoes-setor { width: 88px; }     /* Editar e Inativar/Reativar empilhados (Setores) */
.tabela-usuarios .col-email { width: 124px; }   /* e-mail já sai cortado (…); com o chip da foto, o nome precisa de ≥ 140px (min-width 600 = 460 + 140) */
.tabela-usuarios .col-setor { width: 120px; }
.acoes-linha { display: flex; flex-direction: column; align-items: stretch; gap: 4px; }
.acoes-linha form { display: contents; }
.acoes-linha .botao { justify-content: center; padding: 0 8px; }
.badge-inativo { background: var(--cancelada-fundo); color: var(--cancelada-texto); }
.badge-excluido { background: var(--perigo-fundo); color: var(--perigo); }
.tabela tbody tr.linha-excluida > td { color: var(--texto-2); }
.botao-desabilitado { opacity: .55; cursor: not-allowed; pointer-events: none; }
/* Transferir responsabilidades (antes de inativar/excluir um usuário): um card por setor, uma linha por item */
.transferir, .transferir-form { display: flex; flex-direction: column; gap: 14px; }
.transferir-intro { max-width: 860px; font-size: 13px; color: var(--texto-2); }
.transferir-todos { display: flex; align-items: flex-end; flex-wrap: wrap; gap: 8px 10px; padding: 14px 18px; border-bottom: 1px solid var(--borda-suave); background: var(--fundo-2); }
.transferir-todos .campo { width: 280px; max-width: 100%; }
.transferir-todos .campo-ajuda { flex-basis: 100%; }
.transferir-todos .campo-ajuda:empty { display: none; }
.tabela-transferir { table-layout: fixed; }
.tabela-transferir .col-destino { width: 300px; }
.tabela-transferir td { vertical-align: middle; }
.transferir-tipo { display: block; font-size: 11px; font-weight: 600; letter-spacing: .02em; text-transform: uppercase; color: var(--texto-2); }
.transferir-descricao { display: block; overflow-wrap: anywhere; }
/* Inativar setor (admin/setor-inativar): textos soltos dentro dos cards-lista (sem o padding da tabela) */
.inativar-lista { margin: 0; padding: 12px 18px; font-size: 13px; }
ul.inativar-lista { display: flex; flex-direction: column; gap: 4px; padding-left: 36px; }
.inativar-lista + .inativar-lista { padding-top: 0; }
.transferir-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 8px; margin-top: 4px; font-size: 12px; color: var(--texto-2); }
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
.badge-perfil { background: var(--fundo); color: var(--texto-2); }
.badge-perfil-gestao { background: var(--tinta-1); color: var(--ducon-marinho); }
.badge-aberto { background: var(--concluida-fundo); color: var(--concluida-texto); }
.badge-encerrado { background: var(--cancelada-fundo); color: var(--cancelada-texto); }
.anos-lista { list-style: none; display: flex; flex-wrap: wrap; gap: 8px; padding: 0; }
.anos-lista li { display: flex; align-items: center; gap: 8px; min-height: 36px; padding: 4px 6px 4px 14px; border: 1px solid var(--borda); border-radius: var(--raio-pill); background: var(--superficie); font-size: 13px; font-weight: 500; box-shadow: var(--sombra-1); }
/* Novo ano (tela própria, admin/ano-form) · "Iniciar a partir de outro ano" (copiar SWOT e pendências de um ano existente) */
.form-novo-ano { display: flex; flex-direction: column; gap: 12px; }
.copiar-ano { display: flex; flex-direction: column; gap: 8px; max-width: 620px; min-width: 0; margin: 0; padding: 12px 14px 14px; border: 1px solid var(--borda); border-radius: var(--raio-m); background: var(--fundo-2); }
.copiar-ano legend { padding: 0 4px; font-size: 12px; font-weight: 600; color: var(--texto); }
.copiar-ano select { max-width: 200px; }
.copiar-ano .opcao { padding-top: 4px; padding-bottom: 4px; }
.copiar-ano .opcao:hover { background: var(--superficie); }

.campos-linha-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.campo-opcao { justify-content: flex-end; }
.form-linha { display: flex; align-items: flex-end; flex-wrap: wrap; gap: 10px; }
.form-linha .campo { width: 160px; }
.form-rodape { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 10px; }
.form-rodape .botao-primario { margin-left: auto; }
/* rodapé que também é .card (fim da tela de transferência): o .card empilha em coluna; aqui volta a ser uma linha, com o texto
   ocupando o que sobra (e quebrando dentro dele) e os dois botões juntos à direita */
.card.form-rodape { flex-direction: row; }
.card.form-rodape > .texto-secundario { flex: 1 1 320px; min-width: 0; }
/* ---------- Configurações: hub (um card-link por área) e as abas "E-mail · Setores · Usuários · Anos" no topo de cada área ---------- */
.config-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 16px; max-width: 1180px; }
.config-card {
    display: flex;
    flex-direction: column;
    gap: 6px;
    padding: 18px 20px;
    border-radius: var(--raio);
    border: 1px solid var(--borda);
    box-shadow: var(--sombra-1);
    background: var(--superficie);
    color: var(--texto);
    transition: transform var(--transicao), box-shadow var(--transicao), border-color var(--transicao);
}
a.config-card:hover { text-decoration: none; border-color: var(--borda-forte); transform: translateY(-1px); box-shadow: var(--sombra-2); }
a.config-card:hover .config-card-titulo { text-decoration: underline; text-underline-offset: 3px; }
.config-card-icone { width: 40px; height: 40px; margin-bottom: 4px; display: inline-flex; align-items: center; justify-content: center; border-radius: var(--raio-m); background: var(--tinta-1); }
.config-card-icone::before { content: ""; width: 20px; height: 20px; background: var(--ducon-azul-forte); -webkit-mask: var(--icone) center / contain no-repeat; mask: var(--icone) center / contain no-repeat; }
.config-card-icone[data-icone="email"] { --icone: var(--icone-email); }
.config-card-icone[data-icone="setores"] { --icone: var(--icone-setores); }
.config-card-icone[data-icone="usuarios"] { --icone: var(--icone-admin); }
.config-card-icone[data-icone="anos"] { --icone: var(--icone-anos); }
.config-card-icone[data-icone="avisos"] { --icone: var(--icone-avisos); }
.config-card-titulo { font-family: var(--fonte-titulo); font-size: 17px; font-weight: 700; line-height: 1.25; letter-spacing: -0.01em; }
.config-card-descricao { font-size: 13px; color: var(--texto-2); }
.config-card-contador { margin-top: auto; padding-top: 8px; font-size: 13px; font-weight: 600; color: var(--ducon-marinho); }
.config-card-contador .badge { font-weight: 600; }
.abas-configuracoes { align-self: flex-start; }
/* Configurações (E-mail SMTP): largura de leitura; o "Para" do teste é mais largo que os campos curtos do .form-linha */
.configuracoes { max-width: 880px; }
.form-linha .campo-para { width: 320px; max-width: 100%; }
/* Configurações → Avisos: grupos "Avisos de prazo" e "Revisão anual" no desenho do "Iniciar a partir de outro ano" (fundo suave, legenda) */
.grupo-avisos { display: flex; flex-direction: column; gap: 8px; min-width: 0; margin: 0; padding: 12px 14px 14px; border: 1px solid var(--borda); border-radius: var(--raio-m); background: var(--fundo-2); }
.grupo-avisos legend { padding: 0 4px; font-size: 12px; font-weight: 600; color: var(--texto); }
.grupo-avisos > .campo-ajuda { font-size: 12px; }
.grupo-avisos .opcao:hover { background: var(--superficie); }
.form-linha .campo-dia { width: 96px; }
.perfis { display: flex; flex-direction: column; gap: 6px; font-size: 13px; }
.perfis > div { display: flex; align-items: baseline; gap: 8px; }
.perfis .badge { flex: none; }
/* Formulário de usuário: "Setores" (vínculos) some no perfil Gestão; "Responsável pelos setores" só com o perfil
   Setor · gestor. Sem JS: o :has() lê a <option> marcada do select de perfil (o servidor também ignora o que estiver escondido). */
.campo-setores, .campo-geridos { margin: 0; padding: 0; border: 0; }
.campo-setores legend, .campo-geridos legend { padding: 0; margin-bottom: 5px; font-size: 12px; font-weight: 600; color: var(--texto); }
.opcoes-setores, .opcoes-geridos { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); max-height: 220px; }
#form-usuario:not(:has(#usuario-perfil option[value="setor_gestor"]:checked)) .campo-geridos { display: none; }
#form-usuario:has(#usuario-perfil option[value="gestao"]:checked) .campo-setores { display: none; }

/* ---------- Mensagens: filete lateral de 4px na cor do status ---------- */
.flash {
    margin-bottom: 16px;
    padding: 12px 16px;
    border-radius: 12px;
    border: 1px solid rgba(46, 125, 79, 0.35);
    border-left: 4px solid var(--concluida);
    background: linear-gradient(var(--concluida-fundo), var(--concluida-fundo)), var(--superficie);   /* tinta sobre branco, não sobre o cinza */
    color: var(--concluida-texto);
    font-size: 13px;
    font-weight: 500;
    box-shadow: var(--sombra-1);
}
.flash-erro { border-color: var(--perigo-borda); border-left-color: var(--perigo); background: linear-gradient(var(--perigo-fundo), var(--perigo-fundo)), var(--superficie); color: var(--perigo); }
/* aviso no cabeçalho (ex.: "Ano 2026 encerrado — somente leitura."): linha inteira, sem margem */
.cabecalho .flash { flex-basis: 100%; margin-bottom: 0; padding: 8px 14px; border-radius: var(--raio-m); border-color: var(--borda); border-left-color: var(--ducon-marinho); background: var(--fundo-2); color: var(--texto-2); box-shadow: none; }

/* ---------- Tela centrada (login e páginas de erro) ---------- */
.login {
    min-height: 100vh;
    padding: 24px;
    display: flex;
    align-items: center;
    justify-content: center;
    background:
        radial-gradient(60% 50% at 85% 10%, rgba(4, 217, 251, 0.12), transparent 70%),
        radial-gradient(50% 45% at 10% 90%, rgba(75, 83, 255, 0.10), transparent 70%),
        var(--fundo);   /* páginas de erro: o mesmo cinza das telas, com dois brilhos leves da marca */
}
/* tela de login: degradê da marca marinho→índigo (as páginas de erro continuam no cinza); nada de texto fora do cartão */
.login-marca { flex-direction: column; gap: 20px; background: linear-gradient(135deg, var(--ducon-marinho), var(--ducon-indigo)); }
.login-logo { display: block; width: auto; height: 48px; }   /* isotipo + "ducon" ≈ 172×48, só sobre o degradê (branco 5,3:1 no ponto mais claro) */
.login-marca .login-cartao { border-color: rgba(255, 255, 255, 0.6); box-shadow: 0 24px 60px rgba(3, 5, 17, 0.35), 0 2px 8px rgba(3, 5, 17, 0.12); }
.login-cartao {
    width: 100%;
    max-width: 400px;
    padding: 36px 32px;
    border-radius: 20px;
    background: var(--degrade-kpi) top / 100% 4px no-repeat, var(--superficie);   /* filete da marca no topo */
    border: 1px solid var(--borda);
    box-shadow: var(--sombra-3);
    display: flex;
    flex-direction: column;
    gap: 18px;
}
.login-cartao h1 { font-family: var(--fonte-titulo); font-size: 28px; font-weight: 700; line-height: 1.15; letter-spacing: -0.02em; color: var(--ducon-marinho); }
.login-cartao > p { color: var(--texto-2); }
.login-subtitulo { margin-top: 4px; font-size: 11px; font-weight: 500; color: var(--texto-2); letter-spacing: 0.06em; text-transform: uppercase; }
.login-cartao .botao-primario { align-self: flex-start; }
.login-cartao .botao-bloco { align-self: stretch; }
/* "Lembrar-me" + "Esqueci minha senha" na mesma linha; texto de apoio, aviso e "Voltar ao login" das telas de senha */
.login-linha { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
.login-linha .opcao { margin-left: -8px; }
.login-texto { margin-top: 6px; font-size: 13px; line-height: 1.5; color: var(--texto-2); }
.login-cartao .flash { margin-bottom: 0; box-shadow: none; }
.login-voltar { align-self: center; }

/* marca só no papel (versão escura): escondida na tela, aparece no @media print; depois de .login-logo para vencer o display: block */
.so-impressao { display: none; }

/* ---------- Movimento reduzido: sem transições nem elevação no hover ---------- */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after { transition: none !important; }
    .botao:hover, a.kpi:hover, .plano-card:hover, a.setor-card:hover, a.config-card:hover, .menu-usuario > summary:hover, .menu-usuario-foto:hover { transform: none; }
}

/* ---------- Responsivo ---------- */
/* Padrão mobile (ver CLAUDE.md): larguras fixas > 360px só dentro de @media (min-width: …); abaixo de 900px a nav vira barra com
   menu <details> e as abas rolam na horizontal; abaixo de 640px tabelas viram cartões (.tabela-cartoes + data-rotulo), formulários
   em coluna única, botões de ação em largura total e alvos de toque de 40px. Guardas: tests/Feature/LayoutMobileTest.php. */

/* tablet e maior: tabelas de colunas fixas (table-layout: fixed) — min-width = colunas fixas + ≥ 140px para a coluna flexível;
   abaixo disso a tabela vira cartões e não precisa de largura mínima */
@media (min-width: 641px) {
    .tabela-admin { min-width: 552px; }        /* Setores: 120 + 84 + 120 + 88 = 412 fixas */
    .tabela-usuarios { min-width: 600px; }     /* 124 + 120 + 128 + 88 = 460 fixas; a lista ocupa a largura toda da área */
    .tabela-atencao { min-width: 674px; }      /* 96 + 120 + 110 + 96 + 112 = 534 fixas */
    .acoes-tabela { min-width: 588px; }        /* 140 + 96 + 124 + 88 = 448 fixas */
    .tabela-transferir { min-width: 520px; }   /* 300 fixas: 220px para o item */
}

/* lista de planos ao lado do plano selecionado só com espaço para os dois */
@media (min-width: 1201px) {
    .plano-lista { width: 400px; }
}

/* a visão geral empilha até 1500px: a 1501px a coluna de 1,3fr tem 676px ≥ min-width (674) de "Ações que precisam de atenção" */
@media (max-width: 1500px) {
    .visao-grade { grid-template-columns: minmax(0, 1fr); }
}

@media (max-width: 1440px) {
    .d2-rosca { width: 128px; height: 128px; }   /* dashboard: a rosca encolhe para a legenda caber ao lado no card de 1/3 */
}


/* abaixo de 1280px: KPIs em 3 colunas (2 linhas), cards em 2 colunas (os largos ocupam a linha), insights em 2 */
@media (max-width: 1280px) {
    .d2-kpis { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    .d2-grade { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .d2-insights { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 1200px) {
    .swot { flex-direction: column; align-items: stretch; }
    .painel { width: auto; }
    .swot:has(.painel form) .painel { order: -1; }   /* editando (?editar= / ?novo=): o formulário vem antes dos quadrantes, não no fim da página */
    .planejamento { flex-direction: column; align-items: stretch; }
    .plano-detalhe { order: -1; }   /* empilhado: o plano selecionado vem antes da lista (o clique num plano recarrega no topo) */
}

/* tablet e celular: a nav vira uma barra de 56px — "Menu" à esquerda, "SWOT" no centro, logo à direita (grade auto 1fr auto,
   mesma ordem do HTML) — e os links abrem num <details> abaixo da barra, sem JS */
@media (max-width: 900px) {
    .hub { flex-direction: column; height: auto; min-height: 100vh; }
    .nav { position: relative; z-index: 30; width: auto; min-height: 56px; display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 0 12px; padding: 6px 16px; overflow: visible; }
    /* .nav-marca sai da caixa: o "SWOT" e a logo viram células da grade da barra */
    .nav-marca { display: contents; }
    .nav-movel { display: block; grid-column: 1; grid-row: 1; }
    .nav-titulo { grid-column: 2; grid-row: 1; min-width: 0; text-align: center; font-size: 18px; font-weight: 700; color: #FFFFFF; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
    .nav-logo-link { grid-column: 3; grid-row: 1; order: 0; justify-self: end; align-self: center; margin: 0; }
    .nav-logo { height: 26px; }   /* ≈ 93×26, quase a largura do botão "Menu" (≈ 92px): o "SWOT" fica no meio da tela */
    .nav-subtitulo { display: none; }
    /* a coluna de links sai: os links ficam no menu (nome, perfil, "Minha foto" e "Sair" só no chip do cabeçalho) */
    .nav > .nav-links { display: none; }
    .nav-movel > summary {
        list-style: none;
        display: flex;
        align-items: center;
        justify-content: center;
        gap: 8px;
        min-height: 44px;
        min-width: 44px;
        padding: 0 14px 0 12px;
        border-radius: var(--raio-pill);
        border: 1px solid rgba(255, 255, 255, 0.4);
        color: #FFFFFF;
        font-weight: 600;
        cursor: pointer;
        user-select: none;
        transition: background var(--transicao);
    }
    .nav-movel > summary::-webkit-details-marker { display: none; }
    .nav-movel > summary::before { content: ""; width: 18px; height: 18px; background: currentColor; -webkit-mask: var(--icone-menu) center / contain no-repeat; mask: var(--icone-menu) center / contain no-repeat; }
    .nav-movel[open] > summary::before { -webkit-mask-image: var(--icone-fechar); mask-image: var(--icone-fechar); }
    .nav-movel > summary:hover, .nav-movel[open] > summary { background: rgba(255, 255, 255, 0.14); }
    /* painel aberto: por cima do conteúdo, na largura da barra */
    .nav-movel-links { position: absolute; left: 0; right: 0; top: 100%; display: flex; flex-direction: column; gap: 4px; padding: 8px 16px 16px; background: var(--degrade-nav); border-top: 1px solid rgba(255, 255, 255, 0.14); box-shadow: 0 14px 32px rgba(3, 5, 17, 0.3); }
    .nav-movel-links a { min-height: 44px; }
    .cabecalho { padding: 12px 16px; align-items: flex-start; }
    .cabecalho h1 { font-size: 24px; }
    .acoes { margin-left: 0; }
    /* abas (ano, setores, áreas de Configurações): uma linha que rola na horizontal, em vez de quebrar em pílulas deformadas */
    .abas { flex-wrap: nowrap; max-width: 100%; overflow-x: auto; overscroll-behavior-x: contain; scrollbar-width: none; scroll-snap-type: x proximity; }
    .abas::-webkit-scrollbar { display: none; }
    .abas > * { flex: none; scroll-snap-align: start; }
    .principal { overflow: visible; padding: 16px 16px 32px; }
    .quadrantes { grid-template-columns: minmax(0, 1fr); }
    .campos-acao { grid-template-columns: minmax(0, 1fr); }
    .plano-detalhe-topo { flex-wrap: wrap; }
    .d2-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .d2-grade { grid-template-columns: minmax(0, 1fr); }
    .d2-insights { grid-template-columns: minmax(0, 1fr); }
    .d2-span2 { grid-column: auto; }
    .d2-rosca-caixa { flex-wrap: wrap; justify-content: center; }
    .campos-linha-2, .opcoes-setores, .opcoes-geridos, .configuracoes .campos-linha { grid-template-columns: minmax(0, 1fr); }
}

/* celular */
@media (max-width: 640px) {
    :root { --controle-p: 40px; }   /* botão pequeno, abas, lápis da SWOT, "Sair", "Encerrar 2026": alvo de toque de 40px */

    .cabecalho h1 { font-size: 22px; }
    .cabecalho .acoes { flex-basis: 100%; }
    .cabecalho .acoes .botao { flex: 1 1 auto; }
    .abas > * { min-height: 40px; }
    .card:not(.card-lista) { padding: 14px 16px; }   /* .card-lista segue sem padding: as linhas/cartões vão de borda a borda */
    .login-cartao { padding: 28px 22px; }

    /* texto de leitura ≥ 13px (rótulos em caixa alta, badges e chips seguem menores) */
    .texto-secundario, .nota, .campo, .campo-ajuda, .resumo, .kpi-nota, .d2-sub, .d2-rodape, .d2-fim, .d2-insight p, .card-rodape, .plano-rodape,
    .acao-linha2, .pendencia-detalhe, .transferir-meta, .aviso-sem-plano, .setor-card-numeros, .setor-card-rodape, .plano-card-resp, .plano-card-progresso { font-size: 13px; }
    .legenda, .d2-spark-aviso, .d2-funil-conv, .d2-rosca-pct { font-size: 12px; }
    .d2-kpi-rodape, .d2-rank-num, .d2-rank-num small, .abas .aba-conta, .aba-sufixo { font-size: 11px; }
    .d2-av { font-size: 10px; }
    /* campo com menos de 16px faz o iOS ampliar a tela ao focar */
    .campo input:not([type="checkbox"]):not([type="radio"]), .campo select, .campo textarea { font-size: 16px; }

    /* alvos de toque de 40px: opções marcáveis e links soltos (os links dentro de parágrafo seguem no texto) */
    .opcao { min-height: 40px; align-items: center; }
    .opcao input { margin: 0; width: 18px; height: 18px; }
    .card-topo .link, .login-linha .link, .login-voltar, .campo > .link { display: inline-flex; align-items: center; min-height: 40px; }

    /* formulários em coluna única (G·U·T, dias de aviso e dia/mês — campos curtos — ficam lado a lado) */
    .campos-linha, .campos-linha-2, .campos-acao { grid-template-columns: minmax(0, 1fr); }
    .campos-linha.campos-curtos { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    .form-linha { flex-direction: column; align-items: stretch; }
    .form-linha .campo, .form-linha .campo-para { width: auto; }
    .form-linha.campos-curtos { flex-direction: row; align-items: flex-end; }
    .form-linha.campos-curtos .campo { flex: 1 1 0; }
    .form-linha.campos-curtos .campo-dia { flex: none; width: 96px; }
    .transferir-todos { flex-direction: column; align-items: stretch; }
    .transferir-todos .campo { width: auto; }

    /* botões de ação em linha própria e largura total */
    .botoes, .form-rodape, .card.form-rodape { flex-direction: column; align-items: stretch; }
    .botoes .botao, .form-rodape .botao { flex: none; width: 100%; }   /* flex: none — em coluna, o flex: 1 do primário zerava a altura */
    .admin-barra .botao { flex: 1 1 100%; }   /* "+ Novo usuário" / "+ Novo setor" em largura total */
    .form-rodape .botao-primario { margin-left: 0; }
    .card.form-rodape > .texto-secundario { flex: none; }
    .plano-detalhe-topo .botao { margin-left: 0; }

    /* números em 2 colunas; cartão de plano: responsável abaixo do título, barra com largura útil */
    .kpis, .setor-card-numeros { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .plano-card-topo { flex-wrap: wrap; }
    .plano-card-resp { flex-basis: 100%; margin-left: 0; max-width: none; text-align: left; }
    .plano-card-progresso { flex-wrap: wrap; }
    .plano-card-progresso .barra { flex: 1 1 120px; }

    /* dashboard: ritmo e prazos por mês (viewBox de 740) rolam no card, com o texto dos eixos legível (~11px na tela) */
    .d2-card > .d2-rolagem { margin: 0 -16px; padding: 0 16px; }
    .d2-rolagem > .d2-svg { min-width: 560px; }
    .d2-rolagem .d2-eixo, .d2-rolagem .d2-rot, .d2-rolagem .d2-dentro { font-size: 14px; }

    /* ---- tabelas → cartões: uma linha = um cartão; título (.celula-principal) no topo, "Rótulo  valor" em cada célula
       (rótulo do <th> em data-rotulo), botões (.celula-acoes) numa linha própria em largura total; o <thead> fica só para o
       leitor de tela (role="table/row/cell" no HTML mantém a semântica com display: block) ---- */
    .tabela-rolagem:has(> .tabela-cartoes) { overflow: visible; }
    .tabela-cartoes { display: block; width: 100%; min-width: 0; table-layout: auto; }
    .tabela-cartoes tbody { display: block; }
    .tabela-cartoes thead { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
    .tabela-cartoes tbody tr { display: flex; flex-direction: column; gap: 2px; padding: 12px 16px; border-top: 1px solid var(--borda-suave); }
    .tabela-cartoes tbody tr:first-child { border-top: 0; }
    .tabela-cartoes td { display: block; min-width: 0; padding: 3px 0; border: 0; }
    .tabela.tabela-cartoes td[colspan] { padding-left: 0; padding-right: 0; }
    /* "Rótulo  valor": o rótulo flutua na faixa de 104px à esquerda (flow-root: a célula cresce se ele quebrar em 2 linhas) */
    .tabela-cartoes td[data-rotulo] { display: flow-root; padding: 3px 0 3px 112px; overflow-wrap: anywhere; }
    .tabela-cartoes td[data-rotulo]::before { content: attr(data-rotulo); float: left; width: 104px; margin-left: -112px; font-size: 12px; font-weight: 600; line-height: 1.6; color: var(--texto-2); overflow-wrap: break-word; }
    .tabela-cartoes td.celula-principal { order: -1; padding: 0 0 4px; font-size: 15px; font-weight: 600; line-height: 1.4; overflow-wrap: break-word; }
    .tabela-cartoes td.celula-acoes { padding: 8px 0 0; }
    .tabela-cartoes td.celula-principal::before, .tabela-cartoes td.celula-acoes::before { content: none; }
    .tabela-cartoes td.celula-acoes:not(:has(*)) { display: none; }   /* sem botão (sem permissão): nada de linha vazia */
    /* célula em bloco (select de "Para quem vai"): rótulo em cima, campo em largura total */
    .tabela-cartoes td.celula-bloco { padding: 6px 0 0; }
    .tabela-cartoes td.celula-bloco::before { float: none; display: block; width: auto; margin: 0 0 4px; }
    .tabela-cartoes .celula-cortada { white-space: normal; overflow: visible; text-overflow: clip; overflow-wrap: anywhere; }
    .tabela-cartoes .acao-titulo { font-weight: 600; }
    .tabela-cartoes .acao-linha2 { font-weight: 400; }
    .tabela-cartoes.tabela-transferir td.celula-principal { font-size: 14px; font-weight: 400; }
    .tabela-cartoes .prazo-data { padding-left: 112px; }
    .tabela-cartoes .acoes-linha { flex-direction: row; gap: 8px; }
    .tabela-cartoes .celula-acoes .botao, .tabela-cartoes .celula-acoes .link { display: flex; flex: 1 1 0; width: 100%; min-height: 40px; margin: 0; justify-content: center; border-radius: var(--raio-m); font-size: 13px; }
    .tabela-cartoes tbody tr.linha-edicao { padding-top: 0; border-top: 0; }
    .tabela.tabela-cartoes tr.linha-edicao > td { padding: 0; }
    /* faixa lateral de status: do 1º td (que no cartão fica recuado) para a borda do cartão */
    .tabela.tabela-cartoes tbody tr > td:first-child { box-shadow: none; }
    .tabela.tabela-cartoes tbody tr.linha-atrasada, .tabela.tabela-cartoes tbody tr:has(.badge-atrasada) { box-shadow: inset var(--faixa) 0 0 var(--atrasada); }
    .tabela.tabela-cartoes tbody tr:has(.badge-concluida) { box-shadow: inset var(--faixa) 0 0 var(--concluida); }
    .tabela.tabela-cartoes tbody tr:has(.badge-em_andamento) { box-shadow: inset var(--faixa) 0 0 var(--andamento); }
    .tabela.tabela-cartoes tbody tr:has(.badge-cancelada) { box-shadow: inset var(--faixa) 0 0 var(--cancelada); }
    .tabela.tabela-cartoes tbody tr:has(.badge-vence) { box-shadow: inset var(--faixa) 0 0 var(--atrasada-borda); }
}

/* ---------- Impressão ("Exportar PDF" = window.print()): só o conteúdo ---------- */
@media print {
    .nav, .menu-usuario, .cabecalho .acoes, .admin-barra { display: none; }
    /* a logo branca (nav, login) dá lugar à versão escura #030511: o PDF sai com a marca */
    .so-tela { display: none; }
    .so-impressao { display: block; }
    .logo-impressao { align-self: flex-start; width: auto; height: 32px; margin: 12px 28px 0; }
    .hub { display: block; height: auto; }
    .principal { overflow: visible; }
    body { background: var(--superficie); }   /* papel branco, não o cinza da tela */
    .card, .kpi, .quadrante, .plano-card, .plano-detalhe, .setor-card, .config-card, .flash { box-shadow: none; break-inside: avoid; }
    /* cor que carrega informação (barras e seus números brancos, legenda, badges, chips, filetes, destaques):
       imprime mesmo com "gráficos de fundo" desligado no Chrome — senão os números somem em branco sobre branco */
    .barra, .barra > span, .barra-empilhada, .barra-empilhada > span,
    .legenda-cor, .badge, .chip, .vinculo, .passo-numero, .sinal-ponto, .abas > .aba-ativa, .botao-primario,
    .kpi, .kpi-alerta, .plano-card, .setor-card, .flash, .item-swot-sem, .item-swot-ativo, .d2-spark-fim, .d2-av-usuario, .d2-insight,
    .avatar-tabela, .avatar-previa, .avatar-grande, .menu-usuario > summary, .plano-card-ativo, .tabela tbody tr.linha-atrasada, .aviso-sem-plano { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
    /* faixas laterais via box-shadow somem sem "imprimir fundos": viram borda real */
    .pendencia { box-shadow: none; border-left: 3px solid var(--atrasada-borda); }
    /* dashboard no papel: 2 colunas de cards, KPIs em 3 */
    .d2-kpis { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    .d2-grade { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .d2-insights { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
